2 ################################################################################
3 # File: $RCSfile: mapsutil,v $
4 # Revision: $Revision: 1.1 $
5 # Description: This script implements a small command interpreter to exercise
7 # Author: Andrew@DeFaria.com
8 # Created: Fri Nov 29 14:17:21 2002
9 # Modified: $Date: 2013/06/12 14:05:47 $
12 # (c) Copyright 2000-2006, Andrew@DeFaria.com, all rights reserved.
14 ################################################################################
20 # For use of the given/when (See https://perlmaven.com/switch-case-statement-in-perl5)
21 no warnings 'experimental';
27 use lib "$FindBin::Bin/../lib";
28 use lib "$FindBin::Bin/../../lib";
39 help => 'Add a user to MAPS',
40 description => 'Usage: adduser <userid> <name> <email> <password>',
43 help => 'Add sender to whitelist',
44 description => 'Usage: add2whitelist <sender> <retention>',
47 help => 'Cleans out old log entries',
48 description => 'Usage; cleanlog [timestamp]'
51 help => 'Logs a message',
52 description => 'Usage: log <message>',
55 help => 'Load a list file',
56 description => 'Usage: loadlist <listfile>',
59 help => 'Cleans out old email entries',
60 description => 'Usage: cleanemail [timestamp]',
63 help => 'Delivers a message',
64 description => 'Usage: deliver <message>',
67 help => 'Load an mbox file',
68 description => 'Usage: loademail <mbox>',
71 help => 'Dump email from DB to mbox file',
72 description => 'Usage: ',
75 help => 'Decrypt a password',
76 description => 'Usage: decrypt <password>',
79 help => 'Switch to user',
80 description => 'Usage: switchuser <userid>',
83 help => "Set a user's password",
84 description => 'Usage: setpassword',
87 help => 'Show current user',
88 description => 'Usage: showuser',
91 help => 'Shows users in the DB',
92 description => 'Usage: showusers',
95 help => 'Displays email',
96 description => 'Usage: showemail',
99 help => 'Displays <nbr> log entires',
100 description => 'Usage: showlog <nbr>',
103 help => 'Display space usage',
104 description => 'Usage: space',
107 help => 'Show list by <type>',
108 description => 'Usage: showlist <type>',
111 help => 'Encrypt a password',
112 description => 'Usage: encrypt <password>',
115 help => 'Resequences a <list>',
116 description => 'Usage: resequence <list>',
120 my $userid = GetContext;
122 sub EncryptPassword($$) {
123 my ($password, $userid) = @_;
125 my $encrypted_password = Encrypt $password, $userid;
127 say "Encrypted password: '$encrypted_password'";
132 sub DecryptPassword($$) {
133 my ($password, $userid) = @_;
135 my $decrypted_password = Decrypt($password, $userid);
137 say "Decrypted password: $decrypted_password";
143 my ($userid, $type) = @_;
151 sub Login2MAPS($;$) {
152 my ($username, $password) = @_;
154 if ($username ne '') {
155 $password = GetPassword unless $password;
158 while (Login($username, $password) != 0) {
165 if ($username eq '') {
166 say "Login aborted!";
173 $password = GetPassword;
179 sub LoadListFile($) {
180 # This function loads a ".list" file. This is to "import" our old ".list"
181 # files. Note it assumes that the ".list" files have specific names.
182 my ($listfilename) = @_;
186 if ($listfilename eq "white.list") {
188 } elsif ($listfilename eq "black.list") {
190 } elsif ($listfilename eq "null.list") {
193 say "Unknown list file: $listfilename";
199 if (!open $listfile, '<', $listfilename) {
200 say "Unable to open $listfilename";
208 message => "Adding $listfilename to $listtype list",
213 next if m/^#/ || m/^$/;
215 my ($pattern, $comment) = split /\,/;
217 AddList($listtype, $pattern, 0, $comment);
221 if ($sequence == 0) {
222 say "No messages found to load";
223 } elsif ($sequence == 1) {
224 say "Loaded 1 message ";
226 say "Loaded $sequence messages";
229 say "from $listfilename";
235 # This function loads an mbox file.
240 open $file, '<', $filename
241 or die "Unable to open \"$filename\" - $!\n";
248 my %msgInfo = ReadMsg *$file;
254 sender => $msgInfo{sender},
255 subject => $msgInfo{subject},
256 data => $msgInfo{data},
261 message => "Added message from $msgInfo{sender} to email"
265 if ($nbr_msgs == 0) {
266 print "No messages found to load";
267 } elsif ($nbr_msgs == 1) {
268 print "Loaded 1 message";
270 print "Loaded $nbr_msgs messages";
273 say " from $filename";
277 # This function unloads email to a mbox file.
282 open $file, '>', $filename or
283 die "Unable to open \"$filename\" - $!\n";
289 my ($err, $msg) = $MAPS::db->find(
291 "userid = '$userid'",
297 while (my $rec = $MAPS::db->getnext) {
298 say $file $rec->{data};
302 say "$i messages dumped to $file";
310 if ($new_user = Login2MAPS($new_user)) {
311 say "You are now logged in as $new_user";
316 FindUser(userid => $userid);
322 my $password = GetPassword('Enter new password');
323 my $repeat = GetPassword('Enter new password again');
325 if ($password ne $repeat) {
326 say "Passwords don't match!";
328 $rec->{password} = Encrypt($password, $userid);
332 say "Password updated";
339 my $userid = GetContext;
341 my $total_space = Space($userid);
343 $total_space = $total_space / (1024 * 1024);
346 Total size @###.### Meg
355 say "Current userid is " . GetContext();
360 fields => ['userid', 'name', 'email'],
366 User ID: @<<<<<<<<< Name: @<<<<<<<<<<<<<<<<<<< Email: @<<<<<<<<<<<<<<<<<<<<<<<
367 $rec->{userid},$rec->{name},$rec->{email}
370 while ($rec = GetUser) {
371 last unless $rec->{userid};
377 my @fields = qw(userid timestamp sender subject);
378 my ($err, $msg) = $MAPS::db->find(
384 my ($timestamp, $sender, $subject);
387 @<<<<<<<<<<<<<<<<<<<@<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
388 $timestamp,$sender,$subject
392 while (my $rec = $MAPS::db->getnext) {
393 last unless $rec->{userid};
395 $timestamp = $rec->{timestamp} || '<undef>';
396 $sender = $rec->{sender} || '<undef>';
397 $subject = $rec->{subject} || '<undef>';
406 $how_many = defined $how_many ? $how_many : -20;
408 my $handle = FindLog($how_many);
410 my ($userid, $timestamp, $sender, $type, $message);
413 @<<<<<<<<<<<<<<<<<<<@<<<<<<<<< @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
414 $timestamp,$type,$sender,$message
420 while (my $rec = GetLog) {
421 $timestamp = $rec->{timestamp} || '';
422 $type = $rec->{type} || '';
423 $sender = $rec->{sender} || '';
424 $message = $rec->{message} || '';
428 last if $count > $how_many;
445 @>> @<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<
446 $record{sequence},$record{pattern},$record{domain},$record{comment}
450 # TODO: Why does ReturnList return a one entry array with a many entry array
451 # of hashes. Seems it should just return $list[0], right?
452 while (@list = ReturnList(
460 # Format blows up if any field is undefined so...
461 $record{pattern} //= '';
462 $record{domain} //= '';
463 $record{comment} //= '';
467 print 'Hit any key to continue - q to quit';
470 my $key = ReadKey(0);
473 if ($key eq 'q' or ord $key == 67) {
492 my %dates = GetStats(
497 for my $date (keys(%dates)) {
498 for (keys(%{$dates{$date}})) {
500 say "\t$dates{$date}{$_}";
510 if (!open $message, '<', $filename) {
511 say "Unable to open message file $filename";
521 Whitelist "Andrew\@DeFaria.com", $data;
531 my ($cmd, $parm1, $parm2, $parm3, $parm4) = split /\s+/, $line;
538 when (/^\s*resequence\s*$/) {
539 Resequence(GetContext(), $parm1);
542 when (/^s*encrypt\s*$/) {
543 EncryptPassword($parm1, $userid);
546 when (/^\s*encrypt\s*$/) {
547 EncryptPassword($parm1, $userid);
550 when (/^\s*decrypt\s*$/) {
551 DecryptPassword($parm1, $userid);
554 when (/^\s*deliver\s*$/) {
558 when (/^\s*add2whitelist\s*$/) {
560 $parm2 .= ' ' . $parm3
564 userid => GetContext,
571 when (/^\s*showusers\s*$/) {
575 when (/^\s*adduser\s*$/) {
580 password => Encrypt($parm4, $userid),
584 when (/^\s*cleanemail\s*$/) {
585 $parm1 = "9999-12-31 23:59:59" unless $parm1;
587 say CleanEmail($parm1);
590 when (/^\s*cleanlog\s*$/) {
591 $parm1 = "9999-12-31 23:59:59" unless $parm1;
593 say CleanLog($parm1);
596 when (/^\s*loadlist\s*$/) {
597 LoadListFile($parm1);
600 when (/^\s*loademail\s*$/) {
604 when (/^\s*dumpemail\s*$/) {
608 when (/^\s*log\s*$/) {
617 when (/^\s*switchuser\s*$/) {
621 when (/^\s*showuser\s*$/) {
625 when (/^\s*showemail\s*$/) {
629 when (/^\s*showlog\s*$/) {
633 when (/^\s*showlist\s*$/) {
637 when (/^\s*space\s*$/) {
641 when (/^\s*showstats\s*$/) {
645 when (/^\s*setpassword\s*$/) {
650 say "Unknown command: $_";
652 say "Parm1: $parm1" if $parm1;
653 say "Parm2: $parm2" if $parm2;
654 say "Parm3: $parm3" if $parm3;
655 say "Parm4: $parm4" if $parm4;
662 my $username = Login2MAPS($userid, $ENV{MAPS_PASSWORD});
665 ExecuteCmd join ' ', @ARGV;
670 $CmdLine::cmdline->set_cmds(%cmds);
671 $CmdLine::cmdline->set_eval(\&ExecuteCmd);
673 while (my ($line, $result) = $CmdLine::cmdline->get) {
676 last if $line =~ /^\s*exit\s*$/i or $line =~ /^\s*quit\s*$/i;