]>
diplodocus.org Git - nmh/blob - sbr/ruserpass.c
2 * Portions of this code are
3 * Copyright (c) 1985 Regents of the University of California.
6 * Redistribution and use in source and binary forms are permitted
7 * provided that the above copyright notice and this paragraph are
8 * duplicated in all such forms and that any documentation,
9 * advertising materials, and other materials related to such
10 * distribution and use acknowledge that the software was developed
11 * by the University of California, Berkeley. The name of the
12 * University may not be used to endorse or promote products derived
13 * from this software without specific prior written permission.
14 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18 * Portions of this code are Copyright (c) 2013, by the authors of
19 * nmh. See the COPYRIGHT file in the root directory of the nmh
20 * distribution for complete copyright information.
37 #define MAX_TOKVAL_SIZE 1024
44 static struct toktab toktabs
[] = {
45 { "default", DEFAULT
},
47 { "password", PASSWD
},
49 { "account", ACCOUNT
},
58 static int token(char *);
62 ruserpass(char *host
, char **aname
, char **apass
)
64 int t
, usedefault
= 0;
67 init_credentials_file ();
69 cfile
= fopen (credentials_file
, "r");
72 perror (credentials_file
);
74 char tokval
[MAX_TOKVAL_SIZE
];
77 while ((t
= token(tokval
))) {
85 if (token(tokval
) != ID
)
88 * Allow match either for user's host name.
90 if (strcasecmp(host
, tokval
) == 0)
95 while ((t
= token(tokval
)) && t
!= MACH
&& t
!= DEFAULT
) {
98 if (token(tokval
) && *aname
== 0) {
99 *aname
= mh_xmalloc((size_t) strlen(tokval
) + 1);
100 strcpy(*aname
, tokval
);
105 if (fstat(fileno(cfile
), &stb
) >= 0 &&
106 (stb
.st_mode
& 077) != 0) {
107 /* We make this a fatal error to force the
108 user to correct it. */
109 advise(NULL
, "Error - file %s must not be world or "
110 "group readable.", credentials_file
);
111 adios(NULL
, "Remove password or correct file "
114 if (token(tokval
) && *apass
== 0) {
115 *apass
= mh_xmalloc((size_t) strlen(tokval
) + 1);
116 strcpy(*apass
, tokval
);
129 "Unknown keyword %s in credentials file %s\n",
130 tokval
, credentials_file
);
143 if ((myname
= getlogin()) == NULL
) {
146 if ((pp
= getpwuid (getuid())) != NULL
)
147 myname
= pp
->pw_name
;
149 printf("Name (%s:%s): ", host
, myname
);
151 if (fgets(tmp
, sizeof(tmp
) - 1, stdin
) == NULL
) {
152 advise ("tmp", "fgets");
154 tmp
[strlen(tmp
) - 1] = '\0';
155 if (*tmp
!= '\0' || myname
== NULL
) {
159 *aname
= mh_xmalloc((size_t) strlen(myname
) + 1);
160 strcpy (*aname
, myname
);
167 snprintf(prompt
, sizeof(prompt
), "Password (%s:%s): ", host
, *aname
);
168 mypass
= nmh_getpass(prompt
);
170 if (*mypass
== '\0') {
174 *apass
= mh_xmalloc((size_t) strlen(mypass
) + 1);
175 strcpy (*apass
, mypass
);
189 while ((c
= getc(cfile
)) != EOF
&&
190 (c
== '\n' || c
== '\t' || c
== ' ' || c
== ','))
196 while ((c
= getc(cfile
)) != EOF
&& c
!= '"') {
200 if (cp
- tokval
> MAX_TOKVAL_SIZE
-1) {
201 adios(NULL
, "credential tokens restricted to length %d",
202 MAX_TOKVAL_SIZE
- 1);
207 while ((c
= getc(cfile
)) != EOF
208 && c
!= '\n' && c
!= '\t' && c
!= ' ' && c
!= ',') {
212 if (cp
- tokval
> MAX_TOKVAL_SIZE
-1) {
213 adios(NULL
, "credential tokens restricted to length %d",
214 MAX_TOKVAL_SIZE
- 1);
221 for (t
= toktabs
; t
->tokstr
; t
++)
222 if (!strcmp(t
->tokstr
, tokval
))