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 }
|