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
|