liquid_feedback_frontend
annotate fastpath/getpic.c @ 4:80c215dbf076
Version alpha5
Many optical changes and improved usability
Support for different wiki-formatting-engines
Help system
Many optical changes and improved usability
Support for different wiki-formatting-engines
Help system
author | bsw/jbe |
---|---|
date | Thu Dec 10 12:00:00 2009 +0100 (2009-12-10) |
parents | |
children | afd9f769c7ae |
rev | line source |
---|---|
bsw/jbe@4 | 1 #include <stdlib.h> |
bsw/jbe@4 | 2 #include <stdio.h> |
bsw/jbe@4 | 3 #include <libpq-fe.h> |
bsw/jbe@4 | 4 #include <string.h> |
bsw/jbe@4 | 5 #include <regex.h> |
bsw/jbe@4 | 6 #include <sys/types.h> |
bsw/jbe@4 | 7 #include <sys/stat.h> |
bsw/jbe@4 | 8 #include <unistd.h> |
bsw/jbe@4 | 9 |
bsw/jbe@4 | 10 #ifndef GETPIC_CONNINFO |
bsw/jbe@4 | 11 #define GETPIC_CONNINFO "dbname=liquid_feedback" |
bsw/jbe@4 | 12 #endif |
bsw/jbe@4 | 13 |
bsw/jbe@4 | 14 #ifndef GETPIC_DEFAULT_AVATAR |
bsw/jbe@4 | 15 #define GETPIC_DEFAULT_AVATAR "/opt/liquid_feedback_testing/app/static/avatar.jpg" |
bsw/jbe@4 | 16 #endif |
bsw/jbe@4 | 17 |
bsw/jbe@4 | 18 int main(int argc, const char * const *argv) { |
bsw/jbe@4 | 19 PGconn *conn; |
bsw/jbe@4 | 20 PGresult *dbr; |
bsw/jbe@4 | 21 |
bsw/jbe@4 | 22 char *cookies = getenv("HTTP_COOKIE"); |
bsw/jbe@4 | 23 |
bsw/jbe@4 | 24 char *args_string; |
bsw/jbe@4 | 25 char *member_id; |
bsw/jbe@4 | 26 char *image_type; |
bsw/jbe@4 | 27 |
bsw/jbe@4 | 28 char *sql_session_params[1]; |
bsw/jbe@4 | 29 char *sql_member_image_params[2]; |
bsw/jbe@4 | 30 |
bsw/jbe@4 | 31 ssize_t start, length; |
bsw/jbe@4 | 32 |
bsw/jbe@4 | 33 char *session_ident; |
bsw/jbe@4 | 34 |
bsw/jbe@4 | 35 regex_t session_ident_regex; |
bsw/jbe@4 | 36 regmatch_t session_ident_regmatch[2]; |
bsw/jbe@4 | 37 |
bsw/jbe@4 | 38 cookies = getenv("HTTP_COOKIE"); |
bsw/jbe@4 | 39 |
bsw/jbe@4 | 40 args_string = getenv("QUERY_STRING"); |
bsw/jbe@4 | 41 |
bsw/jbe@4 | 42 if (!cookies || !args_string) { |
bsw/jbe@4 | 43 fputs("Status: 403 Access Denied\n\n", stdout); |
bsw/jbe@4 | 44 return 0; |
bsw/jbe@4 | 45 } |
bsw/jbe@4 | 46 |
bsw/jbe@4 | 47 member_id = strtok(args_string, "+"); |
bsw/jbe@4 | 48 image_type = strtok(NULL, "+"); |
bsw/jbe@4 | 49 |
bsw/jbe@4 | 50 sql_member_image_params[0] = member_id; |
bsw/jbe@4 | 51 sql_member_image_params[1] = image_type; |
bsw/jbe@4 | 52 |
bsw/jbe@4 | 53 // get session from cookie |
bsw/jbe@4 | 54 |
bsw/jbe@4 | 55 // TODO improve regex to fit better |
bsw/jbe@4 | 56 if (regcomp(&session_ident_regex, "liquid_feedback_session=([a-zA-Z0-9]+)", REG_EXTENDED) != 0) { |
bsw/jbe@4 | 57 // shouldn't happen |
bsw/jbe@4 | 58 abort(); |
bsw/jbe@4 | 59 } |
bsw/jbe@4 | 60 |
bsw/jbe@4 | 61 if (regexec(&session_ident_regex, cookies, 2, session_ident_regmatch, 0) != 0) { |
bsw/jbe@4 | 62 fputs("Status: 403 Access Denied\n\n", stdout); |
bsw/jbe@4 | 63 return 0; |
bsw/jbe@4 | 64 } |
bsw/jbe@4 | 65 |
bsw/jbe@4 | 66 start = session_ident_regmatch[1].rm_so; |
bsw/jbe@4 | 67 length = session_ident_regmatch[1].rm_eo - session_ident_regmatch[1].rm_so; |
bsw/jbe@4 | 68 |
bsw/jbe@4 | 69 session_ident = malloc(length + 1); |
bsw/jbe@4 | 70 |
bsw/jbe@4 | 71 strncpy(session_ident, cookies + start, length); |
bsw/jbe@4 | 72 |
bsw/jbe@4 | 73 session_ident[length] = 0; |
bsw/jbe@4 | 74 |
bsw/jbe@4 | 75 sql_session_params[0] = session_ident; |
bsw/jbe@4 | 76 |
bsw/jbe@4 | 77 |
bsw/jbe@4 | 78 // connect to database |
bsw/jbe@4 | 79 |
bsw/jbe@4 | 80 conn = PQconnectdb(GETPIC_CONNINFO); |
bsw/jbe@4 | 81 if (!conn) { |
bsw/jbe@4 | 82 fputs("Could not create PGconn structure.\n", stderr); |
bsw/jbe@4 | 83 return 1; |
bsw/jbe@4 | 84 } |
bsw/jbe@4 | 85 if (PQstatus(conn) != CONNECTION_OK) { |
bsw/jbe@4 | 86 fputs(PQerrorMessage(conn), stderr); |
bsw/jbe@4 | 87 return 1; |
bsw/jbe@4 | 88 } |
bsw/jbe@4 | 89 |
bsw/jbe@4 | 90 // check session |
bsw/jbe@4 | 91 dbr = PQexecParams(conn, |
bsw/jbe@4 | 92 "SELECT NULL FROM session JOIN member ON member.id = session.member_id WHERE session.ident = $1 AND member.active", |
bsw/jbe@4 | 93 1, NULL, sql_session_params, NULL, NULL, 0 |
bsw/jbe@4 | 94 ); |
bsw/jbe@4 | 95 |
bsw/jbe@4 | 96 if (PQresultStatus(dbr) != PGRES_TUPLES_OK) { |
bsw/jbe@4 | 97 fputs(PQresultErrorMessage(dbr), stderr); |
bsw/jbe@4 | 98 return 1; |
bsw/jbe@4 | 99 } |
bsw/jbe@4 | 100 |
bsw/jbe@4 | 101 if (PQntuples(dbr) != 1) { |
bsw/jbe@4 | 102 fputs("Status: 403 Access Denied\n\n", stdout); |
bsw/jbe@4 | 103 return 0; |
bsw/jbe@4 | 104 } |
bsw/jbe@4 | 105 |
bsw/jbe@4 | 106 |
bsw/jbe@4 | 107 // get picture |
bsw/jbe@4 | 108 dbr = PQexecParams(conn, |
bsw/jbe@4 | 109 "SELECT content_type, data " |
bsw/jbe@4 | 110 "FROM member_image " |
bsw/jbe@4 | 111 "WHERE member_id = $1 " |
bsw/jbe@4 | 112 "AND image_type = $2 " |
bsw/jbe@4 | 113 "AND scaled " |
bsw/jbe@4 | 114 "LIMIT 1;", |
bsw/jbe@4 | 115 2, NULL, sql_member_image_params, NULL, NULL, 1 |
bsw/jbe@4 | 116 ); |
bsw/jbe@4 | 117 |
bsw/jbe@4 | 118 if (PQresultStatus(dbr) != PGRES_TUPLES_OK) { |
bsw/jbe@4 | 119 fputs(PQresultErrorMessage(dbr), stderr); |
bsw/jbe@4 | 120 return 1; |
bsw/jbe@4 | 121 } |
bsw/jbe@4 | 122 if (PQntuples(dbr) > 1) { |
bsw/jbe@4 | 123 return 1; |
bsw/jbe@4 | 124 } |
bsw/jbe@4 | 125 fputs("Cache-Control: private; max-age=86400\n", stdout); |
bsw/jbe@4 | 126 if (PQntuples(dbr) == 0) { |
bsw/jbe@4 | 127 struct stat sb; |
bsw/jbe@4 | 128 PQclear(dbr); |
bsw/jbe@4 | 129 PQfinish(conn); |
bsw/jbe@4 | 130 fputs("Content-Type: image/jpeg\n\n", stdout); |
bsw/jbe@4 | 131 if (stat(GETPIC_DEFAULT_AVATAR, &sb)) return 1; |
bsw/jbe@4 | 132 fprintf(stdout, "Content-Length: %i\n", sb.st_size); |
bsw/jbe@4 | 133 execl("/bin/cat", "cat", GETPIC_DEFAULT_AVATAR, NULL); |
bsw/jbe@4 | 134 return 1; |
bsw/jbe@4 | 135 } else { |
bsw/jbe@4 | 136 if (PQnfields(dbr) < 0) { |
bsw/jbe@4 | 137 fputs("Too few columns returned by database.\n", stderr); |
bsw/jbe@4 | 138 return 1; |
bsw/jbe@4 | 139 } |
bsw/jbe@4 | 140 if (PQfformat(dbr, 0) != 1 || PQfformat(dbr, 1) != 1) { |
bsw/jbe@4 | 141 fputs("Database did not return data in binary format.\n", stderr); |
bsw/jbe@4 | 142 return 1; |
bsw/jbe@4 | 143 } |
bsw/jbe@4 | 144 if (PQgetisnull(dbr, 0, 0) || PQgetisnull(dbr, 0, 1)) { |
bsw/jbe@4 | 145 fputs("Unexpected NULL in database result.\n", stderr); |
bsw/jbe@4 | 146 return 1; |
bsw/jbe@4 | 147 } |
bsw/jbe@4 | 148 fputs("Content-Type: ", stdout); |
bsw/jbe@4 | 149 fprintf(stdout, "Content-Length: %i\n", PQgetlength(dbr, 0, 1)); |
bsw/jbe@4 | 150 fwrite(PQgetvalue(dbr, 0, 0), PQgetlength(dbr, 0, 0), 1, stdout); |
bsw/jbe@4 | 151 fputs("\n\n", stdout); |
bsw/jbe@4 | 152 fwrite(PQgetvalue(dbr, 0, 1), PQgetlength(dbr, 0, 1), 1, stdout); |
bsw/jbe@4 | 153 } |
bsw/jbe@4 | 154 PQclear(dbr); |
bsw/jbe@4 | 155 PQfinish(conn); |
bsw/jbe@4 | 156 return 0; |
bsw/jbe@4 | 157 } |