gitprep / templates / main / login.html.ep /
68669e2 12 years ago
1 contributor
177 lines | 3.909kb
<%
  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>
% }