diff APOPtools/apoppasswd @ 4:d741b3ecc917 draft

imapext-2007f
author HIROSE Yuuji <yuuji@gentei.org>
date Thu, 30 Oct 2014 00:03:05 +0900
parents 28a55bc1110c
children
line wrap: on
line diff
--- a/APOPtools/apoppasswd	Thu Oct 30 00:00:57 2014 +0900
+++ b/APOPtools/apoppasswd	Thu Oct 30 00:03:05 2014 +0900
@@ -208,3 +208,213 @@
     }
     exit 0;
 }
+#!/usr/local/bin/perl
+# Customize these variables.
+# If you change APOPFILEBASE, change the same variable in apopcall.c too.
+# See http://www.gentei.org/~yuuji/software/imapext/
+
+$HOME=$ENV{"HOME"};
+
+$DEFAULTMAILDIR = "Maildir";	# Must be same as ../src/osdep/unix/Makefile
+
+$APOPFILEBASE = ".apop";	# "$HOME/$APOPFILEBASE" is the password file
+# $APOPFILEBASE = "$DEFAULTMAILDIR/apop";
+# $APOPFILEBASE = "Mail/apop";
+
+$ENCODER = "cat";
+# $ENCODER = "gzip";
+# $ENCODER = "uuencode $$|gzip";
+
+$DECODER = "cat";
+# $DECODER = "gzip -dc";
+# $DECODER = "gzip -dc | uudecode";
+
+$DOTQMAIL = ".qmail";		# qmail
+# $DOTQMAIL = ".forward";	# Postfix
+
+$XADDR_DELIM = "-";		# qmail
+# $XADDR_DELIM = "+";		# Postfix
+
+$HERE = ".";			# qmail
+# $HERE = "~";			# Postfix
+
+$EXT = "";
+$force = 0;
+$base = 0;
+
+$APOPFILE = "$HOME/$APOPFILEBASE";
+
+sub handler {
+	system "stty echo";
+	print STDERR "Abort:\n";
+	exit 1;
+}
+
+$SIG{'INT'} = $SIG{'KILL'} = $SIG{'QUIT'} = $SIG{'HUP'} = 'handler';
+
+while ($_=$ARGV[0], /^-.+/ && shift) {
+    if (/^-e/) {
+	$APOPFILE .= $XADDR_DELIM . ($EXT=shift);
+    } elsif (/^-b/) {
+	$base++;
+    } elsif (/^-c/) {
+	$create++;
+    } elsif (/^-s/) {
+	$stream++;
+	# and exit;
+    } elsif (/^-h/) {
+	&usage; # and exit
+    }
+}
+
+sub checkmaildir {
+    local($dotqmail) = ("$HOME/$DOTQMAIL");
+    local($maildir) = ($DEFAULTMAILDIR);	  # default
+    $dotqmail .= "$XADDR_DELIM$EXT" if $EXT;
+    $maildir .= "-$EXT" if $EXT;
+    unless (-f "$dotqmail") {
+	if ($create) {
+	    if (open(DQMAIL, "> $dotqmail")) {
+		print DQMAIL "$HERE/$maildir/\n";
+		print "File [$dotqmail] created\n";
+		close(DQMAIL);
+	    }
+	} else {
+	    print "$dotqmail file does not exist.\n";	# should go to stdout
+	    print "Your should create $maildir first!\n";
+	    print "(-c option automatically makes it)\n";
+	    exit 1;
+	}
+    }
+    if (-s $dotqmail) {
+	$maildir='';
+	if (open(DQMAIL, "< $dotqmail")) {
+	    while (<DQMAIL>) {
+		s/[\r\n \t]*$//g;
+		next if /#/;
+		next unless m,\./.*/,;
+		chop;			  # strip trailing "/"
+		$maildir = $_;
+		last;
+	    }
+	    close(DQMAIL);
+	    $maildir = $DEFAULTMAILDIR if $maildir eq '';
+	    unless (-d "$HOME/$maildir"
+		    && -d "$HOME/$maildir/new"
+		    && -d "$HOME/$maildir/cur"
+		    && -d "$HOME/$maildir/tmp") {
+		if ($create) {
+		    mkdir "$HOME/$maildir", 0700;
+		    mkdir "$HOME/$maildir/new", 0700;
+		    mkdir "$HOME/$maildir/cur", 0700;
+		    mkdir "$HOME/$maildir/tmp", 0700;
+		    print "Maildir [$maildir/] created\n";
+		} else {
+		    print "Maildir($maildir) does not exist\n";
+		    print "Your should do maildirmake $maildir first!\n";
+		    print "(-c option automatically makes it)\n";
+		    exit 1;
+		}
+	    }
+	}
+    }
+}
+
+sub usage {
+    local($mydir, $myname) = ($0 =~ m,(.*)/(.*),);
+    print<<_EOU_;
+$myname	Change Mail password for imap-4.7+qmailapop
+Usage:	$myname [options]
+Options are...
+	-e EXT		Set target email address to "user-EXT"
+	-c		If no .qmail file and Maildir, create them
+
+_EOU_
+    exit 0;
+}
+
+if ($stream) {
+    &stream;
+    exit; # not reached
+}
+$OK=0;
+until ($OK) {
+    system "stty -echo";
+    print STDERR "Enter APOP Password: ";
+    $new1 = <>;
+    print STDERR "\n";
+    if (length($new1) == 1) {
+	print STDERR "Canceled\n";
+	exit 1;
+    } elsif (length($new1) < 9) {
+	print STDERR "Password is too short!  Please use more than 8 chars.\n";
+	next;
+    }
+    print STDERR "Again APOP Password: ";
+    $new2 = <>;
+    if ($new1 eq $new2) {
+	$OK=1;
+    } else {
+	print STDERR "\nPassword mismatch! Try again.\n";
+    }
+}
+#OK
+&checkmaildir;
+system "stty echo";
+open(NP, "| $ENCODER > $APOPFILE") || die "Cannot write on $APOPFILE\n";
+print NP "$new1";
+close(NP);
+chmod 0600, $APOPFILE;
+print STDERR "\nUpdated APOP password successfully.\n";
+
+sub stream {				  # Must match with old password
+    local($PASS, $old, $new1, $new2, $master) = (0);
+    local($masterfile) = ($APOPFILE);
+    $masterfile = "$HOME/$APOPFILEBASE" if $base;
+    exit 1 if ($> == 0);
+    while (<>) {
+	chop;
+	if (/^PASS (.*)$/i) {
+	    $old = $1;
+	} elsif (/^NEW (.*)/i) {
+	    $new1 = $1;
+	} elsif (/^NEW2 (.*)/i) {
+	    $new2 = $1;
+	}
+	last if ("$new1" ne "" && "$new2" ne "");
+    }
+    if (-s $APOPFILE || ($base && -f $masterfile)) { # Already exist
+	if (open(OLD, "$DECODER $masterfile |")) {
+	    ($master = <OLD>) =~ s/[\n\r]$//g;
+	    close(OLD);
+	} else {
+	    print "Old password file corrupted.\n";
+	    print "Please ask to administrator.\n";
+	    exit 1;
+	}
+	if ($master ne $old) {
+	    print "Illegal password\nBye\n";
+	    exit 1;
+	}
+    } 
+    if ($new1 ne $new2) {
+	print "Password(new) mismatch\nBye\n";
+	exit 1;
+    }
+    # OK, now begin to create!
+    &checkmaildir;
+    if (open(P, "| $ENCODER > $APOPFILE")) {
+	# open success
+	print P "$new1\n";
+	close(P);
+	chmod 0600, $APOPFILE;
+	if (-s $APOPFILE) {
+	    print "Success!\n";
+	    exit 0;
+	}
+    } else {
+	print "Cannot output to $APOPFILE\nBye\n";
+	exit 1;
+    }
+    exit 0;
+}

yatex.org