]> arthur.barton.de Git - netatalk.git/blob - etc/uams/uams_passwd.c
Initial revision
[netatalk.git] / etc / uams / uams_passwd.c
1 /* Copyright (c) 1990,1993 Regents of The University of Michigan.
2  * Copyright (c) 1999 Adrian Sun (asun@u.washington.edu) 
3  * All Rights Reserved.  See COPYRIGHT.
4  */
5
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <unistd.h>
10 #ifndef NO_CRYPT_H
11 #include <crypt.h>
12 #endif
13 #include <pwd.h>
14 #include <syslog.h>
15
16 #ifdef SOLARIS
17 #define SHADOWPW
18 #endif SOLARIS
19
20 #ifdef SHADOWPW
21 #include <shadow.h>
22 #endif SHADOWPW
23
24 #include <atalk/afp.h>
25 #include <atalk/uam.h>
26
27 #define PASSWDLEN 8
28
29 /* cleartxt login */
30 static int passwd_login(void *obj, struct passwd **uam_pwd,
31                         char *ibuf, int ibuflen,
32                         char *rbuf, int *rbuflen)
33 {
34     struct passwd *pwd;
35 #ifdef SHADOWPW
36     struct spwd *sp;
37 #endif
38     char *username, *p;
39     int len, ulen;
40
41     *rbuflen = 0;
42
43     if (uam_afpserver_option(obj, UAM_OPTION_USERNAME,
44                              (void *) &username, &ulen) < 0)
45       return AFPERR_MISC;
46
47     len = (unsigned char) *ibuf++;
48     if ( len > ulen ) {
49         return( AFPERR_PARAM );
50     }
51
52     memcpy(username, ibuf, len );
53     ibuf += len;
54     username[ len ] = '\0';
55     if ((unsigned long) ibuf & 1) /* pad character */
56       ++ibuf;
57     ibuf[ PASSWDLEN ] = '\0';
58
59     if (( pwd = uam_getname(username, ulen)) == NULL ) {
60         return AFPERR_PARAM;
61     }
62
63     syslog(LOG_INFO, "cleartext login: %s", username);
64     if (uam_checkuser(pwd) < 0)
65       return AFPERR_NOTAUTH;
66
67 #ifdef SHADOWPW
68     if (( sp = getspnam( pwd->pw_name )) == NULL ) {
69         syslog( LOG_INFO, "no shadow passwd entry for %s", username);
70         return AFPERR_NOTAUTH;
71     }
72     pwd->pw_passwd = sp->sp_pwdp;
73 #endif SHADOWPW
74
75     if (!pwd->pw_passwd)
76       return AFPERR_NOTAUTH;
77
78     *uam_pwd = pwd;
79
80     p = crypt( ibuf, pwd->pw_passwd );
81     if ( strcmp( p, pwd->pw_passwd ) == 0 ) 
82       return AFP_OK;
83
84     return AFPERR_NOTAUTH;
85 }
86
87
88 #if 0
89 /* change passwd */
90 static int passwd_changepw(void *obj, char *username,
91                            struct passwd *pwd, char *ibuf,
92                            int ibuflen, char *rbuf, int *rbuflen)
93 {
94 #ifdef SHADOWPW
95     struct spwd *sp;
96 #endif
97     char pw[PASSWDLEN + 1], *p;
98     uid_t uid = geteuid();
99
100     if (uam_checkuser(pwd) < 0)
101       return AFPERR_ACCESS;
102
103     /* old password */
104     memcpy(pw, ibuf, PASSWDLEN);
105     memset(ibuf, 0, PASSWDLEN);
106     pw[PASSWDLEN] = '\0';
107
108 #ifdef SHADOWPW
109     if (( sp = getspnam( pwd->pw_name )) == NULL ) {
110         syslog( LOG_INFO, "no shadow passwd entry for %s", username);
111         return AFPERR_PARAM;
112     }
113     pwd->pw_passwd = sp->sp_pwdp;
114 #endif SHADOWPW
115
116     p = crypt(pw, pwd->pw_passwd );
117     if (strcmp( p, pwd->pw_passwd )) {
118       memset(pw, 0, sizeof(pw));
119       return AFPERR_NOTAUTH;
120     }
121
122     /* new password */
123     ibuf += PASSWDLEN;
124     ibuf[PASSWDLEN] = '\0';
125     
126 #ifdef SHADOWPW
127 #else
128 #endif
129     return AFP_OK;
130 }
131 #endif
132
133 static int uam_setup(const char *path)
134 {
135   if (uam_register(UAM_SERVER_LOGIN, path, 
136                "Cleartxt Passwrd", passwd_login, NULL, NULL) < 0)
137     return -1;
138   /*uam_register(UAM_SERVER_PRINTAUTH, path, "Cleartxt Passwrd",
139     passwd_printer);*/
140   return 0;
141 }
142
143 static void uam_cleanup(void)
144 {
145   uam_unregister(UAM_SERVER_LOGIN, "Cleartxt Passwrd");
146   /*uam_unregister(UAM_SERVER_PRINTAUTH, "Cleartxt Passwrd"); */
147 }
148
149 UAM_MODULE_EXPORT struct uam_export uams_clrtxt = {
150   UAM_MODULE_SERVER,
151   UAM_MODULE_VERSION,
152   uam_setup, uam_cleanup
153 };