annotate lib/password.c @ 629:225262d6e6c7

Only add / in dirtree_path if it hasn't already got one, spotted by Ashwini Sharma.
author Rob Landley <rob@landley.net>
date Wed, 18 Jul 2012 00:19:08 -0500
parents 77d94b36aff0
children 9aeea680acc7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
626
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* vi: set sw=4 ts=4 :
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
2 * pwdutils.c - password read/update helper functions.
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
3 *
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 * Copyright 2012 Ashwini Kumar <ak.ashwini@gmail.com>
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
5 */
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
6
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
7 #include "toys.h"
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
8 #include <time.h>
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
9
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
10
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
11 int read_passwd(char * buff, int buflen, char* mesg)
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 {
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 int i = 0;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
14 struct termios termio, oldtermio;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
15 tcgetattr(0, &oldtermio);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
16 tcflush(0, TCIFLUSH);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
17 termio = oldtermio;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
18
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
19 termio.c_iflag &= ~(IUCLC|IXON|IXOFF|IXANY);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
20 termio.c_lflag &= ~(ECHO|ECHOE|ECHOK|ECHONL|TOSTOP);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
21 tcsetattr(0, TCSANOW, &termio);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
22
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
23 fputs(mesg, stdout);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
24 fflush(stdout);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
25
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
26 while (1) {
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
27 int ret = read(0, &buff[i], 1);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
28 if ( ret < 0 ) {
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
29 buff[0] = 0;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
30 tcsetattr(0, TCSANOW, &oldtermio);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
31 return 1;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
32 }
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
33 else if ( ret == 0 || buff[i] == '\n' ||
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
34 buff[i] == '\r' || buflen == i+1) {
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
35 buff[i] = '\0';
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
36 break;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
37 }
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
38 i++;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
39 }
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
40
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
41 tcsetattr(0, TCSANOW, &oldtermio);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
42 puts("");
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
43 fflush(stdout);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
44 return 0;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
45 }
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
46
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
47 static char *get_nextcolon(const char *line, char delim)
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
48 {
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
49 char *current_ptr = NULL;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
50 if((current_ptr = strchr(line, ':')) == NULL)
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
51 error_exit("Invalid Entry\n");
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
52 return current_ptr;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
53 }
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
54
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
55 int update_passwd(char *filename, char* username, char* encrypted)
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
56 {
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
57 char *filenamesfx = NULL, *namesfx = NULL;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
58 char *shadow = NULL, *sfx = NULL;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
59 FILE *exfp, *newfp;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
60 int ret = -1; //fail
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
61 struct flock lock;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
62 char *line = NULL;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
63
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
64 shadow = strstr(filename, "shadow");
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
65 filenamesfx = xmsprintf("%s+", filename);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
66 sfx = strchr(filenamesfx, '+');
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
67
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
68 exfp = fopen(filename, "r+");
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
69 if(!exfp) {
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
70 perror_msg("Couldn't open file %s",filename);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
71 goto free_storage;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
72 }
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
73
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
74 *sfx = '-';
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
75 ret = unlink(filenamesfx);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
76 ret = link(filename, filenamesfx);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
77 if(ret < 0) error_msg("can't create backup file");
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
78
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
79 *sfx = '+';
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
80 lock.l_type = F_WRLCK;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
81 lock.l_whence = SEEK_SET;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
82 lock.l_start = 0;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
83 lock.l_len = 0;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
84
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
85 ret = fcntl(fileno(exfp), F_SETLK, &lock);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
86 if(ret < 0) perror_msg("Couldn't lock file %s",filename);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
87
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
88 lock.l_type = F_UNLCK; //unlocking at a later stage
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
89
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
90 newfp = fopen(filenamesfx, "w+");
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
91 if(!newfp) {
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
92 error_msg("couldn't open file for writing");
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
93 ret = -1;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
94 fclose(exfp);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
95 goto free_storage;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
96 }
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
97
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
98 ret = 0;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
99 namesfx = xmsprintf("%s:",username);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
100 while((line = get_line(fileno(exfp))) != NULL)
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
101 {
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
102 if(strncmp(line, namesfx, strlen(namesfx)) != 0)
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
103 fprintf(newfp, "%s\n", line);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
104 else {
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
105 char *current_ptr = NULL;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
106 fprintf(newfp, "%s%s:",namesfx,encrypted);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
107 current_ptr = get_nextcolon(line, ':'); //past username
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
108 current_ptr++; //past colon ':' after username
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
109 current_ptr = get_nextcolon(current_ptr, ':'); //past passwd
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
110 current_ptr++; //past colon ':' after passwd
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
111 if(shadow) {
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
112 fprintf(newfp, "%u:",(unsigned)(time(NULL))/(24*60*60));
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
113 current_ptr = get_nextcolon(current_ptr, ':');
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
114 current_ptr++; //past time stamp colon.
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
115 fprintf(newfp, "%s\n",current_ptr);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
116 }
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
117 else {
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
118 fprintf(newfp, "%s\n",current_ptr);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
119 }
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
120 }
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
121
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
122 free(line);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
123 }
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
124 free(namesfx);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
125 fcntl(fileno(exfp), F_SETLK, &lock);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
126 fclose(exfp);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
127
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
128 errno = 0;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
129 fflush(newfp);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
130 fsync(fileno(newfp));
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
131 fclose(newfp);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
132 rename(filenamesfx, filename);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
133 if(errno) {
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
134 perror_msg("File Writing/Saving failed: ");
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
135 unlink(filenamesfx);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
136 ret = -1;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
137 }
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
138
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
139 free_storage:
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
140 free(filenamesfx);
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
141 return ret;
77d94b36aff0 Add passwd by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
142 }