imapext-2007

annotate APOPtools/apoppasswd @ 1:28a55bc1110c

[mq]: imapext
author yuuji@gentei.org
date Mon, 14 Sep 2009 19:23:11 +0900
parents
children d741b3ecc917
rev   line source
yuuji@1 1 #!/usr/local/bin/perl
yuuji@1 2 # Customize these variables.
yuuji@1 3 # If you change APOPFILEBASE, change the same variable in apopcall.c too.
yuuji@1 4 # See http://www.gentei.org/~yuuji/software/imapext/
yuuji@1 5
yuuji@1 6 $HOME=$ENV{"HOME"};
yuuji@1 7
yuuji@1 8 $DEFAULTMAILDIR = "Maildir"; # Must be same as ../src/osdep/unix/Makefile
yuuji@1 9
yuuji@1 10 $APOPFILEBASE = ".apop"; # "$HOME/$APOPFILEBASE" is the password file
yuuji@1 11 # $APOPFILEBASE = "$DEFAULTMAILDIR/apop";
yuuji@1 12 # $APOPFILEBASE = "Mail/apop";
yuuji@1 13
yuuji@1 14 $ENCODER = "cat";
yuuji@1 15 # $ENCODER = "gzip";
yuuji@1 16 # $ENCODER = "uuencode $$|gzip";
yuuji@1 17
yuuji@1 18 $DECODER = "cat";
yuuji@1 19 # $DECODER = "gzip -dc";
yuuji@1 20 # $DECODER = "gzip -dc | uudecode";
yuuji@1 21
yuuji@1 22 $DOTQMAIL = ".qmail"; # qmail
yuuji@1 23 # $DOTQMAIL = ".forward"; # Postfix
yuuji@1 24
yuuji@1 25 $XADDR_DELIM = "-"; # qmail
yuuji@1 26 # $XADDR_DELIM = "+"; # Postfix
yuuji@1 27
yuuji@1 28 $HERE = "."; # qmail
yuuji@1 29 # $HERE = "~"; # Postfix
yuuji@1 30
yuuji@1 31 $EXT = "";
yuuji@1 32 $force = 0;
yuuji@1 33 $base = 0;
yuuji@1 34
yuuji@1 35 $APOPFILE = "$HOME/$APOPFILEBASE";
yuuji@1 36
yuuji@1 37 sub handler {
yuuji@1 38 system "stty echo";
yuuji@1 39 print STDERR "Abort:\n";
yuuji@1 40 exit 1;
yuuji@1 41 }
yuuji@1 42
yuuji@1 43 $SIG{'INT'} = $SIG{'KILL'} = $SIG{'QUIT'} = $SIG{'HUP'} = 'handler';
yuuji@1 44
yuuji@1 45 while ($_=$ARGV[0], /^-.+/ && shift) {
yuuji@1 46 if (/^-e/) {
yuuji@1 47 $APOPFILE .= $XADDR_DELIM . ($EXT=shift);
yuuji@1 48 } elsif (/^-b/) {
yuuji@1 49 $base++;
yuuji@1 50 } elsif (/^-c/) {
yuuji@1 51 $create++;
yuuji@1 52 } elsif (/^-s/) {
yuuji@1 53 $stream++;
yuuji@1 54 # and exit;
yuuji@1 55 } elsif (/^-h/) {
yuuji@1 56 &usage; # and exit
yuuji@1 57 }
yuuji@1 58 }
yuuji@1 59
yuuji@1 60 sub checkmaildir {
yuuji@1 61 local($dotqmail) = ("$HOME/$DOTQMAIL");
yuuji@1 62 local($maildir) = ($DEFAULTMAILDIR); # default
yuuji@1 63 $dotqmail .= "$XADDR_DELIM$EXT" if $EXT;
yuuji@1 64 $maildir .= "-$EXT" if $EXT;
yuuji@1 65 unless (-f "$dotqmail") {
yuuji@1 66 if ($create) {
yuuji@1 67 if (open(DQMAIL, "> $dotqmail")) {
yuuji@1 68 print DQMAIL "$HERE/$maildir/\n";
yuuji@1 69 print "File [$dotqmail] created\n";
yuuji@1 70 close(DQMAIL);
yuuji@1 71 }
yuuji@1 72 } else {
yuuji@1 73 print "$dotqmail file does not exist.\n"; # should go to stdout
yuuji@1 74 print "Your should create $maildir first!\n";
yuuji@1 75 print "(-c option automatically makes it)\n";
yuuji@1 76 exit 1;
yuuji@1 77 }
yuuji@1 78 }
yuuji@1 79 if (-s $dotqmail) {
yuuji@1 80 $maildir='';
yuuji@1 81 if (open(DQMAIL, "< $dotqmail")) {
yuuji@1 82 while (<DQMAIL>) {
yuuji@1 83 s/[\r\n \t]*$//g;
yuuji@1 84 next if /#/;
yuuji@1 85 next unless m,\./.*/,;
yuuji@1 86 chop; # strip trailing "/"
yuuji@1 87 $maildir = $_;
yuuji@1 88 last;
yuuji@1 89 }
yuuji@1 90 close(DQMAIL);
yuuji@1 91 $maildir = $DEFAULTMAILDIR if $maildir eq '';
yuuji@1 92 unless (-d "$HOME/$maildir"
yuuji@1 93 && -d "$HOME/$maildir/new"
yuuji@1 94 && -d "$HOME/$maildir/cur"
yuuji@1 95 && -d "$HOME/$maildir/tmp") {
yuuji@1 96 if ($create) {
yuuji@1 97 mkdir "$HOME/$maildir", 0700;
yuuji@1 98 mkdir "$HOME/$maildir/new", 0700;
yuuji@1 99 mkdir "$HOME/$maildir/cur", 0700;
yuuji@1 100 mkdir "$HOME/$maildir/tmp", 0700;
yuuji@1 101 print "Maildir [$maildir/] created\n";
yuuji@1 102 } else {
yuuji@1 103 print "Maildir($maildir) does not exist\n";
yuuji@1 104 print "Your should do maildirmake $maildir first!\n";
yuuji@1 105 print "(-c option automatically makes it)\n";
yuuji@1 106 exit 1;
yuuji@1 107 }
yuuji@1 108 }
yuuji@1 109 }
yuuji@1 110 }
yuuji@1 111 }
yuuji@1 112
yuuji@1 113 sub usage {
yuuji@1 114 local($mydir, $myname) = ($0 =~ m,(.*)/(.*),);
yuuji@1 115 print<<_EOU_;
yuuji@1 116 $myname Change Mail password for imap-4.7+qmailapop
yuuji@1 117 Usage: $myname [options]
yuuji@1 118 Options are...
yuuji@1 119 -e EXT Set target email address to "user-EXT"
yuuji@1 120 -c If no .qmail file and Maildir, create them
yuuji@1 121
yuuji@1 122 _EOU_
yuuji@1 123 exit 0;
yuuji@1 124 }
yuuji@1 125
yuuji@1 126 if ($stream) {
yuuji@1 127 &stream;
yuuji@1 128 exit; # not reached
yuuji@1 129 }
yuuji@1 130 $OK=0;
yuuji@1 131 until ($OK) {
yuuji@1 132 system "stty -echo";
yuuji@1 133 print STDERR "Enter APOP Password: ";
yuuji@1 134 $new1 = <>;
yuuji@1 135 print STDERR "\n";
yuuji@1 136 if (length($new1) == 1) {
yuuji@1 137 print STDERR "Canceled\n";
yuuji@1 138 exit 1;
yuuji@1 139 } elsif (length($new1) < 9) {
yuuji@1 140 print STDERR "Password is too short! Please use more than 8 chars.\n";
yuuji@1 141 next;
yuuji@1 142 }
yuuji@1 143 print STDERR "Again APOP Password: ";
yuuji@1 144 $new2 = <>;
yuuji@1 145 if ($new1 eq $new2) {
yuuji@1 146 $OK=1;
yuuji@1 147 } else {
yuuji@1 148 print STDERR "\nPassword mismatch! Try again.\n";
yuuji@1 149 }
yuuji@1 150 }
yuuji@1 151 #OK
yuuji@1 152 &checkmaildir;
yuuji@1 153 system "stty echo";
yuuji@1 154 open(NP, "| $ENCODER > $APOPFILE") || die "Cannot write on $APOPFILE\n";
yuuji@1 155 print NP "$new1";
yuuji@1 156 close(NP);
yuuji@1 157 chmod 0600, $APOPFILE;
yuuji@1 158 print STDERR "\nUpdated APOP password successfully.\n";
yuuji@1 159
yuuji@1 160 sub stream { # Must match with old password
yuuji@1 161 local($PASS, $old, $new1, $new2, $master) = (0);
yuuji@1 162 local($masterfile) = ($APOPFILE);
yuuji@1 163 $masterfile = "$HOME/$APOPFILEBASE" if $base;
yuuji@1 164 exit 1 if ($> == 0);
yuuji@1 165 while (<>) {
yuuji@1 166 chop;
yuuji@1 167 if (/^PASS (.*)$/i) {
yuuji@1 168 $old = $1;
yuuji@1 169 } elsif (/^NEW (.*)/i) {
yuuji@1 170 $new1 = $1;
yuuji@1 171 } elsif (/^NEW2 (.*)/i) {
yuuji@1 172 $new2 = $1;
yuuji@1 173 }
yuuji@1 174 last if ("$new1" ne "" && "$new2" ne "");
yuuji@1 175 }
yuuji@1 176 if (-s $APOPFILE || ($base && -f $masterfile)) { # Already exist
yuuji@1 177 if (open(OLD, "$DECODER $masterfile |")) {
yuuji@1 178 ($master = <OLD>) =~ s/[\n\r]$//g;
yuuji@1 179 close(OLD);
yuuji@1 180 } else {
yuuji@1 181 print "Old password file corrupted.\n";
yuuji@1 182 print "Please ask to administrator.\n";
yuuji@1 183 exit 1;
yuuji@1 184 }
yuuji@1 185 if ($master ne $old) {
yuuji@1 186 print "Illegal password\nBye\n";
yuuji@1 187 exit 1;
yuuji@1 188 }
yuuji@1 189 }
yuuji@1 190 if ($new1 ne $new2) {
yuuji@1 191 print "Password(new) mismatch\nBye\n";
yuuji@1 192 exit 1;
yuuji@1 193 }
yuuji@1 194 # OK, now begin to create!
yuuji@1 195 &checkmaildir;
yuuji@1 196 if (open(P, "| $ENCODER > $APOPFILE")) {
yuuji@1 197 # open success
yuuji@1 198 print P "$new1\n";
yuuji@1 199 close(P);
yuuji@1 200 chmod 0600, $APOPFILE;
yuuji@1 201 if (-s $APOPFILE) {
yuuji@1 202 print "Success!\n";
yuuji@1 203 exit 0;
yuuji@1 204 }
yuuji@1 205 } else {
yuuji@1 206 print "Cannot output to $APOPFILE\nBye\n";
yuuji@1 207 exit 1;
yuuji@1 208 }
yuuji@1 209 exit 0;
yuuji@1 210 }

UW-IMAP'd extensions by yuuji