Browse code

add authid cookie to complement the session in QUERY_STRING

Dario Rodriguez authored on 13/07/2014 21:41:07
Showing 6 changed files
... ...
@@ -26,7 +26,7 @@
26 26
 #include "kakumei_config.h"
27 27
 
28 28
 #define CONFIGFILE "kakumei.conf"
29
-#define CFCOOKIEPREFIX "kakumei_"
29
+#define CFCOOKIENAME "kakumeiauthid"
30 30
 #define CFCOOKIEDOMAIN "localhost"
31 31
 #define CFBANNERPATH "default.png"
32 32
 
... ...
@@ -60,7 +60,7 @@ main(int argc, char *argv[])
60 60
         port=atoi(argv[1]);
61 61
         if(kaconfig_exists(CONFIGFILE)!=0) {
62 62
                 log_write("INIT","Config file not found, writing default file %s",CONFIGFILE);
63
-                kaconfig_write(CONFIGFILE,CFCOOKIEPREFIX,CFCOOKIEDOMAIN,CFBANNERPATH);
63
+                kaconfig_write(CONFIGFILE,CFCOOKIENAME,CFCOOKIEDOMAIN,CFBANNERPATH);
64 64
         }
65 65
         if((ka->config=kaconfig_init(CONFIGFILE))==NULL) {
66 66
                 log_write("INIT","ERROR: insufficient memory or config file error");
... ...
@@ -164,8 +164,9 @@ callback_http(wk *web, int connid, wk_uri *uri, void *userptr)
164 164
         int ishtml;
165 165
         int whitelisted;
166 166
         int validsession;
167
-        char session[SESSIONSIZE];
167
+        char session[SESSIONSIZE+1];
168 168
         char user[MAXUSERSIZE+1];
169
+        char authid[AUTHIDSIZE+1];
169 170
         int i;
170 171
         if(ka==NULL)
171 172
                 return(wkact_finished);
... ...
@@ -200,7 +201,9 @@ callback_http(wk *web, int connid, wk_uri *uri, void *userptr)
200 201
         if(wk_uri_copyvar(uri,"s",session,sizeof(session))==NULL)
201 202
                 session[0]='\0';
202 203
         user[0]='\0';
203
-        validsession=(session_check(ka,session,user,sizeof(user))!=NULL)?1:0;
204
+        if(wk_uri_copycookie(uri,ka->config->cookiename,authid,sizeof(authid))==NULL)
205
+                authid[0]='\0';
206
+        validsession=(session_check(ka,session,authid,user,sizeof(user))!=NULL)?1:0;
204 207
         /* serve the page */
205 208
         if(partialpath[0]=='/' && (res=res_find(resindexdata,partialpath+1))!=NULL) {
206 209
                 if(whitelisted || validsession) {
... ...
@@ -269,7 +272,8 @@ http_login(wk *web, int connid, wk_uri *uri, void *userptr)
269 272
 {
270 273
         char u[MAXUSERSIZE+1],p[MAXPASSWDSIZE+1];
271 274
         char reply[1024];
272
-        char session[SESSIONSIZE];
275
+        char session[SESSIONSIZE+1];
276
+        char authid[AUTHIDSIZE+1];
273 277
         kakumei *ka=(kakumei *)userptr;
274 278
         if(web==NULL || connid<0 || uri==NULL || ka==NULL) {
275 279
                 log_write("EINT","%s:%i",__FILE__,__LINE__);
... ...
@@ -290,10 +294,11 @@ http_login(wk *web, int connid, wk_uri *uri, void *userptr)
290 294
                 log_write("LGIN","Reply: %s",reply);
291 295
                 return(wkact_finished);
292 296
         } else if(pass_check(ka,u,p)==0 &&
293
-                  session_new(ka,u,session,sizeof(session))!=NULL) {
297
+                  session_new(ka,u,session,sizeof(session),authid,sizeof(authid))!=NULL) {
294 298
                 /* valid login */
295 299
                 snprintf(reply,sizeof(reply),"/posts.html?s=%s",session);
296 300
                 reply[sizeof(reply)-1]='\0';
301
+                wk_serve_cookieadd(web,connid,ka->config->cookiename,authid,ka->config->cookiedomain,21600 /* 6h */,"secure");
297 302
                 wk_serve_buffer_as_file(web,connid,reply,strlen(reply),"text/plain");
298 303
                 log_write("LGIN","Reply: %s",reply);
299 304
                 return(wkact_finished);
... ...
@@ -308,7 +313,8 @@ http_newuser(wk *web, int connid, wk_uri *uri, void *userptr)
308 313
 {
309 314
         char u[MAXUSERSIZE+1],p[MAXPASSWDSIZE+1],i[MAXPASSWDSIZE+1];
310 315
         char reply[1024];
311
-        char session[SESSIONSIZE];
316
+        char session[SESSIONSIZE+1];
317
+        char authid[AUTHIDSIZE+1];
312 318
         kakumei *ka=(kakumei *)userptr;
313 319
         if(web==NULL || connid<0 || uri==NULL || ka==NULL) {
314 320
                 log_write("EINT","%s:%i",__FILE__,__LINE__);
... ...
@@ -339,7 +345,7 @@ http_newuser(wk *web, int connid, wk_uri *uri, void *userptr)
339 345
         /* delete invitation */
340 346
         kakumei_invitedel(ka,i);
341 347
         /* create session and go to "posts" page */
342
-        if(session_new(ka,u,session,sizeof(session))==NULL) {
348
+        if(session_new(ka,u,session,sizeof(session),authid,sizeof(authid))==NULL) {
343 349
                 /* "autologin" didn't work, ask for login */
344 350
                 log_write("NEWU","couldn't generate new session, redirecting to login");
345 351
                 wk_serve_buffer_as_file(web,connid,"/",1,"text/plain");
... ...
@@ -348,6 +354,7 @@ http_newuser(wk *web, int connid, wk_uri *uri, void *userptr)
348 354
         /* valid login */
349 355
         snprintf(reply,sizeof(reply),"/posts.html?s=%s",session);
350 356
         reply[sizeof(reply)-1]='\0';
357
+        wk_serve_cookieadd(web,connid,ka->config->cookiename,authid,ka->config->cookiedomain,21600 /* 6h */,"secure");
351 358
         wk_serve_buffer_as_file(web,connid,reply,strlen(reply),"text/plain");
352 359
         log_write("NEWU","Reply: %s",reply);
353 360
         return(wkact_finished);
... ...
@@ -24,7 +24,8 @@
24 24
 #define SESSIONSDIR "data/sessions"
25 25
 #define MAXUSERSIZE 32
26 26
 #define MAXPASSWDSIZE 64
27
-#define SESSIONSIZE 33
27
+#define SESSIONSIZE 32
28
+#define AUTHIDSIZE 32
28 29
 
29 30
 typedef struct kakumei {
30 31
         sselect *ssel;
... ...
@@ -85,8 +85,8 @@ kaconfig_init(char *configfile)
85 85
                                 continue;
86 86
                         }
87 87
                         /* identify key-value pair */
88
-                        if(strcmp(ptr,"cookieprefix")==0) {
89
-                                configvalue=&(config->cookieprefix);
88
+                        if(strcmp(ptr,"cookiename")==0) {
89
+                                configvalue=&(config->cookiename);
90 90
                         } else if(strcmp(ptr,"cookiedomain")==0) {
91 91
                                 configvalue=&(config->cookiedomain);
92 92
                         } else if(strcmp(ptr,"bannerpath")==0) {
... ...
@@ -121,8 +121,8 @@ kaconfig_free(kaconfig *config)
121 121
 {
122 122
         if(config==NULL)
123 123
                 return;
124
-        if(config->cookieprefix!=NULL)
125
-                free(config->cookieprefix),config->cookieprefix=NULL;
124
+        if(config->cookiename!=NULL)
125
+                free(config->cookiename),config->cookiename=NULL;
126 126
         if(config->cookiedomain!=NULL)
127 127
                 free(config->cookiedomain),config->cookiedomain=NULL;
128 128
         if(config->bannerpath!=NULL)
... ...
@@ -141,14 +141,14 @@ kaconfig_exists(char *configfile)
141 141
 }
142 142
 
143 143
 int
144
-kaconfig_write(char *configfile,char *cookieprefix,char *cookiedomain, char *bannerpath)
144
+kaconfig_write(char *configfile,char *cookiename,char *cookiedomain, char *bannerpath)
145 145
 {
146 146
         FILE *f;
147 147
         if((f=fopen(configfile,"w"))==NULL)
148 148
                 return(-1);
149 149
         fprintf(f,"; kakumei config file\n");
150 150
         fprintf(f,"[general]\n");
151
-        fprintf(f,"cookieprefix=%s\n",(cookieprefix!=NULL)?cookieprefix:"kakumei_");
151
+        fprintf(f,"cookiename=%s\n",(cookiename!=NULL)?cookiename:"kakumeiauthid");
152 152
         fprintf(f,"cookiedomain=%s\n",(cookiedomain!=NULL)?cookiedomain:"localhost");
153 153
         fprintf(f,"bannerpath=%s\n",(bannerpath!=NULL)?bannerpath:"default.png");
154 154
         return(0);
... ...
@@ -12,7 +12,7 @@
12 12
 #ifndef KAKUMEI_CONFIG_H
13 13
 #define KAKUMEI_CONFIG_H
14 14
 typedef struct kaconfig {
15
-        char *cookieprefix;
15
+        char *cookiename;
16 16
         char *cookiedomain;
17 17
         char *bannerpath;
18 18
 } kaconfig;
... ...
@@ -21,5 +21,5 @@ kaconfig *kaconfig_init(char *configfile);
21 21
 void kaconfig_free(kaconfig *config);
22 22
 
23 23
 int kaconfig_exists(char *configfile);
24
-int kaconfig_write(char *configfile,char *cookieprefix,char *cookiedomain, char *bannerpath);
24
+int kaconfig_write(char *configfile,char *cookiename,char *cookiedomain, char *bannerpath);
25 25
 #endif
... ...
@@ -18,21 +18,22 @@
18 18
 #include "kakumei_session.h"
19 19
 
20 20
 char *
21
-session_new(kakumei *ka, char *user, char *session, int sessionsize)
21
+session_new(kakumei *ka, char *user, char *session, int sessionsize, char *authid, int authidsize)
22 22
 {
23 23
         static int init=0;
24 24
         MHASH td;
25 25
         struct timeval tv;
26 26
         struct timezone tz;
27
-        int i;
27
+        int i,k;
28 28
         long n;
29 29
         char c;
30 30
         char binhash[32];
31 31
         char filename[1024];
32 32
         int len;
33 33
         int fd;
34
-        char oldsession[SESSIONSIZE];
35
-        if(ka==NULL || user==NULL || session==NULL || sessionsize<SESSIONSIZE || kakumei_uservalid(ka,user)!=0)
34
+        int authidlen;
35
+        char oldsession[SESSIONSIZE+1];
36
+        if(ka==NULL || user==NULL || session==NULL || sessionsize<(SESSIONSIZE+1) || authidsize<(AUTHIDSIZE+1)|| kakumei_uservalid(ka,user)!=0)
36 37
                 return(NULL);
37 38
         if(init==0) {
38 39
                 gettimeofday(&tv,&tz);
... ...
@@ -50,7 +51,7 @@ session_new(kakumei *ka, char *user, char *session, int sessionsize)
50 51
                 mhash(td,&n,sizeof(n));
51 52
         }
52 53
         mhash_deinit(td,&binhash);
53
-        for(i=0;i<sizeof(binhash) && i<SESSIONSIZE;i++) {
54
+        for(i=0;i<sizeof(binhash) && i<(SESSIONSIZE/2);i++) {
54 55
                 c=(((unsigned char *)binhash)[i]>>4);
55 56
                 c=(c>=10)?(c-10+'a'):c+'0';
56 57
                 session[i<<1]=c;
... ...
@@ -58,7 +59,16 @@ session_new(kakumei *ka, char *user, char *session, int sessionsize)
58 59
                 c=(c>=10)?(c-10+'a'):c+'0';
59 60
                 session[(i<<1)+1]=c;
60 61
         }
61
-        session[SESSIONSIZE-1]='\0';
62
+        session[SESSIONSIZE]='\0';
63
+        for(k=0;i<sizeof(binhash) && k<(AUTHIDSIZE/2);i++,k++) {
64
+                c=(((unsigned char *)binhash)[i]>>4);
65
+                c=(c>=10)?(c-10+'a'):c+'0';
66
+                authid[k<<1]=c;
67
+                c=(((unsigned char *)binhash)[i]&0xf);
68
+                c=(c>=10)?(c-10+'a'):c+'0';
69
+                authid[(k<<1)+1]=c;
70
+        }
71
+        authid[AUTHIDSIZE]='\0';
62 72
         /* save the hash */
63 73
         mkdir(DATADIR,0700);
64 74
         mkdir(SESSIONSDIR,0700);
... ...
@@ -67,7 +77,8 @@ session_new(kakumei *ka, char *user, char *session, int sessionsize)
67 77
         if((fd=open(filename,O_WRONLY|O_TRUNC|O_CREAT,0600))==-1)
68 78
                 return(NULL);
69 79
         len=strlen(user);
70
-        if(write(fd,user,len)!=len) {
80
+        authidlen=strlen(authid);
81
+        if(write(fd,user,len)!=len || write(fd,"\n",1)!=1 || write(fd,authid,authidlen)!=authidlen) {
71 82
                 close(fd),fd=-1;
72 83
                 return(NULL);
73 84
         }
... ...
@@ -93,11 +104,14 @@ session_new(kakumei *ka, char *user, char *session, int sessionsize)
93 104
 }
94 105
 
95 106
 char *
96
-session_check(kakumei *ka, char *session, char *user, int usersize)
107
+session_check(kakumei *ka, char *session, char *authid, char *user, int usersize)
97 108
 {
98 109
         int i;
99 110
         int fd;
100 111
         char filename[1024];
112
+        char sesbuf[MAXUSERSIZE+AUTHIDSIZE+2];
113
+        char *sep;
114
+        int len;
101 115
         if(ka==NULL || session==NULL || session[0]=='\0' || user==NULL || usersize<(MAXUSERSIZE+1))
102 116
                 return(NULL);
103 117
         for(i=0;session[i]!='\0';i++) {
... ...
@@ -110,11 +124,25 @@ session_check(kakumei *ka, char *session, char *user, int usersize)
110 124
         filename[sizeof(filename)-1]='\0';
111 125
         if((fd=open(filename,O_RDONLY))==-1)
112 126
                 return(NULL);
113
-        memset(user,0,usersize);
114
-        read(fd,user,usersize-1);
127
+        memset(sesbuf,0,sizeof(sesbuf));
128
+        read(fd,sesbuf,sizeof(sesbuf));
129
+        sesbuf[sizeof(sesbuf)-1]='\0';
115 130
         close(fd),fd=-1;
131
+        if((sep=strchr(sesbuf,'\n'))==NULL)
132
+                return(NULL); /* invalid format */
133
+        *sep='\0';
134
+        memset(user,0,usersize);
135
+        strncpy(user,sesbuf,usersize);
136
+        user[usersize-1]='\0';
137
+        /* position sep to authid and trim the last '\n' if it exists */
138
+        sep++;
139
+        if((len=strlen(sep))>0 && sep[len-1]=='\n')
140
+                sep[len-1]='\0';
141
+        /* check validity */
142
+        if(strcmp(authid,sep)!=0)
143
+                return(NULL); /* authid doesn't match */
116 144
         if(kakumei_uservalid(ka,user)!=0)
117
-                return(NULL);
145
+                return(NULL); /* invalid user */
118 146
         return(user);
119 147
 }
120 148
 
... ...
@@ -11,7 +11,7 @@
11 11
 
12 12
 #include "kakumei.h"
13 13
 
14
-char *session_new(kakumei *ka, char *user, char *session, int sessionsize);
15
-char *session_check(kakumei *ka, char *session, char *user, int usersize);
14
+char *session_new(kakumei *ka, char *user, char *session, int sessionsize, char *authid, int authidsize);
15
+char *session_check(kakumei *ka, char *session, char *authid, char *user, int usersize);
16 16
 int session_del(kakumei *ka, char *session);
17 17