00001
00002
00003 #include "crypt2.hh"
00004
00005 #include <stdio.h>
00006 #include <string.h>
00007 #include <stdlib.h>
00008 #include <errno.h>
00009 #include <ctype.h>
00010
00011 #ifdef linux
00012 #include <pwd.h>
00013 #endif
00014
00015 #ifdef VXWORKS
00016 #ifdef __cplusplus
00017 extern "C" int nmlpwd ();
00018 #endif
00019
00020 int
00021 nmlpwd ()
00022 {
00023 int argc = 1;
00024 char **argv = NULL;
00025 #else
00026
00027 int
00028 main (int argc, char **argv)
00029 {
00030 #endif
00031 char old_passwd_file[256];
00032 char new_passwd_file[256];
00033 char user_passwd[16];
00034 char user_logname[16];
00035 char temp_buffer[256];
00036 char *crypt_ret;
00037 char encrypted_passwd[16];
00038 int allow_read = 0;
00039 int allow_write = 0;
00040 int seed;
00041 int i;
00042 char new_line[256];
00043 char salt[3];
00044 int user_logname_length;
00045 int user_found = 0;
00046 char *end_line = NULL;
00047 char *getpass_ret = NULL;
00048
00049 FILE *fp_old = NULL;
00050 FILE *fp_new = NULL;
00051
00052 if (argc > 1)
00053 {
00054 strncpy (old_passwd_file, argv[1], 256);
00055 }
00056 else
00057 {
00058 printf ("Old Password File:(type none to create a file from scratch)");
00059 fgets (old_passwd_file, 256, stdin);
00060 }
00061 end_line = strpbrk (old_passwd_file, "\r\n");
00062 if (end_line != NULL)
00063 {
00064 *end_line = 0;
00065 }
00066 if (old_passwd_file[0] != 0)
00067 {
00068 if (strcmp (old_passwd_file, "none"))
00069 {
00070 fp_old = fopen (old_passwd_file, "r");
00071 if (fp_old == NULL)
00072 {
00073 fprintf (stderr, "Can not open %s. errno = %d -- %s\n",
00074 old_passwd_file, errno, strerror (errno));
00075 exit (-1);
00076 }
00077 }
00078 }
00079
00080 if (argc > 1)
00081 {
00082 strncpy (new_passwd_file, argv[1], 256);
00083 }
00084 else
00085 {
00086 printf ("New Password File:");
00087 fgets (new_passwd_file, 256, stdin);
00088 }
00089 end_line = strpbrk (new_passwd_file, "\r\n");
00090 if (end_line != NULL)
00091 {
00092 *end_line = 0;
00093 }
00094
00095 if (!strcmp (new_passwd_file, old_passwd_file))
00096 {
00097 fprintf (stderr,
00098 "New passwd file must be different from old passwd file.\n");
00099 exit (-1);
00100 }
00101
00102 fp_new = fopen (new_passwd_file, "w");
00103 if (NULL == fp_new)
00104 {
00105 fprintf (stderr, "Can not open/create %s. errno = %d -- %s\n",
00106 new_passwd_file, errno, strerror (errno));
00107 exit (-1);
00108 }
00109 if (argc > 3)
00110 {
00111 strncpy (user_logname, argv[3], 16);
00112 }
00113 else
00114 {
00115 printf ("Login name:");
00116 fgets (user_logname, 16, stdin);
00117 }
00118 end_line = strpbrk (user_logname, "\r\n");
00119 if (end_line != NULL)
00120 {
00121 *end_line = 0;
00122 }
00123 user_logname_length = strlen (user_logname);
00124 if (user_logname_length < 2)
00125 {
00126 fprintf (stderr, "Login name %s is too short.\n", user_logname);
00127 exit (-1);
00128 }
00129
00130 if (argc > 4)
00131 {
00132 strncpy (user_passwd, argv[4], 16);
00133 }
00134 else
00135 {
00136 while (1)
00137 {
00138 getpass_ret = getpass ("Password:");
00139 if (NULL == getpass_ret)
00140 {
00141 fprintf (stderr, "getpass() failed. errno = %d -- %s\n",
00142 errno, strerror (errno));
00143 exit (-1);
00144 }
00145 strncpy (user_passwd, getpass_ret, 16);
00146 getpass_ret = getpass ("Retype Password:");
00147 if (!strcmp (getpass_ret, user_passwd))
00148 {
00149 break;
00150 }
00151 printf ("Passwd did not match.\n");
00152 }
00153 }
00154 end_line = strpbrk (user_passwd, "\r\n");
00155 if (end_line != NULL)
00156 {
00157 *end_line = 0;
00158 }
00159
00160 printf ("Should %s be allowed to read?(y/n)", user_logname);
00161 fgets (temp_buffer, 256, stdin);
00162 allow_read = (temp_buffer[0] == 'y' || temp_buffer[0] == 'Y');
00163
00164
00165 printf ("Should %s be allowed to write?(y/n)", user_logname);
00166 fgets (temp_buffer, 256, stdin);
00167 allow_write = (temp_buffer[0] == 'y' || temp_buffer[0] == 'Y');
00168
00169 if (strlen (user_passwd) > 1)
00170 {
00171 seed = 1000;
00172
00173 for (i = 0; i < 256 && new_passwd_file[i]; i++)
00174 {
00175 seed += new_passwd_file[i];
00176 }
00177
00178 for (i = 0; i < 16 && user_logname[i]; i++)
00179 {
00180 seed += user_logname[i];
00181 }
00182
00183 for (i = 0; i < 16 && user_passwd[i]; i++)
00184 {
00185 seed += user_passwd[i];
00186 }
00187 srand (seed);
00188 salt[0] = rand () % 128;
00189 while (!isgraph (salt[0])
00190 && salt[0] != ' '
00191 && salt[0] != '\t'
00192 && salt[0] != '\r'
00193 && salt[0] != '\n' && salt[0] != ':' && salt[0] != 0)
00194 {
00195 salt[0] = rand () % 128;
00196 }
00197 salt[1] = rand () % 128;
00198 while (!isgraph (salt[1])
00199 && salt[1] != ' '
00200 && salt[1] != '\t'
00201 && salt[1] != '\r'
00202 && salt[1] != '\n' && salt[1] != ':' && salt[1] != 1)
00203 {
00204 salt[1] = rand () % 128;
00205 }
00206 salt[2] = 0;
00207
00208 crypt_ret = rcs_crypt (user_passwd, salt);
00209 if (NULL == crypt_ret)
00210 {
00211 fprintf (stderr, "crypt failed.\n");
00212 exit (-1);
00213 }
00214 strncpy (encrypted_passwd, crypt_ret, 16);
00215
00216 sprintf (new_line, "%s:%s:", user_logname, encrypted_passwd);
00217 }
00218 else
00219 {
00220 sprintf (new_line, "%s::", user_logname);
00221 }
00222 if (allow_read)
00223 {
00224 strcat (new_line, " read=true,");
00225 }
00226 else
00227 {
00228 strcat (new_line, " read=false,");
00229 }
00230 if (allow_write)
00231 {
00232 strcat (new_line, " write=true");
00233 }
00234 else
00235 {
00236 strcat (new_line, " write=false");
00237 }
00238
00239 printf ("New line will be:\n");
00240 puts (new_line);
00241
00242 if (NULL != fp_old)
00243 {
00244 while (!feof (fp_old))
00245 {
00246 memset (temp_buffer, 0, 256);
00247 fgets (temp_buffer, 256, fp_old);
00248 if (!temp_buffer[0])
00249 {
00250 continue;
00251 }
00252 if (!strncmp (temp_buffer, user_logname, user_logname_length))
00253 {
00254 if (!user_found)
00255 {
00256 fputs (new_line, fp_new);
00257 fputs ("\n", fp_new);
00258 }
00259 user_found = 1;
00260 }
00261 else
00262 {
00263 fputs (temp_buffer, fp_new);
00264 }
00265 }
00266 }
00267 if (!user_found)
00268 {
00269 fputs (new_line, fp_new);
00270 fputs ("\n", fp_new);
00271 }
00272 }