X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Fauth.c;h=fa60b192796739d2f3ab1fd50cf0d136928d2cd6;hb=22ad101eb72bf10fe5144526209798c677b2d1d8;hp=60a5b69c8c5c76cb8c0c785ed8f278f934f639f7;hpb=2fdd522410f80afcd055d7333f491ee6c0b4b9fa;p=netatalk.git diff --git a/etc/afpd/auth.c b/etc/afpd/auth.c index 60a5b69c..fa60b192 100644 --- a/etc/afpd/auth.c +++ b/etc/afpd/auth.c @@ -50,24 +50,7 @@ extern void afp_get_cmdline( int *ac, char ***av ); #include "acls.h" #endif -int afp_version = 11; static int afp_version_index; - -uid_t uuid; - -#if defined( sun ) && !defined( __svr4__ ) || defined( ultrix ) - -int *groups; -#define GROUPS_SIZE sizeof(int) - -#else /* sun __svr4__ ultrix */ - -gid_t *groups; -#define GROUPS_SIZE sizeof(gid_t) -#endif /* sun ultrix */ - -int ngroups; - static struct uam_mod uam_modules = {NULL, NULL, &uam_modules, &uam_modules}; static struct uam_obj uam_login = {"", "", 0, {{NULL, NULL, NULL, NULL }}, &uam_login, &uam_login}; @@ -142,7 +125,7 @@ static int send_reply(const AFPObj *obj, const int err) if ((err == AFP_OK) || (err == AFPERR_AUTHCONT)) return err; - obj->reply(obj->handle, err); + obj->reply(obj->dsi, err); obj->exit(0); return AFP_OK; @@ -162,7 +145,7 @@ static int afp_null_nolog(AFPObj *obj _U_, char *ibuf _U_, size_t ibuflen _U_, return( AFPERR_NOOP ); } -static int set_auth_switch(int expired) +static int set_auth_switch(const AFPObj *obj, int expired) { int i; @@ -183,7 +166,7 @@ static int set_auth_switch(int expired) } else { afp_switch = postauth_switch; - switch (afp_version) { + switch (obj->afp_version) { case 33: case 32: @@ -270,17 +253,17 @@ static int login(AFPObj *obj, struct passwd *pwd, void (*logout)(void), int expi /* Basically if the user is in the admin group, we stay root */ - if (( ngroups = getgroups( 0, NULL )) < 0 ) { + if ((obj->ngroups = getgroups( 0, NULL )) < 0 ) { LOG(log_error, logtype_afpd, "login: %s getgroups: %s", pwd->pw_name, strerror(errno) ); return AFPERR_BADUAM; } - if ( NULL == (groups = calloc(ngroups, GROUPS_SIZE)) ) { - LOG(log_error, logtype_afpd, "login: %s calloc: %d", ngroups); + if ( NULL == (obj->groups = calloc(obj->ngroups, sizeof(gid_t))) ) { + LOG(log_error, logtype_afpd, "login: %s calloc: %d", obj->ngroups); return AFPERR_BADUAM; } - if (( ngroups = getgroups( ngroups, groups )) < 0 ) { + if (( obj->ngroups = getgroups(obj->ngroups, obj->groups )) < 0 ) { LOG(log_error, logtype_afpd, "login: %s getgroups: %s", pwd->pw_name, strerror(errno) ); return AFPERR_BADUAM; } @@ -290,8 +273,8 @@ static int login(AFPObj *obj, struct passwd *pwd, void (*logout)(void), int expi if (obj->options.admingid != 0) { int i; - for (i = 0; i < ngroups; i++) { - if (groups[i] == obj->options.admingid) admin = 1; + for (i = 0; i < obj->ngroups; i++) { + if (obj->groups[i] == obj->options.admingid) admin = 1; } } if (admin) { @@ -342,21 +325,27 @@ static int login(AFPObj *obj, struct passwd *pwd, void (*logout)(void), int expi } #endif /* TRU64 */ - LOG(log_debug, logtype_afpd, "login: supplementary groups: %s", print_groups(ngroups, groups)); + LOG(log_debug, logtype_afpd, "login: supplementary groups: %s", print_groups(obj->ngroups, obj->groups)); /* There's probably a better way to do this, but for now, we just play root */ #ifdef ADMIN_GRP if (admin) - uuid = 0; + obj->uid = 0; else #endif /* ADMIN_GRP */ - uuid = pwd->pw_uid; + obj->uid = geteuid(); - set_auth_switch(expired); + set_auth_switch(obj, expired); /* save our euid, we need it for preexec_close */ obj->uid = geteuid(); obj->logout = logout; + /* pam_umask or similar might have changed our umask */ + (void)umask(obj->options.umask); + + /* Some PAM module might have reset our signal handlers and timer, so we need to reestablish them */ + afp_over_dsi_sighandlers(obj); + return( AFP_OK ); } @@ -364,7 +353,7 @@ static int login(AFPObj *obj, struct passwd *pwd, void (*logout)(void), int expi int afp_zzz(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) { uint32_t data; - DSI *dsi = (DSI *)AFPobj->handle; + DSI *dsi = (DSI *)AFPobj->dsi; *rbuflen = 0; ibuf += 2; @@ -386,6 +375,7 @@ int afp_zzz(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen if (dsi->flags & DSI_EXTSLEEP) { LOG(log_note, logtype_afpd, "afp_zzz: waking up from extended sleep"); dsi->flags &= ~(DSI_SLEEPING | DSI_EXTSLEEP); + ipc_child_state(obj, DSI_RUNNING); } } else { /* sleep request */ @@ -393,8 +383,10 @@ int afp_zzz(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen if (data & AFPZZZ_EXT_SLEEP) { LOG(log_note, logtype_afpd, "afp_zzz: entering extended sleep"); dsi->flags |= DSI_EXTSLEEP; + ipc_child_state(obj, DSI_EXTSLEEP); } else { LOG(log_note, logtype_afpd, "afp_zzz: entering normal sleep"); + ipc_child_state(obj, DSI_SLEEPING); } } @@ -557,7 +549,7 @@ int afp_getsession( /* ---------------------- */ int afp_disconnect(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size_t *rbuflen) { - DSI *dsi = (DSI *)obj->handle; + DSI *dsi = (DSI *)obj->dsi; uint16_t type; uint32_t tklen; pid_t token; @@ -647,7 +639,7 @@ static int get_version(AFPObj *obj, char *ibuf, size_t ibuflen, size_t len) num = sizeof( afp_versions ) / sizeof( afp_versions[ 0 ]); for ( i = 0; i < num; i++ ) { if ( strncmp( ibuf, afp_versions[ i ].av_name , len ) == 0 ) { - afp_version = afp_versions[ i ].av_number; + obj->afp_version = afp_versions[ i ].av_number; afp_version_index = i; break; } @@ -655,11 +647,8 @@ static int get_version(AFPObj *obj, char *ibuf, size_t ibuflen, size_t len) if ( i == num ) /* An inappropo version */ return AFPERR_BADVERS ; - if (afp_version >= 30 && obj->proto != AFPPROTO_DSI) - return AFPERR_BADVERS ; - /* FIXME Hack */ - if (afp_version >= 30 && sizeof(off_t) != 8) { + if (obj->afp_version >= 30 && sizeof(off_t) != 8) { LOG(log_error, logtype_afpd, "get_version: no LARGE_FILE support recompile!" ); return AFPERR_BADVERS ; } @@ -868,11 +857,11 @@ int afp_logincont(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *r int afp_logout(AFPObj *obj, char *ibuf _U_, size_t ibuflen _U_, char *rbuf _U_, size_t *rbuflen) { - DSI *dsi = (DSI *)(obj->handle); + DSI *dsi = (DSI *)(obj->dsi); LOG(log_note, logtype_afpd, "AFP logout by %s", obj->username); - of_close_all_forks(); - close_all_vol(); + of_close_all_forks(obj); + close_all_vol(obj); dsi->flags = DSI_AFP_LOGGED_OUT; *rbuflen = 0; return AFP_OK; @@ -911,7 +900,7 @@ int afp_changepw(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rb if ((len + 1) & 1) /* pad byte */ ibuf++; - if ( afp_version < 30) { + if (obj->afp_version < 30) { len = (unsigned char) *ibuf++; if ( len > sizeof(username) - 1) { return AFPERR_PARAM; @@ -926,7 +915,7 @@ int afp_changepw(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rb if ( ibuf[0] != '\0' || ibuf[1] != '\0') return AFPERR_PARAM; ibuf += 2; - len = MIN(sizeof(username), strlen(obj->username)); + len = MIN(sizeof(username) - 1, strlen(obj->username)); memcpy(username, obj->username, len); username[ len ] = '\0'; } @@ -948,7 +937,7 @@ int afp_changepw(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rb (ret == AFPERR_AUTHCONT) ? "continued" : (ret ? "failed" : "succeeded")); if ( ret == AFP_OK ) - set_auth_switch(0); + set_auth_switch(obj, 0); return ret; } @@ -1074,7 +1063,7 @@ int auth_load(const char *path, const char *list) return -1; strlcpy(buf, list, sizeof(buf)); - if ((p = strtok(buf, ",")) == NULL) + if ((p = strtok(buf, ", ")) == NULL) return -1; strcpy(name, path); @@ -1099,7 +1088,7 @@ int auth_load(const char *path, const char *list) } else { LOG(log_info, logtype_afpd, "uam: uam not found (status=%d)", stat(name, &st)); } - p = strtok(NULL, ","); + p = strtok(NULL, ", "); } return 0;