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 )