Source of login.inc.plp

<:
use 5.014;
use warnings;

our $db = eval {
	require Shiar_Sheet::DB;
	Shiar_Sheet::DB->connect;
} or Abort('Database error', 501, $@);

our $user = eval {
	if (defined $post{username}) {
		$cookie{login} = EncodeURI(join ':', @post{qw( username pass )});
	}
	elsif (exists $fields{logout}) {
		require CGI::Cookie;
		if (AddCookie(CGI::Cookie->new(
			-name    => 'login',
			-value   => '',
			-path    => $editorurl,
			-expires => 'now',
		)->as_string)) {
			delete $cookie{login};
			die "Logged out as requested\n";
		}
		Alert("Failed to log out", "Login cookie could not be removed.");
	}

	my $cookiedata = $cookie{login} or return;
	my ($name, $key) = split /[:\v]/, DecodeURI($cookiedata);
	my %rowmatch = (username => $name, pass => $key);
	my $found = $db->select(login => '*', \%rowmatch)->hash
		or die "Invalid user or password\n";

	eval {
		require CGI::Cookie;
		my $httpcookie = CGI::Cookie->new(
			-name    => 'login',
			-value   => join(':', @{$found}{qw( username pass )}),
			-path    => $editorurl,
		) or die "prepared object is empty\n";
		AddCookie($httpcookie->as_string);
	} or Abort(["Unable to create login cookie", $@], 403);

	return $found;
} or do {
	say '<h1>Login to edit words</h1>';
	Alert('Access denied', $@) if $@;
	say '<form action="?" method="post" class="inline">';
	say '<section><ul class="table">';
	my $loginform = bless {%post}, 'Shiar_Sheet::FormRow';
	say '<li>', $loginform->input(@{$_}), '</li>' for (
		[username => {-label => 'User&nbsp;name'}],
		[pass     => {-label => 'Password', type => 'password'}],
	);
	say '</ul>';
	say '<p><input type="submit" value="Login" /></p>';
	say '</section>';
	say '</form>';
	exit;
};

sub parseinput {
	return undef if not length $_[0];
	require Encode;
	return Encode::decode_utf8($_[0]);
}