Skip to content

Commit c9bc0b3

Browse files
author
root
committed
Fix #288
1 parent 58b1738 commit c9bc0b3

File tree

1 file changed

+30
-11
lines changed

1 file changed

+30
-11
lines changed

Diff for: app/models/gitolite_public_key.rb

+30-11
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,17 @@ def deploy_key?
7373
end
7474

7575

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
7679
def owner
7780
self.identifier.split('@')[0]
7881
end
7982

8083

84+
# Return the last part of key identifier
85+
# For redmine_nicolas_deploy_key_2@redmine_1419167701_730356
86+
# return redmine_1419167701_730356
8187
def location
8288
self.identifier.split('@')[1]
8389
end
@@ -226,24 +232,37 @@ def set_identifier
226232
begin
227233
my_time = Time.now
228234
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
230235
case key_type
231236
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\-]/, '_')
238239
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\-]/, '_')
243242
else
244243
nil
245244
end
246245
end
247246
end
248247

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+
249268
end

0 commit comments

Comments
 (0)