veracode_api_signing 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/codeql-analysis.yml +70 -0
- data/.github/workflows/tests.yml +53 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.rubocop.yml +27 -0
- data/.rubocop_todo.yml +87 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +78 -0
- data/LICENSE.txt +21 -0
- data/README.md +52 -0
- data/Rakefile +28 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/lib/veracode_api_signing/credentials.rb +57 -0
- data/lib/veracode_api_signing/exception.rb +12 -0
- data/lib/veracode_api_signing/formatters.rb +41 -0
- data/lib/veracode_api_signing/hmac_auth.rb +78 -0
- data/lib/veracode_api_signing/plugins/faraday_middleware.rb +57 -0
- data/lib/veracode_api_signing/regions.rb +31 -0
- data/lib/veracode_api_signing/utils.rb +57 -0
- data/lib/veracode_api_signing/validation.rb +91 -0
- data/lib/veracode_api_signing/version.rb +5 -0
- data/lib/veracode_api_signing.rb +7 -0
- data/shell.nix +84 -0
- data/veracode_api_signing.gemspec +43 -0
- metadata +214 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 81116e99b04c7860e24ea32f2f2aaee4d8c84f8b45d094acfbeb89b668198a06
|
4
|
+
data.tar.gz: 85540edb0fe3b0e723bc2260f70bc980e135845a2fe8d561c8677926b0b92f62
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e101221d2ef7f19af442c2a7e2c47e4fae6af13d40b8ada771b08554db6cf4d6ccbd9efe550ac1adbdf7ee796408c0bd90ccedeed77bd324437e46ffc63e026f
|
7
|
+
data.tar.gz: ee9f009356caa2b78ed466cefedccc50974ee70ed4f0de0f5a7e69255e670b2c121648a1ae879183a1a496fba4eb9b867739adef215e8f83030ef1af537b37a2
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# For most projects, this workflow file will not need changing; you simply need
|
2
|
+
# to commit it to your repository.
|
3
|
+
#
|
4
|
+
# You may wish to alter this file to override the set of languages analyzed,
|
5
|
+
# or to provide custom queries or build logic.
|
6
|
+
#
|
7
|
+
# ******** NOTE ********
|
8
|
+
# We have attempted to detect the languages in your repository. Please check
|
9
|
+
# the `language` matrix defined below to confirm you have the correct set of
|
10
|
+
# supported CodeQL languages.
|
11
|
+
#
|
12
|
+
name: "CodeQL"
|
13
|
+
|
14
|
+
on:
|
15
|
+
push:
|
16
|
+
branches: [ main ]
|
17
|
+
pull_request:
|
18
|
+
# The branches below must be a subset of the branches above
|
19
|
+
branches: [ main ]
|
20
|
+
schedule:
|
21
|
+
- cron: '29 8 * * 5'
|
22
|
+
|
23
|
+
jobs:
|
24
|
+
analyze:
|
25
|
+
name: Analyze
|
26
|
+
runs-on: ubuntu-latest
|
27
|
+
permissions:
|
28
|
+
actions: read
|
29
|
+
contents: read
|
30
|
+
security-events: write
|
31
|
+
|
32
|
+
strategy:
|
33
|
+
fail-fast: false
|
34
|
+
matrix:
|
35
|
+
language: [ 'ruby' ]
|
36
|
+
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
37
|
+
# Learn more about CodeQL language support at https://git.io/codeql-language-support
|
38
|
+
|
39
|
+
steps:
|
40
|
+
- name: Checkout repository
|
41
|
+
uses: actions/checkout@v2
|
42
|
+
|
43
|
+
# Initializes the CodeQL tools for scanning.
|
44
|
+
- name: Initialize CodeQL
|
45
|
+
uses: github/codeql-action/init@v1
|
46
|
+
with:
|
47
|
+
languages: ${{ matrix.language }}
|
48
|
+
# If you wish to specify custom queries, you can do so here or in a config file.
|
49
|
+
# By default, queries listed here will override any specified in a config file.
|
50
|
+
# Prefix the list here with "+" to use these queries and those in the config file.
|
51
|
+
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
52
|
+
|
53
|
+
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
54
|
+
# If this step fails, then you should remove it and run the build manually (see below)
|
55
|
+
- name: Autobuild
|
56
|
+
uses: github/codeql-action/autobuild@v1
|
57
|
+
|
58
|
+
# ℹ️ Command-line programs to run using the OS shell.
|
59
|
+
# 📚 https://git.io/JvXDl
|
60
|
+
|
61
|
+
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
62
|
+
# and modify them (or add more) to build your code if your project
|
63
|
+
# uses a compiled language
|
64
|
+
|
65
|
+
#- run: |
|
66
|
+
# make bootstrap
|
67
|
+
# make release
|
68
|
+
|
69
|
+
- name: Perform CodeQL Analysis
|
70
|
+
uses: github/codeql-action/analyze@v1
|
@@ -0,0 +1,53 @@
|
|
1
|
+
name: VeracodeApiSigning
|
2
|
+
on:
|
3
|
+
pull_request:
|
4
|
+
branches-ignore:
|
5
|
+
- 'gh-pages'
|
6
|
+
push:
|
7
|
+
branches-ignore:
|
8
|
+
- 'gh-pages'
|
9
|
+
jobs:
|
10
|
+
test:
|
11
|
+
strategy:
|
12
|
+
fail-fast: false
|
13
|
+
matrix:
|
14
|
+
os: [ubuntu-latest, macos-latest]
|
15
|
+
# Due to https://github.com/actions/runner/issues/849, we have to use quotes for '3.0'
|
16
|
+
ruby: [2.7, '3.0', truffleruby, truffleruby-head]
|
17
|
+
runs-on: ${{ matrix.os }}
|
18
|
+
steps:
|
19
|
+
- uses: actions/checkout@v2
|
20
|
+
- uses: ruby/setup-ruby@v1
|
21
|
+
with:
|
22
|
+
ruby-version: ${{ matrix.ruby }}
|
23
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
24
|
+
- run: bundle exec rake
|
25
|
+
|
26
|
+
deploy:
|
27
|
+
needs: test
|
28
|
+
if: github.ref == 'refs/heads/main'
|
29
|
+
runs-on: ubuntu-latest
|
30
|
+
steps:
|
31
|
+
- uses: actions/checkout@v2
|
32
|
+
with:
|
33
|
+
persist-credentials: false
|
34
|
+
|
35
|
+
- uses: ruby/setup-ruby@v1
|
36
|
+
with:
|
37
|
+
ruby-version: '3.0'
|
38
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
39
|
+
|
40
|
+
- name: Yard documents
|
41
|
+
run: |
|
42
|
+
bundle exec rake yard
|
43
|
+
|
44
|
+
- name: Deploy pages
|
45
|
+
if: github.event_name == 'push'
|
46
|
+
uses: JamesIves/github-pages-deploy-action@4.1.5
|
47
|
+
with:
|
48
|
+
SSH: false
|
49
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
50
|
+
BRANCH: gh-pages
|
51
|
+
FOLDER: doc
|
52
|
+
CLEAN: true
|
53
|
+
CLEAN_EXCLUDE: '[".gitattributes", ".gitignore", "CNAME", "LICENSE"]'
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
inherit_from: .rubocop_todo.yml
|
2
|
+
|
3
|
+
require:
|
4
|
+
- rubocop-performance
|
5
|
+
- rubocop-rake
|
6
|
+
- rubocop-rspec
|
7
|
+
|
8
|
+
AllCops:
|
9
|
+
NewCops: enable
|
10
|
+
TargetRubyVersion: 2.7
|
11
|
+
|
12
|
+
Style/StringLiterals:
|
13
|
+
Enabled: true
|
14
|
+
EnforcedStyle: double_quotes
|
15
|
+
|
16
|
+
Style/StringLiteralsInInterpolation:
|
17
|
+
Enabled: true
|
18
|
+
EnforcedStyle: double_quotes
|
19
|
+
|
20
|
+
RSpec/ExampleLength:
|
21
|
+
Max: 50
|
22
|
+
|
23
|
+
RSpec/NestedGroups:
|
24
|
+
Max: 4
|
25
|
+
|
26
|
+
Metrics/BlockLength:
|
27
|
+
Max: 100
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config`
|
3
|
+
# on 2021-10-29 23:02:10 UTC using RuboCop version 1.22.3.
|
4
|
+
# The point is for the user to remove these configuration records
|
5
|
+
# one by one as the offenses are removed from the code base.
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
# Offense count: 1
|
10
|
+
# Configuration parameters: Include.
|
11
|
+
# Include: **/*.gemspec
|
12
|
+
Gemspec/RequiredRubyVersion:
|
13
|
+
Exclude:
|
14
|
+
- 'veracode_api_signing.gemspec'
|
15
|
+
|
16
|
+
# Offense count: 1
|
17
|
+
# Cop supports --auto-correct.
|
18
|
+
# Configuration parameters: EnforcedStyle.
|
19
|
+
# SupportedStyles: runtime_error, standard_error
|
20
|
+
Lint/InheritException:
|
21
|
+
Exclude:
|
22
|
+
- 'lib/veracode_api_signing/exception.rb'
|
23
|
+
|
24
|
+
# Offense count: 1
|
25
|
+
# Configuration parameters: IgnoredMethods, CountRepeatedAttributes.
|
26
|
+
Metrics/AbcSize:
|
27
|
+
Max: 38
|
28
|
+
|
29
|
+
# Offense count: 5
|
30
|
+
# Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
|
31
|
+
Metrics/MethodLength:
|
32
|
+
Max: 15
|
33
|
+
|
34
|
+
# Offense count: 1
|
35
|
+
# Configuration parameters: CountKeywordArgs, MaxOptionalParameters.
|
36
|
+
Metrics/ParameterLists:
|
37
|
+
Max: 6
|
38
|
+
|
39
|
+
# Offense count: 3
|
40
|
+
Naming/AccessorMethodName:
|
41
|
+
Exclude:
|
42
|
+
- 'lib/veracode_api_signing/credentials.rb'
|
43
|
+
- 'lib/veracode_api_signing/utils.rb'
|
44
|
+
|
45
|
+
# Offense count: 3
|
46
|
+
# Configuration parameters: ForbiddenDelimiters.
|
47
|
+
# ForbiddenDelimiters: (?-mix:(^|\s)(EO[A-Z]{1}|END)(\s|$))
|
48
|
+
Naming/HeredocDelimiterNaming:
|
49
|
+
Exclude:
|
50
|
+
- 'spec/veracode_api_signing/credentials_spec.rb'
|
51
|
+
|
52
|
+
# Offense count: 2
|
53
|
+
# Configuration parameters: Include, CustomTransform, IgnoreMethods, SpecSuffixOnly.
|
54
|
+
# Include: **/*_spec*rb*, **/spec/**/*
|
55
|
+
RSpec/FilePath:
|
56
|
+
Exclude:
|
57
|
+
- 'spec/veracode_api_signing/exception_spec.rb'
|
58
|
+
- 'spec/veracode_api_signing/version_spec.rb'
|
59
|
+
|
60
|
+
# Offense count: 8
|
61
|
+
# Configuration parameters: AllowedConstants.
|
62
|
+
Style/Documentation:
|
63
|
+
Exclude:
|
64
|
+
- 'spec/**/*'
|
65
|
+
- 'test/**/*'
|
66
|
+
- 'lib/veracode_api_signing.rb'
|
67
|
+
- 'lib/veracode_api_signing/credentials.rb'
|
68
|
+
- 'lib/veracode_api_signing/formatters.rb'
|
69
|
+
- 'lib/veracode_api_signing/hmac_auth.rb'
|
70
|
+
- 'lib/veracode_api_signing/plugins/faraday_middleware.rb'
|
71
|
+
- 'lib/veracode_api_signing/regions.rb'
|
72
|
+
- 'lib/veracode_api_signing/utils.rb'
|
73
|
+
- 'lib/veracode_api_signing/validation.rb'
|
74
|
+
|
75
|
+
# Offense count: 4
|
76
|
+
# Configuration parameters: MinBodyLength.
|
77
|
+
Style/GuardClause:
|
78
|
+
Exclude:
|
79
|
+
- 'lib/veracode_api_signing/hmac_auth.rb'
|
80
|
+
- 'lib/veracode_api_signing/validation.rb'
|
81
|
+
|
82
|
+
# Offense count: 14
|
83
|
+
# Cop supports --auto-correct.
|
84
|
+
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
85
|
+
# URISchemes: http, https
|
86
|
+
Layout/LineLength:
|
87
|
+
Max: 312
|
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
veracode_api_signing (0.1.0)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
ast (2.4.2)
|
10
|
+
brakeman (5.1.2)
|
11
|
+
diff-lcs (1.4.4)
|
12
|
+
docile (1.4.0)
|
13
|
+
parallel (1.21.0)
|
14
|
+
parser (3.0.2.0)
|
15
|
+
ast (~> 2.4.1)
|
16
|
+
rainbow (3.0.0)
|
17
|
+
rake (13.0.6)
|
18
|
+
regexp_parser (2.1.1)
|
19
|
+
rexml (3.2.5)
|
20
|
+
rspec (3.10.0)
|
21
|
+
rspec-core (~> 3.10.0)
|
22
|
+
rspec-expectations (~> 3.10.0)
|
23
|
+
rspec-mocks (~> 3.10.0)
|
24
|
+
rspec-core (3.10.1)
|
25
|
+
rspec-support (~> 3.10.0)
|
26
|
+
rspec-expectations (3.10.1)
|
27
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
28
|
+
rspec-support (~> 3.10.0)
|
29
|
+
rspec-mocks (3.10.2)
|
30
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
31
|
+
rspec-support (~> 3.10.0)
|
32
|
+
rspec-support (3.10.2)
|
33
|
+
rubocop (1.22.3)
|
34
|
+
parallel (~> 1.10)
|
35
|
+
parser (>= 3.0.0.0)
|
36
|
+
rainbow (>= 2.2.2, < 4.0)
|
37
|
+
regexp_parser (>= 1.8, < 3.0)
|
38
|
+
rexml
|
39
|
+
rubocop-ast (>= 1.12.0, < 2.0)
|
40
|
+
ruby-progressbar (~> 1.7)
|
41
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
42
|
+
rubocop-ast (1.12.0)
|
43
|
+
parser (>= 3.0.1.1)
|
44
|
+
rubocop-performance (1.11.5)
|
45
|
+
rubocop (>= 1.7.0, < 2.0)
|
46
|
+
rubocop-ast (>= 0.4.0)
|
47
|
+
rubocop-rake (0.6.0)
|
48
|
+
rubocop (~> 1.0)
|
49
|
+
rubocop-rspec (2.5.0)
|
50
|
+
rubocop (~> 1.19)
|
51
|
+
ruby-progressbar (1.11.0)
|
52
|
+
simplecov (0.21.2)
|
53
|
+
docile (~> 1.1)
|
54
|
+
simplecov-html (~> 0.11)
|
55
|
+
simplecov_json_formatter (~> 0.1)
|
56
|
+
simplecov-html (0.12.3)
|
57
|
+
simplecov_json_formatter (0.1.3)
|
58
|
+
unicode-display_width (2.1.0)
|
59
|
+
yard (0.9.26)
|
60
|
+
|
61
|
+
PLATFORMS
|
62
|
+
ruby
|
63
|
+
|
64
|
+
DEPENDENCIES
|
65
|
+
brakeman (~> 5.1)
|
66
|
+
bundler (~> 2.0)
|
67
|
+
rake (~> 13.0)
|
68
|
+
rspec (~> 3.0)
|
69
|
+
rubocop (~> 1.2)
|
70
|
+
rubocop-performance (~> 1.1)
|
71
|
+
rubocop-rake (~> 0.6)
|
72
|
+
rubocop-rspec (~> 2.5)
|
73
|
+
simplecov (~> 0.21.2)
|
74
|
+
veracode_api_signing!
|
75
|
+
yard (~> 0.9.26)
|
76
|
+
|
77
|
+
BUNDLED WITH
|
78
|
+
2.2.30
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2021 Corban Raun
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# VeracodeApiSigning
|
2
|
+
|
3
|
+

|
4
|
+
|
5
|
+
Library which uses HMAC to generate signed requests for Veracode API
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'veracode_api_signing'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle install
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install veracode_api_signing
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
TODO: Write usage instructions here
|
26
|
+
|
27
|
+
## Development
|
28
|
+
|
29
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
|
+
|
31
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
|
+
|
33
|
+
### Nix development
|
34
|
+
If you have [nix](https://nixos.org/download.html) installed, you can run
|
35
|
+
- `nix-shell`
|
36
|
+
- `gem install bundler`
|
37
|
+
- `bundle install`
|
38
|
+
- `bundle exec rspec`
|
39
|
+
|
40
|
+
Optional tools
|
41
|
+
- [direnv](https://direnv.net/)
|
42
|
+
- [lorri](https://github.com/target/lorri)
|
43
|
+
|
44
|
+
**NOTE:** At some point [nix flakes](https://nixos.wiki/wiki/Flakes) will become stable, and, if you choose to use something like `lorri`, you can just use `nix` with `direnv`!
|
45
|
+
|
46
|
+
## Contributing
|
47
|
+
|
48
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/veracode_api_signing.
|
49
|
+
|
50
|
+
## License
|
51
|
+
|
52
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bundler/gem_tasks"
|
4
|
+
require "rspec/core/rake_task"
|
5
|
+
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
7
|
+
|
8
|
+
require "rubocop/rake_task"
|
9
|
+
|
10
|
+
RuboCop::RakeTask.new
|
11
|
+
|
12
|
+
require "yard"
|
13
|
+
|
14
|
+
YARD::Rake::YardocTask.new
|
15
|
+
|
16
|
+
namespace :brakeman do
|
17
|
+
desc "Run Brakeman"
|
18
|
+
task :run, :output_files do |_t, args|
|
19
|
+
require "brakeman"
|
20
|
+
|
21
|
+
files = args[:output_files].split if args[:output_files]
|
22
|
+
Brakeman.run app_path: ".", output_files: files, print_report: true, run_all_checks: true, force_scan: true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
multitask mytasks: %i[spec rubocop yard brakeman:run]
|
27
|
+
|
28
|
+
task default: %i[mytasks]
|
data/bin/console
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "bundler/setup"
|
5
|
+
require "veracode_api_signing"
|
6
|
+
|
7
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
8
|
+
# with your gem easier. You can also use a different console, if you like.
|
9
|
+
|
10
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
11
|
+
# require "pry"
|
12
|
+
# Pry.start
|
13
|
+
|
14
|
+
require "irb"
|
15
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "veracode_api_signing/exception"
|
4
|
+
|
5
|
+
module VeracodeApiSigning
|
6
|
+
class Credentials
|
7
|
+
PROFILE_DEFAULT = "default"
|
8
|
+
|
9
|
+
ENV_API_KEY_NAME = "VERACODE_API_KEY_ID"
|
10
|
+
ENV_API_SECRET_KEY_NAME = "VERACODE_API_KEY_SECRET"
|
11
|
+
ENV_PROFILE = "VERACODE_API_PROFILE"
|
12
|
+
|
13
|
+
FIX_INSTRUCTIONS = "Please consult the documentation to get your Veracode credentials set up."
|
14
|
+
|
15
|
+
# Get credentials from supported sources. Precedence is 1) env vars, 2) file.
|
16
|
+
def get_credentials(auth_file = "#{Dir.home}/.veracode/credentials")
|
17
|
+
credentials_from_environment = get_credentials_from_environment_variables
|
18
|
+
return credentials_from_environment if credentials_from_environment.compact.length == 2
|
19
|
+
|
20
|
+
credentials_from_filesystem = get_credentials_from_filesystem(auth_file)
|
21
|
+
if credentials_from_filesystem.compact.length == 2
|
22
|
+
credentials_from_filesystem
|
23
|
+
else
|
24
|
+
raise VeracodeApiSigning::CredentialsError,
|
25
|
+
"Unable to determine credentials. Set environment variables #{ENV_API_KEY_NAME}, and #{ENV_API_SECRET_KEY_NAME} or create credentials file #{Dir.home}/.veracode/credentials"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def get_credentials_from_environment_variables
|
32
|
+
[ENV[ENV_API_KEY_NAME], ENV[ENV_API_SECRET_KEY_NAME]]
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_credentials_from_filesystem(auth_file)
|
36
|
+
unless File.exist?(auth_file)
|
37
|
+
raise VeracodeApiSigning::CredentialsError,
|
38
|
+
"Could not read credentials file #{auth_file}"
|
39
|
+
end
|
40
|
+
|
41
|
+
credentials_section_name = get_credentials_profile
|
42
|
+
raw_creds = File.read(auth_file)
|
43
|
+
api_key_id = raw_creds.match(/(\[#{credentials_section_name}\].*\n)(.*#{ENV_API_KEY_NAME.downcase}.*=)(.*\S)/) do |g|
|
44
|
+
g[3]
|
45
|
+
end&.strip&.tr('"', "")
|
46
|
+
api_secret_key = raw_creds.match(/(\[#{credentials_section_name}\].*\n)(.*\n#{ENV_API_SECRET_KEY_NAME.downcase}.*=)(.*\S)/) do |g|
|
47
|
+
g[3]
|
48
|
+
end&.strip&.tr('"', "")
|
49
|
+
|
50
|
+
[api_key_id, api_secret_key]
|
51
|
+
end
|
52
|
+
|
53
|
+
def get_credentials_profile
|
54
|
+
ENV.fetch(ENV_PROFILE, PROFILE_DEFAULT)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module VeracodeApiSigning
|
4
|
+
# Generic error thrown when anything goes wrong
|
5
|
+
class Exception < StandardError; end
|
6
|
+
|
7
|
+
# Thrown if there is anything Veracode credentials, such as not found, improper format ... etc
|
8
|
+
class CredentialsError < Exception; end
|
9
|
+
|
10
|
+
# Thrown if there is anything Veracode credentials, such as not found, improper format ... etc
|
11
|
+
class UnsupportedAuthSchemeException < CredentialsError; end
|
12
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "veracode_api_signing/regions"
|
4
|
+
|
5
|
+
module VeracodeApiSigning
|
6
|
+
module Formatters
|
7
|
+
include Regions
|
8
|
+
# @param api_key_id [String] the veracode api key
|
9
|
+
# @param host [String] the url host
|
10
|
+
# @param url [String] the url path
|
11
|
+
# @param method [String] method to use [get, post, put, patch, delete]
|
12
|
+
# @example
|
13
|
+
# format_signing_data("0123456789abcdef", "veracode.com", "/home", "GET") #=> "id=0123456789abcdef&host=veracode.com&url=/home&method=GET"
|
14
|
+
# @example
|
15
|
+
# format_signing_data("0123456789abcdef", "VERACODE.com", "/home", "get") #=> "id=0123456789abcdef&host=veracode.com&url=/home&method=GET"
|
16
|
+
# @return [String] the formatted signing data
|
17
|
+
def format_signing_data(api_key_id, host, url, method)
|
18
|
+
# Ensure some things are in the right case.
|
19
|
+
# Note: that path (url) is allowed to be case-sensitive (because path is sent along verbatim)
|
20
|
+
api_key_id = remove_prefix_from_api_credential(api_key_id).downcase
|
21
|
+
host = host.downcase
|
22
|
+
method = method.upcase
|
23
|
+
|
24
|
+
"id=#{api_key_id}&host=#{host}&url=#{url}&method=#{method}"
|
25
|
+
end
|
26
|
+
|
27
|
+
# @param auth_scheme [String] the veracode auth scheme
|
28
|
+
# @param api_key_id [String] the veracode api key
|
29
|
+
# @param timestamp [String] the epoch timestamp
|
30
|
+
# @param nonce [String] the random nonce
|
31
|
+
# @param signature [String] the veracode signature
|
32
|
+
# @example
|
33
|
+
# format_veracode_hmac_header(auth_scheme="VERACODE-HMAC-SHA-256", api_key_id="702a1650", timestamp="1445452792746", nonce="3b1974fbaa7c97cc", signature="b81c0315b8df360778083d1b408916f8") => "VERACODE-HMAC-SHA-256 id=702a1650,ts=1445452792746,nonce=3b1974fbaa7c97cc,sig=b81c0315b8df360778083d1b408916f8"
|
34
|
+
# @return [String] the formatted hmac header
|
35
|
+
def format_veracode_hmac_header(auth_scheme, api_key_id, timestamp, nonce, signature)
|
36
|
+
# NOTE: This should _NOT_ manipulate case and so-on, that would likely break things.
|
37
|
+
api_key_id = remove_prefix_from_api_credential(api_key_id)
|
38
|
+
"#{auth_scheme} id=#{api_key_id},ts=#{timestamp},nonce=#{nonce},sig=#{signature}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "openssl"
|
4
|
+
require "veracode_api_signing/exception"
|
5
|
+
require "veracode_api_signing/formatters"
|
6
|
+
require "veracode_api_signing/regions"
|
7
|
+
require "veracode_api_signing/utils"
|
8
|
+
require "veracode_api_signing/validation"
|
9
|
+
|
10
|
+
module VeracodeApiSigning
|
11
|
+
class HMACAuth
|
12
|
+
include Validation
|
13
|
+
include Utils
|
14
|
+
include Formatters
|
15
|
+
include Regions
|
16
|
+
|
17
|
+
DEFAULT_AUTH_SCHEME = "VERACODE-HMAC-SHA-256"
|
18
|
+
|
19
|
+
# @param host [String] The host of the request("api.veracode.com")
|
20
|
+
# @param path [String] The path of the request("/v1/results")
|
21
|
+
# @param method [String] The method of the request("GET", "POST")
|
22
|
+
# @param api_key_id [String] The user's API key
|
23
|
+
# @param api_key_secret [String] The user's API secret key
|
24
|
+
# @param auth_scheme [String] What authentication algorithm will be used to create the signature of the request
|
25
|
+
# @return [String] The value of Veracode compliant HMAC header
|
26
|
+
def generate_veracode_hmac_header(host, path, method, api_key_id, api_key_secret, auth_scheme = DEFAULT_AUTH_SCHEME)
|
27
|
+
signing_data = format_signing_data(api_key_id, host, path, method)
|
28
|
+
timestamp = get_current_timestamp
|
29
|
+
nonce = generate_nonce
|
30
|
+
signature = create_signature(auth_scheme, api_key_secret, signing_data, timestamp, nonce)
|
31
|
+
format_veracode_hmac_header(auth_scheme, api_key_id, timestamp, nonce, signature)
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
# @param auth_scheme [String] Used to describe what algorithm to use when creating the signature
|
37
|
+
# @param api_key_secret [String] The user's API secret key
|
38
|
+
# @param signing_data [String] The data to be signed (usually consists of host, path, request method and other data)
|
39
|
+
# @param timestamp [String] A unix timestamp to millisecond precision
|
40
|
+
# @param nonce [String] A random value to prevent replay attacks
|
41
|
+
# @return [String] The signature according to algorithm specified
|
42
|
+
# @raise [VeracodeApiSigning::UnsupportedAuthSchemeException] if auth scheme is not supported
|
43
|
+
def create_signature(auth_scheme, api_key_secret, signing_data, timestamp, nonce)
|
44
|
+
if auth_scheme == "VERACODE-HMAC-SHA-256"
|
45
|
+
create_hmac_sha_256_signature(api_key_secret, signing_data, timestamp, nonce)
|
46
|
+
else
|
47
|
+
raise VeracodeApiSigning::UnsupportedAuthSchemeException, "Auth scheme #{auth_scheme} not supported"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# @param api_key_secret [String] The user's API secret key
|
52
|
+
# @param signing_data [String] The data to be signed (usually consists of host, path, request method and other data)
|
53
|
+
# @param timestamp [String] A unix timestamp to millisecond precision
|
54
|
+
# @param nonce [String] A random value to prevent replay attacks
|
55
|
+
# @return [String] An HMAC-SHA-256 signature
|
56
|
+
def create_hmac_sha_256_signature(api_key_secret, signing_data, timestamp, nonce)
|
57
|
+
api_key_secret = remove_prefix_from_api_credential(api_key_secret)
|
58
|
+
key_nonce = generate_digest(hex_to_bin(api_key_secret), hex_to_bin(nonce))
|
59
|
+
key_date = generate_digest(key_nonce, timestamp.to_s.encode)
|
60
|
+
signature_key = generate_digest(key_date, "vcode_request_version_1".encode)
|
61
|
+
|
62
|
+
OpenSSL::HMAC.hexdigest("sha256", signature_key, signing_data.encode)
|
63
|
+
end
|
64
|
+
|
65
|
+
# @param hex_string [String] the hex string
|
66
|
+
# @return [String] The hex string converted to binary
|
67
|
+
# @raise [VeracodeApiSigning::Exception] if string is NOT valid hex
|
68
|
+
def hex_to_bin(hex_string)
|
69
|
+
raise VeracodeApiSigning::Exception, "String is not valid hex: #{hex_string}" unless valid_hex?(hex_string)
|
70
|
+
|
71
|
+
hex_string.scan(/../).map { |x| x.hex.chr }.join
|
72
|
+
end
|
73
|
+
|
74
|
+
def generate_digest(key, data)
|
75
|
+
OpenSSL::HMAC.digest("sha256", key, data)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "faraday"
|
4
|
+
require "faraday/request"
|
5
|
+
require "veracode_api_signing/credentials"
|
6
|
+
require "veracode_api_signing/utils"
|
7
|
+
require "veracode_api_signing/hmac_auth"
|
8
|
+
require "veracode_api_signing/validation"
|
9
|
+
|
10
|
+
module VeracodeApiSigning
|
11
|
+
module Plugins
|
12
|
+
class FaradayMiddleware < Faraday::Middleware
|
13
|
+
include Utils
|
14
|
+
include Validation
|
15
|
+
|
16
|
+
KEY = "Authorization"
|
17
|
+
|
18
|
+
attr_reader :api_key_id, :api_secret_key
|
19
|
+
|
20
|
+
# @param app [#call]
|
21
|
+
# @param api_key_id [String] the veracode api key
|
22
|
+
# @param api_secret_key [String] The user's API secret key
|
23
|
+
def initialize(app, api_key_id = nil, api_secret_key = nil)
|
24
|
+
if api_key_id && api_secret_key
|
25
|
+
validate_credentials(api_key_id, api_secret_key)
|
26
|
+
@api_key_id = api_key_id
|
27
|
+
@api_secret_key = api_secret_key
|
28
|
+
else
|
29
|
+
api_key_id, api_secret_key = Credentials.new.get_credentials
|
30
|
+
validate_credentials(api_key_id, api_secret_key)
|
31
|
+
@api_key_id = api_key_id
|
32
|
+
@api_secret_key = api_secret_key
|
33
|
+
end
|
34
|
+
|
35
|
+
super(app)
|
36
|
+
end
|
37
|
+
|
38
|
+
# @param env [Faraday::Env]
|
39
|
+
def on_request(env)
|
40
|
+
return if env.request_headers[KEY]
|
41
|
+
|
42
|
+
url = env.url
|
43
|
+
host = get_host_from_url(url)
|
44
|
+
path = get_path_and_params_from_url(url)
|
45
|
+
method = env.method.to_s.upcase
|
46
|
+
auth = HMACAuth.new.generate_veracode_hmac_header(host, path, method, api_key_id, api_secret_key)
|
47
|
+
env.request_headers[KEY] = auth
|
48
|
+
end
|
49
|
+
|
50
|
+
def validate_credentials(key, secret)
|
51
|
+
validate_api_key_id(key)
|
52
|
+
validate_api_key_secret(secret)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
Faraday::Request.register_middleware(veracode_api_signing: VeracodeApiSigning::Plugins::FaradayMiddleware)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "veracode_api_signing/exception"
|
4
|
+
|
5
|
+
module VeracodeApiSigning
|
6
|
+
module Regions
|
7
|
+
REGIONS = { "e" => "eu", "f" => "fedramp", "g" => "global" }.freeze
|
8
|
+
|
9
|
+
def get_region_for_api_credential(api_credential)
|
10
|
+
if api_credential.include?("-")
|
11
|
+
prefix = api_credential.split("-").first
|
12
|
+
raise VeracodeApiSigning::CredentialsError, "Credential starts with an invalid prefix" if prefix.length != 8
|
13
|
+
|
14
|
+
region_character = prefix[6].downcase
|
15
|
+
else
|
16
|
+
region_character = "g"
|
17
|
+
end
|
18
|
+
|
19
|
+
if REGIONS.key?(region_character)
|
20
|
+
REGIONS.fetch(region_character)
|
21
|
+
else
|
22
|
+
(raise VeracodeApiSigning::CredentialsError,
|
23
|
+
"Credential does not map to a known region")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def remove_prefix_from_api_credential(api_credential)
|
28
|
+
api_credential.split("-").last
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "securerandom"
|
4
|
+
require "uri"
|
5
|
+
|
6
|
+
module VeracodeApiSigning
|
7
|
+
module Utils
|
8
|
+
# @return [Integer] current epoch time * 1000 rounded
|
9
|
+
def get_current_timestamp
|
10
|
+
Time.now.utc.to_i * 1000.round
|
11
|
+
end
|
12
|
+
|
13
|
+
# @return [String] nonce string
|
14
|
+
def generate_nonce
|
15
|
+
SecureRandom.hex(16)
|
16
|
+
end
|
17
|
+
|
18
|
+
# @param url [String] the url to parse
|
19
|
+
# @example
|
20
|
+
# get_host_from_url("https://api.example.com/foo/bar") #=> "api.example.com"
|
21
|
+
# @return [String] just returns the host
|
22
|
+
def get_host_from_url(url)
|
23
|
+
parsed_url(url).host
|
24
|
+
end
|
25
|
+
|
26
|
+
# @param url [String] the url to parse
|
27
|
+
# @example
|
28
|
+
# get_path_and_params_from_url("https://api.example.com/foo/bar") #=> "/foo/bar"
|
29
|
+
# @example
|
30
|
+
# get_path_and_params_from_url("https://api.example.com") #=> ""
|
31
|
+
# @example
|
32
|
+
# get_path_and_params_from_url("https://api.example.com/apm/v1/assets?page=2") #=> "/apm/v1/assets?page=2"
|
33
|
+
# @return [String] returns the the path and params formatted, or an empty String
|
34
|
+
def get_path_and_params_from_url(url)
|
35
|
+
uri = parsed_url(url)
|
36
|
+
path = uri.path
|
37
|
+
params = uri.query
|
38
|
+
return "" if (path.nil? || path.empty?) && params.nil?
|
39
|
+
|
40
|
+
built_url = URI::HTTPS.build(path: path, query: params)
|
41
|
+
built_url.request_uri
|
42
|
+
end
|
43
|
+
|
44
|
+
# @param url [String] the url to parse
|
45
|
+
# @example
|
46
|
+
# get_scheme_from_url("https://api.example.com/foo/bar") #=> "https"
|
47
|
+
# @example
|
48
|
+
# get_scheme_from_url("api.example.com") #=> ""
|
49
|
+
def get_scheme_from_url(url)
|
50
|
+
parsed_url(url).scheme.to_s
|
51
|
+
end
|
52
|
+
|
53
|
+
def parsed_url(url)
|
54
|
+
URI(url)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "veracode_api_signing/exception"
|
4
|
+
require "veracode_api_signing/regions"
|
5
|
+
|
6
|
+
module VeracodeApiSigning
|
7
|
+
module Validation
|
8
|
+
include Regions
|
9
|
+
|
10
|
+
# @param api_key_id [String] the api key id to validate
|
11
|
+
# @example
|
12
|
+
# validate_api_key_id("3ddaeeb10ca690df3fee5e3bd1c329fa") #=> nil
|
13
|
+
# @example
|
14
|
+
# validate_api_key_id("3ddaeeb10ca690df3f") #=> VeracodeApiSigning::CredentialsError
|
15
|
+
# @raise [VeracodeApiSigning::CredentialsError] if api key id is not valid
|
16
|
+
def validate_api_key_id(api_key_id)
|
17
|
+
api_key_id_minimum_length = 32
|
18
|
+
api_key_id_maximum_length = 128 + 9
|
19
|
+
api_key_id_hex = remove_prefix_from_api_credential(api_key_id)
|
20
|
+
|
21
|
+
if api_key_id.length < api_key_id_minimum_length
|
22
|
+
raise VeracodeApiSigning::CredentialsError,
|
23
|
+
"API key #{api_key_id} is #{api_key_id.length} characters, which is not long enough. The API key should be at least #{api_key_id_minimum_length} characters"
|
24
|
+
end
|
25
|
+
if api_key_id.length > api_key_id_maximum_length
|
26
|
+
raise VeracodeApiSigning::CredentialsError,
|
27
|
+
"API key #{api_key_id} is #{api_key_id.length} characters, which is too long. The API key should not be more than #{api_key_id_maximum_length} characters"
|
28
|
+
end
|
29
|
+
unless valid_hex?(api_key_id_hex)
|
30
|
+
raise VeracodeApiSigning::CredentialsError,
|
31
|
+
"API key #{api_key_id} does not seem to be hexadecimal"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# @param api_key_secret [String] the api key secret to validate
|
36
|
+
# @example
|
37
|
+
# validate_api_key_secret("0123456789abcdef"*8) #=> nil
|
38
|
+
# @example
|
39
|
+
# validate_api_key_secret("0123456789abcdef") #=> Veracode::ApiSigning::CredentialsError
|
40
|
+
# @raise [VeracodeApiSigning::CredentialsError] if api secret key is not valid
|
41
|
+
def validate_api_key_secret(api_key_secret)
|
42
|
+
secret_key_minimum_length = 128
|
43
|
+
secret_key_maximum_length = 1024 + 9
|
44
|
+
api_key_secret_hex = remove_prefix_from_api_credential(api_key_secret)
|
45
|
+
|
46
|
+
if api_key_secret.length < secret_key_minimum_length
|
47
|
+
raise VeracodeApiSigning::CredentialsError,
|
48
|
+
"API secret key #{api_key_secret} is #{api_key_secret.length} characters, which is not long enough. The API secret key should be at least #{secret_key_minimum_length} characters"
|
49
|
+
end
|
50
|
+
if api_key_secret.length > secret_key_maximum_length
|
51
|
+
raise VeracodeApiSigning::CredentialsError,
|
52
|
+
"API secret key #{api_key_secret} is #{api_key_secret.length} characters, which is too long. The API secret key should not be more than #{secret_key_maximum_length} characters"
|
53
|
+
end
|
54
|
+
unless valid_hex?(api_key_secret_hex)
|
55
|
+
raise VeracodeApiSigning::CredentialsError,
|
56
|
+
"API secret key #{api_key_secret} does not seem to be hexadecimal"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# @param scheme [String] the scheme to validate
|
61
|
+
# @example
|
62
|
+
# validate_scheme("https") #=> true
|
63
|
+
# @example
|
64
|
+
# validate_scheme("httpss") #=> VeracodeApiSigning::Exception
|
65
|
+
# @return [Boolean] true if valid scheme, otherwise raise error
|
66
|
+
# @raise [VeracodeApiSigning::Exception] if scheme is not valid
|
67
|
+
def validate_scheme(scheme)
|
68
|
+
if scheme.casecmp("https").zero?
|
69
|
+
true
|
70
|
+
else
|
71
|
+
raise VeracodeApiSigning::Exception, "Only HTTPS APIs are supported by Veracode."
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# @param hex_string [String] the hex string to validate
|
76
|
+
# @example
|
77
|
+
# valid_hex?("af") #=> true
|
78
|
+
# @example
|
79
|
+
# valid_hex?("zh") #=> false
|
80
|
+
# @return [Boolean] true if valid hex, otherwise false
|
81
|
+
# @raise [VeracodeApiSigning::CredentialsError] if api secret key is not valid
|
82
|
+
def valid_hex?(hex_string)
|
83
|
+
hex_string = hex_string.to_s
|
84
|
+
hex = true
|
85
|
+
hex_string.chars.each do |digit|
|
86
|
+
hex = false unless /[0-9A-Fa-f]/.match?(digit)
|
87
|
+
end
|
88
|
+
hex
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
data/shell.nix
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
{ pkgs ? import <nixpkgs> {}, ...}:
|
2
|
+
|
3
|
+
with pkgs;
|
4
|
+
|
5
|
+
let
|
6
|
+
darwin_packages = lib.optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [
|
7
|
+
CoreServices
|
8
|
+
ApplicationServices
|
9
|
+
Security
|
10
|
+
]);
|
11
|
+
ruby = ruby_3_0;
|
12
|
+
|
13
|
+
# Issue with using gemspec files
|
14
|
+
#
|
15
|
+
#gems = bundlerEnv {
|
16
|
+
#name = "veracodeRubyEnv";
|
17
|
+
#inherit ruby;
|
18
|
+
#gemdir = ./.;
|
19
|
+
#gemConfig = defaultGemConfig;
|
20
|
+
#};
|
21
|
+
|
22
|
+
in mkShell rec {
|
23
|
+
name = "veracode_api_signing";
|
24
|
+
|
25
|
+
buildInputs = [
|
26
|
+
libressl
|
27
|
+
#(lowPrio gems.wrappedRuby)
|
28
|
+
autoconf
|
29
|
+
automake
|
30
|
+
bash-completion
|
31
|
+
bison
|
32
|
+
cairo
|
33
|
+
coreutils
|
34
|
+
gdbm
|
35
|
+
#gems
|
36
|
+
git
|
37
|
+
gnumake
|
38
|
+
groff
|
39
|
+
libffi
|
40
|
+
libiconv
|
41
|
+
libtool
|
42
|
+
libunwind
|
43
|
+
libxml2
|
44
|
+
libxslt
|
45
|
+
libyaml
|
46
|
+
msgpack
|
47
|
+
ncurses
|
48
|
+
netcat
|
49
|
+
openssl
|
50
|
+
pkg-config
|
51
|
+
pkgconfig
|
52
|
+
postgresql
|
53
|
+
postgresql_13
|
54
|
+
readline
|
55
|
+
ruby
|
56
|
+
shared-mime-info # Required for the mime gem
|
57
|
+
sqlcipher
|
58
|
+
sqlite
|
59
|
+
swagger-codegen3
|
60
|
+
zlib
|
61
|
+
] ++ (lib.optionals stdenv.isDarwin darwin_packages);
|
62
|
+
|
63
|
+
shellHook = ''
|
64
|
+
export FREEDESKTOP_MIME_TYPES_PATH=${shared-mime-info}/share/mime/packages/freedesktop.org.xml
|
65
|
+
|
66
|
+
mkdir -p .gems
|
67
|
+
export GEM_HOME=$PWD/.gems
|
68
|
+
export GEM_PATH=$GEM_HOME
|
69
|
+
export PATH=$GEM_HOME/bin:$PATH
|
70
|
+
|
71
|
+
# Add additional folders to to XDG_DATA_DIRS if they exists, which will get sourced by bash-completion
|
72
|
+
for p in ''${buildInputs}; do
|
73
|
+
if [ -d "$p/share/bash-completion" ]; then
|
74
|
+
if [ -z ''${XDG_DATA_DIRS} ]; then
|
75
|
+
XDG_DATA_DIRS="$p/share"
|
76
|
+
else
|
77
|
+
XDG_DATA_DIRS="$XDG_DATA_DIRS:$p/share"
|
78
|
+
fi
|
79
|
+
fi
|
80
|
+
done
|
81
|
+
|
82
|
+
source ${bash-completion}/etc/profile.d/bash_completion.sh
|
83
|
+
'';
|
84
|
+
}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path("lib", __dir__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
require "veracode_api_signing/version"
|
7
|
+
|
8
|
+
Gem::Specification.new do |spec|
|
9
|
+
spec.name = "veracode_api_signing"
|
10
|
+
spec.version = VeracodeApiSigning::VERSION
|
11
|
+
spec.authors = ["Corban Raun"]
|
12
|
+
spec.email = ["corban@raunco.co"]
|
13
|
+
|
14
|
+
spec.summary = "Veracode hmac signing library used with Veracode API"
|
15
|
+
spec.homepage = "https://CorbanR.github.io/veracode_api_signing"
|
16
|
+
spec.license = "MIT"
|
17
|
+
spec.required_ruby_version = ">= 2.6.0"
|
18
|
+
|
19
|
+
spec.metadata["allowed_push_host"] = "https://rubygems.org/"
|
20
|
+
|
21
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
22
|
+
spec.metadata["documentation_uri"] = "https://www.raunco.co/veracode_api_signing/"
|
23
|
+
spec.metadata["source_code_uri"] = "https://github.com/CorbanR/veracode_api_signing"
|
24
|
+
spec.metadata["changelog_uri"] = "https://github.com/CorbanR/veracode_api_signing/blob/main/CHANGELOG.md"
|
25
|
+
|
26
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
27
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features|examples|docs|coverage)/}) }
|
28
|
+
end
|
29
|
+
spec.bindir = "exe"
|
30
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
31
|
+
spec.require_paths = ["lib"]
|
32
|
+
|
33
|
+
spec.add_development_dependency "brakeman", "~> 5.1"
|
34
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
35
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
36
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
37
|
+
spec.add_development_dependency "rubocop", "~> 1.2"
|
38
|
+
spec.add_development_dependency "rubocop-performance", "~> 1.1"
|
39
|
+
spec.add_development_dependency "rubocop-rake", "~> 0.6"
|
40
|
+
spec.add_development_dependency "rubocop-rspec", "~> 2.5"
|
41
|
+
spec.add_development_dependency "simplecov", "~> 0.21.2"
|
42
|
+
spec.add_development_dependency "yard", "~> 0.9.26"
|
43
|
+
end
|
metadata
ADDED
@@ -0,0 +1,214 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: veracode_api_signing
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Corban Raun
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 1980-01-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: brakeman
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.1'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '13.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '13.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.2'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.2'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop-performance
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.1'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.1'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop-rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.6'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.6'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop-rspec
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '2.5'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '2.5'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: simplecov
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 0.21.2
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 0.21.2
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: yard
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 0.9.26
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 0.9.26
|
153
|
+
description:
|
154
|
+
email:
|
155
|
+
- corban@raunco.co
|
156
|
+
executables: []
|
157
|
+
extensions: []
|
158
|
+
extra_rdoc_files: []
|
159
|
+
files:
|
160
|
+
- ".github/workflows/codeql-analysis.yml"
|
161
|
+
- ".github/workflows/tests.yml"
|
162
|
+
- ".gitignore"
|
163
|
+
- ".rspec"
|
164
|
+
- ".rubocop.yml"
|
165
|
+
- ".rubocop_todo.yml"
|
166
|
+
- CHANGELOG.md
|
167
|
+
- Gemfile
|
168
|
+
- Gemfile.lock
|
169
|
+
- LICENSE.txt
|
170
|
+
- README.md
|
171
|
+
- Rakefile
|
172
|
+
- bin/console
|
173
|
+
- bin/setup
|
174
|
+
- lib/veracode_api_signing.rb
|
175
|
+
- lib/veracode_api_signing/credentials.rb
|
176
|
+
- lib/veracode_api_signing/exception.rb
|
177
|
+
- lib/veracode_api_signing/formatters.rb
|
178
|
+
- lib/veracode_api_signing/hmac_auth.rb
|
179
|
+
- lib/veracode_api_signing/plugins/faraday_middleware.rb
|
180
|
+
- lib/veracode_api_signing/regions.rb
|
181
|
+
- lib/veracode_api_signing/utils.rb
|
182
|
+
- lib/veracode_api_signing/validation.rb
|
183
|
+
- lib/veracode_api_signing/version.rb
|
184
|
+
- shell.nix
|
185
|
+
- veracode_api_signing.gemspec
|
186
|
+
homepage: https://CorbanR.github.io/veracode_api_signing
|
187
|
+
licenses:
|
188
|
+
- MIT
|
189
|
+
metadata:
|
190
|
+
allowed_push_host: https://rubygems.org/
|
191
|
+
homepage_uri: https://CorbanR.github.io/veracode_api_signing
|
192
|
+
documentation_uri: https://www.raunco.co/veracode_api_signing/
|
193
|
+
source_code_uri: https://github.com/CorbanR/veracode_api_signing
|
194
|
+
changelog_uri: https://github.com/CorbanR/veracode_api_signing/blob/main/CHANGELOG.md
|
195
|
+
post_install_message:
|
196
|
+
rdoc_options: []
|
197
|
+
require_paths:
|
198
|
+
- lib
|
199
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
200
|
+
requirements:
|
201
|
+
- - ">="
|
202
|
+
- !ruby/object:Gem::Version
|
203
|
+
version: 2.6.0
|
204
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - ">="
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
209
|
+
requirements: []
|
210
|
+
rubygems_version: 3.2.26
|
211
|
+
signing_key:
|
212
|
+
specification_version: 4
|
213
|
+
summary: Veracode hmac signing library used with Veracode API
|
214
|
+
test_files: []
|