1758ae1 9 years ago
1 contributor
222 lines | 7.318kb
<%
  # API
  my $api = gitprep_api;
  
  # Parameters
  my $op = param('op') || '';
  my $user = param('user') || '';
  
  # Authentication
  unless ($api->logined($user)) {
    $self->redirect_to('/');
    return;
  }
  
  # Process form
  my $errors;
  if (lc $self->req->method eq 'post') {
    # Add ssh key
    if ($op eq 'add') {
      
      # Paramters
      my $params = $api->params;
      
      # Rule
      my $rule = [
        title => [
          ['not_blank' => 'title is empty'],
          ['ascii' => 'title contains invalid character'],
        ],
        key => [
          ['not_blank' => 'key is empty'],
          sub {
            my ($original_key, $args, $vc) = @_;
            
            my $type;
            my $original_key_edit;
            if ($original_key =~ /^(ssh-rsa|ssh-dss|ecdsa-sha2-nistp25|ecdsa-sha2-nistp384|ecdsa-sha2-nistp521) +(\S+)/) {
              $type = $1;
              $original_key_edit = $2;
            }
            
            if ($type) {
              if ($vc->constraints->{ascii}->($original_key_edit)) {
                my $key = "$type $original_key_edit";
                
                my $row = app->dbi->model('ssh_public_key')->select(id => [$user, $key])->one;
                
                if ($row) {
                  return {result => 0, message => 'Key already exists'};
                }
                else {
                  return {result => 1, output => $key}
                }
              }
              else {
                return {
                  result => 0,
                  message => "Key contains invalid character."
                }
              }
            }
            else {
              return {
                result => 0,
                message => "Key is invalid. It must begin with 'ssh-rsa', 'ssh-dss', 'ecdsa-sha2-nistp256',"
                  . "'ecdsa-sha2-nistp384', or 'ecdsa-sha2-nistp521'. Check that you're copying the public half of the key"
              };
            }
          }
        ]
      ];
      
      # Validation
      my $vresult = app->vc->validate($params, $rule);
      
      # Register ssh key
      if ($vresult->is_ok) {
        my $safe_params = $vresult->data;
        my $title = $safe_params->{title};
        my $key = $safe_params->{key};
        
        my $p = {
          user_id => $user,
          title => $title,
          key => $key
        };
        eval {
          app->dbi->connector->txn(sub {
            app->dbi->model('ssh_public_key')->insert($p);
            # $self->manager->update_authorized_keys_file;
          });
        };
        
        if (my $e = $@) {
          app->log->error(url_for . ":$e");
          $errors = ['Internal error'];
        }
        else {
          flash('message' => 'Success: ssh key is added');
          $self->redirect_to('current');
          return;
        }
      }
      else {
        $errors = $vresult->messages;
      }
    }
    # Delete ssh public key
    elsif ($op eq 'delete') {
      my $row_id = param('row-id');
      eval {
        app->dbi->model('ssh_public_key')->delete(where => {row_id => $row_id});
      };
      
      if (my $e = $@) {
        app->log->error(url_with . ": $e");
        $errors = ['Internal Error'];
      }
      else {
        flash(message => 'Success: a key is deleted');
        $self->redirect_to('current');
      }
    }
  }
  
  my $keys = app->dbi->model('ssh_public_key')->select(where => {user_id => $user})->all;
%>

% layout 'common', title => 'SSH keys';

  %= include '/include/header';
  
  <div class="container">
    <ul class="breadcrumb" style="margin-top:10px">
      <li><a href="<%= url_for('/') %>">Home</a></li>
      /
      <li><a href="<%= url_for("/$user") %>"><%= $user %></a></li>
    </ul>
    <div style="margin-bottom:30px">
      <div class="row">
        <div class="span2">
          <ul class="nav nav-tabs nav-stacked">
            <li class="" style="font-weight:bold">
              <a href="<%= url_for("/$user/_settings") %>">Profile</a>
            </li>
            <li class="active" style="">
              <a href="<%= url_for("/$user/_settings/ssh") %>">SSH keys</a>
            </li>
          </ul>
        </div>
        <div class="span10">
          <%= include '/include/errors', errors => $errors %>
          <%= include '/include/message', message => flash('message') %>
          
          <div class="border-gray bk-gray-light radius-top" style="padding:5px;">
            <div style="padding:5px">
              <span style="font-size:15px;font-weight:bold;">SSH Keys</span> (<a href="<%= url_for("/$user.keys") %>">see</a>)
            </div>
          </div>
          <div style="margin-bottom:30px">
            % if (@$keys > 0) {
              <div class="border-gray" style="border-top:none;padding:10px">
                This is a list of SSH keys associated with your account. Remove any keys that you do not recognize.
              </div>
              % for my $key (@$keys) {
                <form action="<%= url_for->query(op => 'delete') %>" method="post" style="margin:0;padding:0">
                  <div class="border-gray" style="border-top:none;">
                    <div class="row">
                      <div class="span7" style="width:600px">
                        <div style="font-size:15px;padding:10px">
                          <div>
                            <b><%= $key->{title} %></b>
                          </div>
                        </div>
                      </div>
                      <div class="span2">
                        <div style="padding:5px;text-align:right">
                          <a class="btn btn-danger" href="javascript:void(0)" onclick="$(this).closest('form').submit()">Delete</a>
                          <%= hidden_field 'row-id' => $key->{row_id} %>
                        </div>
                      </div>
                    </div>
                  </div>
                </form>
              % }
            % } else {
              <div class="border-gray" style="margin-bottom:30px;border-top:none;padding:10px">
                SSH key don't exists.
              </div>
            % }
          </div>
          
          <div>
            <div class="border-gray bk-gray-light radius-top" style="padding:5px;font-weight:bold;font-size:17px">
              <div style="font-size:15px;padding:5px">
                Add an SSH Key
              </div>
            </div>
            <div class="border-gray" style="margin-bottom:30px;border-top:none;padding:10px">
              <form action="<%= url_for->query(op => 'add') %>" method="post" %>
                <div style="margin-bottom:5px">
                  Title
                </div>
                <div>
                  <%= text_field 'title', style => "width:400px" %>
                </div>
                <div style="margin-bottom:5px">
                  Key
                </div>
                <div>
                  <%= text_area 'key', style => "width:730px;height:200px" %>
                </div>
                <input type="submit" class="btn btn-success" value="Add key">
              </form>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
  
  %= include '/include/footer';