From c2b101cc2d1f51a4968673756eecfb2e36bf682c Mon Sep 17 00:00:00 2001 From: Ash McKenzie Date: Mon, 11 Feb 2019 17:23:03 +1100 Subject: Provide expires_in for LFS if available --- lib/gitlab_lfs_authentication.rb | 33 ++++++++++++++++------- spec/gitlab_lfs_authentication_spec.rb | 48 ++++++++++++++++++++++++---------- 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 -- cgit v1.2.1