+ # 'identify'
+ if ($msgType =~ /private/ and $message =~ s/^identify//i) {
+ $message =~ s/^\s+|\s+$//g;
+ my @array = split / /, $message;
+
+ if ($who =~ /^_default$/i) {
+ &pSReply("you are too eleet.");
+ return;
+ }
+
+ if (!scalar @array or scalar @array > 2) {
+ &help("identify");
+ return;
+ }
+
+ my $do_nick = $array[1] || $who;
+
+ if (!exists $users{$do_nick}) {
+ &pSReply("nick $do_nick is not in user list.");
+ return;
+ }
+
+ my $crypt = $users{$do_nick}{PASS};
+ if (!defined $crypt) {
+ &pSReply("user $do_nick has no passwd set.");
+ return;
+ }
+
+ if (!&ckpasswd($array[0], $crypt)) {
+ &pSReply("invalid passwd for $do_nick.");
+ return;
+ }
+
+ my $mask = "*!$user@".&makeHostMask($host);
+ ### TODO: prevent adding multiple dupe masks?
+ ### TODO: make &addHostMask() CMD?
+ &pSReply("Added $mask for $do_nick...");
+ $users{$do_nick}{HOSTS}{$mask} = 1;
+
+ return;
+ }
+
+ # 'pass'
+ if ($msgType =~ /private/ and $message =~ s/^pass//i) {
+ $message =~ s/^\s+|\s+$//g;
+ my @array = split / /, $message;
+
+ if ($who =~ /^_default$/i) {
+ &pSReply("you are too eleet.");
+ return;
+ }
+
+ if (scalar @array != 1) {
+ &help("pass");
+ return;
+ }
+
+ # todo: use &getUser()?
+ my $first = (scalar keys %users) ? 1 : 0;
+ if (!exists $users{$who} and !$first) {
+ &pSReply("nick $who is not in user list.");
+ return;
+ }
+
+ if ($first) {
+ &pSReply("first time user... adding you as master.");
+ $users{$who}{FLAGS} = "mrsteon";
+ }
+
+ my $crypt = $users{$who}{PASS};
+ if (defined $crypt) {
+ &pSReply("user $who already has pass set.");
+ return;
+ }
+
+ if (!defined $host) {
+ &WARN("pass: host == NULL.");
+ return;
+ }
+
+ if (!scalar keys %{ $users{$who}{HOSTS} }) {
+ my $mask = "*!$user@".&makeHostMask($host);
+ &pSReply("added mask $mask to $who.");
+ $users{$who}{HOSTS}{$mask} = 1;
+ }
+
+ my $salt = join '',('.','/',0..9,'A'..'Z','a'..'z')[rand 64, rand 64];
+ # todo: show crypt?
+ &pSReply("new pass for $who, salt $salt.");
+ $users{$who}{PASS} = crypt($array[0], $salt);
+
+ return;
+ }
+