@@ -73,11 +73,17 @@ def deploy_key?
73
73
end
74
74
75
75
76
+ # Return the first part of key identifier
77
+ # For redmine_nicolas_deploy_key_2@redmine_1419167701_730356
78
+ # return redmine_nicolas_deploy_key_2
76
79
def owner
77
80
self . identifier . split ( '@' ) [ 0 ]
78
81
end
79
82
80
83
84
+ # Return the last part of key identifier
85
+ # For redmine_nicolas_deploy_key_2@redmine_1419167701_730356
86
+ # return redmine_1419167701_730356
81
87
def location
82
88
self . identifier . split ( '@' ) [ 1 ]
83
89
end
@@ -226,24 +232,37 @@ def set_identifier
226
232
begin
227
233
my_time = Time . now
228
234
time_tag = "#{ my_time . to_i . to_s } _#{ my_time . usec . to_s } "
229
- key_count = GitolitePublicKey . by_user ( self . user ) . deploy_key . length + 1
230
235
case key_type
231
236
when KEY_TYPE_USER
232
- # add "redmine_" as a prefix to the username, and then the current date
233
- # this helps ensure uniqueness of each key identifier
234
- #
235
- # also, it ensures that it is very, very unlikely to conflict with any
236
- # existing key name if gitolite config is also being edited manually
237
- "#{ self . user . gitolite_identifier } " << "@redmine_" << "#{ time_tag } " . gsub ( /[^0-9a-zA-Z\- ]/ , '_' )
237
+ # KEY FORMAT : <user.gitolite_identifier>@redmine_<TIMESTAMP>
238
+ "#{ user . gitolite_identifier } " << "@redmine_" << "#{ time_tag } " . gsub ( /[^0-9a-zA-Z\- ]/ , '_' )
238
239
when KEY_TYPE_DEPLOY
239
- # add "redmine_deploy_key_" as a prefix, and then the current date
240
- # to help ensure uniqueness of each key identifier
241
- # "redmine_#{DEPLOY_PSEUDO_USER}_#{time_tag}".gsub(/[^0-9a-zA-Z\-]/, '_') << "@redmine_" << "#{time_tag}".gsub(/[^0-9a-zA-Z\-]/, '_')
242
- "#{ self . user . gitolite_identifier } _#{ DEPLOY_PSEUDO_USER } _#{ key_count } " . gsub ( /[^0-9a-zA-Z\- ]/ , '_' ) << "@redmine_" << "#{ time_tag } " . gsub ( /[^0-9a-zA-Z\- ]/ , '_' )
240
+ # KEY FORMAT : <user.gitolite_identifier>_<DEPLOY_PSEUDO_USER>_<KEY_COUNTER>@redmine_<TIMESTAMP>
241
+ deploy_key_identifier << "@redmine_" << "#{ time_tag } " . gsub ( /[^0-9a-zA-Z\- ]/ , '_' )
243
242
else
244
243
nil
245
244
end
246
245
end
247
246
end
248
247
248
+
249
+ def deploy_key_identifier
250
+ # Fix https://github.com/jbox-web/redmine_git_hosting/issues/288
251
+ # Getting user deployment keys count is not sufficient to assure uniqueness of
252
+ # deployment key identifier. So we need an 'external' counter to increment the global count
253
+ # while a key with this identifier exists.
254
+ count = 0
255
+ begin
256
+ key_id = generate_deploy_key_identifier ( count )
257
+ count += 1
258
+ end while user . gitolite_public_keys . deploy_key . map ( &:owner ) . include? ( key_id )
259
+ key_id
260
+ end
261
+
262
+
263
+ def generate_deploy_key_identifier ( count )
264
+ key_count = user . gitolite_public_keys . deploy_key . length + 1 + count
265
+ "#{ user . gitolite_identifier } _#{ DEPLOY_PSEUDO_USER } _#{ key_count } " . gsub ( /[^0-9a-zA-Z\- ]/ , '_' )
266
+ end
267
+
249
268
end
0 commit comments