summaryrefslogtreecommitdiff
path: root/snac.c
diff options
context:
space:
mode:
Diffstat (limited to 'snac.c')
-rw-r--r--snac.c96
1 files changed, 96 insertions, 0 deletions
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}