imapext-2007

annotate APOPtools/apoppasswd @ 4:d741b3ecc917

imapext-2007f
author HIROSE Yuuji <yuuji@gentei.org>
date Thu, 30 Oct 2014 00:03:05 +0900
parents 28a55bc1110c
children
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 }
yuuji@4 211 #!/usr/local/bin/perl
yuuji@4 212 # Customize these variables.
yuuji@4 213 # If you change APOPFILEBASE, change the same variable in apopcall.c too.
yuuji@4 214 # See http://www.gentei.org/~yuuji/software/imapext/
yuuji@4 215
yuuji@4 216 $HOME=$ENV{"HOME"};
yuuji@4 217
yuuji@4 218 $DEFAULTMAILDIR = "Maildir"; # Must be same as ../src/osdep/unix/Makefile
yuuji@4 219
yuuji@4 220 $APOPFILEBASE = ".apop"; # "$HOME/$APOPFILEBASE" is the password file
yuuji@4 221 # $APOPFILEBASE = "$DEFAULTMAILDIR/apop";
yuuji@4 222 # $APOPFILEBASE = "Mail/apop";
yuuji@4 223
yuuji@4 224 $ENCODER = "cat";
yuuji@4 225 # $ENCODER = "gzip";
yuuji@4 226 # $ENCODER = "uuencode $$|gzip";
yuuji@4 227
yuuji@4 228 $DECODER = "cat";
yuuji@4 229 # $DECODER = "gzip -dc";
yuuji@4 230 # $DECODER = "gzip -dc | uudecode";
yuuji@4 231
yuuji@4 232 $DOTQMAIL = ".qmail"; # qmail
yuuji@4 233 # $DOTQMAIL = ".forward"; # Postfix
yuuji@4 234
yuuji@4 235 $XADDR_DELIM = "-"; # qmail
yuuji@4 236 # $XADDR_DELIM = "+"; # Postfix
yuuji@4 237
yuuji@4 238 $HERE = "."; # qmail
yuuji@4 239 # $HERE = "~"; # Postfix
yuuji@4 240
yuuji@4 241 $EXT = "";
yuuji@4 242 $force = 0;
yuuji@4 243 $base = 0;
yuuji@4 244
yuuji@4 245 $APOPFILE = "$HOME/$APOPFILEBASE";
yuuji@4 246
yuuji@4 247 sub handler {
yuuji@4 248 system "stty echo";
yuuji@4 249 print STDERR "Abort:\n";
yuuji@4 250 exit 1;
yuuji@4 251 }
yuuji@4 252
yuuji@4 253 $SIG{'INT'} = $SIG{'KILL'} = $SIG{'QUIT'} = $SIG{'HUP'} = 'handler';
yuuji@4 254
yuuji@4 255 while ($_=$ARGV[0], /^-.+/ && shift) {
yuuji@4 256 if (/^-e/) {
yuuji@4 257 $APOPFILE .= $XADDR_DELIM . ($EXT=shift);
yuuji@4 258 } elsif (/^-b/) {
yuuji@4 259 $base++;
yuuji@4 260 } elsif (/^-c/) {
yuuji@4 261 $create++;
yuuji@4 262 } elsif (/^-s/) {
yuuji@4 263 $stream++;
yuuji@4 264 # and exit;
yuuji@4 265 } elsif (/^-h/) {
yuuji@4 266 &usage; # and exit
yuuji@4 267 }
yuuji@4 268 }
yuuji@4 269
yuuji@4 270 sub checkmaildir {
yuuji@4 271 local($dotqmail) = ("$HOME/$DOTQMAIL");
yuuji@4 272 local($maildir) = ($DEFAULTMAILDIR); # default
yuuji@4 273 $dotqmail .= "$XADDR_DELIM$EXT" if $EXT;
yuuji@4 274 $maildir .= "-$EXT" if $EXT;
yuuji@4 275 unless (-f "$dotqmail") {
yuuji@4 276 if ($create) {
yuuji@4 277 if (open(DQMAIL, "> $dotqmail")) {
yuuji@4 278 print DQMAIL "$HERE/$maildir/\n";
yuuji@4 279 print "File [$dotqmail] created\n";
yuuji@4 280 close(DQMAIL);
yuuji@4 281 }
yuuji@4 282 } else {
yuuji@4 283 print "$dotqmail file does not exist.\n"; # should go to stdout
yuuji@4 284 print "Your should create $maildir first!\n";
yuuji@4 285 print "(-c option automatically makes it)\n";
yuuji@4 286 exit 1;
yuuji@4 287 }
yuuji@4 288 }
yuuji@4 289 if (-s $dotqmail) {
yuuji@4 290 $maildir='';
yuuji@4 291 if (open(DQMAIL, "< $dotqmail")) {
yuuji@4 292 while (<DQMAIL>) {
yuuji@4 293 s/[\r\n \t]*$//g;
yuuji@4 294 next if /#/;
yuuji@4 295 next unless m,\./.*/,;
yuuji@4 296 chop; # strip trailing "/"
yuuji@4 297 $maildir = $_;
yuuji@4 298 last;
yuuji@4 299 }
yuuji@4 300 close(DQMAIL);
yuuji@4 301 $maildir = $DEFAULTMAILDIR if $maildir eq '';
yuuji@4 302 unless (-d "$HOME/$maildir"
yuuji@4 303 && -d "$HOME/$maildir/new"
yuuji@4 304 && -d "$HOME/$maildir/cur"
yuuji@4 305 && -d "$HOME/$maildir/tmp") {
yuuji@4 306 if ($create) {
yuuji@4 307 mkdir "$HOME/$maildir", 0700;
yuuji@4 308 mkdir "$HOME/$maildir/new", 0700;
yuuji@4 309 mkdir "$HOME/$maildir/cur", 0700;
yuuji@4 310 mkdir "$HOME/$maildir/tmp", 0700;
yuuji@4 311 print "Maildir [$maildir/] created\n";
yuuji@4 312 } else {
yuuji@4 313 print "Maildir($maildir) does not exist\n";
yuuji@4 314 print "Your should do maildirmake $maildir first!\n";
yuuji@4 315 print "(-c option automatically makes it)\n";
yuuji@4 316 exit 1;
yuuji@4 317 }
yuuji@4 318 }
yuuji@4 319 }
yuuji@4 320 }
yuuji@4 321 }
yuuji@4 322
yuuji@4 323 sub usage {
yuuji@4 324 local($mydir, $myname) = ($0 =~ m,(.*)/(.*),);
yuuji@4 325 print<<_EOU_;
yuuji@4 326 $myname Change Mail password for imap-4.7+qmailapop
yuuji@4 327 Usage: $myname [options]
yuuji@4 328 Options are...
yuuji@4 329 -e EXT Set target email address to "user-EXT"
yuuji@4 330 -c If no .qmail file and Maildir, create them
yuuji@4 331
yuuji@4 332 _EOU_
yuuji@4 333 exit 0;
yuuji@4 334 }
yuuji@4 335
yuuji@4 336 if ($stream) {
yuuji@4 337 &stream;
yuuji@4 338 exit; # not reached
yuuji@4 339 }
yuuji@4 340 $OK=0;
yuuji@4 341 until ($OK) {
yuuji@4 342 system "stty -echo";
yuuji@4 343 print STDERR "Enter APOP Password: ";
yuuji@4 344 $new1 = <>;
yuuji@4 345 print STDERR "\n";
yuuji@4 346 if (length($new1) == 1) {
yuuji@4 347 print STDERR "Canceled\n";
yuuji@4 348 exit 1;
yuuji@4 349 } elsif (length($new1) < 9) {
yuuji@4 350 print STDERR "Password is too short! Please use more than 8 chars.\n";
yuuji@4 351 next;
yuuji@4 352 }
yuuji@4 353 print STDERR "Again APOP Password: ";
yuuji@4 354 $new2 = <>;
yuuji@4 355 if ($new1 eq $new2) {
yuuji@4 356 $OK=1;
yuuji@4 357 } else {
yuuji@4 358 print STDERR "\nPassword mismatch! Try again.\n";
yuuji@4 359 }
yuuji@4 360 }
yuuji@4 361 #OK
yuuji@4 362 &checkmaildir;
yuuji@4 363 system "stty echo";
yuuji@4 364 open(NP, "| $ENCODER > $APOPFILE") || die "Cannot write on $APOPFILE\n";
yuuji@4 365 print NP "$new1";
yuuji@4 366 close(NP);
yuuji@4 367 chmod 0600, $APOPFILE;
yuuji@4 368 print STDERR "\nUpdated APOP password successfully.\n";
yuuji@4 369
yuuji@4 370 sub stream { # Must match with old password
yuuji@4 371 local($PASS, $old, $new1, $new2, $master) = (0);
yuuji@4 372 local($masterfile) = ($APOPFILE);
yuuji@4 373 $masterfile = "$HOME/$APOPFILEBASE" if $base;
yuuji@4 374 exit 1 if ($> == 0);
yuuji@4 375 while (<>) {
yuuji@4 376 chop;
yuuji@4 377 if (/^PASS (.*)$/i) {
yuuji@4 378 $old = $1;
yuuji@4 379 } elsif (/^NEW (.*)/i) {
yuuji@4 380 $new1 = $1;
yuuji@4 381 } elsif (/^NEW2 (.*)/i) {
yuuji@4 382 $new2 = $1;
yuuji@4 383 }
yuuji@4 384 last if ("$new1" ne "" && "$new2" ne "");
yuuji@4 385 }
yuuji@4 386 if (-s $APOPFILE || ($base && -f $masterfile)) { # Already exist
yuuji@4 387 if (open(OLD, "$DECODER $masterfile |")) {
yuuji@4 388 ($master = <OLD>) =~ s/[\n\r]$//g;
yuuji@4 389 close(OLD);
yuuji@4 390 } else {
yuuji@4 391 print "Old password file corrupted.\n";
yuuji@4 392 print "Please ask to administrator.\n";
yuuji@4 393 exit 1;
yuuji@4 394 }
yuuji@4 395 if ($master ne $old) {
yuuji@4 396 print "Illegal password\nBye\n";
yuuji@4 397 exit 1;
yuuji@4 398 }
yuuji@4 399 }
yuuji@4 400 if ($new1 ne $new2) {
yuuji@4 401 print "Password(new) mismatch\nBye\n";
yuuji@4 402 exit 1;
yuuji@4 403 }
yuuji@4 404 # OK, now begin to create!
yuuji@4 405 &checkmaildir;
yuuji@4 406 if (open(P, "| $ENCODER > $APOPFILE")) {
yuuji@4 407 # open success
yuuji@4 408 print P "$new1\n";
yuuji@4 409 close(P);
yuuji@4 410 chmod 0600, $APOPFILE;
yuuji@4 411 if (-s $APOPFILE) {
yuuji@4 412 print "Success!\n";
yuuji@4 413 exit 0;
yuuji@4 414 }
yuuji@4 415 } else {
yuuji@4 416 print "Cannot output to $APOPFILE\nBye\n";
yuuji@4 417 exit 1;
yuuji@4 418 }
yuuji@4 419 exit 0;
yuuji@4 420 }

UW-IMAP'd extensions by yuuji