[BACK]Return to tilde-luzah-bozo.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / libexec / httpd

Annotation of src/libexec/httpd/tilde-luzah-bozo.c, Revision 1.12

1.12    ! shm         1: /*     $NetBSD: tilde-luzah-bozo.c,v 1.11 2015/07/16 12:19:23 shm Exp $        */
1.2       tls         2:
1.9       mrg         3: /*     $eterna: tilde-luzah-bozo.c,v 1.16 2011/11/18 09:21:15 mrg Exp $        */
1.1       tls         4:
                      5: /*
1.10      mrg         6:  * Copyright (c) 1997-2014 Matthew R. Green
1.1       tls         7:  * All rights reserved.
                      8:  *
                      9:  * Redistribution and use in source and binary forms, with or without
                     10:  * modification, are permitted provided that the following conditions
                     11:  * are met:
                     12:  * 1. Redistributions of source code must retain the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer.
                     14:  * 2. Redistributions in binary form must reproduce the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer and
                     16:  *    dedication in the documentation and/or other materials provided
                     17:  *    with the distribution.
                     18:  *
                     19:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     20:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     21:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     22:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     23:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
                     24:  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
                     25:  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
                     26:  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
                     27:  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     28:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     29:  * SUCH DAMAGE.
                     30:  *
                     31:  */
                     32:
                     33: /* this code implements ~user support for bozohttpd */
                     34:
                     35: #ifndef NO_USER_SUPPORT
                     36:
                     37: #include <sys/param.h>
                     38:
1.11      shm        39: #include <assert.h>
1.1       tls        40: #include <errno.h>
                     41: #include <pwd.h>
1.5       mrg        42: #include <stdlib.h>
1.1       tls        43: #include <string.h>
                     44: #include <unistd.h>
                     45:
                     46: #include "bozohttpd.h"
                     47:
                     48: /*
1.6       mrg        49:  * bozo_user_transform does this:
1.1       tls        50:  *     - chdir's /~user/public_html
                     51:  *     - returns the rest of the file, index.html appended if required
1.5       mrg        52:  *     - returned malloced file to serve in request->hr_file,
                     53:  *        ala transform_request().
1.1       tls        54:  *
                     55:  * transform_request() is supposed to check that we have user support
                     56:  * enabled.
                     57:  */
1.5       mrg        58: int
1.12    ! shm        59: bozo_user_transform(bozo_httpreq_t *request)
1.1       tls        60: {
1.6       mrg        61:        bozohttpd_t *httpd = request->hr_httpd;
1.12    ! shm        62:        char    *s, *file = NULL, *user;
1.1       tls        63:        struct  passwd *pw;
                     64:
1.11      shm        65:        /* find username */
1.12    ! shm        66:        user = strchr(request->hr_file + 1, '~');
1.11      shm        67:
                     68:        /* this shouldn't happen, but "better paranoid than sorry" */
                     69:        assert(user != NULL);
                     70:
                     71:        user++;
                     72:
                     73:        if ((s = strchr(user, '/')) != NULL) {
1.1       tls        74:                *s++ = '\0';
                     75:        }
                     76:
1.6       mrg        77:        debug((httpd, DEBUG_OBESE, "looking for user %s",
1.11      shm        78:                user));
                     79:        pw = getpwnam(user);
1.12    ! shm        80:        request->hr_user = bozostrdup(httpd, user);
        !            81:
1.1       tls        82:        /* fix this up immediately */
1.12    ! shm        83:        if (s) {
1.1       tls        84:                s[-1] = '/';
1.12    ! shm        85:                /* omit additional slashes at the beginning */
        !            86:                while (*s == '/')
        !            87:                        s++;
        !            88:        }
        !            89:
1.5       mrg        90:        if (pw == NULL) {
1.12    ! shm        91:                free(request->hr_user);
        !            92:                request->hr_user = NULL;
1.6       mrg        93:                (void)bozo_http_error(httpd, 404, request, "no such user");
1.5       mrg        94:                return 0;
                     95:        }
1.1       tls        96:
1.8       mrg        97:        debug((httpd, DEBUG_OBESE, "user %s dir %s/%s uid %d gid %d",
                     98:              pw->pw_name, pw->pw_dir, httpd->public_html,
                     99:              pw->pw_uid, pw->pw_gid));
1.1       tls       100:
                    101:        if (chdir(pw->pw_dir) < 0) {
1.6       mrg       102:                bozo_warn(httpd, "chdir1 error: %s: %s", pw->pw_dir,
                    103:                        strerror(errno));
1.8       mrg       104:                (void)bozo_http_error(httpd, 404, request,
1.6       mrg       105:                        "can't chdir to homedir");
1.5       mrg       106:                return 0;
1.1       tls       107:        }
1.6       mrg       108:        if (chdir(httpd->public_html) < 0) {
                    109:                bozo_warn(httpd, "chdir2 error: %s: %s", httpd->public_html,
                    110:                        strerror(errno));
1.8       mrg       111:                (void)bozo_http_error(httpd, 404, request,
1.6       mrg       112:                        "can't chdir to public_html");
1.5       mrg       113:                return 0;
1.1       tls       114:        }
                    115:        if (s == NULL || *s == '\0') {
1.12    ! shm       116:                file = bozostrdup(httpd, "/");
1.1       tls       117:        } else {
1.12    ! shm       118:                file = bozomalloc(httpd, strlen(s) + 2);
        !           119:                strcpy(file, "/");
        !           120:                strcat(file, s);
1.5       mrg       121:        }
1.1       tls       122:
1.5       mrg       123:        free(request->hr_file);
                    124:        request->hr_file = file;
1.1       tls       125:
1.6       mrg       126:        debug((httpd, DEBUG_FAT, "transform_user returning %s under %s", file,
1.1       tls       127:            pw->pw_dir));
1.5       mrg       128:        return 1;
1.1       tls       129: }
                    130: #endif /* NO_USER_SUPPORT */

CVSweb <webmaster@jp.NetBSD.org>