OurNet-BBS
view release on metacpan or search on metacpan
lib/OurNet/BBS/Server.pm view on Meta::CPAN
if ($plan =~ /^#\s+pubkey:\s*(?:\d+\w\/)?([^\s]+)/) {
$Auth->{keyid} = $1;
}
else {
show("...failed! (no pubkey id)");
nextstate();
return $OP->{STATUS_NO_PUBKEY};
}
my $pubkey = ($Auth->{user})->{pubkey};
if ($pubkey and $pubkey eq $Auth->export_key) {
nextstate('set_sign');
return ($Auth->{challenge} = md5_hex(rand));
}
else {
nextstate('set_pubkey');
return $OP->{STATUS_OK};
}
}
sub set_pubkey {
my ($self, $pubkey) = @_;
show("...setpubkey");;
$Auth->import_key($pubkey);
if (compare_keys($pubkey, $Auth->export_key)) {
$Auth->{user}{pubkey} = $pubkey or return;
nextstate('set_sign');
return ($Auth->{challenge} = md5_hex(rand));
}
else {
show("...failed! (keyid doesn't match)\n");;
nextstate();
return $OP->{STATUS_BAD_PUBKEY};
}
}
sub compare_keys {
my ($key1, $key2) = @_;
# strip version info and final checksum
$key1 =~ s/.*\n\n+//s; $key1 =~ s/\n.*//s;
$key2 =~ s/.*\n\n+//s; $key2 =~ s/\n.*//s;
return ($key1 eq $key2);
}
sub set_sign {
my ($self, $signature) = @_;
show("...setsign");
my $response = $Auth->verify($signature);
if (!$response or
index($response, "key ID $Auth->{keyid}") > -1 and
index($response, "gpg: BAD signature") == -1 and
index($signature, "$Auth->{challenge}\n") > -1)
{
show("...done!\n");
nextstate('locate', 'relay');
return ($OP->{STATUS_ACCEPTED}, AUTH_PGP);
}
else {
show("...failed! ($signature, $response)\n");
nextstate();
return $OP->{STATUS_BAD_SIGNATURE}
}
}
sub auth_crypt {
my ($self, $login) = @_;
return unless $AuthLevel & AUTH_CRYPT;
$Auth->{user} = $ROOT->{users}{$login} or return $OP->{NO_USER};
my $passwd = ($Auth->{user})->{passwd};
return unless length($passwd);
$Auth->{login} = $login;
show("[Server] $login: login");;
nextstate('set_crypted');
return ($OP->{STATUS_OK}, substr($passwd, 0, 2));
}
sub set_crypted {
my ($self, $crypted) = @_;
if (($Auth->{user})->{passwd} eq $crypted) {
show("...done!\n");;
nextstate('locate', 'relay');
return ($OP->{STATUS_ACCEPTED}, $AuthMode = AUTH_CRYPT);
}
show("...failed! (crypt mismatch)\n");;
nextstate();
return $OP->{STATUS_BAD_SIGNATURE};
}
sub auth_none {
my ($self, $login) = @_;
return unless $AuthLevel & AUTH_NONE;
if ($Auth->{login} = $GuestId) {
$Auth->{login} = ($login || substr($GuestId, 1))
or return $OP->{NO_USER} if $GuestId =~ /^\*/; # AUTH_LOCAL
$Auth->{user} = $ROOT->{users}{$Auth->{login}}
or return $OP->{NO_USER};
}
else {
undef $Auth->{user}; # clean up previous auth
undef $Auth->{login}; # clean up previous auth
}
nextstate('locate', 'relay');
return ($OP->{STATUS_ACCEPTED}, $AuthMode = AUTH_NONE);
( run in 0.690 second using v1.01-cache-2.11-cpan-df04353d9ac )