Showing 10 changed files with 306 additions and 473 deletions
+67 -59
templates/auto/_admin/user/update.html.ep
... ...
@@ -5,74 +5,82 @@
5 5
   my $user_id = param('id');
6 6
   
7 7
   my $errors;
8
-  if ($op eq 'update') {
9
-  
10
-    # Parameters
11
-    my $id = param('id');
12
-    my $name = param('name');
13
-    my $email = param('email');
14
-    
15
-    # Validator
16
-    my $vc = app->vc;
17
-    
18
-    # Validation result
19
-    my $validation = $vc->validation;
20
-    
21
-    # "id" check
22
-    if (!(defined $id && length $id)) {
23
-      $validation->add_failed(id => 'User id is empty.');
24
-    }
8
+  if (lc $self->req->method eq 'post') {
9
+    if ($op eq 'update') {
25 10
     
26
-    # "name" check
27
-    $name //= '';
28
-    
29
-    # "email" check
30
-    if (!(defined $email && length $email)) {
31
-      $validation->add_failed(email => "Mail must be not empty");
32
-    }
33
-    elsif ($email !~ /\@/) {
34
-      $validation->add_failed(email => "Invalid mail address");
35
-    }
36
-    else {
37
-      my $where = app->dbi->where;
38
-      my $clause = [
39
-        'and',
40
-        ':email{=}',
41
-        ':id{<>}'
42
-      ];
43
-      my $param = {
44
-        email => $email,
45
-        id => $user_id
46
-      };
47
-      $where->clause($clause);
48
-      $where->param($param);
11
+      # Parameters
12
+      my $id = param('id');
13
+      my $name = param('name');
14
+      my $email = param('email');
15
+      
16
+      # Validator
17
+      my $vc = app->vc;
49 18
       
50
-      my $row = app->dbi->model('user')->select(where => $where)->one;
51
-      if ($row) {
52
-        $validation->add_failed(email => "Mail $email already exists");
19
+      # Validation result
20
+      my $validation = $vc->validation;
21
+      
22
+      # "id" check
23
+      if (!(defined $id && length $id)) {
24
+        $validation->add_failed(id => 'User id is empty.');
25
+      }
26
+      elsif (length $name > 300) {
27
+        $validation->add_failed(id => 'User id is too long.');
53 28
       }
54
-    }
55
-    
56
-    if ($validation->is_valid) {
57 29
       
58
-      # Encrypt password
59
-      my $params = {};
60
-      $params->{name} = $name;
61
-      $params->{email} = $email;
30
+      # "name" check
31
+      $name //= '';
62 32
       
63
-      # Update user
64
-      eval { app->dbi->model('user')->update($params, where => {id => $id}) };
65
-      if (my $e = $@) {
66
-        app->log->error(url_for . ": $e");
67
-        $errors = ['Internal Error'];
33
+      # "email" check
34
+      if (!(defined $email && length $email)) {
35
+        $validation->add_failed(email => "Mail must be not empty");
36
+      }
37
+      elsif (length $email > 300) {
38
+        $validation->add_failed(email => "Mail is too long");
39
+      }
40
+      elsif ($email !~ /\@/) {
41
+        $validation->add_failed(email => "Invalid mail address");
68 42
       }
69 43
       else {
70
-        $self->flash(success => 1);
71
-        $self->flash(id => $id);
72
-        $self->redirect_to(url_for->query(id => $id));
44
+        my $where = app->dbi->where;
45
+        my $clause = [
46
+          'and',
47
+          ':email{=}',
48
+          ':id{<>}'
49
+        ];
50
+        my $param = {
51
+          email => $email,
52
+          id => $user_id
53
+        };
54
+        $where->clause($clause);
55
+        $where->param($param);
56
+        
57
+        my $row = app->dbi->model('user')->select(where => $where)->one;
58
+        if ($row) {
59
+          $validation->add_failed(email => "Mail $email already exists");
60
+        }
61
+      }
62
+      
63
+      if ($validation->is_valid) {
64
+        
65
+        # Encrypt password
66
+        my $params = {};
67
+        $params->{name} = $name;
68
+        $params->{email} = $email;
69
+        
70
+        # Update user
71
+        eval { app->dbi->model('user')->update($params, where => {id => $id}) };
72
+        if (my $e = $@) {
73
+          app->log->error(url_for . ": $e");
74
+          $errors = ['Internal Error'];
75
+        }
76
+        else {
77
+          $self->flash(success => 1);
78
+          $self->flash(id => $id);
79
+          $self->redirect_to(url_for->query(id => $id));
80
+        }
73 81
       }
82
+      else { $errors = $validation->messages }
74 83
     }
75
-    else { $errors = $validation->messages }
76 84
   }
77 85
   
78 86
   my $user = app->dbi->model('user')->select(
+5 -5
templates/auto/_admin/users.html.ep
... ...
@@ -6,7 +6,7 @@
6 6
   if ($op eq 'delete' && lc $self->req->method eq 'post') {
7 7
     
8 8
     # Parameters
9
-    my $user = param('user');
9
+    my $user_id = param('user');
10 10
     
11 11
     # Validator
12 12
     my $vc = app->vc;
... ...
@@ -15,7 +15,7 @@
15 15
     my $validation = $vc->validation;
16 16
     
17 17
     # "user" check
18
-    if (!(defined $user && length $user)) {
18
+    if (!(defined $user_id && length $user_id)) {
19 19
       $validation->add_failed(user => 'User name is empty.');
20 20
     }
21 21
 
... ...
@@ -23,17 +23,17 @@
23 23
       
24 24
       # Delete user
25 25
       my $count;
26
-      eval { $count = app->manager->delete_user($user) };
26
+      eval { $count = app->manager->delete_user($user_id) };
27 27
       if (my $e = $@) {
28 28
         app->log->error(url_for . ": $e");
29 29
         $errors = ['Internal Error'];
30 30
       }
31 31
       elsif ($count == 0) {
32
-        app->log->error("/_admin/users?op=delete: User $user not exists");
32
+        app->log->error("/_admin/users?op=delete: User $user_id not exists");
33 33
         $errors = ['Internal Error'];
34 34
       }
35 35
       else {
36
-        $self->flash(message => "User $user is deleted.");
36
+        $self->flash(message => "User $user_id is deleted.");
37 37
         $self->redirect_to('current');
38 38
         return;
39 39
       }
+63 -55
templates/auto/_new.html.ep
... ...
@@ -13,66 +13,74 @@
13 13
   }
14 14
   
15 15
   my $errors;
16
-  if ($op eq 'create') {
17
-    # Parameters
18
-    my $project_id = param('project');
19
-    my $description = param('description');
20
-    my $readme = param('readme');
21
-    my $private = param('private');
22
-    
23
-    # Validator
24
-    my $vc = app->vc;
25
-    
26
-    # Validation
27
-    my $validation = $vc->validation;
28
-    
29
-    # "project"
30
-    if (!(defined $project_id && length $project_id)) {
31
-      $validation->add_failed(project => 'Repository name is empty');
32
-    }
33
-    elsif (!$vc->check($project_id, 'project_name')) {
34
-      $validation->add_failed(project => 'Invalid repository name');
35
-    }
36
-    elsif (app->manager->exists_project($session_user->{id}, $project_id)) {
37
-      $validation->add_failed(project => 'Repository already exists');
38
-    }
39
-    
40
-    # "description"
41
-    $description ||= '';
42
-    
43
-    # "readme"
44
-    $readme = $readme ? 1 :0;
45
-    
46
-    # "private"
47
-    $private = $private ? 1 : 0;
48
-    
49
-    # Git
50
-    if ($validation->is_valid) {
51
-      # Not logined
52
-      unless ($api->logined) {
53
-        return $self->reply->exception;
54
-      }
16
+  if (lc $self->req->method eq 'post') {
17
+    if ($op eq 'create') {
18
+      # Parameters
19
+      my $project_id = param('project');
20
+      my $description = param('description');
21
+      my $readme = param('readme');
22
+      my $private = param('private');
55 23
       
56
-      my $manager = app->manager;
57
-      # Create repository
58
-      eval {
59
-        $manager->create_project(
60
-          $session_user->{id},
61
-          $project_id,
62
-          {description => $description, readme => $readme, private => $private}
63
-        );
64
-      };
24
+      # Validator
25
+      my $vc = app->vc;
65 26
       
66
-      if (my $e = $@) {
67
-        app->log->error(url_for . ": $e");
68
-        $errors = ['Internal error'];
27
+      # Validation
28
+      my $validation = $vc->validation;
29
+      
30
+      # "project"
31
+      if (!(defined $project_id && length $project_id)) {
32
+        $validation->add_failed(project => 'Repository name is empty');
33
+      }
34
+      elsif (length $project_id > 300) {
35
+        $validation->add_failed(project => 'Repository name is too long');
36
+      }
37
+      elsif (!$vc->check($project_id, 'project_name')) {
38
+        $validation->add_failed(project => 'Invalid repository name');
69 39
       }
70
-      else {
71
-        $self->redirect_to("/$session_user->{id}/$project_id");
72
-        return;
40
+      elsif (app->manager->exists_project($session_user->{id}, $project_id)) {
41
+        $validation->add_failed(project => 'Repository already exists');
42
+      }
43
+      
44
+      # "description"
45
+      $description ||= '';
46
+      if (length $description > 300) {
47
+        $validation->add_failed(description => 'description is too long');
48
+      }
49
+      
50
+      # "readme"
51
+      $readme = $readme ? 1 :0;
52
+      
53
+      # "private"
54
+      $private = $private ? 1 : 0;
55
+      
56
+      # Git
57
+      if ($validation->is_valid) {
58
+        # Not logined
59
+        unless ($api->logined) {
60
+          return $self->reply->exception;
61
+        }
62
+        
63
+        my $manager = app->manager;
64
+        # Create repository
65
+        eval {
66
+          $manager->create_project(
67
+            $session_user->{id},
68
+            $project_id,
69
+            {description => $description, readme => $readme, private => $private}
70
+          );
71
+        };
72
+        
73
+        if (my $e = $@) {
74
+          app->log->error(url_for . ": $e");
75
+          $errors = ['Internal error'];
76
+        }
77
+        else {
78
+          $self->redirect_to("/$session_user->{id}/$project_id");
79
+          return;
80
+        }
73 81
       }
82
+      else { $errors = $validation->messages }
74 83
     }
75
-    else { $errors = $validation->messages }
76 84
   }
77 85
 %>
78 86
 
+98 -67
templates/compare.html.ep
... ...
@@ -40,92 +40,121 @@
40 40
   # Git
41 41
   my $git = $self->app->git;
42 42
   
43
+  my $errors;
43 44
   if (lc $self->req->method eq 'post') {
44 45
     my $op = param('op');
45 46
     
46 47
     if ($op eq 'create-pull-request') {
48
+      
49
+      # Parameters
47 50
       my $title = param('title');
48 51
       my $message = param('message');
49 52
       
50
-      my $project_row_id = app->dbi->model('project')->select(
51
-        'project.row_id',
52
-        where => {'__user.id' => $base_user_id, 'project.id' => $base_project_id}
53
-      )->value;
53
+      # Validation
54
+      my $vc = app->vc;
55
+      my $validation = $vc->validation;
54 56
       
55
-      my $pull_request = app->dbi->model('pull_request')->select(
56
-        where => {
57
-          base_project => $project_row_id,
58
-          base_branch => $base_branch,
59
-          target_project => $target_project->{id},
60
-          target_branch => $target_branch
61
-        }
62
-      )->one;
57
+      # Check title
58
+      if (!(defined $title && length $title)) {
59
+        $validation->add_failed(title => 'title is empty');
60
+      }
61
+      elsif (length $title > 300) {
62
+        $validation->add_failed(title => 'title is too long');
63
+      }
63 64
       
64
-      if ($pull_request) {
65
-        $self->redirect_to("/$base_user_id/$base_project_id/pull/$pull_request->{row_id}");
66
-        return;
65
+      # Message
66
+      if (!(defined $message && length $message)) {
67
+        $message = '';
68
+        if (length $message > 1000) {
69
+          $validation->add_failed(message => 'message is too long');
70
+        }
67 71
       }
68
-      else {
69
-        my $now_tm = Time::Moment->now_utc;
70
-        my $now_epoch = $now_tm->epoch;
71
-        my $user_row_id = app->dbi->model('user')->select(
72
-          'row_id',
73
-          where => {id => $base_user_id}
72
+      
73
+      if ($validation->is_valid) {
74
+      
75
+        my $project_row_id = app->dbi->model('project')->select(
76
+          'project.row_id',
77
+          where => {'__user.id' => $base_user_id, 'project.id' => $base_project_id}
74 78
         )->value;
75 79
         
76
-        my $new_pull_request_row_id;
77
-        my $session_user_row_id = $api->session_user_row_id;
78
-        app->dbi->connector->txn(sub {
79
-          # New pull request
80
-          my $new_pull_request_params = {
80
+        my $pull_request = app->dbi->model('pull_request')->select(
81
+          where => {
81 82
             base_project => $project_row_id,
82 83
             base_branch => $base_branch,
83
-            target_project => $target_project->{row_id},
84
-            target_branch => $target_branch,
85
-            title => $title,
86
-            open => 1,
87
-            open_time => $now_epoch,
88
-            open_user => $session_user_row_id
89
-          };
90
-          
91
-          app->dbi->model('pull_request')->insert($new_pull_request_params);
92
-          
93
-          $new_pull_request_row_id = app->dbi->model('pull_request')->select(
84
+            target_project => $target_project->{id},
85
+            target_branch => $target_branch
86
+          }
87
+        )->one;
88
+        
89
+        if ($pull_request) {
90
+          $self->redirect_to("/$base_user_id/$base_project_id/pull/$pull_request->{row_id}");
91
+          return;
92
+        }
93
+        else {
94
+          my $now_tm = Time::Moment->now_utc;
95
+          my $now_epoch = $now_tm->epoch;
96
+          my $user_row_id = app->dbi->model('user')->select(
94 97
             'row_id',
95
-            where => {
98
+            where => {id => $base_user_id}
99
+          )->value;
100
+          
101
+          my $new_pull_request_row_id;
102
+          my $session_user_row_id = $api->session_user_row_id;
103
+          app->dbi->connector->txn(sub {
104
+            # New pull request
105
+            my $new_pull_request_params = {
96 106
               base_project => $project_row_id,
97 107
               base_branch => $base_branch,
98 108
               target_project => $target_project->{row_id},
99
-              target_branch => $target_branch
100
-            }
101
-          )->value;
102
-          
103
-          # Get pull request message number
104
-          my $number = app->dbi->model('pull_request_message')->select(
105
-            'max(number)',
106
-            where => {pull_request => $new_pull_request_row_id},
107
-            append => 'group by number'
108
-          )->value;
109
-          
110
-          $number //= 0;
111
-          
112
-          my $new_number = $number + 1;
109
+              target_branch => $target_branch,
110
+              title => $title,
111
+              open => 1,
112
+              open_time => $now_epoch,
113
+              open_user => $session_user_row_id
114
+            };
115
+            
116
+            app->dbi->model('pull_request')->insert($new_pull_request_params);
117
+            
118
+            $new_pull_request_row_id = app->dbi->model('pull_request')->select(
119
+              'row_id',
120
+              where => {
121
+                base_project => $project_row_id,
122
+                base_branch => $base_branch,
123
+                target_project => $target_project->{row_id},
124
+                target_branch => $target_branch
125
+              }
126
+            )->value;
127
+            
128
+            # Get pull request message number
129
+            my $number = app->dbi->model('pull_request_message')->select(
130
+              'max(number)',
131
+              where => {pull_request => $new_pull_request_row_id},
132
+              append => 'group by number'
133
+            )->value;
134
+            
135
+            $number //= 0;
136
+            
137
+            my $new_number = $number + 1;
138
+            
139
+            # New pull request message
140
+            my $new_pull_request_message_params = {
141
+              pull_request => $new_pull_request_row_id,
142
+              number => $new_number,
143
+              message => $message,
144
+              create_time => $now_epoch,
145
+              update_time => $now_epoch,
146
+              user => $session_user_row_id
147
+            };
148
+            
149
+            app->dbi->model('pull_request_message')->insert($new_pull_request_message_params);
150
+          });
113 151
           
114
-          # New pull request message
115
-          my $new_pull_request_message_params = {
116
-            pull_request => $new_pull_request_row_id,
117
-            number => $new_number,
118
-            message => $message,
119
-            create_time => $now_epoch,
120
-            update_time => $now_epoch,
121
-            user => $session_user_row_id
122
-          };
123
-          
124
-          app->dbi->model('pull_request_message')->insert($new_pull_request_message_params);
125
-        });
126
-        
127
-        $self->redirect_to("/$base_user_id/$base_project_id/pull/$new_pull_request_row_id");
128
-        return;
152
+          $self->redirect_to("/$base_user_id/$base_project_id/pull/$new_pull_request_row_id");
153
+          return;
154
+        }
155
+      }
156
+      else {
157
+        $errors = $validation->messages;
129 158
       }
130 159
     }
131 160
   }
... ...
@@ -321,6 +350,8 @@
321 350
 %= include '/include/header';
322 351
 
323 352
 <div class="container">
353
+  %= include '/include/errors', errors => $errors;
354
+  
324 355
   <div class="topic1">
325 356
     % if ($can_open_pull_request) {
326 357
       Open a pull request
-182
templates/import-branch.html.ep
... ...
@@ -1,182 +0,0 @@
1
-<%
2
-  
3
-  my $api = gitprep_api;
4
-  
5
-  my $user = param('user');
6
-  my $project = param('project');
7
-  my $remote_user = param('remote_user');
8
-  my $remote_project = param('remote_project');
9
-  my $remote_branch = param('remote-branch');
10
-  
11
-  # Authentication
12
-  unless ($api->logined($user)) {
13
-    $self->redirect_to('/');
14
-    return;
15
-  }
16
-  
17
-  # Branches
18
-  my $git = app->git;
19
-  my $remote_branches = $git->branches($self->app->rep_info($remote_user, $remote_project));
20
-  my $remote_branch_names = [map { $_->{name} } @$remote_branches];
21
-  
22
-  my $op = param('op') || '';
23
-  my $errors;
24
-  if ($op eq 'import' && lc $self->req->method eq 'post') {
25
-    # Parameters
26
-    my $user = param('user');
27
-    my $project = param('project');
28
-    my $branch = param('branch');
29
-    my $remote_user = param('remote_user');
30
-    my $remote_project = param('remote_project');
31
-    my $remote_branch = param('remote-branch');
32
-    my $force = param('force');
33
-    
34
-    # Validator
35
-    my $vc = app->vc;
36
-    
37
-    # Validation result
38
-    my $validation = $vc->validation;
39
-    
40
-    # "user"
41
-    if (!$vc->check($user, 'user_name')) {
42
-      $validation->add_failed('User name is invalid.');
43
-    }
44
-    
45
-    # "project"
46
-    if (!$vc->check($project, 'project_name')) {
47
-      $validation->add_failed('Repository name is invalid.');
48
-    }
49
-    
50
-    # "branch"
51
-    if (!(defined $branch && length $branch)) {
52
-      $validation->add_failed('Branch name is empty.');
53
-    }
54
-    
55
-    # "remote_user"
56
-    if (!$vc->check($remote_user, 'user_name')) {
57
-      $validation->add_failed('Remote User name is invalid.');
58
-    }
59
-    
60
-    # "remote_project"
61
-    if (!$vc->check($remote_project, 'project_name')) {
62
-      $validation->add_failed('Remote repository is invalid.');
63
-    }
64
-    
65
-    # "remote-branch"
66
-    if (!(defined $remote_branch && length $remote_branch)) {
67
-      $validation->add_failed('Remote branch name is empty.');
68
-    }
69
-    
70
-    # "force"
71
-    $force = $force ? 1 : 0;
72
-    
73
-    if ($validation->is_valid) {
74
-      
75
-      # Check branch name
76
-      my $branches = $git->branches($self->app->rep_info($user, $project));
77
-      
78
-      if (!$force && grep { $branch eq $_->{name} } @$branches) {
79
-        $errors = ["Branch \"$branch\" is already exists. If you want to import this branch, check force option."];
80
-      }
81
-      else {
82
-        eval {
83
-          $git->import_branch(
84
-            app->rep_info($user, $project),
85
-            $branch,
86
-            app->rep_info($remote_user, $remote_project),
87
-            $remote_branch,
88
-            {force => $force}
89
-          );
90
-        };
91
-        
92
-        if (my $e = $@) {
93
-          $errors = ['Internal Error'];
94
-          app->log->error(url_for . ": $e");
95
-        }
96
-        else {
97
-          flash(message => "Success: " . ($force ? 'force ' : '') . "import \"$remote_user / $remote_project / $remote_branch\" into \"$user / $project / $branch\"");
98
-          $self->redirect_to('current');
99
-          return;
100
-        }
101
-      }
102
-    }
103
-    else {
104
-      $errors = $validation->messages;
105
-    }
106
-  }
107
-
108
-  layout 'common', title => "Import branch";
109
-%>
110
-
111
-  %= include 'include/header';
112
-
113
-  %= javascript begin
114
-    $('document').ready(function () {
115
-      
116
-      // Select remote branch
117
-      $('[name=copy-branch-name]').on('click', function () {
118
-        $('[name=branch]').val($('[name=remote-branch]').val());
119
-        return false;
120
-      });
121
-    });
122
-  % end
123
-  
124
-  <div class="container">
125
-    % if (my $message = flash('message')) {
126
-      <div class="alert alert-success">
127
-        <button type="button" class="close" data-dismiss="alert">&times;</button>
128
-        <%= $message %>
129
-      </div>
130
-    % }
131
-    % if ($errors) {
132
-      <div class="alert alert-error">
133
-        <button type="button" class="close" data-dismiss="alert">&times;</button>
134
-        % for my $error (@$errors) {
135
-          <p><%= $error %></p>
136
-        % }
137
-      </div>
138
-    % }
139
-    <h3 class="topic1">Import branch</h3>
140
-    <form action="<%= url_for("/$user/$project/import-branch/$remote_user/$remote_project")->query(op => 'import') %>" method="post">
141
-      <div class="import-branch">
142
-        <div class="left">
143
-          <div class="import-branch-to">
144
-            <div>
145
-              %= "$user / $project";
146
-            </div>
147
-            <div>
148
-              %= text_field 'branch', placeholder => "Branch name", style => "width:250px";
149
-              <button name="copy-branch-name", class="btn" style="font-size:12px; padding-left:3px;padding-right:3px;color:#666">Copy Branch Name</button>
150
-            </div>
151
-            <div class="import-branch-button-panel">
152
-              <div>
153
-                %= submit_button 'Import', class => "btn btn-info";
154
-              </div>
155
-              <div>
156
-                <%= check_box force => 1 %> 
157
-              </div>
158
-              <div>
159
-                Force
160
-              </div>
161
-            </div>
162
-          </div>
163
-        </div>
164
-        <div class="center">
165
-          &lArr;
166
-        </div>
167
-        <div class="right">
168
-          <div  class="import-branch-from">
169
-            <div>
170
-              %= "$remote_user / $remote_project";
171
-            </div>
172
-            <div>
173
-              % param('remote-branch' => $remote_branch);
174
-              %= select_field 'remote-branch' => $remote_branch_names, style => "width:250px";
175
-            </div>
176
-          </div>
177
-        </div>
178
-      </div>
179
-    </form>
180
-  </div>
181
-  
182
-  %= include '/include/footer';
-15
templates/network.html.ep
... ...
@@ -70,18 +70,6 @@
70 70
         location.href = '<%= url_for("/$user_id/$project_id/network/graph/") %>' + branch + '...'
71 71
           + remote_member + '/' + remote_project + '/' + remote_branch;
72 72
       });
73
-
74
-      // Click import button
75
-      $('[name=import-btn]').on('click', function () {
76
-        var branch = $('[name=branch]').val();
77
-        var remote = $(this).closest('[name=remote]');
78
-        var remote_member = remote.find('[name=remote-member]').text();
79
-        var remote_project = remote.find('[name=remote-project]').text();
80
-        var remote_branch = remote.find('[name=remote-branch]').val();
81
-        
82
-        location.href = '<%= url_for("/$user_id/$project_id/import-branch/") %>'
83
-          + remote_member + '/' + remote_project + '?remote-branch=' + remote_branch;
84
-      });
85 73
     });
86 74
   % end
87 75
   
... ...
@@ -119,9 +107,6 @@
119 107
             </div>
120 108
             <div class="last-child">
121 109
               <button name="compare-btn" class="btn" style="margin-top:5px">Compare</button>
122
-              % if ($api->logined($user_id)) {
123
-                <button name="import-btn" class="btn" style="margin-top:5px">Import</button>
124
-              % }
125 110
             </div>
126 111
           </li>
127 112
         % }
+50 -10
templates/settings.html.ep
... ...
@@ -34,6 +34,9 @@
34 34
       if (!(defined $to_project && length $to_project)) {
35 35
         $validation->add_failed('to-project' => 'Repository name is empty.');
36 36
       }
37
+      elsif (length $to_project > 300) {
38
+        $validation->add_failed('to-project' => 'Repository name is too long.');
39
+      }
37 40
       elsif (!$vc->check($to_project, 'project_name')) {
38 41
         $validation->add_failed('to-project' => 'Repository name contains invalid charactor.');
39 42
       }
... ...
@@ -59,18 +62,32 @@
59 62
     
60 63
     # Change description
61 64
     elsif ($op eq 'change-description') {
65
+      
66
+      # Parameters
62 67
       my $description = param('description');
63 68
       $description = '' unless defined $description;
69
+ 
70
+      # Validator
71
+      my $vc = app->vc;
64 72
       
65
-      eval { $git->description(app->rep_info($user_id, $project_id), $description) };
66
-      if (my $e = $@) {
67
-        app->log->error("/$user_id/$project_id/settings?op=description: $e");
68
-        $errors = ['Internal Error'];
73
+      # Validation result
74
+      my $validation = $vc->validation;
75
+      
76
+      if (length $description > 300) {
77
+        $validation->add_failed(description => 'description is too long');
69 78
       }
70
-      else {
71
-        flash(message => 'Description is saved.');
72
-        $self->redirect_to('current');
73
-        return;
79
+      
80
+      if ($validation->is_valid) {
81
+        eval { $git->description(app->rep_info($user_id, $project_id), $description) };
82
+        if (my $e = $@) {
83
+          app->log->error("/$user_id/$project_id/settings?op=description: $e");
84
+          $errors = ['Internal Error'];
85
+        }
86
+        else {
87
+          flash(message => 'Description is saved.');
88
+          $self->redirect_to('current');
89
+          return;
90
+        }
74 91
       }
75 92
     }
76 93
     
... ...
@@ -82,16 +99,39 @@
82 99
       my $private = param('private');
83 100
       my $ignore_space_change = param('ignore_space_change');
84 101
       my $guess_encoding = param('guess_encoding');
102
+
103
+      # Validator
104
+      my $vc = app->vc;
105
+      
106
+      # Validation result
107
+      my $validation = $vc->validation;
108
+      
109
+      # Check default branch
110
+      if (length $default_branch > 300) {
111
+        $validation->add_failed('default-branch' => 'default branch is too long');
112
+      }
113
+      
114
+      # Check private
115
+      $private = $private ? 1 : 0;
116
+      
117
+      # Check ignore space change
118
+      $ignore_space_change = $ignore_space_change ? 1 : 0;
119
+      
120
+      # Check guess encoding
121
+      $guess_encoding //= '';
122
+      if (length $guess_encoding > 300) {
123
+        $validation->add_failed(guess_encoding => 'guess_encoding is too long');
124
+      }
85 125
       
86 126
       my $params = {};
87 127
       if (defined $default_branch) {
88 128
         $params->{default_branch} = $default_branch;
89 129
       }
90 130
       if (defined $private) {
91
-        $params->{private} = $private ? 1 : 0;
131
+        $params->{private} = $private;
92 132
       };
93 133
       if (defined $ignore_space_change) {
94
-        $params->{ignore_space_change} = $ignore_space_change ? 1 : 0;
134
+        $params->{ignore_space_change} = $ignore_space_change;
95 135
       }
96 136
       if (defined $guess_encoding) {
97 137
         $params->{guess_encoding} = $guess_encoding;
+5 -4
templates/user-keys.html.ep
... ...
@@ -1,9 +1,10 @@
1 1
 <%
2
-  my $user = param('user');
2
+  my $user_id = param('user');
3 3
   
4
-  warn param('user.keys');
5
-  
6
-  my $keys = app->dbi->model('ssh_public_key')->select(where => {user_id => $user})->all;
4
+  my $keys = app->dbi->model('ssh_public_key')->select(
5
+    where => {'__user.id' => $user_id},
6
+    append => 'order by title'
7
+  )->all;
7 8
   my $keys_str = '';
8 9
   for my $key (@$keys) {
9 10
     $keys_str .= "$key->{key}\n";
+18 -7
templates/user-settings/ssh.html.ep
... ...
@@ -4,10 +4,10 @@
4 4
   
5 5
   # Parameters
6 6
   my $op = param('op') || '';
7
-  my $user = param('user') || '';
7
+  my $user_id = param('user') || '';
8 8
   
9 9
   # Authentication
10
-  unless ($api->logined($user)) {
10
+  unless ($api->logined($user_id)) {
11 11
     $self->redirect_to('/');
12 12
     return;
13 13
   }
... ...
@@ -49,6 +49,9 @@
49 49
       if (!(defined $original_key && length $original_key)) {
50 50
         $validation->add_failed(key => 'key is empty');
51 51
       }
52
+      elsif (length $original_key > 2000) {
53
+        $validation->add_failed(key => 'key is too long');
54
+      }
52 55
       else {
53 56
         my $type;
54 57
         my $original_key_edit;
... ...
@@ -99,8 +102,9 @@
99 102
       
100 103
       # Register ssh key
101 104
       if ($validation->is_valid) {
105
+        my $session_user_row_id = $api->session_user_row_id;
102 106
         my $p = {
103
-          user_id => $user,
107
+          user => $session_user_row_id,
104 108
           title => $title,
105 109
           key => $key
106 110
         };
... ...
@@ -128,6 +132,7 @@
128 132
     # Delete ssh public key
129 133
     elsif ($op eq 'delete') {
130 134
       my $row_id = param('row-id');
135
+      
131 136
       eval {
132 137
         app->dbi->connector->txn(sub {
133 138
           app->dbi->model('ssh_public_key')->delete(where => {row_id => $row_id});
... ...
@@ -146,7 +151,13 @@
146 151
     }
147 152
   }
148 153
   
149
-  my $keys = app->dbi->model('ssh_public_key')->select(where => {user_id => $user})->all;
154
+  my $keys = app->dbi->model('ssh_public_key')->select(
155
+    {
156
+      __MY__ => '*'
157
+    },
158
+    where => {'__user.id' => $user_id},
159
+    append => 'order by title'
160
+  )->all;
150 161
 %>
151 162
 
152 163
 % layout 'common', title => 'SSH keys';
... ...
@@ -158,10 +169,10 @@
158 169
       <div class="left">
159 170
         <ul>
160 171
           <li>
161
-            <a href="<%= url_for("/$user/_settings") %>">Profile</a>
172
+            <a href="<%= url_for("/$user_id/_settings") %>">Profile</a>
162 173
           </li>
163 174
           <li class="active">
164
-            <a href="<%= url_for("/$user/_settings/ssh") %>">SSH keys</a>
175
+            <a href="<%= url_for("/$user_id/_settings/ssh") %>">SSH keys</a>
165 176
           </li>
166 177
         </ul>
167 178
       </div>
... ...
@@ -172,7 +183,7 @@
172 183
         <div class="user-settings-container ssh-keys">
173 184
           <div>
174 185
             <div>
175
-              <span>SSH Keys</span> (<a href="<%= url_for("/$user.keys") %>">see</a>)
186
+              <span>SSH Keys</span> (<a href="<%= url_for("/$user_id.keys") %>">see</a>)
176 187
             </div>
177 188
           </div>
178 189
           <div>
-69
xt/user.t
... ...
@@ -498,75 +498,6 @@ note 'Delete branch';
498 498
   $t->content_unlike(qr/tmp_branch/);
499 499
 }
500 500
 
501
-note 'import-branch';
502
-{
503
-  system("$FindBin::Bin/../setup_database", $db_file) == 0
504
-    or die "Can't setup $db_file";
505
-  my $app = Mojo::Server->new->load_app("$FindBin::Bin/../script/gitprep");
506
-
507
-  my $t = Test::Mojo->new($app);
508
-  $t->ua->max_redirects(3);
509
-
510
-  # Login as kimoto1
511
-  $t->post_ok('/_login?op=login', form => {id => 'kimoto1', password => 'a'});
512
-  $t->get_ok('/')->content_like(qr/Logined as kimoto1 /);
513
-
514
-  # Create project
515
-  $t->post_ok('/_new?op=create', form => {project => 'import-branch1', description => '', readme => 1});
516
-  $t->get_ok('/kimoto1')->content_like(qr/import-branch1/);
517
-  
518
-  # Login as kimoto2
519
-  $t->post_ok('/_login?op=login', form => {id => 'kimoto2', password => 'a'});
520
-  $t->get_ok('/')->content_like(qr/Logined as kimoto2 /);
521
-
522
-  # Fork kimoto1/import-branch1
523
-  $t->get_ok("/kimoto1/import-branch1/fork");
524
-  $t->content_like(qr#Repository is forked from /kimoto1/import-branch1#);
525
-
526
-  # Access not valid user
527
-  $t->get_ok('/kimoto1/import-branch1/network');
528
-  $t->content_like(qr/Network/);
529
-  $t->content_unlike(qr/Import/);
530
-  $t->get_ok('/kimoto1/import-branch1/import-branch/kimoto2/import-branch1?remote-branch=master');
531
-  $t->content_like(qr/ Index page /);
532
-  
533
-  # Show network page import button
534
-  $t->get_ok('/kimoto2/import-branch1/network');
535
-  $t->content_like(qr/Network/);
536
-  $t->content_like(qr/Import/);
537
-  
538
-  # Import branch page access
539
-  $t->get_ok('/kimoto2/import-branch1/import-branch/kimoto1/import-branch1?remote-branch=master');
540
-  $t->content_like(qr/Import branch/);
541
-
542
-  # Invalid parameters
543
-  $t->post_ok('/kimoto2/import-branch1/import-branch/kimoto1/import-branch1?remote-branch=master&op=import');
544
-  $t->content_like(qr/Branch name is empty/);
545
-  
546
-  # Import branch
547
-  $t->post_ok('/kimoto2/import-branch1/import-branch/kimoto1/import-branch1?op=import', form => {
548
-    branch => 'new1',
549
-    'remote-branch' => 'master'
550
-  });
551
-  $t->content_like(qr#Success: import#);
552
-  $t->get_ok('/kimoto2/import-branch1/branches')->content_like(qr/new1/);
553
-
554
-  # Import same name branch fail
555
-  $t->post_ok('/kimoto2/import-branch1/import-branch/kimoto1/import-branch1?op=import', form => {
556
-    branch => 'new1',
557
-    'remote-branch' => 'master'
558
-  });
559
-  $t->content_like(qr#already exists#);
560
-
561
-  # Import force
562
-  $t->post_ok('/kimoto2/import-branch1/import-branch/kimoto1/import-branch1?op=import', form => {
563
-    branch => 'new1',
564
-    'remote-branch' => 'master',
565
-    force => 1
566
-  });
567
-  $t->content_like(qr#Success: force import#);
568
-}
569
-
570 501
 note 'Private repository and collaborator';
571 502
 {
572 503
   unlink $db_file;