diff options
Diffstat (limited to 'snac.c')
| -rw-r--r-- | snac.c | 96 |
1 files changed, 96 insertions, 0 deletions
| @@ -14,6 +14,9 @@ | |||
| 14 | 14 | ||
| 15 | #include "snac.h" | 15 | #include "snac.h" |
| 16 | 16 | ||
| 17 | #include <sys/time.h> | ||
| 18 | |||
| 19 | |||
| 17 | d_char *srv_basedir = NULL; | 20 | d_char *srv_basedir = NULL; |
| 18 | d_char *srv_config = NULL; | 21 | d_char *srv_config = NULL; |
| 19 | d_char *srv_baseurl = NULL; | 22 | d_char *srv_baseurl = NULL; |
| @@ -39,6 +42,18 @@ d_char *xs_time(char *fmt, int local) | |||
| 39 | } | 42 | } |
| 40 | 43 | ||
| 41 | 44 | ||
| 45 | d_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 | |||
| 42 | void srv_debug(int level, d_char *str) | 57 | void 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 | |||
| 123 | int 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 | |||
| 137 | int 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 | |||
| 193 | void 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 | } | ||