1 contributor
<%
use Mojo::JSON ();
use Encode ();
use Gitprep::API;
use Mojo::Util 'md5_sum';
my $api = Gitprep::API->new($self);
my $op = param('op') || '';
my $state = 'start';
# DBI
my $dbi = $self->app->dbi;
if ($op eq 'login') {
$state = 'login';
my $params = {
id => scalar param('id'),
password => scalar param('password'),
};
my $id = param('id');
my $validator = $self->app->validator;
my $password_check = sub {
my $values = shift;
my ($id, $password) = @$values;
my $password_md5 = md5_sum $password;
my $config_json
= $dbi->model('user')->select('config', id => $id)->value;
return unless $config_json;
my $config = $api->json($config_json);
return $config->{password} eq $password_md5;
};
my $rule = [
id => [
'any'
],
password => [
'any'
],
{password_check => [qw/id password/]}
=> {copy => 0},
=> [
$password_check
]
];
my $vresult = $validator->validate($params, $rule);
if ($vresult->is_ok) {
my $valid_params = $vresult->data;
my $id = $valid_params->{id};
my $config_json = $self->app->dbi->model('user')->select('config', id => $id)->value;
my $config = $api->json($config_json);
my $admin = $config->{admin};
if ($admin) {
$self->redirect_to('/_admin');
}
else {
$self->redirect_to("/$id");
}
}
else {
$state = 'error';
}
}
%>
%= stylesheet begin
.signin {
width:350px;
margin-left:auto;
margin-right:auto;
}
.signin .sheader {
margin-top:50px;
background-color:#6c8393;
padding:15px;
border:1px solid #586873;
border-bottom:1px solid #6c8393;
border-top-left-radius:5px;
border-top-right-radius:5px;
color:white;
font-weight:bold;
}
.signin .serror {
color:red;
margin-bottom:10px;
}
.signin .sbody {
margin-left:auto;
margin-right:auto;
margin-bottom:10px;
border:1px solid #d8dee2;
border-top:none;
border-bottom-left-radius:5px;
border-bottom-right-radius:5px;
padding:20px 20px;
}
.signin .suser_header {
font-weight:bold;
margin-bottom:5px;
}
.signin .suser {
background-color:white;
border:1px solid #d8dee2;
width:100%;
height:25px;
border-radius:3px;
margin-bottom:10px;
display:block;
}
.signin .spassword_header {
font-weight:bold;
padding-bottom:5px;
}
.signin .spassword {
background-color:white;
border:1px solid #d8dee2;
width:100%;
height:25px;
border-radius:3px;
margin-bottom:10px;
display:block;
}
.signin .ssubmit {
display:block;
background-color:#EEE;
border:1px solid #d8dee2;
text-align:center;
height:35px;
width:60px;
border-radius:4px;
cursor:pointer;
}
.signin .submit input {
width:150px;
height:40px;
}
% end
% layout 'common';
%= include '/css/common';
% my $id = '';
% if (flash('success')) {
<br>
<b><center>Start up success! Please login as admin user.</center></b>
% $id = flash('id');
% }
% if ($state eq 'start' || $state eq 'error') {
<div class="signin">
<div class="sheader">
Sing in
</div>
<div class="sbody">
% if ($state eq 'error') {
<div class="serror">
Incorrect username or password.
</div>
% }
<form action="<%= url_for->query(op => 'login') %>" method="post">
<div class="suser_header">Username</div>
<%= input_tag id => $id, class => 'suser' %>
<div class="spassword_header">Password</div>
<%= password_field 'password', class => 'spassword' %>
<input class="ssubmit" type="submit" value="Sign in">
</form>
</div>
% }