diff options
| author | 2023-02-07 09:25:01 +0100 | |
|---|---|---|
| committer | 2023-02-07 09:25:01 +0100 | |
| commit | 67f2d4318d76b305ab98a48ff48b47e2e87126c2 (patch) | |
| tree | e8c72fcf2aaf9ff0f8ec59dd07894736d0ab01ac | |
| parent | Ensure the setgid bit is set in the base directory. (diff) | |
| download | penes-snac2-67f2d4318d76b305ab98a48ff48b47e2e87126c2.tar.gz penes-snac2-67f2d4318d76b305ab98a48ff48b47e2e87126c2.tar.xz penes-snac2-67f2d4318d76b305ab98a48ff48b47e2e87126c2.zip | |
New utility function mkdirx().
| -rw-r--r-- | data.c | 4 | ||||
| -rw-r--r-- | snac.c | 14 | ||||
| -rw-r--r-- | snac.h | 2 | ||||
| -rw-r--r-- | upgrade.c | 10 | ||||
| -rw-r--r-- | utils.c | 15 |
5 files changed, 28 insertions, 17 deletions
| @@ -88,7 +88,7 @@ int srv_open(char *basedir, int auto_upgrade) | |||
| 88 | 88 | ||
| 89 | /* create the queue/ subdir, just in case */ | 89 | /* create the queue/ subdir, just in case */ |
| 90 | xs *qdir = xs_fmt("%s/queue", srv_basedir); | 90 | xs *qdir = xs_fmt("%s/queue", srv_basedir); |
| 91 | mkdir(qdir, DIR_PERM); | 91 | mkdirx(qdir); |
| 92 | 92 | ||
| 93 | #ifdef __OpenBSD__ | 93 | #ifdef __OpenBSD__ |
| 94 | char *v = xs_dict_get(srv_config, "disable_openbsd_security"); | 94 | char *v = xs_dict_get(srv_config, "disable_openbsd_security"); |
| @@ -434,7 +434,7 @@ d_char *_object_fn_by_md5(const char *md5) | |||
| 434 | { | 434 | { |
| 435 | xs *bfn = xs_fmt("%s/object/%c%c", srv_basedir, md5[0], md5[1]); | 435 | xs *bfn = xs_fmt("%s/object/%c%c", srv_basedir, md5[0], md5[1]); |
| 436 | 436 | ||
| 437 | mkdir(bfn, DIR_PERM); | 437 | mkdirx(bfn); |
| 438 | 438 | ||
| 439 | return xs_fmt("%s/%s.json", bfn, md5); | 439 | return xs_fmt("%s/%s.json", bfn, md5); |
| 440 | } | 440 | } |
| @@ -30,6 +30,18 @@ int srv_running = 0; | |||
| 30 | int dbglevel = 0; | 30 | int dbglevel = 0; |
| 31 | 31 | ||
| 32 | 32 | ||
| 33 | int mkdirx(const char *pathname) | ||
| 34 | /* creates a directory with special permissions */ | ||
| 35 | { | ||
| 36 | int ret; | ||
| 37 | |||
| 38 | if ((ret = mkdir(pathname, DIR_PERM)) != -1) | ||
| 39 | ret = chmod(pathname, DIR_PERM); | ||
| 40 | |||
| 41 | return ret; | ||
| 42 | } | ||
| 43 | |||
| 44 | |||
| 33 | int valid_status(int status) | 45 | int valid_status(int status) |
| 34 | /* is this HTTP status valid? */ | 46 | /* is this HTTP status valid? */ |
| 35 | { | 47 | { |
| @@ -149,7 +161,7 @@ void srv_archive(const char *direction, xs_dict *req, | |||
| 149 | xs *dir = xs_fmt("%s/archive/%s_%s", srv_basedir, date, direction); | 161 | xs *dir = xs_fmt("%s/archive/%s_%s", srv_basedir, date, direction); |
| 150 | FILE *f; | 162 | FILE *f; |
| 151 | 163 | ||
| 152 | if (mkdir(dir, DIR_PERM) != -1) { | 164 | if (mkdirx(dir) != -1) { |
| 153 | xs *meta_fn = xs_fmt("%s/_META", dir); | 165 | xs *meta_fn = xs_fmt("%s/_META", dir); |
| 154 | 166 | ||
| 155 | if ((f = fopen(meta_fn, "w")) != NULL) { | 167 | if ((f = fopen(meta_fn, "w")) != NULL) { |
| @@ -17,6 +17,8 @@ extern int dbglevel; | |||
| 17 | 17 | ||
| 18 | #define L(s) (s) | 18 | #define L(s) (s) |
| 19 | 19 | ||
| 20 | int mkdirx(const char *pathname); | ||
| 21 | |||
| 20 | int valid_status(int status); | 22 | int valid_status(int status); |
| 21 | d_char *tid(int offset); | 23 | d_char *tid(int offset); |
| 22 | double ftime(void); | 24 | double ftime(void); |
| @@ -36,7 +36,7 @@ int snac_upgrade(xs_str **error) | |||
| 36 | else | 36 | else |
| 37 | if (f < 2.1) { | 37 | if (f < 2.1) { |
| 38 | xs *dir = xs_fmt("%s/object", srv_basedir); | 38 | xs *dir = xs_fmt("%s/object", srv_basedir); |
| 39 | mkdir(dir, DIR_PERM); | 39 | mkdirx(dir); |
| 40 | 40 | ||
| 41 | nf = 2.1; | 41 | nf = 2.1; |
| 42 | } | 42 | } |
| @@ -61,7 +61,7 @@ int snac_upgrade(xs_str **error) | |||
| 61 | xs *dir = xs_fmt("%s/object/%c%c", srv_basedir, b[0], b[1]); | 61 | xs *dir = xs_fmt("%s/object/%c%c", srv_basedir, b[0], b[1]); |
| 62 | xs *nfn = xs_fmt("%s/%s", dir, b); | 62 | xs *nfn = xs_fmt("%s/%s", dir, b); |
| 63 | 63 | ||
| 64 | mkdir(dir, DIR_PERM); | 64 | mkdirx(dir); |
| 65 | rename(fn, nfn); | 65 | rename(fn, nfn); |
| 66 | } | 66 | } |
| 67 | 67 | ||
| @@ -88,7 +88,7 @@ int snac_upgrade(xs_str **error) | |||
| 88 | xs *dir = xs_fmt("%s/hidden", snac.basedir); | 88 | xs *dir = xs_fmt("%s/hidden", snac.basedir); |
| 89 | 89 | ||
| 90 | /* create the hidden directory */ | 90 | /* create the hidden directory */ |
| 91 | mkdir(dir, DIR_PERM); | 91 | mkdirx(dir); |
| 92 | 92 | ||
| 93 | /* rename all muted files incorrectly named .json */ | 93 | /* rename all muted files incorrectly named .json */ |
| 94 | xs *spec = xs_fmt("%s/muted/" "*.json", snac.basedir); | 94 | xs *spec = xs_fmt("%s/muted/" "*.json", snac.basedir); |
| @@ -117,10 +117,10 @@ int snac_upgrade(xs_str **error) | |||
| 117 | 117 | ||
| 118 | if (user_open(&snac, v)) { | 118 | if (user_open(&snac, v)) { |
| 119 | xs *dir = xs_fmt("%s/public", snac.basedir); | 119 | xs *dir = xs_fmt("%s/public", snac.basedir); |
| 120 | mkdir(dir, DIR_PERM); | 120 | mkdirx(dir); |
| 121 | 121 | ||
| 122 | dir = xs_replace_i(dir, "public", "private"); | 122 | dir = xs_replace_i(dir, "public", "private"); |
| 123 | mkdir(dir, DIR_PERM); | 123 | mkdirx(dir); |
| 124 | 124 | ||
| 125 | user_free(&snac); | 125 | user_free(&snac); |
| 126 | } | 126 | } |
| @@ -143,22 +143,19 @@ int snac_init(const char *basedir) | |||
| 143 | } | 143 | } |
| 144 | } | 144 | } |
| 145 | 145 | ||
| 146 | if (mkdir(srv_basedir, DIR_PERM) == -1) { | 146 | if (mkdirx(srv_basedir) == -1) { |
| 147 | printf("ERROR: cannot create directory '%s'\n", srv_basedir); | 147 | printf("ERROR: cannot create directory '%s'\n", srv_basedir); |
| 148 | return 1; | 148 | return 1; |
| 149 | } | 149 | } |
| 150 | 150 | ||
| 151 | /* force permissions (mkdir also uses 777) */ | ||
| 152 | chmod(srv_basedir, DIR_PERM); | ||
| 153 | |||
| 154 | xs *udir = xs_fmt("%s/user", srv_basedir); | 151 | xs *udir = xs_fmt("%s/user", srv_basedir); |
| 155 | mkdir(udir, DIR_PERM); | 152 | mkdirx(udir); |
| 156 | 153 | ||
| 157 | xs *odir = xs_fmt("%s/object", srv_basedir); | 154 | xs *odir = xs_fmt("%s/object", srv_basedir); |
| 158 | mkdir(odir, DIR_PERM); | 155 | mkdirx(odir); |
| 159 | 156 | ||
| 160 | xs *qdir = xs_fmt("%s/queue", srv_basedir); | 157 | xs *qdir = xs_fmt("%s/queue", srv_basedir); |
| 161 | mkdir(qdir, DIR_PERM); | 158 | mkdirx(qdir); |
| 162 | 159 | ||
| 163 | xs *gfn = xs_fmt("%s/greeting.html", srv_basedir); | 160 | xs *gfn = xs_fmt("%s/greeting.html", srv_basedir); |
| 164 | if ((f = fopen(gfn, "w")) == NULL) { | 161 | if ((f = fopen(gfn, "w")) == NULL) { |
| @@ -246,7 +243,7 @@ int adduser(const char *uid) | |||
| 246 | 243 | ||
| 247 | xs *basedir = xs_fmt("%s/user/%s", srv_basedir, uid); | 244 | xs *basedir = xs_fmt("%s/user/%s", srv_basedir, uid); |
| 248 | 245 | ||
| 249 | if (mkdir(basedir, DIR_PERM) == -1) { | 246 | if (mkdirx(basedir) == -1) { |
| 250 | printf("ERROR: cannot create directory '%s'\n", basedir); | 247 | printf("ERROR: cannot create directory '%s'\n", basedir); |
| 251 | return 0; | 248 | return 0; |
| 252 | } | 249 | } |
| @@ -259,7 +256,7 @@ int adduser(const char *uid) | |||
| 259 | 256 | ||
| 260 | for (n = 0; dirs[n]; n++) { | 257 | for (n = 0; dirs[n]; n++) { |
| 261 | xs *d = xs_fmt("%s/%s", basedir, dirs[n]); | 258 | xs *d = xs_fmt("%s/%s", basedir, dirs[n]); |
| 262 | mkdir(d, DIR_PERM); | 259 | mkdirx(d); |
| 263 | } | 260 | } |
| 264 | 261 | ||
| 265 | xs *scssfn = xs_fmt("%s/style.css", srv_basedir); | 262 | xs *scssfn = xs_fmt("%s/style.css", srv_basedir); |