1 contributor
<%
# 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';