puppet_webhook 1.4.0 → 1.5.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 +5 -5
- data/CHANGELOG.md +19 -1
- data/README.md +2 -2
- data/lib/helpers/data_parsers.rb +4 -8
- data/lib/helpers/tasks.rb +4 -2
- data/lib/parsers/webhook_parser.rb +10 -7
- data/lib/puppet_webhook.rb +3 -1
- data/lib/routes/module.rb +2 -2
- data/lib/routes/payload.rb +7 -8
- metadata +18 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 2 | 
            +
            SHA1:
         | 
| 3 | 
            +
              metadata.gz: 653632cd922c85c60f40066bea79580609626cc1
         | 
| 4 | 
            +
              data.tar.gz: d2a72dae7db871ac46c8d1353e6ae43aaab761c5
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: d0214e6440b6ccb26e0bff3f28f0756f512e0f7235618a50d05e6859fe42095f8b42359ee358ec4cc1d39174ea2661dc9d8504a9b47b6f88fe80a20317dc02a5
         | 
| 7 | 
            +
              data.tar.gz: c198a88fa0849cb8588e70b81d0c07be6d85955954a6a150ed5e972440e483e3f1ea1abdfa51c009918c7f8698fbb0dca4a46d2bc0f284193bcfcf5f26496c97
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -4,6 +4,24 @@ All notable changes to this project will be documented in this file. | |
| 4 4 | 
             
            Each new release typically also includes the latest modulesync defaults.
         | 
| 5 5 | 
             
            These should not affect the functionality of the module.
         | 
| 6 6 |  | 
| 7 | 
            +
            ## [v1.5.0](https://github.com/voxpupuli/puppet_webhook/tree/v1.5.0) (2018-11-01)
         | 
| 8 | 
            +
            [Full Changelog](https://github.com/voxpupuli/puppet_webhook/compare/v1.4.0...v1.5.0)
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            **Implemented enhancements:**
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            - Add tests to validate posts to the module route  [\#37](https://github.com/voxpupuli/puppet_webhook/pull/37) ([dhollinger](https://github.com/dhollinger))
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            **Fixed bugs:**
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            - puppet\_webhook is not compatible with Ruby \< 2.2.2 [\#56](https://github.com/voxpupuli/puppet_webhook/issues/56)
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            **Merged pull requests:**
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            - Bitbucket Server \(stash\) detection / JSON updates [\#61](https://github.com/voxpupuli/puppet_webhook/pull/61) ([ChetHosey](https://github.com/ChetHosey))
         | 
| 21 | 
            +
            - Stray payload reference [\#60](https://github.com/voxpupuli/puppet_webhook/pull/60) ([ChetHosey](https://github.com/ChetHosey))
         | 
| 22 | 
            +
            - Changed minimum versions to Puppet 5/Ruby 2.2 [\#58](https://github.com/voxpupuli/puppet_webhook/pull/58) ([ChetHosey](https://github.com/ChetHosey))
         | 
| 23 | 
            +
            - Add tests for the DataParsers helper module [\#55](https://github.com/voxpupuli/puppet_webhook/pull/55) ([dhollinger](https://github.com/dhollinger))
         | 
| 24 | 
            +
             | 
| 7 25 | 
             
            ## [v1.4.0](https://github.com/voxpupuli/puppet_webhook/tree/v1.4.0) (2018-05-02)
         | 
| 8 26 | 
             
            [Full Changelog](https://github.com/voxpupuli/puppet_webhook/compare/v1.3.0...v1.4.0)
         | 
| 9 27 |  | 
| @@ -98,4 +116,4 @@ These should not affect the functionality of the module. | |
| 98 116 |  | 
| 99 117 |  | 
| 100 118 |  | 
| 101 | 
            -
            \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
         | 
| 119 | 
            +
            \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
         | 
    
        data/README.md
    CHANGED
    
    | @@ -19,8 +19,8 @@ puppet_webhook is a Sinatra-based application receiving REST-based calls to trig | |
| 19 19 |  | 
| 20 20 | 
             
            ## Prerequisites
         | 
| 21 21 |  | 
| 22 | 
            -
            * Ruby 2. | 
| 23 | 
            -
            * Puppet  | 
| 22 | 
            +
            * Ruby 2.2.0 or greater
         | 
| 23 | 
            +
            * Puppet 5.0.0 or greater
         | 
| 24 24 | 
             
            * r10k gem
         | 
| 25 25 | 
             
            * *Optional*: MCollective and MCollective-r10k (Provides one form of multi-master syncronization)
         | 
| 26 26 | 
             
                * Currently Mcollective-r10k is only available from [puppet-r10k](https://github.com/voxpupuli/puppet-r10k)
         | 
    
        data/lib/helpers/data_parsers.rb
    CHANGED
    
    | @@ -7,16 +7,12 @@ module DataParsers # rubocop:disable Style/Documentation | |
| 7 7 | 
             
                sanitized
         | 
| 8 8 | 
             
              end
         | 
| 9 9 |  | 
| 10 | 
            -
              def normalize(str)
         | 
| 11 | 
            -
                 | 
| 10 | 
            +
              def normalize(allow_upper, str)
         | 
| 11 | 
            +
                allow_upper ? str : str.downcase
         | 
| 12 12 | 
             
              end
         | 
| 13 13 |  | 
| 14 | 
            -
              def verify_signature(payload_body)
         | 
| 15 | 
            -
                signature = 'sha1=' + OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'),  | 
| 14 | 
            +
              def verify_signature(secret, payload_body)
         | 
| 15 | 
            +
                signature = 'sha1=' + OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), secret, payload_body)
         | 
| 16 16 | 
             
                throw(:halt, [500, "Signatures didn't match!\n"]) unless Rack::Utils.secure_compare(signature, request.env['HTTP_X_HUB_SIGNATURE'])
         | 
| 17 17 | 
             
              end
         | 
| 18 | 
            -
             | 
| 19 | 
            -
              def payload
         | 
| 20 | 
            -
                env['parsed_body']
         | 
| 21 | 
            -
              end
         | 
| 22 18 | 
             
            end
         | 
    
        data/lib/helpers/tasks.rb
    CHANGED
    
    | @@ -67,6 +67,7 @@ module Tasks # rubocop:disable Style/Documentation | |
| 67 67 |  | 
| 68 68 | 
             
              def notification(message)
         | 
| 69 69 | 
             
                return unless settings.chatops || settings.slack_webhook
         | 
| 70 | 
            +
             | 
| 70 71 | 
             
                slack_settings if settings.chatops == false && settings.slack_webhook != false
         | 
| 71 72 | 
             
                PuppetWebhook::Chatops.new(settings.chatops_service,
         | 
| 72 73 | 
             
                                           settings.chatops_url,
         | 
| @@ -100,8 +101,8 @@ module Tasks # rubocop:disable Style/Documentation | |
| 100 101 | 
             
              def slack_proxy
         | 
| 101 102 | 
             
                uri = URI(settings.slack_proxy_url)
         | 
| 102 103 | 
             
                http_options = {
         | 
| 103 | 
            -
                  proxy_address: | 
| 104 | 
            -
                  proxy_port: | 
| 104 | 
            +
                  proxy_address: uri.hostname,
         | 
| 105 | 
            +
                  proxy_port: uri.port,
         | 
| 105 106 | 
             
                  proxy_from_env: false
         | 
| 106 107 | 
             
                }
         | 
| 107 108 | 
             
                http_options
         | 
| @@ -110,6 +111,7 @@ module Tasks # rubocop:disable Style/Documentation | |
| 110 111 | 
             
              def types?
         | 
| 111 112 | 
             
                return false unless settings.respond_to?(:generate_types=)
         | 
| 112 113 | 
             
                return false if settings.generate_types.nil?
         | 
| 114 | 
            +
             | 
| 113 115 | 
             
                settings.generate_types
         | 
| 114 116 | 
             
              end
         | 
| 115 117 |  | 
| @@ -10,8 +10,8 @@ module Sinatra | |
| 10 10 | 
             
                    @data = parse_data(body)
         | 
| 11 11 | 
             
                    @vcs = detect_vcs
         | 
| 12 12 | 
             
                    {
         | 
| 13 | 
            -
                      branch: | 
| 14 | 
            -
                      deleted: | 
| 13 | 
            +
                      branch: branch,
         | 
| 14 | 
            +
                      deleted: deleted?,
         | 
| 15 15 | 
             
                      module_name: repo_name.sub(%r{^.*-}, ''),
         | 
| 16 16 | 
             
                      repo_name: repo_name,
         | 
| 17 17 | 
             
                      repo_user: repo_user
         | 
| @@ -24,6 +24,7 @@ module Sinatra | |
| 24 24 | 
             
                    return 'stash'     if stash_webhook?
         | 
| 25 25 | 
             
                    return 'bitbucket' if bitbucket_webhook?
         | 
| 26 26 | 
             
                    return 'tfs'       if tfs_webhook?
         | 
| 27 | 
            +
             | 
| 27 28 | 
             
                    raise StandardError, 'payload not recognised'
         | 
| 28 29 | 
             
                  end
         | 
| 29 30 |  | 
| @@ -39,19 +40,20 @@ module Sinatra | |
| 39 40 |  | 
| 40 41 | 
             
                  # stash/bitbucket server
         | 
| 41 42 | 
             
                  def stash_webhook?
         | 
| 42 | 
            -
                    # https://confluence.atlassian.com/bitbucketserver/ | 
| 43 | 
            -
                    env.key?(' | 
| 43 | 
            +
                    # https://confluence.atlassian.com/bitbucketserver/event-payload-938025882.html
         | 
| 44 | 
            +
                    env.key?('HTTP_X_EVENT_KEY') && env.key?('HTTP_X_REQUEST_ID')
         | 
| 44 45 | 
             
                  end
         | 
| 45 46 |  | 
| 46 47 | 
             
                  def bitbucket_webhook?
         | 
| 47 48 | 
             
                    # https://confluence.atlassian.com/bitbucket/event-payloads-740262817.html
         | 
| 48 | 
            -
                    env.key?('HTTP_X_EVENT_KEY')
         | 
| 49 | 
            +
                    env.key?('HTTP_X_EVENT_KEY') && env.key?('HTTP_X_HOOK_UUID')
         | 
| 49 50 | 
             
                  end
         | 
| 50 51 |  | 
| 51 52 | 
             
                  def tfs_webhook?
         | 
| 52 53 | 
             
                    # https://docs.microsoft.com/en-us/vsts/service-hooks/services/webhooks
         | 
| 53 54 | 
             
                    return false unless @data.key? 'resource'
         | 
| 54 55 | 
             
                    return false unless @data.key? 'eventType'
         | 
| 56 | 
            +
             | 
| 55 57 | 
             
                    true
         | 
| 56 58 | 
             
                  end
         | 
| 57 59 |  | 
| @@ -66,9 +68,10 @@ module Sinatra | |
| 66 68 | 
             
                    when 'gitlab'
         | 
| 67 69 | 
             
                      @data['ref'].sub('refs/heads/', '')
         | 
| 68 70 | 
             
                    when 'stash'
         | 
| 69 | 
            -
                      @data[' | 
| 71 | 
            +
                      @data['changes'][0]['refId'].sub('refs/heads/', '')
         | 
| 70 72 | 
             
                    when 'bitbucket'
         | 
| 71 73 | 
             
                      return @data['push']['changes'][0]['new']['name'] unless deleted?
         | 
| 74 | 
            +
             | 
| 72 75 | 
             
                      @data['push']['changes'][0]['old']['name']
         | 
| 73 76 | 
             
                    when 'tfs'
         | 
| 74 77 | 
             
                      @data['resource']['refUpdates'][0]['name'].sub('refs/heads/', '')
         | 
| @@ -82,7 +85,7 @@ module Sinatra | |
| 82 85 | 
             
                    when 'gitlab'
         | 
| 83 86 | 
             
                      @data['after'] == '0000000000000000000000000000000000000000'
         | 
| 84 87 | 
             
                    when 'stash'
         | 
| 85 | 
            -
                      @data[' | 
| 88 | 
            +
                      @data['changes'][0]['type'] == 'DELETE'
         | 
| 86 89 | 
             
                    when 'bitbucket'
         | 
| 87 90 | 
             
                      @data['push']['changes'][0]['closed']
         | 
| 88 91 | 
             
                    when 'tfs'
         | 
    
        data/lib/puppet_webhook.rb
    CHANGED
    
    | @@ -17,7 +17,7 @@ class PuppetWebhook < Sinatra::Base # rubocop:disable Style/Documentation | |
| 17 17 | 
             
                    'application/json' => Sinatra::Parsers::WebhookJsonParser.new,
         | 
| 18 18 | 
             
                    'application/x-www-form-urlencoded' => Sinatra::Parsers::WebhookWWWFormURLEncodedParser.new
         | 
| 19 19 | 
             
                  },
         | 
| 20 | 
            -
                  handlers: | 
| 20 | 
            +
                  handlers: {
         | 
| 21 21 | 
             
                    'application/json' => proc { |e, type|
         | 
| 22 22 | 
             
                      [400, { 'Content-Type' => type }, [{ error: e.to_s }.to_json]]
         | 
| 23 23 | 
             
                    }
         | 
| @@ -52,6 +52,8 @@ class PuppetWebhook < Sinatra::Base # rubocop:disable Style/Documentation | |
| 52 52 | 
             
              set :command_prefix, 'umask 0022;' unless settings.respond_to? :command_prefix=
         | 
| 53 53 | 
             
              set :github_secret, nil unless settings.respond_to? :github_secret=
         | 
| 54 54 | 
             
              set :repository_events, nil unless settings.respond_to? :respository_events=
         | 
| 55 | 
            +
              set :user, 'puppet' unless settings.respond_to? :user=
         | 
| 56 | 
            +
              set :pass, 'puppet' unless settings.respond_to? :pass=
         | 
| 55 57 |  | 
| 56 58 | 
             
              # Deprecated Settings
         | 
| 57 59 | 
             
              set :slack_webhook, false unless settings.respond_to? :slack_webhook=
         | 
    
        data/lib/routes/module.rb
    CHANGED
    
    | @@ -14,9 +14,9 @@ module Sinatra | |
| 14 14 |  | 
| 15 15 | 
             
                      # TODO: Move these two lines of code into the parser
         | 
| 16 16 | 
             
                      decoded = request.body.read
         | 
| 17 | 
            -
                      verify_signature(decoded) if verify_signature?
         | 
| 17 | 
            +
                      verify_signature(settings.github_secret, decoded) if verify_signature?
         | 
| 18 18 |  | 
| 19 | 
            -
                      module_name =  | 
| 19 | 
            +
                      module_name = env['parsed_body'][:module_name]
         | 
| 20 20 |  | 
| 21 21 | 
             
                      module_name = sanitize_input(module_name)
         | 
| 22 22 | 
             
                      LOGGER.info("Deploying module #{module_name}")
         | 
    
        data/lib/routes/payload.rb
    CHANGED
    
    | @@ -6,7 +6,6 @@ module Sinatra | |
| 6 6 | 
             
                module Payload
         | 
| 7 7 | 
             
                  def self.registered(puppet_webhook)
         | 
| 8 8 | 
             
                    puppet_webhook.post '/payload' do # rubocop:disable Metrics/BlockLength
         | 
| 9 | 
            -
                      LOGGER.info "parsed payload contained: #{payload}"
         | 
| 10 9 | 
             
                      protected! if settings.protected
         | 
| 11 10 | 
             
                      request.body.rewind # in case someone already read it
         | 
| 12 11 |  | 
| @@ -19,18 +18,18 @@ module Sinatra | |
| 19 18 | 
             
                                else
         | 
| 20 19 | 
             
                                  request.body.read
         | 
| 21 20 | 
             
                                end
         | 
| 22 | 
            -
                      verify_signature(decoded) if verify_signature?
         | 
| 21 | 
            +
                      verify_signature(settings.github_secret, decoded) if verify_signature?
         | 
| 23 22 | 
             
                      data = JSON.parse(decoded, quirks_mode: true)
         | 
| 24 23 |  | 
| 25 24 | 
             
                      # Iterate the data structure to determine what's should be deployed
         | 
| 26 | 
            -
                      branch =  | 
| 25 | 
            +
                      branch = env['parsed_body'][:branch]
         | 
| 27 26 |  | 
| 28 27 | 
             
                      # If prefix is enabled in our config file, determine what the prefix should be
         | 
| 29 28 | 
             
                      prefix = case settings.prefix
         | 
| 30 29 | 
             
                               when :repo
         | 
| 31 | 
            -
                                  | 
| 30 | 
            +
                                 env['parsed_body'][:repo_name]
         | 
| 32 31 | 
             
                               when :user
         | 
| 33 | 
            -
                                  | 
| 32 | 
            +
                                 env['parsed_body'][:repo_user]
         | 
| 34 33 | 
             
                               when :command, TrueClass
         | 
| 35 34 | 
             
                                 run_prefix_command(data.to_json)
         | 
| 36 35 | 
             
                               when String
         | 
| @@ -39,7 +38,7 @@ module Sinatra | |
| 39 38 |  | 
| 40 39 | 
             
                      # When a branch is being deleted, a deploy against it will result in a failure, as it no longer exists.
         | 
| 41 40 | 
             
                      # Instead, deploy the default branch, which will purge deleted branches per the user's configuration
         | 
| 42 | 
            -
                      deleted =  | 
| 41 | 
            +
                      deleted = env['parsed_body'][:deleted]
         | 
| 43 42 |  | 
| 44 43 | 
             
                      branch = if deleted
         | 
| 45 44 | 
             
                                 settings.default_branch
         | 
| @@ -51,9 +50,9 @@ module Sinatra | |
| 51 50 | 
             
                      # The best we can do is just deploy all environments by passing nil to
         | 
| 52 51 | 
             
                      # deploy() if we don't know the correct branch.
         | 
| 53 52 | 
             
                      env = if prefix.nil? || prefix.empty? || branch.nil? || branch.empty?
         | 
| 54 | 
            -
                              normalize(branch)
         | 
| 53 | 
            +
                              normalize(settings.allow_uppercase, branch)
         | 
| 55 54 | 
             
                            else
         | 
| 56 | 
            -
                              normalize("#{prefix}_#{branch}")
         | 
| 55 | 
            +
                              normalize(settings.allow_uppercase, "#{prefix}_#{branch}")
         | 
| 57 56 | 
             
                            end
         | 
| 58 57 |  | 
| 59 58 | 
             
                      if ignore_env?(env)
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: puppet_webhook
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.5.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Vox Pupuli
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2018- | 
| 11 | 
            +
            date: 2018-11-02 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: json
         | 
| @@ -164,6 +164,20 @@ dependencies: | |
| 164 164 | 
             
                - - ">="
         | 
| 165 165 | 
             
                  - !ruby/object:Gem::Version
         | 
| 166 166 | 
             
                    version: '0'
         | 
| 167 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 168 | 
            +
              name: pry
         | 
| 169 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 170 | 
            +
                requirements:
         | 
| 171 | 
            +
                - - ">="
         | 
| 172 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 173 | 
            +
                    version: '0'
         | 
| 174 | 
            +
              type: :development
         | 
| 175 | 
            +
              prerelease: false
         | 
| 176 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 177 | 
            +
                requirements:
         | 
| 178 | 
            +
                - - ">="
         | 
| 179 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 180 | 
            +
                    version: '0'
         | 
| 167 181 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 168 182 | 
             
              name: rack-test
         | 
| 169 183 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -274,7 +288,7 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 274 288 | 
             
              requirements:
         | 
| 275 289 | 
             
              - - ">="
         | 
| 276 290 | 
             
                - !ruby/object:Gem::Version
         | 
| 277 | 
            -
                  version: 2. | 
| 291 | 
            +
                  version: 2.2.0
         | 
| 278 292 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 279 293 | 
             
              requirements:
         | 
| 280 294 | 
             
              - - ">="
         | 
| @@ -282,7 +296,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 282 296 | 
             
                  version: '0'
         | 
| 283 297 | 
             
            requirements: []
         | 
| 284 298 | 
             
            rubyforge_project: 
         | 
| 285 | 
            -
            rubygems_version: 2. | 
| 299 | 
            +
            rubygems_version: 2.6.14
         | 
| 286 300 | 
             
            signing_key: 
         | 
| 287 301 | 
             
            specification_version: 4
         | 
| 288 302 | 
             
            summary: Sinatra Webhook Server for Puppet/R10K
         |