Newer Older
222 lines | 7.318kb
add ssh keys page design
gitprep authored on 2014-05-17
1
<%
2
  # API
3
  my $api = gitprep_api;
4
  
5
  # Parameters
6
  my $op = param('op') || '';
7
  my $user = param('user') || '';
8
  
9
  # Authentication
10
  unless ($api->logined($user)) {
11
    $self->redirect_to('/');
12
    return;
13
  }
14
  
add ssh key add feature
gitprep authored on 2014-05-17
15
  # Process form
16
  my $errors;
17
  if (lc $self->req->method eq 'post') {
18
    # Add ssh key
19
    if ($op eq 'add') {
20
      
21
      # Paramters
22
      my $params = $api->params;
23
      
24
      # Rule
25
      my $rule = [
26
        title => [
27
          ['not_blank' => 'title is empty'],
28
          ['ascii' => 'title contains invalid character'],
29
        ],
30
        key => [
31
          ['not_blank' => 'key is empty'],
32
          sub {
33
            my ($original_key, $args, $vc) = @_;
34
            
35
            my $type;
36
            my $original_key_edit;
37
            if ($original_key =~ /^(ssh-rsa|ssh-dss|ecdsa-sha2-nistp25|ecdsa-sha2-nistp384|ecdsa-sha2-nistp521) +(\S+)/) {
38
              $type = $1;
39
              $original_key_edit = $2;
40
            }
41
            
42
            if ($type) {
43
              if ($vc->constraints->{ascii}->($original_key_edit)) {
44
                my $key = "$type $original_key_edit";
45
                
46
                my $row = app->dbi->model('ssh_public_key')->select(id => [$user, $key])->one;
47
                
48
                if ($row) {
49
                  return {result => 0, message => 'Key already exists'};
50
                }
51
                else {
52
                  return {result => 1, output => $key}
53
                }
54
              }
55
              else {
56
                return {
57
                  result => 0,
58
                  message => "Key contains invalid character."
59
                }
60
              }
61
            }
62
            else {
63
              return {
64
                result => 0,
65
                message => "Key is invalid. It must begin with 'ssh-rsa', 'ssh-dss', 'ecdsa-sha2-nistp256',"
66
                  . "'ecdsa-sha2-nistp384', or 'ecdsa-sha2-nistp521'. Check that you're copying the public half of the key"
67
              };
68
            }
69
          }
70
        ]
71
      ];
72
      
73
      # Validation
74
      my $vresult = app->vc->validate($params, $rule);
75
      
76
      # Register ssh key
77
      if ($vresult->is_ok) {
78
        my $safe_params = $vresult->data;
79
        my $title = $safe_params->{title};
80
        my $key = $safe_params->{key};
81
        
82
        my $p = {
83
          user_id => $user,
84
          title => $title,
85
          key => $key
86
        };
87
        eval {
add key delete feature and u...
gitprep authored on 2014-05-19
88
          app->dbi->connector->txn(sub {
89
            app->dbi->model('ssh_public_key')->insert($p);
90
            # $self->manager->update_authorized_keys_file;
91
          });
add ssh key add feature
gitprep authored on 2014-05-17
92
        };
add add ssh key form
gitprep authored on 2014-05-17
93
        
add ssh key add feature
gitprep authored on 2014-05-17
94
        if (my $e = $@) {
95
          app->log->error(url_for . ":$e");
96
          $errors = ['Internal error'];
add add ssh key form
gitprep authored on 2014-05-17
97
        }
98
        else {
add ssh key add feature
gitprep authored on 2014-05-17
99
          flash('message' => 'Success: ssh key is added');
100
          $self->redirect_to('current');
101
          return;
add add ssh key form
gitprep authored on 2014-05-17
102
        }
add ssh key add feature
gitprep authored on 2014-05-17
103
      }
104
      else {
105
        $errors = $vresult->messages;
106
      }
107
    }
add key delete feature and u...
gitprep authored on 2014-05-19
108
    # Delete ssh public key
109
    elsif ($op eq 'delete') {
110
      my $row_id = param('row-id');
111
      eval {
112
        app->dbi->model('ssh_public_key')->delete(where => {row_id => $row_id});
113
      };
114
      
115
      if (my $e = $@) {
116
        app->log->error(url_with . ": $e");
117
        $errors = ['Internal Error'];
118
      }
119
      else {
120
        flash(message => 'Success: a key is deleted');
121
        $self->redirect_to('current');
122
      }
123
    }
add ssh key add feature
gitprep authored on 2014-05-17
124
  }
add ssh keys page design
gitprep authored on 2014-05-17
125
  
add ssh key add feature
gitprep authored on 2014-05-17
126
  my $keys = app->dbi->model('ssh_public_key')->select(where => {user_id => $user})->all;
127
%>
128

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

            
add ssh keys page design
gitprep authored on 2014-05-17
131
  %= include '/include/header';
132
  
133
  <div class="container">
134
    <ul class="breadcrumb" style="margin-top:10px">
135
      <li><a href="<%= url_for('/') %>">Home</a></li>
136
      /
137
      <li><a href="<%= url_for("/$user") %>"><%= $user %></a></li>
138
    </ul>
139
    <div style="margin-bottom:30px">
140
      <div class="row">
141
        <div class="span2">
142
          <ul class="nav nav-tabs nav-stacked">
143
            <li class="" style="font-weight:bold">
144
              <a href="<%= url_for("/$user/_settings") %>">Profile</a>
145
            </li>
146
            <li class="active" style="">
147
              <a href="<%= url_for("/$user/_settings/ssh") %>">SSH keys</a>
148
            </li>
149
          </ul>
150
        </div>
151
        <div class="span10">
add ssh key add feature
gitprep authored on 2014-05-17
152
          <%= include '/include/errors', errors => $errors %>
153
          <%= include '/include/message', message => flash('message') %>
154
          
155
          <div class="border-gray bk-gray-light radius-top" style="padding:5px;">
156
            <div style="padding:5px">
157
              <span style="font-size:15px;font-weight:bold;">SSH Keys</span> (<a href="<%= url_for("/$user.keys") %>">see</a>)
add ssh keys page design
gitprep authored on 2014-05-17
158
            </div>
159
          </div>
add add ssh key form
gitprep authored on 2014-05-17
160
          <div style="margin-bottom:30px">
161
            % if (@$keys > 0) {
162
              <div class="border-gray" style="border-top:none;padding:10px">
163
                This is a list of SSH keys associated with your account. Remove any keys that you do not recognize.
164
              </div>
165
              % for my $key (@$keys) {
add key delete feature and u...
gitprep authored on 2014-05-19
166
                <form action="<%= url_for->query(op => 'delete') %>" method="post" style="margin:0;padding:0">
167
                  <div class="border-gray" style="border-top:none;">
168
                    <div class="row">
169
                      <div class="span7" style="width:600px">
170
                        <div style="font-size:15px;padding:10px">
171
                          <div>
172
                            <b><%= $key->{title} %></b>
173
                          </div>
add add ssh key form
gitprep authored on 2014-05-17
174
                        </div>
add ssh keys page design
gitprep authored on 2014-05-17
175
                      </div>
add key delete feature and u...
gitprep authored on 2014-05-19
176
                      <div class="span2">
177
                        <div style="padding:5px;text-align:right">
178
                          <a class="btn btn-danger" href="javascript:void(0)" onclick="$(this).closest('form').submit()">Delete</a>
179
                          <%= hidden_field 'row-id' => $key->{row_id} %>
180
                        </div>
add add ssh key form
gitprep authored on 2014-05-17
181
                      </div>
add ssh keys page design
gitprep authored on 2014-05-17
182
                    </div>
183
                  </div>
add key delete feature and u...
gitprep authored on 2014-05-19
184
                </form>
add add ssh key form
gitprep authored on 2014-05-17
185
              % }
186
            % } else {
187
              <div class="border-gray" style="margin-bottom:30px;border-top:none;padding:10px">
188
                SSH key don't exists.
add ssh keys page design
gitprep authored on 2014-05-17
189
              </div>
190
            % }
add add ssh key form
gitprep authored on 2014-05-17
191
          </div>
192
          
add ssh key add feature
gitprep authored on 2014-05-17
193
          <div>
add add ssh key form
gitprep authored on 2014-05-17
194
            <div class="border-gray bk-gray-light radius-top" style="padding:5px;font-weight:bold;font-size:17px">
195
              <div style="font-size:15px;padding:5px">
196
                Add an SSH Key
197
              </div>
198
            </div>
add ssh keys page design
gitprep authored on 2014-05-17
199
            <div class="border-gray" style="margin-bottom:30px;border-top:none;padding:10px">
add ssh key add feature
gitprep authored on 2014-05-17
200
              <form action="<%= url_for->query(op => 'add') %>" method="post" %>
add add ssh key form
gitprep authored on 2014-05-17
201
                <div style="margin-bottom:5px">
202
                  Title
203
                </div>
204
                <div>
205
                  <%= text_field 'title', style => "width:400px" %>
206
                </div>
207
                <div style="margin-bottom:5px">
208
                  Key
209
                </div>
210
                <div>
211
                  <%= text_area 'key', style => "width:730px;height:200px" %>
212
                </div>
213
                <input type="submit" class="btn btn-success" value="Add key">
214
              </form>
add ssh keys page design
gitprep authored on 2014-05-17
215
            </div>
add add ssh key form
gitprep authored on 2014-05-17
216
          </div>
add ssh keys page design
gitprep authored on 2014-05-17
217
        </div>
218
      </div>
219
    </div>
220
  </div>
221
  
222
  %= include '/include/footer';