oso-oso 0.5.2 → 0.6.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 +4 -4
- data/Gemfile.lock +1 -1
- data/ext/oso-oso/lib/libpolar.dylib +0 -0
- data/ext/oso-oso/lib/libpolar.so +0 -0
- data/ext/oso-oso/lib/polar.dll +0 -0
- data/lib/oso/polar/errors.rb +2 -0
- data/lib/oso/polar/host.rb +5 -8
- data/lib/oso/polar/query.rb +22 -30
- data/lib/oso/version.rb +1 -1
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 70321ccb3dc8e6468b89109aa7d9bbb97868d1be
         | 
| 4 | 
            +
              data.tar.gz: 8b7c1873eba4dae6d1150f8f91a74a3d5a72e51c
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 639ea45ef8a86ebf97ae20ee1977499e18f04827b05d869369c7ec01792eb7a7747c6bae9f7d7789af4993a4b04edef5b375c9caa504c6e09afe701ed931874f
         | 
| 7 | 
            +
              data.tar.gz: 7dc68ed639125472e808ff375059ceb6d70837fad20c05672a183452bef78eeee56dcc0dc58579d21536749bc8e2fbc2628baa349473984c824d23b38d1270f4
         | 
    
        data/Gemfile.lock
    CHANGED
    
    
| Binary file | 
    
        data/ext/oso-oso/lib/libpolar.so
    CHANGED
    
    | Binary file | 
    
        data/ext/oso-oso/lib/polar.dll
    CHANGED
    
    | Binary file | 
    
        data/lib/oso/polar/errors.rb
    CHANGED
    
    | @@ -35,6 +35,8 @@ module Oso | |
| 35 35 | 
             
                class MissingConstructorError < PolarRuntimeError; end
         | 
| 36 36 | 
             
                class UnregisteredInstanceError < PolarRuntimeError; end
         | 
| 37 37 | 
             
                class DuplicateInstanceRegistrationError < PolarRuntimeError; end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                # TODO: I think this should probably have some arguments to say what the call is
         | 
| 38 40 | 
             
                class InvalidCallError < PolarRuntimeError; end
         | 
| 39 41 | 
             
                class InvalidConstructorError < PolarRuntimeError; end
         | 
| 40 42 | 
             
                class InvalidQueryTypeError < PolarRuntimeError; end
         | 
    
        data/lib/oso/polar/host.rb
    CHANGED
    
    | @@ -69,7 +69,7 @@ module Oso | |
| 69 69 | 
             
                  # @param name [String]
         | 
| 70 70 | 
             
                  # @return [Symbol] if constructor is the default of `:new`.
         | 
| 71 71 | 
             
                  # @return [Proc] if a custom constructor was registered.
         | 
| 72 | 
            -
                  # @raise [ | 
| 72 | 
            +
                  # @raise [MissingConstructorError] if the constructor has not been registered.
         | 
| 73 73 | 
             
                  def get_constructor(name)
         | 
| 74 74 | 
             
                    raise MissingConstructorError, name unless constructors.key? name
         | 
| 75 75 |  | 
| @@ -121,6 +121,7 @@ module Oso | |
| 121 121 | 
             
                  # @raise [PolarRuntimeError] if instance construction fails.
         | 
| 122 122 | 
             
                  def make_instance(cls_name, args:, kwargs:, id:) # rubocop:disable Metrics/MethodLength
         | 
| 123 123 | 
             
                    constructor = get_constructor(cls_name)
         | 
| 124 | 
            +
                    # The kwargs.empty? checks are for Ruby < 2.7.
         | 
| 124 125 | 
             
                    instance = if constructor == :new
         | 
| 125 126 | 
             
                                 if kwargs.empty?
         | 
| 126 127 | 
             
                                   get_class(cls_name).__send__(:new, *args)
         | 
| @@ -146,9 +147,9 @@ module Oso | |
| 146 147 | 
             
                  # @return [Boolean]
         | 
| 147 148 | 
             
                  def subspecializer?(instance_id, left_tag:, right_tag:)
         | 
| 148 149 | 
             
                    mro = get_instance(instance_id).class.ancestors
         | 
| 149 | 
            -
                     | 
| 150 | 
            -
             | 
| 151 | 
            -
                     | 
| 150 | 
            +
                    left_index = mro.index(get_class(left_tag))
         | 
| 151 | 
            +
                    right_index = mro.index(get_class(right_tag))
         | 
| 152 | 
            +
                    left_index && right_index && left_index < right_index
         | 
| 152 153 | 
             
                  end
         | 
| 153 154 |  | 
| 154 155 | 
             
                  # Check if instance is an instance of class.
         | 
| @@ -160,8 +161,6 @@ module Oso | |
| 160 161 | 
             
                    instance = to_ruby(instance)
         | 
| 161 162 | 
             
                    cls = get_class(class_tag)
         | 
| 162 163 | 
             
                    instance.is_a? cls
         | 
| 163 | 
            -
                  rescue PolarRuntimeError
         | 
| 164 | 
            -
                    false
         | 
| 165 164 | 
             
                  end
         | 
| 166 165 |  | 
| 167 166 | 
             
                  # Check if two instances unify
         | 
| @@ -173,8 +172,6 @@ module Oso | |
| 173 172 | 
             
                    left_instance = get_instance(left_instance_id)
         | 
| 174 173 | 
             
                    right_instance = get_instance(right_instance_id)
         | 
| 175 174 | 
             
                    left_instance == right_instance
         | 
| 176 | 
            -
                  rescue PolarRuntimeError
         | 
| 177 | 
            -
                    false
         | 
| 178 175 | 
             
                  end
         | 
| 179 176 |  | 
| 180 177 | 
             
                  # Turn a Ruby value into a Polar term that's ready to be sent across the
         | 
    
        data/lib/oso/polar/query.rb
    CHANGED
    
    | @@ -43,16 +43,18 @@ module Oso | |
| 43 43 | 
             
                  # @param args [Array<Hash>]
         | 
| 44 44 | 
             
                  # @raise [InvalidCallError] if the method doesn't exist on the instance or
         | 
| 45 45 | 
             
                  #   the args passed to the method are invalid.
         | 
| 46 | 
            -
                  def register_call(attribute, call_id:, instance:, args:) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
         | 
| 46 | 
            +
                  def register_call(attribute, call_id:, instance:, args:, kwargs:) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
         | 
| 47 47 | 
             
                    return if calls.key?(call_id)
         | 
| 48 48 |  | 
| 49 49 | 
             
                    instance = host.to_ruby(instance)
         | 
| 50 | 
            -
                     | 
| 51 | 
            -
             | 
| 52 | 
            -
                     | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 50 | 
            +
                    args = args.map { |a| host.to_ruby(a) }
         | 
| 51 | 
            +
                    kwargs = Hash[kwargs.map { |k, v| [k.to_sym, host.to_ruby(v)] }]
         | 
| 52 | 
            +
                    # The kwargs.empty? check is for Ruby < 2.7.
         | 
| 53 | 
            +
                    result = if kwargs.empty?
         | 
| 54 | 
            +
                               instance.__send__(attribute, *args)
         | 
| 55 | 
            +
                             else
         | 
| 56 | 
            +
                               instance.__send__(attribute, *args, **kwargs)
         | 
| 57 | 
            +
                             end
         | 
| 56 58 | 
             
                    result = [result].to_enum unless result.is_a? Enumerator # Call must be a generator.
         | 
| 57 59 | 
             
                    calls[call_id] = result.lazy
         | 
| 58 60 | 
             
                  rescue ArgumentError, NoMethodError
         | 
| @@ -93,8 +95,8 @@ module Oso | |
| 93 95 | 
             
                  # @param call_id [Integer]
         | 
| 94 96 | 
             
                  # @param instance [Hash<String, Object>]
         | 
| 95 97 | 
             
                  # @raise [Error] if the FFI call raises one.
         | 
| 96 | 
            -
                  def handle_call(attribute, call_id:, instance:, args:)
         | 
| 97 | 
            -
                    register_call(attribute, call_id: call_id, instance: instance, args: args)
         | 
| 98 | 
            +
                  def handle_call(attribute, call_id:, instance:, args:, kwargs:)
         | 
| 99 | 
            +
                    register_call(attribute, call_id: call_id, instance: instance, args: args, kwargs: kwargs)
         | 
| 98 100 | 
             
                    result = JSON.dump(next_call_result(call_id))
         | 
| 99 101 | 
             
                    call_result(result, call_id: call_id)
         | 
| 100 102 | 
             
                  rescue InvalidCallError => e
         | 
| @@ -104,28 +106,17 @@ module Oso | |
| 104 106 | 
             
                    call_result(nil, call_id: call_id)
         | 
| 105 107 | 
             
                  end
         | 
| 106 108 |  | 
| 107 | 
            -
                  def handle_make_external(data) # rubocop:disable Metrics/AbcSize | 
| 109 | 
            +
                  def handle_make_external(data) # rubocop:disable Metrics/AbcSize
         | 
| 108 110 | 
             
                    id = data['instance_id']
         | 
| 109 111 | 
             
                    raise DuplicateInstanceRegistrationError, id if host.instance? id
         | 
| 110 112 |  | 
| 111 113 | 
             
                    constructor = data['constructor']['value']
         | 
| 112 | 
            -
                     | 
| 113 | 
            -
             | 
| 114 | 
            -
             | 
| 115 | 
            -
             | 
| 116 | 
            -
             | 
| 117 | 
            -
                     | 
| 118 | 
            -
                      cls_name = constructor['Call']['name']
         | 
| 119 | 
            -
                      args = constructor['Call']['args'].map { |arg| host.to_ruby(arg) }
         | 
| 120 | 
            -
                      kwargs = constructor['Call']['kwargs']
         | 
| 121 | 
            -
                      kwargs = if kwargs.nil?
         | 
| 122 | 
            -
                                 {}
         | 
| 123 | 
            -
                               else
         | 
| 124 | 
            -
                                 Hash[kwargs.map { |k, v| [k.to_sym, host.to_ruby(v)] }]
         | 
| 125 | 
            -
                               end
         | 
| 126 | 
            -
                    else
         | 
| 127 | 
            -
                      raise InvalidConstructorError
         | 
| 128 | 
            -
                    end
         | 
| 114 | 
            +
                    raise InvalidConstructorError unless constructor.key? 'Call'
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                    cls_name = constructor['Call']['name']
         | 
| 117 | 
            +
                    args = constructor['Call']['args'].map { |arg| host.to_ruby(arg) }
         | 
| 118 | 
            +
                    kwargs = constructor['Call']['kwargs'] || {}
         | 
| 119 | 
            +
                    kwargs = Hash[kwargs.map { |k, v| [k.to_sym, host.to_ruby(v)] }]
         | 
| 129 120 | 
             
                    host.make_instance(cls_name, args: args, kwargs: kwargs, id: id)
         | 
| 130 121 | 
             
                  end
         | 
| 131 122 |  | 
| @@ -134,7 +125,7 @@ module Oso | |
| 134 125 | 
             
                  # @yieldparam [Hash<String, Object>]
         | 
| 135 126 | 
             
                  # @return [Enumerator]
         | 
| 136 127 | 
             
                  # @raise [Error] if any of the FFI calls raise one.
         | 
| 137 | 
            -
                  def start # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
         | 
| 128 | 
            +
                  def start # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
         | 
| 138 129 | 
             
                    Enumerator.new do |yielder| # rubocop:disable Metrics/BlockLength
         | 
| 139 130 | 
             
                      loop do # rubocop:disable Metrics/BlockLength
         | 
| 140 131 | 
             
                        event = ffi_query.next_event
         | 
| @@ -149,8 +140,9 @@ module Oso | |
| 149 140 | 
             
                          call_id = event.data['call_id']
         | 
| 150 141 | 
             
                          instance = event.data['instance']
         | 
| 151 142 | 
             
                          attribute = event.data['attribute']
         | 
| 152 | 
            -
                          args = event.data['args']
         | 
| 153 | 
            -
                           | 
| 143 | 
            +
                          args = event.data['args'] || []
         | 
| 144 | 
            +
                          kwargs = event.data['kwargs'] || {}
         | 
| 145 | 
            +
                          handle_call(attribute, call_id: call_id, instance: instance, args: args, kwargs: kwargs)
         | 
| 154 146 | 
             
                        when 'ExternalIsSubSpecializer'
         | 
| 155 147 | 
             
                          instance_id = event.data['instance_id']
         | 
| 156 148 | 
             
                          left_tag = event.data['left_class_tag']
         | 
    
        data/lib/oso/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: oso-oso
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.6.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Oso Security, Inc.
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2020-09- | 
| 11 | 
            +
            date: 2020-09-22 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: ffi
         |