annotate toys/pending/mkpasswd.c @ 1091:c4d4a6e7473f draft

useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
author Rob Landley <rob@landley.net>
date Wed, 16 Oct 2013 20:41:56 -0500
parents
children 63db77909fc8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1091
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* mkpasswd.c - encrypt the given passwd using salt
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
2 *
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
3 * Copyright 2013 Ashwini Kumar <ak.ashwini@gmail.com>
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 * Copyright 2013 Kyungwan Han <asura321@gmail.com>
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
5 *
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
6 * No Standard
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
7
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
8 USE_MKPASSWD(NEWTOY(mkpasswd, ">2S:m:P#=0<0", TOYFLAG_USR|TOYFLAG_BIN))
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
9
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
10 config MKPASSWD
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
11 bool "mkpasswd"
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 default n
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 help
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
14 usage: mkpasswd [OPTIONS] [PASSWORD] [SALT]
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
15
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
16 Crypt PASSWORD using crypt(3)
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
17
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
18 -P N Read password from fd N
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
19 -m TYPE Encryption method, when TYPE='help', then show the methods available
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
20 -S SALT
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
21 */
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
22
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
23 #define FOR_mkpasswd
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
24 #include "toys.h"
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
25 #include "lib/xregcomp.h"
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
26
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
27 GLOBALS(
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
28 long pfd;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
29 char *method;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
30 char *salt;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
31 )
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
32
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
33
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
34 /*
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
35 * validate the salt provided by user.
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
36 * the allowed character set for salt is [./A-Za-z0-9]
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
37 */
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
38 static void is_salt_valid(char *salt)
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
39 {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
40 regex_t rp;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
41 regmatch_t rm[1];
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
42 char *regex = "[./A-Za-z0-9]*"; //salt REGEX
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
43
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
44 xregcomp(&rp, regex, REG_NEWLINE);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
45
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
46 /* compare string against pattern -- remember that patterns
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
47 are anchored to the beginning of the line */
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
48 if (regexec(&rp, salt, 1, rm, 0) == 0 && rm[0].rm_so == 0
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
49 && rm[0].rm_eo == strlen(salt))
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
50 return;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
51
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
52 error_exit("salt should be in character set [./A-Za-z0-9]");
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
53 }
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
54
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
55 void mkpasswd_main(void)
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
56 {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
57 int offset = 0;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
58 char salt[MAX_SALT_LEN] = {0,};
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
59
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
60 if (!(toys.optflags & FLAG_m)) TT.method = "des";
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
61 else if (!strcmp(TT.method, "help")) {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
62 xprintf("Available encryption methods are:\n"
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
63 " des\n md5\n sha256\n sha512\n");
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
64 return;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
65 }
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
66 // If arguments are there, then the second argument is Salt, can be NULL also
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
67 if ((toys.optc == 2) && !(toys.optflags & FLAG_S)) TT.salt = toys.optargs[1];
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
68
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
69 offset= get_salt(salt, TT.method);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
70 if (offset == -1) error_exit("unknown encryption method");
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
71 if (TT.salt) {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
72 is_salt_valid(TT.salt);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
73 snprintf(salt + offset, MAX_SALT_LEN - offset, "%s", TT.salt);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
74 }
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
75
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
76 if (toys.optflags & FLAG_P) {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
77 if (dup2(TT.pfd, STDIN_FILENO) == -1) perror_exit("fd");
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
78 close(TT.pfd);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
79 }
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
80
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
81 if (!toys.optc) {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
82 if (isatty(STDIN_FILENO)) {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
83 if (read_password(toybuf, sizeof(toybuf), "Password: "))
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
84 perror_exit("password read failed");
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
85 } else {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
86 // read from the given FD
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
87 int i = 0;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
88 while (1) {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
89 int ret = read(0, &toybuf[i], 1);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
90 if ( ret < 0 ) perror_exit("password read failed");
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
91 else if (ret == 0 || toybuf[i] == '\n' || toybuf[i] == '\r' ||
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
92 sizeof(toybuf) == i+1) {
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
93 toybuf[i] = '\0';
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
94 break;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
95 }
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
96 i++;
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
97 }
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
98 }
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
99 } else snprintf(toybuf, sizeof(toybuf), "%s", toys.optargs[0]);
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
100
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
101 // encrypt & print the password
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
102 xprintf("%s\n",crypt(toybuf, salt));
c4d4a6e7473f useradd, groupadd, and mkpasswd submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff changeset
103 }