Module: JIRA::Atlassian::Jwt

Defined in:
lib/jira/atlassian/jwt.rb

Constant Summary collapse

CANONICAL_QUERY_SEPARATOR =
'&'
ESCAPED_CANONICAL_QUERY_SEPARATOR =
'%26'

Class Method Summary collapse

Class Method Details

.build_claims(issuer, url, http_method, base_url = '', issued_at = nil, expires = nil, attributes = {}) ⇒ Object

rubocop:disable Metrics/ParameterLists



39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/jira/atlassian/jwt.rb', line 39

def build_claims(issuer, url, http_method, base_url = '', issued_at = nil, expires = nil, attributes = {}) # rubocop:disable Metrics/ParameterLists
  issued_at ||= Time.now.to_i
  expires ||= issued_at + 60
  qsh = Digest::SHA256.hexdigest(create_canonical_request(url, http_method, base_url))

  {
    iss: issuer,
    iat: issued_at,
    exp: expires,
    qsh: qsh
  }.merge(attributes)
end

.canonicalize_query_string(query) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/jira/atlassian/jwt.rb', line 60

def canonicalize_query_string(query)
  return '' if query.nil? || query.empty?

  query = CGI.parse(query)
  query.delete('jwt')
  query.each do |k, v|
    query[k] = v.map { |a| CGI.escape a }.join(',') if v.is_a? Array
    query[k].gsub!('+', '%20')  # Use %20, not CGI.escape default of "+"
    query[k].gsub!('%7E', '~')  # Unescape "~" per JS tests
  end
  query = query.sort.to_h
  query.map { |k, v| "#{CGI.escape k}=#{v}" }.join(CANONICAL_QUERY_SEPARATOR)
end

.canonicalize_uri(uri, base_uri) ⇒ Object



52
53
54
55
56
57
58
# File 'lib/jira/atlassian/jwt.rb', line 52

def canonicalize_uri(uri, base_uri)
  path = uri.path.sub(/^#{base_uri.path}/, '')
  path = '/' if path.nil? || path.empty?
  path = "/#{path}" unless path.start_with? '/'
  path.chomp!('/') if path.length > 1
  path.gsub(CANONICAL_QUERY_SEPARATOR, ESCAPED_CANONICAL_QUERY_SEPARATOR)
end

.create_canonical_request(uri, http_method, base_uri) ⇒ Object



28
29
30
31
32
33
34
35
36
37
# File 'lib/jira/atlassian/jwt.rb', line 28

def create_canonical_request(uri, http_method, base_uri)
  uri = URI.parse(uri) unless uri.is_a? URI
  base_uri = URI.parse(base_uri) unless base_uri.is_a? URI

  [
    http_method.upcase,
    canonicalize_uri(uri, base_uri),
    canonicalize_query_string(uri.query)
  ].join(CANONICAL_QUERY_SEPARATOR)
end