📄 pg_passwd.c
字号:
/* * @(#) pg_passwd.c 1.8 09:13:16 97/07/02 Y. Ichikawa */#include "postgres.h"#include <stdio.h>#include <stdlib.h>#if defined(HAVE_STRING_H)#include <string.h>#else#include <strings.h>#endif#include <unistd.h>#include <errno.h>#include <time.h>#include <ctype.h>#define issaltchar(c) (isalnum(c) || (c) == '.' || (c) == '/')#ifdef HAVE_TERMIOS_H#include <termios.h>#endif#ifdef HAVE_CRYPT_H#include <crypt.h>#elseextern char *crypt(const char *, const char *);#endifchar *comname;static void usage(FILE *stream);static void read_pwd_file(char *filename);static void write_pwd_file(char *filename, char *bkname);static void encrypt_pwd(char key[9], char salt[3], char passwd[14]);static void prompt_for_username(char *username);static void prompt_for_password(char *prompt, char *password);static voidusage(FILE *stream){ fprintf(stream, "Usage: %s <password file>\n", comname);}typedef struct{ char *uname; char *pwd; char *rest;} pg_pwd;#define MAXPWDS 1024pg_pwd pwds[MAXPWDS];int npwds = 0;static voidread_pwd_file(char *filename){ FILE *fp; static char line[512]; static char ans[128]; int i;try_again:#ifndef __CYGWIN32__ fp = fopen(filename, "r");#else fp = fopen(filename, "rb");#endif if (fp == NULL) { if (errno == ENOENT) { printf("File \"%s\" does not exist. Create? (y/n): ", filename); fflush(stdout); fgets(ans, 128, stdin); switch (ans[0]) { case 'y': case 'Y':#ifndef __CYGWIN32__ fp = fopen(filename, "w");#else fp = fopen(filename, "wb");#endif if (fp == NULL) { perror(filename); exit(1); } fclose(fp); goto try_again; default: /* cannot continue */ exit(1); } } else { perror(filename); exit(1); } } /* read all the entries */ for (npwds = 0; npwds < MAXPWDS && fgets(line, 512, fp) != NULL; ++npwds) { int l; char *p, *q; l = strlen(line); if (line[l - 1] == '\n') line[l - 1] = '\0'; else { /* too long */ fprintf(stderr, "%s: line %d: line too long.\n", filename, npwds + 1); exit(1); } /* get user name */ p = line; if ((q = strchr(p, ':')) == NULL) { fprintf(stderr, "%s: line %d: illegal format.\n", filename, npwds + 1); exit(1); } *(q++) = '\0'; if (strlen(p) == 0) { fprintf(stderr, "%s: line %d: null user name.\n", filename, npwds + 1); exit(1); } pwds[npwds].uname = strdup(p); /* check duplicate */ for (i = 0; i < npwds; ++i) { if (strcmp(pwds[i].uname, pwds[npwds].uname) == 0) { fprintf(stderr, "%s: duplicated entry.\n", pwds[npwds].uname); exit(1); } } /* get password field */ p = q; q = strchr(p, ':'); /* * --- don't care ----- if ((q = strchr(p, ':')) == NULL) { * fprintf(stderr, "%s: line %d: illegal format.\n", filename, * npwds + 1); exit(1); } */ if (q != NULL) *(q++) = '\0'; if (strlen(p) != 13) { fprintf(stderr, "WARNING: %s: line %d: illegal password length.\n", filename, npwds + 1); } pwds[npwds].pwd = strdup(p); /* rest of the line is treated as is */ if (q == NULL) pwds[npwds].rest = NULL; else pwds[npwds].rest = strdup(q); } fclose(fp);}static voidwrite_pwd_file(char *filename, char *bkname){ FILE *fp; int i; /* make the backup file */link_again: if (link(filename, bkname)) { if (errno == EEXIST) { unlink(bkname); goto link_again; } perror(bkname); exit(1); } if (unlink(filename)) { perror(filename); exit(1); } /* open file */#ifndef __CYGWIN32__ if ((fp = fopen(filename, "w")) == NULL)#else if ((fp = fopen(filename, "wb")) == NULL)#endif { perror(filename); exit(1); } /* write file */ for (i = 0; i < npwds; ++i) { fprintf(fp, "%s:%s%s%s\n", pwds[i].uname, pwds[i].pwd, pwds[i].rest ? ":" : "", pwds[i].rest ? pwds[i].rest : ""); } fclose(fp);}static voidencrypt_pwd(char key[9], char salt[3], char passwd[14]){ int n; /* get encrypted password */ if (salt[0] == '\0') { srand(time(NULL)); do { n = rand() % 256; } while (!issaltchar(n)); salt[0] = n; do { n = rand() % 256; } while (!issaltchar(n)); salt[1] = n; salt[2] = '\0'; } strcpy(passwd, crypt(key, salt)); /* show it */ /* * fprintf(stderr, "key = %s, salt = %s, password = %s\n", key, salt, * passwd); */}#ifdef NOT_USEDstatic intcheck_pwd(char key[9], char passwd[14]){ char shouldbe[14]; char salt[3]; salt[0] = passwd[0]; salt[1] = passwd[1]; salt[2] = '\0'; encrypt_pwd(key, salt, shouldbe); return strncmp(shouldbe, passwd, 13) == 0 ? 1 : 0;}#endifstatic voidprompt_for_username(char *username){ int length; printf("Username: "); fgets(username, 9, stdin); length = strlen(username); /* skip rest of the line */ if (length > 0 && username[length - 1] != '\n') { static char buf[512]; do { fgets(buf, 512, stdin); } while (buf[strlen(buf) - 1] != '\n'); } if (length > 0 && username[length - 1] == '\n') username[length - 1] = '\0';}static voidprompt_for_password(char *prompt, char *password){ int length;#ifdef HAVE_TERMIOS_H struct termios t_orig, t;#endif printf(prompt);#ifdef HAVE_TERMIOS_H tcgetattr(0, &t); t_orig = t; t.c_lflag &= ~ECHO; tcsetattr(0, TCSADRAIN, &t);#endif fgets(password, 9, stdin);#ifdef HAVE_TERMIOS_H tcsetattr(0, TCSADRAIN, &t_orig);#endif length = strlen(password); /* skip rest of the line */ if (length > 0 && password[length - 1] != '\n') { static char buf[512]; do { fgets(buf, 512, stdin); } while (buf[strlen(buf) - 1] != '\n'); } if (length > 0 && password[length - 1] == '\n') password[length - 1] = '\0'; printf("\n");}intmain(int argc, char *argv[]){ static char bkname[512]; char username[9]; char salt[3]; char key[9], key2[9]; char e_passwd[14]; int i; comname = argv[0]; if (argc != 2) { usage(stderr); exit(1); } /* open file */ read_pwd_file(argv[1]); /* ask for the user name and the password */ prompt_for_username(username); prompt_for_password("New password: ", key); prompt_for_password("Re-enter new password: ", key2); if (strncmp(key, key2, 8) != 0) { fprintf(stderr, "Password mismatch.\n"); exit(1); } salt[0] = '\0'; encrypt_pwd(key, salt, e_passwd); /* check password entry */ for (i = 0; i < npwds; ++i) { if (strcmp(pwds[i].uname, username) == 0) { /* found */ pwds[i].pwd = strdup(e_passwd); break; } } if (i == npwds) { /* did not exist */ if (npwds == MAXPWDS) { fprintf(stderr, "%s: cannot handle so may entries.\n", comname); exit(1); } pwds[npwds].uname = strdup(username); pwds[npwds].pwd = strdup(e_passwd); pwds[npwds].rest = NULL; ++npwds; } /* write back the file */ sprintf(bkname, "%s.bk", argv[1]); write_pwd_file(argv[1], bkname); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -