Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Boxiang Sun
gitlab-ce
Commits
1221bec5
Commit
1221bec5
authored
Apr 14, 2015
by
Douwe Maan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor key fingerprint generation.
parent
e245547e
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
71 additions
and
40 deletions
+71
-40
app/models/key.rb
app/models/key.rb
+4
-40
lib/gitlab/key_fingerprint.rb
lib/gitlab/key_fingerprint.rb
+55
-0
spec/lib/gitlab/key_fingerprint_spec.rb
spec/lib/gitlab/key_fingerprint_spec.rb
+12
-0
No files found.
app/models/key.rb
View file @
1221bec5
...
...
@@ -16,7 +16,6 @@ require 'digest/md5'
class
Key
<
ActiveRecord
::
Base
include
Sortable
include
Gitlab
::
Popen
belongs_to
:user
...
...
@@ -79,44 +78,9 @@ class Key < ActiveRecord::Base
def
generate_fingerprint
self
.
fingerprint
=
nil
return
unless
key
.
present?
cmd_status
=
0
cmd_output
=
''
explicit_fingerprint_algorithm
=
false
Tempfile
.
open
(
'gitlab_key_file'
)
do
|
file
|
file
.
puts
key
file
.
rewind
# OpenSSH 6.8 introduces a new default output format for fingerprints.
# Check the version and decide which command to use.
version_output
,
version_status
=
popen
(
%W(ssh -V)
)
if
version_status
.
zero?
out
,
_
=
version_output
.
scan
/.*?(\d)\.(\d).*?,/
major
,
minor
=
out
[
0
],
out
[
1
]
if
major
.
to_i
>
6
or
(
major
.
to_i
==
6
and
minor
.
to_i
>=
8
)
explicit_fingerprint_algorithm
=
true
end
end
if
explicit_fingerprint_algorithm
cmd_output
,
cmd_status
=
popen
(
%W(ssh-keygen -E md5 -lf
#{
file
.
path
}
)
,
'/tmp'
)
else
cmd_output
,
cmd_status
=
popen
(
%W(ssh-keygen -lf
#{
file
.
path
}
)
,
'/tmp'
)
end
end
return
unless
self
.
key
.
present?
if
cmd_status
.
zero?
if
explicit_fingerprint_algorithm
cmd_output
.
gsub
/(MD5:)(\h{2}:)+\h{2}/
do
|
match
|
match
.
slice!
/^MD5:/
self
.
fingerprint
=
match
end
else
cmd_output
.
gsub
/(\h{2}:)+\h{2}/
do
|
match
|
self
.
fingerprint
=
match
end
end
end
self
.
fingerprint
=
Gitlab
::
KeyFingerprint
.
new
(
self
.
key
).
fingerprint
end
end
lib/gitlab/key_fingerprint.rb
0 → 100644
View file @
1221bec5
module
Gitlab
class
KeyFingerprint
include
Gitlab
::
Popen
attr_accessor
:key
def
initialize
(
key
)
@key
=
key
end
def
fingerprint
cmd_status
=
0
cmd_output
=
''
Tempfile
.
open
(
'gitlab_key_file'
)
do
|
file
|
file
.
puts
key
file
.
rewind
cmd
=
[]
cmd
.
push
*
%W(ssh-keygen)
cmd
.
push
*
%W(-E md5)
if
explicit_fingerprint_algorithm?
cmd
.
push
*
%W(-lf
#{
file
.
path
}
)
cmd_output
,
cmd_status
=
popen
(
cmd
,
'/tmp'
)
end
return
nil
unless
cmd_status
.
zero?
# 16 hex bytes separated by ':', optionally starting with "MD5:"
fingerprint_match
=
cmd_output
.
match
(
/(MD5:)?(?<fingerprint>(?:\h{2}:){15}\h{2})/
)
return
nil
unless
fingerprint_match
fingerprint_match
[
:fingerprint
]
end
private
def
explicit_fingerprint_algorithm?
# OpenSSH 6.8 introduces a new default output format for fingerprints.
# Check the version and decide which command to use.
version_output
,
version_status
=
popen
(
%W(ssh -V)
)
return
false
unless
version_status
.
zero?
version_matches
=
version_output
.
match
(
/OpenSSH_(?<major>\d+)\.(?<minor>\d+)/
)
return
false
unless
version_matches
version_info
=
Gitlab
::
VersionInfo
.
new
(
version_matches
[
:major
].
to_i
,
version_matches
[
:minor
].
to_i
)
required_version_info
=
Gitlab
::
VersionInfo
.
new
(
6
,
8
)
version_info
>=
required_version_info
end
end
end
spec/lib/gitlab/key_fingerprint_spec.rb
0 → 100644
View file @
1221bec5
require
"spec_helper"
describe
Gitlab
::
KeyFingerprint
do
let
(
:key
)
{
"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0="
}
let
(
:fingerprint
)
{
"3f:a2:ee:de:b5:de:53:c3:aa:2f:9c:45:24:4c:47:7b"
}
describe
"#fingerprint"
do
it
"generates the key's fingerprint"
do
expect
(
Gitlab
::
KeyFingerprint
.
new
(
key
).
fingerprint
).
to
eq
(
fingerprint
)
end
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment