summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.c6
-rw-r--r--snac.c96
-rw-r--r--snac.h12
3 files changed, 114 insertions, 0 deletions
diff --git a/main.c b/main.c
index 9a3f71c..d047a64 100644
--- a/main.c
+++ b/main.c
@@ -7,7 +7,13 @@
7 7
8int main(int argc, char *argv[]) 8int main(int argc, char *argv[])
9{ 9{
10 snac snac;
11
12 printf("%s\n", tid());
13
10 srv_open("/home/angel/lib/snac/comam.es"); 14 srv_open("/home/angel/lib/snac/comam.es");
11 15
16 snac_open(&snac, "mike");
17
12 return 0; 18 return 0;
13} 19}
diff --git a/snac.c b/snac.c
index 95d2814..fa84c03 100644
--- a/snac.c
+++ b/snac.c
@@ -14,6 +14,9 @@
14 14
15#include "snac.h" 15#include "snac.h"
16 16
17#include <sys/time.h>
18
19
17d_char *srv_basedir = NULL; 20d_char *srv_basedir = NULL;
18d_char *srv_config = NULL; 21d_char *srv_config = NULL;
19d_char *srv_baseurl = NULL; 22d_char *srv_baseurl = NULL;
@@ -39,6 +42,18 @@ d_char *xs_time(char *fmt, int local)
39} 42}
40 43
41 44
45d_char *tid(void)
46/* returns a time-based Id */
47{
48 struct timeval tv;
49 struct timezone tz;
50
51 gettimeofday(&tv, &tz);
52
53 return xs_fmt("%10d.%06d", tv.tv_sec, tv.tv_usec);
54}
55
56
42void srv_debug(int level, d_char *str) 57void srv_debug(int level, d_char *str)
43/* logs a debug message */ 58/* logs a debug message */
44{ 59{
@@ -103,3 +118,84 @@ int srv_open(char *basedir)
103 118
104 return ret; 119 return ret;
105} 120}
121
122
123int validate_uid(char *uid)
124/* returns if uid is a valid identifier */
125{
126 while (*uid) {
127 if (!(isalnum(*uid) || *uid == '_'))
128 return 0;
129
130 uid++;
131 }
132
133 return 1;
134}
135
136
137int snac_open(snac *snac, char *uid)
138/* opens a user */
139{
140 int ret = 0;
141
142 memset(snac, '\0', sizeof(struct _snac));
143
144 if (validate_uid(uid)) {
145 xs *cfg_file;
146 FILE *f;
147
148 snac->uid = xs_str_new(uid);
149
150 snac->basedir = xs_fmt("%s/user/%s", srv_basedir, uid);
151
152 cfg_file = xs_fmt("%s/user.json", snac->basedir);
153
154 if ((f = fopen(cfg_file, "r")) != NULL) {
155 xs *cfg_data;
156
157 /* read full config file */
158 cfg_data = xs_readall(f);
159 fclose(f);
160
161 if ((snac->config = xs_json_loads(cfg_data)) != NULL) {
162 xs *key_file = xs_fmt("%s/key.json", snac->basedir);
163
164 if ((f = fopen(key_file, "r")) != NULL) {
165 xs *key_data;
166
167 key_data = xs_readall(f);
168 fclose(f);
169
170 if ((snac->key = xs_json_loads(key_data)) != NULL) {
171 snac->actor = xs_fmt("%s/%s", srv_baseurl, uid);
172 ret = 1;
173 }
174 else
175 srv_log(xs_fmt("cannot parse %s", key_file));
176 }
177 else
178 srv_log(xs_fmt("error opening '%s'", key_file));
179 }
180 else
181 srv_log(xs_fmt("cannot parse %s", cfg_file));
182 }
183 else
184 srv_log(xs_fmt("error opening '%s'", cfg_file));
185 }
186 else
187 srv_log(xs_fmt("invalid user '%s'", uid));
188
189 return ret;
190}
191
192
193void snac_free(snac *snac)
194/* frees a user snac */
195{
196 free(snac->uid);
197 free(snac->basedir);
198 free(snac->config);
199 free(snac->key);
200 free(snac->actor);
201}
diff --git a/snac.h b/snac.h
index ef14425..c14fd79 100644
--- a/snac.h
+++ b/snac.h
@@ -11,8 +11,20 @@ d_char *xs_time(char *fmt, int local);
11#define xs_local_time(fmt) xs_time(fmt, 1) 11#define xs_local_time(fmt) xs_time(fmt, 1)
12#define xs_utc_time(fmt) xs_time(fmt, 0) 12#define xs_utc_time(fmt) xs_time(fmt, 0)
13 13
14d_char *tid(void);
15
14void srv_debug(int level, d_char *str); 16void srv_debug(int level, d_char *str);
15#define srv_log(str) srv_debug(0, str) 17#define srv_log(str) srv_debug(0, str)
16 18
17int srv_open(char *basedir); 19int srv_open(char *basedir);
18 20
21typedef struct _snac {
22 d_char *uid; /* uid */
23 d_char *basedir; /* user base directory */
24 d_char *config; /* user configuration */
25 d_char *key; /* keypair */
26 d_char *actor; /* actor url */
27} snac;
28
29int snac_open(snac *snac, char *uid);
30void snac_free(snac *snac);