summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAsh McKenzie <amckenzie@gitlab.com>2019-02-11 17:23:03 +1100
committerAsh McKenzie <amckenzie@gitlab.com>2019-02-14 12:56:56 +1100
commitc2b101cc2d1f51a4968673756eecfb2e36bf682c (patch)
tree28ec983e58c4922196f9b1311942a6531dcf37a8
parent1fcb56f42cdb2b6f562d8875abc4e33f7ef3e258 (diff)
downloadgitlab-shell-57353-git-push-fails-on-large-lfs-files-where-the-push-take-a-long-time.tar.gz
-rw-r--r--lib/gitlab_lfs_authentication.rb33
-rw-r--r--spec/gitlab_lfs_authentication_spec.rb48
2 files changed, 57 insertions, 24 deletions
diff --git a/lib/gitlab_lfs_authentication.rb b/lib/gitlab_lfs_authentication.rb
index ccd6d69..574dc98 100644
--- a/lib/gitlab_lfs_authentication.rb
+++ b/lib/gitlab_lfs_authentication.rb
@@ -2,29 +2,42 @@ require 'base64'
require 'json'
class GitlabLfsAuthentication
+ # TODO: These don't need to be public
attr_accessor :username, :lfs_token, :repository_http_path
- def initialize(username, lfs_token, repository_http_path)
+ def initialize(username, lfs_token, repository_http_path, expires_in = nil)
@username = username
@lfs_token = lfs_token
@repository_http_path = repository_http_path
+ @expires_in = expires_in
end
def self.build_from_json(json)
values = JSON.parse(json)
- new(values['username'], values['lfs_token'], values['repository_http_path'])
+ new(values['username'],
+ values['lfs_token'],
+ values['repository_http_path'],
+ values['expires_in'])
rescue
nil
end
+ # Source: https://github.com/git-lfs/git-lfs/blob/master/docs/api/server-discovery.md#ssh
+ #
def authentication_payload
- authorization = {
- header: {
- Authorization: "Basic #{Base64.strict_encode64("#{username}:#{lfs_token}")}"
- },
- href: "#{repository_http_path}/info/lfs/"
- }
-
- JSON.generate(authorization)
+ payload = { header: { Authorization: authorization }, href: href }
+ payload[:expires_in] = @expires_in if @expires_in
+
+ JSON.generate(payload)
+ end
+
+ private
+
+ def authorization
+ "Basic #{Base64.strict_encode64("#{username}:#{lfs_token}")}"
+ end
+
+ def href
+ "#{repository_http_path}/info/lfs"
end
end
diff --git a/spec/gitlab_lfs_authentication_spec.rb b/spec/gitlab_lfs_authentication_spec.rb
index 81b53a7..acc9e3d 100644
--- a/spec/gitlab_lfs_authentication_spec.rb
+++ b/spec/gitlab_lfs_authentication_spec.rb
@@ -3,15 +3,17 @@ require 'gitlab_lfs_authentication'
require 'json'
describe GitlabLfsAuthentication do
+ let(:payload_from_gitlab_api) do
+ {
+ username: 'dzaporozhets',
+ lfs_token: 'wsnys8Zm8Jn7zyhHTAAK',
+ repository_http_path: 'http://gitlab.dev/repo'
+ }
+ end
+
subject do
GitlabLfsAuthentication.build_from_json(
- JSON.generate(
- {
- username: 'dzaporozhets',
- lfs_token: 'wsnys8Zm8Jn7zyhHTAAK',
- repository_http_path: 'http://gitlab.dev/repo'
- }
- )
+ JSON.generate(payload_from_gitlab_api)
)
end
@@ -22,16 +24,34 @@ describe GitlabLfsAuthentication do
end
describe '#authentication_payload' do
- result = "{\"header\":{\"Authorization\":\"Basic ZHphcG9yb3poZXRzOndzbnlzOFptOEpuN3p5aEhUQUFL\"},\"href\":\"http://gitlab.dev/repo/info/lfs/\"}"
+ shared_examples 'a valid payload' do
+ it 'should be proper JSON' do
+ payload = subject.authentication_payload
+ json_payload = JSON.parse(payload)
+
+ expect(json_payload['header']['Authorization']).to eq('Basic ZHphcG9yb3poZXRzOndzbnlzOFptOEpuN3p5aEhUQUFL')
+ expect(json_payload['href']).to eq('http://gitlab.dev/repo/info/lfs')
+ end
+ end
+
+ context 'without expires_in' do
+ let(:result) { { 'header' => { 'Authorization' => 'Basic ZHphcG9yb3poZXRzOndzbnlzOFptOEpuN3p5aEhUQUFL' }, 'href' => 'http://gitlab.dev/repo/info/lfs' }.to_json }
+
+ it { expect(subject.authentication_payload).to eq(result) }
+
+ it_behaves_like 'a valid payload'
+ end
+
+ context 'with expires_in' do
+ let(:result) { { 'header' => { 'Authorization' => 'Basic ZHphcG9yb3poZXRzOndzbnlzOFptOEpuN3p5aEhUQUFL' }, 'href' => 'http://gitlab.dev/repo/info/lfs', 'expires_in' => 1800 }.to_json }
- it { expect(subject.authentication_payload).to eq(result) }
+ before do
+ payload_from_gitlab_api[:expires_in] = 1800
+ end
- it 'should be a proper JSON' do
- payload = subject.authentication_payload
- json_payload = JSON.parse(payload)
+ it { expect(subject.authentication_payload).to eq(result) }
- expect(json_payload['header']['Authorization']).to eq('Basic ZHphcG9yb3poZXRzOndzbnlzOFptOEpuN3p5aEhUQUFL')
- expect(json_payload['href']).to eq('http://gitlab.dev/repo/info/lfs/')
+ it_behaves_like 'a valid payload'
end
end
end