files.c
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:13k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. /* System-dependent definitions of various files, spool directories, etc */
  2. #include <stdio.h>
  3. #include <ctype.h>
  4. #include "global.h"
  5. #include "netuser.h"
  6. #include "files.h"
  7. #include "md5.h"
  8. #ifdef MSDOS
  9. char System[] = "MSDOS";
  10. char *Startup = "/autoexec.net"; /* Initialization file */
  11. char *Userfile = "/ftpusers"; /* Authorized FTP users and passwords */
  12. char *Maillog = "/spool/mail.log"; /* mail log */
  13. char *Mailspool = "/spool/mail"; /* Incoming mail */
  14. char *Mailqdir = "/spool/mqueue"; /* Outgoing mail spool */
  15. char *Mailqueue = "/spool/mqueue/*.wrk"; /* Outgoing mail work files */
  16. char *Routeqdir = "/spool/rqueue"; /* queue for router */
  17. char *Alias = "/alias"; /* the alias file */
  18. char *Dfile = "/domain.txt"; /* Domain cache */
  19. char *Fdir = "/finger"; /* Finger info directory */
  20. char *Arealist = "/spool/areas";/* List of message areas */
  21. char *Helpdir = "/spool/help"; /* Mailbox help file directory */
  22. char *Rewritefile = "/spool/rewrite"; /* Address rewrite file */
  23. char *Newsdir = "/spool/news"; /* News messages and NNTP data */
  24. char *Popusers = "/popusers"; /* POP user and passwd file */
  25. char *Signature = "/spool/signatur"; /* Mail signature file directory */
  26. char *Forwardfile = "/spool/forward.bbs"; /* Mail forwarding file */
  27. char *Historyfile = "/spool/history"; /* Message ID history file */
  28. char *Tmpdir = "/tmp";
  29. char Eol[] = "rn";
  30. #define SEPARATOR "/"
  31. #endif
  32. #ifdef UNIX
  33. char System[] = "UNIX";
  34. char *Startup = "./startup.net"; /* Initialization file */
  35. char *Config = "./config.net"; /* Device configuration list */
  36. char *Userfile = "./ftpusers";
  37. char *Mailspool = "./mail";
  38. char *Maillog = "./mail.log"; /* mail log */
  39. char *Mailqdir = "./mqueue";
  40. char *Mailqueue = "./mqueue/*.wrk";
  41. char *Routeqdir = "./rqueue"; /* queue for router */
  42. char *Alias = "./alias"; /* the alias file */
  43. char *Dfile = "./domain.txt"; /* Domain cache */
  44. char *Fdir = "./finger"; /* Finger info directory */
  45. char *Arealist = "./areas"; /* List of message areas */
  46. char *Helpdir = "./help"; /* Mailbox help file directory */
  47. char *Rewritefile = "./rewrite"; /* Address rewrite file */
  48. char *Newsdir = "./news"; /* News messages and NNTP data */
  49. char *Popusers = "./popusers"; /* POP user and passwd file */
  50. char *Signature = "./signatur"; /* Mail signature file directory */
  51. char *Forwardfile = "./forward.bbs"; /* Mail forwarding file */
  52. char *Historyfile = "./history"; /* Message ID history file */
  53. Char *Tmpdir = "/tmp";
  54. #define SEPARATOR "/"
  55. char Eol[] = "n";
  56. #endif
  57. #ifdef AMIGA
  58. char System[] = "AMIGA";
  59. char *Startup = "TCPIP:net-startup";
  60. char *Config = "TCPIP:config.net"; /* Device configuration list */
  61. char *Userfile = "TCPIP:ftpusers";
  62. char *Mailspool = "TCPIP:spool/mail";
  63. char *Maillog = "TCPIP:spool/mail.log";
  64. char *Mailqdir = "TCPIP:spool/mqueue";
  65. char *Mailqueue = "TCPIP:spool/mqueue/#?.wrk";
  66. char *Routeqdir = "TCPIP:spool/rqueue"; /* queue for router */
  67. char *Alias = "TCPIP:alias"; /* the alias file */
  68. char *Dfile = "TCPIP:domain.txt"; /* Domain cache */
  69. char *Fdir = "TCPIP:finger"; /* Finger info directory */
  70. char *Arealist = "TCPIP:spool/areas"; /* List of message areas */
  71. char *Helpdir = "TCPIP:spool/help"; /* Mailbox help file directory */
  72. char *Rewritefile = "TCPIP:spool/rewrite"; /* Address rewrite file */
  73. char *Newsdir = "TCPIP:spool/news"; /* News messages and NNTP data */
  74. char *Popusers = "TCPIP:/popusers"; /* POP user and passwd file */
  75. char *Signature = "TCPIP:spool/signatur"; /* Mail signature file directory */
  76. char *Forwardfile = "TCPIP:spool/forward.bbs"; /* Mail forwarding file */
  77. char *Historyfile = "TCPIP:spool/history"; /* Message ID history file */
  78. Char *Tmpdir = "TCPIP:tmp";
  79. #define SEPARATOR "/"
  80. char Eol[] = "rn";
  81. #endif
  82. #ifdef MAC
  83. char System[] = "MACOS";
  84. char *Startup ="Mikes Hard Disk:net.start";
  85. char *Config = "Mikes Hard Disk:config.net"; /* Device configuration list */
  86. char *Userfile = "Mikes Hard Disk:ftpusers";
  87. char *Mailspool = "Mikes Hard Disk:spool:mail:";
  88. char *Maillog = "Mikes Hard Disk:spool:mail.log:";
  89. char *Mailqdir = "Mikes Hard Disk:spool:mqueue:";
  90. char *Mailqueue = "Mikes Hard Disk:spool:mqueue:*.wrk";
  91. char *Routeqdir = "Mikes Hard Disk:spool/rqueue:"; /* queue for router */
  92. char *Alias = "Mikes Hard Disk:alias"; /* the alias file */
  93. char *Dfile = "Mikes Hard Disk:domain:txt"; /* Domain cache */
  94. char *Fdir = "Mikes Hard Disk:finger"; /* Finger info directory */
  95. char *Arealist = "Mikes Hard Disk:spool/areas"; /* List of message areas */
  96. char *Helpdir = "Mikes Hard Disk:spool/help"; /* Mailbox help file directory */
  97. char *Rewritefile = "Mikes Hard Disk:spool/rewrite"; /* Address rewrite file */
  98. char *Newsdir = "Mikes Hard Disk:spool/news"; /* News messages and NNTP data */
  99. char *Popusers = "Mikes Hard Disk:/popusers"; /* POP user and passwd file */
  100. char *Signature = "Mikes Hard Disk:spool/signatur"; /* Mail signature file directory */
  101. char *Forwardfile = "Mikes Hard Disk:spool/forward.bbs"; /* Mail forwarding file */
  102. char *Historyfile = "Mikes Hard Disk:spool/history"; /* Message ID history file */
  103. Char *Tmpdir = "Mikes Hard Disk:tmp";
  104. #define SEPARATOR "/"
  105. char Eol[] = "r";
  106. #endif
  107. static char *rootdir = "";
  108. /* Establish a root directory other than the default. Can only be called
  109.  * once, at startup time
  110.  */
  111. void
  112. initroot(root)
  113. char *root;
  114. {
  115. rootdir = strdup( root );
  116. Startup = rootdircat(Startup);
  117. Userfile = rootdircat(Userfile);
  118. Maillog = rootdircat(Maillog);
  119. Mailspool = rootdircat(Mailspool);
  120. Mailqdir = rootdircat(Mailqdir);
  121. Mailqueue = rootdircat(Mailqueue);
  122. Routeqdir = rootdircat(Routeqdir);
  123. Alias = rootdircat(Alias);
  124. Dfile = rootdircat(Dfile);
  125. Fdir = rootdircat(Fdir);
  126. Arealist = rootdircat(Arealist);
  127. Helpdir = rootdircat(Helpdir);
  128. Rewritefile = rootdircat(Rewritefile);
  129. Newsdir = rootdircat(Newsdir);
  130. Signature = rootdircat(Signature);
  131. Forwardfile = rootdircat(Forwardfile);
  132. Historyfile = rootdircat(Historyfile);
  133. }
  134. /* Concatenate root, separator and arg strings into a malloc'ed output
  135.  * buffer, then remove repeated occurrences of the separator char
  136.  */
  137. char *
  138. rootdircat(filename)
  139. char *filename;
  140. {
  141. char *out = filename;
  142. if ( strlen(rootdir) > 0 ) {
  143. char *separator = SEPARATOR;
  144. out = mallocw( strlen(rootdir)
  145. + strlen(separator)
  146. + strlen(filename) + 1);
  147. strcpy(out,rootdir);
  148. strcat(out,separator);
  149. strcat(out,filename);
  150. if(*separator != ''){
  151. char *p1, *p2;
  152. /* Remove any repeated occurrences */
  153. p1 = p2 = out;
  154. while(*p2 != ''){
  155. *p1++ = *p2++;
  156. while(p2[0] == p2[-1] && p2[0] == *separator)
  157. p2++;
  158. }
  159. *p1 = '';
  160. }
  161. }
  162. return out;
  163. }
  164. /* Read through FTPUSERS looking for user record
  165.  * Returns line which matches username, or NULL when no match.
  166.  * Each of the other variables must be copied before freeing the line.
  167.  */
  168. char *
  169. userlookup(username,password,directory,permission,ip_address)
  170. char *username;
  171. char **password;
  172. char **directory;
  173. int   *permission;
  174. int32 *ip_address;
  175. {
  176. FILE *fp;
  177. char *buf;
  178. char *cp;
  179. if((fp = fopen(Userfile,READ_TEXT)) == NULL)
  180. /* Userfile doesn't exist */
  181. return NULL;
  182. buf = mallocw(BUFSIZ);
  183. while ( fgets(buf,BUFSIZ,fp) != NULL ){
  184. if(*buf == '#')
  185. continue; /* Comment */
  186. if((cp = strchr(buf,' ')) == NULL)
  187. /* Bogus entry */
  188. continue;
  189. *cp++ = ''; /* Now points to password */
  190. if( stricmp(username,buf) == 0 )
  191. break; /* Found user */
  192. }
  193. if(feof(fp)){
  194. /* username not found in file */
  195. fclose(fp);
  196. free(buf);
  197. return NULL;
  198. }
  199. fclose(fp);
  200. if ( password != NULL )
  201. *password = cp;
  202. /* Look for space after password field in file */
  203. if((cp = strchr(cp,' ')) == NULL) {
  204. /* Invalid file entry */
  205. free(buf);
  206. return NULL;
  207. }
  208. *cp++ = ''; /* Now points to directory field */
  209. if ( directory != NULL )
  210. *directory = cp;
  211. if((cp = strchr(cp,' ')) == NULL) {
  212. /* Permission field missing */
  213. free(buf);
  214. return NULL;
  215. }
  216. *cp++ = ''; /* now points to permission field */
  217. if ( permission != NULL )
  218. *permission = (int)strtol( cp, NULL, 0 );
  219. if((cp = strchr(cp,' ')) == NULL) {
  220. /* IP address missing */
  221. if ( ip_address != NULL )
  222. *ip_address = 0L;
  223. } else {
  224. *cp++ = ''; /* now points at IP address field */
  225. if ( ip_address != NULL )
  226. *ip_address = resolve( cp );
  227. }
  228. return buf;
  229. }
  230. /* Subroutine for logging in the user whose name is name and password is pass.
  231.  * The buffer path should be long enough to keep a line from the userfile.
  232.  * If pwdignore is true, the password check will be overridden.
  233.  * The return value is the permissions field or -1 if the login failed.
  234.  * Path is set to point at the path field, and pwdignore will be true if no
  235.  * particular password was needed for this user.
  236.  */
  237. int
  238. userlogin(name,pass,path,len,pwdignore)
  239. char *name;
  240. char *pass;
  241. char **path;
  242. int len; /* Length of buffer pointed at by *path */
  243. int *pwdignore;
  244. {
  245. char *buf;
  246. char *password;
  247. char *directory;
  248. int permission;
  249. int anonymous;
  250. char *cp;
  251. uint8 hashpass[16],digest[16];
  252. MD5_CTX md;
  253. if ( (buf = userlookup( name, &password, &directory,
  254. &permission, NULL )) == NULL ) {
  255. return -1;
  256. }
  257. anonymous = *pwdignore;
  258. if(strcmp(password,"*") == 0){
  259. anonymous = TRUE; /* User ID is password-free */
  260. } else {
  261. if(readhex(hashpass,password,sizeof(hashpass)) != sizeof(hashpass)){
  262. /* Invalid hashed password in file */
  263. free(buf);
  264. return -1;
  265. }
  266. MD5Init(&md);
  267. MD5Update(&md,(unsigned char *)name,strlen(name));
  268. MD5Update(&md,(unsigned char *)pass,strlen(pass));
  269. MD5Final(digest,&md);
  270. if(memcmp(digest,hashpass,sizeof(hashpass)) != 0){
  271. /* Incorrect password given */
  272. free(buf);
  273. return -1;
  274. }
  275. }
  276. if ( strlen( directory ) + 1 > len ) {
  277. /* not enough room for path */
  278. free(buf);
  279. return -1;
  280. }
  281. #if   defined(AMIGA)
  282. /*
  283.  * Well, on the Amiga, a file can be referenced by many names:
  284.  * device names (DF0:) or volume names (My_Disk:).  This hunk of code
  285.  * passed the pathname specified in the ftpusers file, and gets the
  286.  * absolute path copied into the user's buffer.  We really should just
  287.  * allocate the buffer and return a pointer to it, since the caller
  288.  * really doesn't have a good idea how long the path string is..
  289.  */
  290. if ( (directory = pathname("", directory)) != NULL ) {
  291. strcpy(*path, directory);
  292. free(directory);
  293. } else {
  294. **path = '';
  295. }
  296. #else
  297. strcpy(*path,directory);
  298. /* Convert any backslashes to forward slashes, for backward
  299.  * compatibility with the old NET
  300.  */
  301. while((cp = strchr(*path,'\')) != NULL)
  302. *cp = '/';
  303. #endif
  304. free(buf);
  305. *pwdignore = anonymous;
  306. /* Finally return the permission bits */
  307. return permission;
  308. }
  309. /* MD5 hash plaintext passwords in user file */
  310. void
  311. usercvt()
  312. {
  313. FILE *fp,*fptmp;
  314. char *buf;
  315. uint8 hexbuf[16],digest[16];
  316. int needsit = 0;
  317. int len,nlen,plen,i;
  318. char *pass;
  319. MD5_CTX md;
  320. if((fp = fopen(Userfile,READ_TEXT)) == NULL)
  321. return; /* Userfile doesn't exist */
  322. buf = mallocw(BUFSIZ);
  323. while(fgets(buf,BUFSIZ,fp) != NULL){
  324. rip(buf);
  325. len = strlen(buf);
  326. if(len == 0 || *buf == '#')
  327. continue; /* Blank or comment line */
  328. if((nlen = strcspn(buf,Whitespace)) == len)
  329. continue; /* No end to the name! */
  330. /* Skip whitespace between name and pass */
  331. for(pass=&buf[nlen];isspace(*pass);pass++)
  332. ;
  333. if(*pass != '' && *pass != '*'
  334.  && readhex(hexbuf,pass,sizeof(hexbuf)) != 16){
  335. needsit = 1;
  336. break;
  337. }
  338. }
  339. if(!needsit){
  340. /* Everything is in order */
  341. fclose(fp);
  342. free(buf);
  343. return;
  344. }
  345. /* At least one entry needs its password hashed */
  346. rewind(fp);
  347. fptmp = tmpfile();
  348. while(fgets(buf,BUFSIZ,fp) != NULL){
  349. rip(buf);
  350. if((len = strlen(buf)) == 0 || *buf == '#'
  351.  || (nlen = strcspn(buf,Whitespace)) == len){
  352. /* Line is blank, a comment or unparseable;
  353.  * copy unchanged
  354.  */
  355. fputs(buf,fptmp);
  356. fputc('n',fptmp);
  357. continue;
  358. }
  359. /* Skip whitespace between name and pass */
  360. for(pass=&buf[nlen];isspace(*pass);pass++)
  361. ;
  362. if(*pass == '' || *pass == '*'
  363.  || (plen = strcspn(pass,Whitespace)) == strlen(pass)
  364.  || readhex(hexbuf,pass,sizeof(hexbuf)) == sizeof(hexbuf)){
  365. /* Other fields are missing, no password is required,
  366.  * or password is already hashed; copy unchanged
  367.  */
  368. fputs(buf,fptmp);
  369. fputc('n',fptmp);
  370. continue;
  371. }
  372. MD5Init(&md);
  373. MD5Update(&md,(unsigned char *)buf,nlen); /* Hash name */
  374. MD5Update(&md,(unsigned char *)pass,plen); /* Hash password */
  375. MD5Final(digest,&md);
  376. fwrite(buf,1,nlen,fptmp); /* Write name */
  377. fputc(' ',fptmp); /* and space */
  378. for(i=0;i<16;i++) /* Write hashed password */
  379. fprintf(fptmp,"%02x",digest[i]);
  380. fputs(&pass[plen],fptmp); /* Write remainder of line */
  381. fputc('n',fptmp);
  382. }
  383. /* Now copy the temp file back into the userfile */
  384. fclose(fp);
  385. rewind(fptmp);
  386. if((fp = fopen(Userfile,WRITE_TEXT)) == NULL){
  387. printf("Can't rewrite %sn",Userfile);
  388. free(buf);
  389. return;
  390. }
  391. while(fgets(buf,BUFSIZ,fptmp) != NULL)
  392. fputs(buf,fp);
  393. fclose(fp);
  394. fclose(fptmp);
  395. free(buf);
  396. }