misp 0.1.0 → 0.1.1
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/README.md +12 -3
- data/lib/misp/attribute.rb +91 -24
- data/lib/misp/base.rb +37 -10
- data/lib/misp/configuration.rb +8 -8
- data/lib/misp/event.rb +107 -32
- data/lib/misp/feed.rb +59 -13
- data/lib/misp/galaxy.rb +32 -8
- data/lib/misp/galaxy_cluster.rb +16 -0
- data/lib/misp/org.rb +8 -0
- data/lib/misp/orgc.rb +8 -0
- data/lib/misp/server.rb +18 -3
- data/lib/misp/sharing_group.rb +51 -11
- data/lib/misp/sharing_group_org.rb +11 -1
- data/lib/misp/sharing_group_server.rb +11 -1
- data/lib/misp/tag.rb +65 -22
- data/lib/misp/version.rb +1 -1
- data/misp.gemspec +2 -2
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3be99f0060b369edec33cbfd1f8451ecfdd1d3c4942091087473abdc96579fc8
|
4
|
+
data.tar.gz: eb6d2f9fe09fd030f6cf0f4e9f73e4b19d650809c3f0121c29b9de2b421fb97c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0659e4345163616f8ad38fd43a391ab3f9921c0cf4d5e926ac74bda7b13762cbaca7f5518041e67795b9518c63a81945f503e54e25d4c8e37e14801e41a3335
|
7
|
+
data.tar.gz: 2e85ada078b9b82eb9221cec0d0b012d731c0dd082b147306f7c0b69a473aa583ac98153c882ba51e6a072fce26d348f607a1178515cca38395624d5db59d7e3
|
data/README.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# misp-rb
|
2
2
|
|
3
|
+
[](https://badge.fury.io/rb/misp)
|
3
4
|
[](https://travis-ci.com/ninoseki/misp-rb)
|
4
5
|
[](https://coveralls.io/github/ninoseki/misp-rb?branch=master)
|
5
6
|
[](https://www.codefactor.io/repository/github/ninoseki/misp-rb)
|
@@ -20,8 +21,8 @@ gem install misp
|
|
20
21
|
|
21
22
|
By default, it tries to load configurations from environmental variables:
|
22
23
|
|
23
|
-
- MISP API endpoint
|
24
|
-
- MISP API key
|
24
|
+
- `MISP_API_ENDPOINT`: MISP API endpoint (e.g. https://misppriv.circl.lu)
|
25
|
+
- `MISP_API_KEY`: MISP API key
|
25
26
|
|
26
27
|
Also, you can configure them manually.
|
27
28
|
|
@@ -60,7 +61,7 @@ event.update
|
|
60
61
|
event = MISP::Event.get(17)
|
61
62
|
event.add_attribute(value: "8.8.8.8", type: "ip-dst")
|
62
63
|
# or
|
63
|
-
attribute = MISP::Attribute(value: "1.1.1.1", type: "ip-dst")
|
64
|
+
attribute = MISP::Attribute.new(value: "1.1.1.1", type: "ip-dst")
|
64
65
|
event.add_attribute attribute
|
65
66
|
event.update
|
66
67
|
```
|
@@ -109,6 +110,14 @@ event.tags << MISP::Tag.new(name: "my event-level tag")
|
|
109
110
|
event.create
|
110
111
|
```
|
111
112
|
|
113
|
+
### Search for events / attributes
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
events = MISP::Event.search(info: "test")
|
117
|
+
|
118
|
+
attributes = MISP::Attribute.search(type: "ip-dst")
|
119
|
+
```
|
120
|
+
|
112
121
|
## Acknowledgement
|
113
122
|
|
114
123
|
The implementation design of this gem is highly influenced by [FloatingGhost/mispex](https://github.com/FloatingGhost/mispex).
|
data/lib/misp/attribute.rb
CHANGED
@@ -2,23 +2,40 @@
|
|
2
2
|
|
3
3
|
module MISP
|
4
4
|
class Attribute < Base
|
5
|
+
# @return [String]
|
5
6
|
attr_reader :id
|
7
|
+
# @return [String]
|
6
8
|
attr_accessor :type
|
9
|
+
# @return [String]
|
7
10
|
attr_accessor :category
|
11
|
+
# @return [Boolean]
|
8
12
|
attr_accessor :to_ids
|
13
|
+
# @return [String]
|
9
14
|
attr_reader :uuid
|
15
|
+
# @return [String]
|
10
16
|
attr_reader :event_id
|
17
|
+
# @return [String]
|
11
18
|
attr_accessor :distribution
|
19
|
+
# @return [String]
|
12
20
|
attr_accessor :timestamp
|
21
|
+
# @return [String]
|
13
22
|
attr_accessor :comment
|
23
|
+
# @return [String]
|
14
24
|
attr_accessor :sharing_group_id
|
25
|
+
# @return [Boolean]
|
15
26
|
attr_accessor :deleted
|
27
|
+
# @return [Boolean]
|
16
28
|
attr_accessor :disable_correlation
|
29
|
+
# @return [String]
|
17
30
|
attr_accessor :value
|
31
|
+
# @return [String]
|
18
32
|
attr_accessor :data
|
19
33
|
|
34
|
+
# @return [Array<MISP::SharingGroup>]
|
20
35
|
attr_accessor :sharing_groups
|
36
|
+
# @return [Array<MISP::Attribute>]
|
21
37
|
attr_accessor :shadow_attributes
|
38
|
+
# @return [Array<MISP::Tag>]
|
22
39
|
attr_accessor :tags
|
23
40
|
|
24
41
|
def initialize(**attributes)
|
@@ -44,6 +61,11 @@ module MISP
|
|
44
61
|
@tags = build_plural_attribute(items: attributes.dig(:Tag), klass: Tag)
|
45
62
|
end
|
46
63
|
|
64
|
+
#
|
65
|
+
# Returns a hash representation of the attribute data.
|
66
|
+
#
|
67
|
+
# @return [Hash]
|
68
|
+
#
|
47
69
|
def to_h
|
48
70
|
{
|
49
71
|
id: id,
|
@@ -66,36 +88,53 @@ module MISP
|
|
66
88
|
}.compact
|
67
89
|
end
|
68
90
|
|
91
|
+
#
|
92
|
+
# Get an attribute
|
93
|
+
#
|
94
|
+
# @return [MISP::Attribute]
|
95
|
+
#
|
69
96
|
def get
|
70
|
-
_get("/attributes/#{id}") { |attribute| Attribute.new
|
71
|
-
end
|
72
|
-
|
73
|
-
def self.get(id)
|
74
|
-
new(id: id).get
|
97
|
+
_get("/attributes/#{id}") { |attribute| Attribute.new attribute }
|
75
98
|
end
|
76
99
|
|
100
|
+
#
|
101
|
+
# Delete an attribute
|
102
|
+
#
|
103
|
+
# @return [Hash]
|
104
|
+
#
|
77
105
|
def delete
|
78
106
|
_post("/attributes/delete/#{id}") { |json| json }
|
79
107
|
end
|
80
108
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
109
|
+
#
|
110
|
+
# Create an attribute
|
111
|
+
#
|
112
|
+
# @return [MISP::Attribute]
|
113
|
+
#
|
85
114
|
def create(event_id)
|
86
|
-
_post("/attributes/add/#{event_id}", wrap(to_h)) { |attribute| Attribute.new
|
87
|
-
end
|
88
|
-
|
89
|
-
def self.create(event_id, **attributes)
|
90
|
-
new(attributes).create(event_id)
|
115
|
+
_post("/attributes/add/#{event_id}", wrap(to_h)) { |attribute| Attribute.new attribute }
|
91
116
|
end
|
92
117
|
|
118
|
+
#
|
119
|
+
# Update an attribute
|
120
|
+
#
|
121
|
+
# @param [Hash] **attrs attributes
|
122
|
+
#
|
123
|
+
# @return [MISP::Attribute]
|
124
|
+
#
|
93
125
|
def update(**attrs)
|
94
126
|
payload = to_h.merge(attrs)
|
95
127
|
payload[:timestamp] = nil
|
96
|
-
_post("/attributes/edit/#{id}", wrap(payload)) { |json| Attribute.new
|
128
|
+
_post("/attributes/edit/#{id}", wrap(payload)) { |json| Attribute.new json.dig(:response, :Attribute) }
|
97
129
|
end
|
98
130
|
|
131
|
+
#
|
132
|
+
# Search for attributes
|
133
|
+
#
|
134
|
+
# @param [Hash] **params parameters
|
135
|
+
#
|
136
|
+
# @return [Array<MISP::Attributes>]
|
137
|
+
#
|
99
138
|
def search(**params)
|
100
139
|
base = {
|
101
140
|
returnFormat: "json",
|
@@ -104,25 +143,53 @@ module MISP
|
|
104
143
|
}
|
105
144
|
|
106
145
|
_post("/attributes/restSearch", base.merge(params)) do |json|
|
107
|
-
attributes = json.dig(
|
108
|
-
attributes.map { |attribute| Attribute.new
|
146
|
+
attributes = json.dig(:response, :Attribute) || []
|
147
|
+
attributes.map { |attribute| Attribute.new attribute }
|
109
148
|
end
|
110
149
|
end
|
111
150
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
151
|
+
#
|
152
|
+
# Add a tag to an attribute
|
153
|
+
#
|
154
|
+
# @param [MISP::Tag, Hash] tag
|
155
|
+
#
|
156
|
+
# @return [MISP::Tag]
|
157
|
+
#
|
116
158
|
def add_tag(tag)
|
117
|
-
tag = Tag.new(
|
159
|
+
tag = Tag.new(tag) unless tag.is_a?(MISP::Tag)
|
118
160
|
payload = { uuid: uuid, tag: tag.name }
|
119
|
-
_post("/tags/attachTagToObject", payload) { |json| Tag.new
|
161
|
+
_post("/tags/attachTagToObject", payload) { |json| Tag.new json }
|
120
162
|
end
|
121
163
|
|
164
|
+
#
|
165
|
+
# Remove a tag from an attribute
|
166
|
+
#
|
167
|
+
# @param [MISP::Tag, Hash] tag
|
168
|
+
#
|
169
|
+
# @return [Hash]
|
170
|
+
#
|
122
171
|
def remove_tag(tag)
|
123
|
-
tag = Tag.new(
|
172
|
+
tag = Tag.new(tag) unless tag.is_a?(MISP::Tag)
|
124
173
|
payload = { uuid: uuid, tag: tag.name }
|
125
174
|
_post("/tags/removeTagFromObject", payload) { |json| json }
|
126
175
|
end
|
176
|
+
|
177
|
+
class << self
|
178
|
+
def get(id)
|
179
|
+
new(id: id).get
|
180
|
+
end
|
181
|
+
|
182
|
+
def delete(id)
|
183
|
+
new(id: id).delete
|
184
|
+
end
|
185
|
+
|
186
|
+
def create(event_id, **attributes)
|
187
|
+
new(attributes).create(event_id)
|
188
|
+
end
|
189
|
+
|
190
|
+
def search(**params)
|
191
|
+
new.search params
|
192
|
+
end
|
193
|
+
end
|
127
194
|
end
|
128
195
|
end
|
data/lib/misp/base.rb
CHANGED
@@ -6,32 +6,59 @@ require "uri"
|
|
6
6
|
|
7
7
|
module MISP
|
8
8
|
class Base
|
9
|
+
private
|
10
|
+
|
11
|
+
#
|
12
|
+
# API endpoint
|
13
|
+
#
|
14
|
+
# @return [URI]
|
15
|
+
#
|
9
16
|
def api_endpoint
|
10
17
|
@api_endpoint ||= URI(MISP.configuration.api_endpoint)
|
11
18
|
end
|
12
19
|
|
20
|
+
#
|
21
|
+
# API key
|
22
|
+
#
|
23
|
+
# @return [String]
|
24
|
+
#
|
13
25
|
def api_key
|
14
26
|
@api_key ||= MISP.configuration.api_key
|
15
27
|
end
|
16
28
|
|
17
|
-
|
18
|
-
|
29
|
+
#
|
30
|
+
# Build an instance of a class
|
31
|
+
#
|
32
|
+
# @param [Hash] item
|
33
|
+
# @param [Class] klass
|
34
|
+
#
|
35
|
+
# @return [Class]
|
36
|
+
#
|
19
37
|
def build_attribute(item:, klass:)
|
20
38
|
return nil unless item
|
21
39
|
|
22
|
-
klass.new
|
40
|
+
klass.new item
|
23
41
|
end
|
24
42
|
|
43
|
+
#
|
44
|
+
# Build an array of an instance of a class
|
45
|
+
#
|
46
|
+
# @param [Array<Hash>] items
|
47
|
+
# @param [Class] klass
|
48
|
+
#
|
49
|
+
# @return [Arra<Class>]
|
50
|
+
#
|
25
51
|
def build_plural_attribute(items:, klass:)
|
26
52
|
(items || []).map do |item|
|
27
|
-
klass.new
|
53
|
+
klass.new item
|
28
54
|
end
|
29
55
|
end
|
30
56
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
57
|
+
#
|
58
|
+
# a name of the class
|
59
|
+
#
|
60
|
+
# @return [String]
|
61
|
+
#
|
35
62
|
def class_name
|
36
63
|
self.class.to_s.split("::").last.to_s
|
37
64
|
end
|
@@ -39,7 +66,7 @@ module MISP
|
|
39
66
|
def normalize_attributes(attributes)
|
40
67
|
klass = class_name.to_sym
|
41
68
|
|
42
|
-
attributes.key?(klass) ?
|
69
|
+
attributes.key?(klass) ? attributes.dig(klass) : attributes
|
43
70
|
end
|
44
71
|
|
45
72
|
def wrap(params)
|
@@ -99,7 +126,7 @@ module MISP
|
|
99
126
|
end
|
100
127
|
|
101
128
|
def parse_body(body)
|
102
|
-
JSON.parse body.to_s
|
129
|
+
JSON.parse body.to_s, symbolize_names: true
|
103
130
|
rescue JSON::ParserError => _e
|
104
131
|
body.to_s
|
105
132
|
end
|
data/lib/misp/configuration.rb
CHANGED
@@ -14,15 +14,15 @@ module MISP
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
class << self
|
18
|
+
def configuration
|
19
|
+
@configuration ||= Configuration.new
|
20
|
+
end
|
20
21
|
|
21
|
-
|
22
|
-
@configuration = config
|
23
|
-
end
|
22
|
+
attr_writer :configuration
|
24
23
|
|
25
|
-
|
26
|
-
|
24
|
+
def configure
|
25
|
+
yield configuration
|
26
|
+
end
|
27
27
|
end
|
28
28
|
end
|
data/lib/misp/event.rb
CHANGED
@@ -2,33 +2,59 @@
|
|
2
2
|
|
3
3
|
module MISP
|
4
4
|
class Event < Base
|
5
|
+
# @return [String]
|
5
6
|
attr_reader :id
|
7
|
+
# @return [String]
|
6
8
|
attr_accessor :orgc_id
|
9
|
+
# @return [String]
|
7
10
|
attr_accessor :org_id
|
11
|
+
# @return [String]
|
8
12
|
attr_accessor :date
|
13
|
+
# @return [String]
|
9
14
|
attr_accessor :threat_level_id
|
15
|
+
# @return [String]
|
10
16
|
attr_accessor :info
|
17
|
+
# @return [Boolean]
|
11
18
|
attr_accessor :published
|
19
|
+
# @return [String]
|
12
20
|
attr_reader :uuid
|
21
|
+
# @return [String]
|
13
22
|
attr_accessor :attribute_count
|
23
|
+
# @return [String]
|
14
24
|
attr_accessor :analysis
|
25
|
+
# @return [String]
|
15
26
|
attr_accessor :timestamp
|
27
|
+
# @return [String]
|
16
28
|
attr_accessor :distribution
|
29
|
+
# @return [Boolean]
|
17
30
|
attr_accessor :proposal_email_lock
|
31
|
+
# @return [Boolean]
|
18
32
|
attr_accessor :locked
|
33
|
+
# @return [String]
|
19
34
|
attr_accessor :publish_timestamp
|
35
|
+
# @return [String]
|
20
36
|
attr_accessor :sharing_group_id
|
37
|
+
# @return [Boolean]
|
21
38
|
attr_accessor :disable_correlation
|
39
|
+
# @return [String]
|
22
40
|
attr_accessor :event_creator_email
|
23
41
|
|
42
|
+
# @return [MISP::Org, nil]
|
24
43
|
attr_accessor :org
|
44
|
+
# @return [MISP::Orgc, nil]
|
25
45
|
attr_accessor :orgc
|
26
46
|
|
47
|
+
# @return [Array<MISP::SharingGroup>]
|
27
48
|
attr_accessor :sharing_groups
|
49
|
+
# @return [Array<MISP::Attribute>]
|
28
50
|
attr_accessor :attributes
|
51
|
+
# @return [Array<MISP::Attribute>]
|
29
52
|
attr_accessor :shadow_attributes
|
53
|
+
# @return [Array<MISP::Event>]
|
30
54
|
attr_accessor :related_events
|
55
|
+
# @return [Array<<MISP::Galaxy>]
|
31
56
|
attr_accessor :galaxies
|
57
|
+
# @return [Array<<MISP::Tag>]
|
32
58
|
attr_accessor :tags
|
33
59
|
|
34
60
|
def initialize(**attrs)
|
@@ -64,6 +90,11 @@ module MISP
|
|
64
90
|
@tags = build_plural_attribute(items: attrs.dig(:Tag), klass: Tag)
|
65
91
|
end
|
66
92
|
|
93
|
+
#
|
94
|
+
# Returns a hash representation of the attribute data.
|
95
|
+
#
|
96
|
+
# @return [Hash]
|
97
|
+
#
|
67
98
|
def to_h
|
68
99
|
compact(
|
69
100
|
id: id,
|
@@ -95,53 +126,65 @@ module MISP
|
|
95
126
|
)
|
96
127
|
end
|
97
128
|
|
129
|
+
#
|
130
|
+
# Get an event
|
131
|
+
#
|
132
|
+
# @return [MISP::Event]
|
133
|
+
#
|
98
134
|
def get(id)
|
99
|
-
_get("/events/#{id}") { |event| Event.new
|
100
|
-
end
|
101
|
-
|
102
|
-
def self.get(id)
|
103
|
-
new.get id
|
135
|
+
_get("/events/#{id}") { |event| Event.new event }
|
104
136
|
end
|
105
137
|
|
138
|
+
#
|
139
|
+
# Create an event
|
140
|
+
#
|
141
|
+
# @param [Hash] **attrs attributes
|
142
|
+
#
|
143
|
+
# @return [MISP::Event]
|
144
|
+
#
|
106
145
|
def create(**attrs)
|
107
146
|
payload = to_h.merge(attrs)
|
108
|
-
_post("/events/add", wrap(payload)) { |event| Event.new
|
109
|
-
end
|
110
|
-
|
111
|
-
def self.create(**attrs)
|
112
|
-
new.create attrs
|
147
|
+
_post("/events/add", wrap(payload)) { |event| Event.new event }
|
113
148
|
end
|
114
149
|
|
150
|
+
#
|
151
|
+
# Delete an event
|
152
|
+
#
|
153
|
+
# @return [Hash]
|
154
|
+
#
|
115
155
|
def delete
|
116
156
|
_delete("/events/#{id}") { |json| json }
|
117
157
|
end
|
118
158
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
159
|
+
#
|
160
|
+
# List events
|
161
|
+
#
|
162
|
+
# @return [Array<MISP::Event>]
|
163
|
+
#
|
123
164
|
def list
|
124
165
|
_get("/events/index") do |events|
|
125
166
|
events.map do |event|
|
126
|
-
Event.new
|
167
|
+
Event.new event
|
127
168
|
end
|
128
169
|
end
|
129
170
|
end
|
130
171
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
172
|
+
#
|
173
|
+
# Update an event
|
174
|
+
#
|
175
|
+
# @return [MISP::Event]
|
176
|
+
#
|
135
177
|
def update(**attrs)
|
136
178
|
payload = to_h.merge(attrs)
|
137
179
|
payload[:timestamp] = nil
|
138
|
-
_post("/events/#{id}", wrap(payload)) { |event| Event.new
|
139
|
-
end
|
140
|
-
|
141
|
-
def self.update(id, **attrs)
|
142
|
-
new(id: id).update attrs
|
180
|
+
_post("/events/#{id}", wrap(payload)) { |event| Event.new event }
|
143
181
|
end
|
144
182
|
|
183
|
+
#
|
184
|
+
# Search for events
|
185
|
+
#
|
186
|
+
# @return [Array<MISP::Event>]
|
187
|
+
#
|
145
188
|
def search(**params)
|
146
189
|
base = {
|
147
190
|
returnFormat: "json",
|
@@ -150,27 +193,59 @@ module MISP
|
|
150
193
|
}
|
151
194
|
|
152
195
|
_post("/events/restSearch", base.merge(params)) do |json|
|
153
|
-
events = json.dig(
|
154
|
-
events.map { |event| Event.new
|
196
|
+
events = json.dig(:response) || []
|
197
|
+
events.map { |event| Event.new event }
|
155
198
|
end
|
156
199
|
end
|
157
200
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
201
|
+
#
|
202
|
+
# Add an attribute to an event. Requires an update or create call afterwards.
|
203
|
+
#
|
204
|
+
# @return [MISP::Event]
|
205
|
+
#
|
162
206
|
def add_attribute(attribute)
|
163
|
-
attribute = Attribute.new(
|
207
|
+
attribute = Attribute.new(attribute) unless attribute.is_a?(Attribute)
|
164
208
|
attributes << attribute
|
165
209
|
self
|
166
210
|
end
|
167
211
|
|
212
|
+
#
|
213
|
+
# Add a tag to an event. Requires an update or create call afterwards.
|
214
|
+
#
|
215
|
+
# @return [MISP::Event]
|
216
|
+
#
|
168
217
|
def add_tag(tag)
|
169
|
-
tag = Tag.new(
|
218
|
+
tag = Tag.new(tag) unless tag.is_a?(MISP::Tag)
|
170
219
|
tags << tag
|
171
220
|
self
|
172
221
|
end
|
173
222
|
|
223
|
+
class << self
|
224
|
+
def get(id)
|
225
|
+
new.get id
|
226
|
+
end
|
227
|
+
|
228
|
+
def create(**attrs)
|
229
|
+
new.create attrs
|
230
|
+
end
|
231
|
+
|
232
|
+
def delete(id)
|
233
|
+
new(id: id).delete
|
234
|
+
end
|
235
|
+
|
236
|
+
def list
|
237
|
+
new.list
|
238
|
+
end
|
239
|
+
|
240
|
+
def update(id, **attrs)
|
241
|
+
new(id: id).update attrs
|
242
|
+
end
|
243
|
+
|
244
|
+
def search(**params)
|
245
|
+
new.search params
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
174
249
|
private
|
175
250
|
|
176
251
|
def compact(hash)
|
data/lib/misp/feed.rb
CHANGED
@@ -2,27 +2,49 @@
|
|
2
2
|
|
3
3
|
module MISP
|
4
4
|
class Feed < Base
|
5
|
+
# @return [String]
|
5
6
|
attr_reader :id
|
7
|
+
# @return [String]
|
6
8
|
attr_reader :name
|
9
|
+
# @return [String]
|
7
10
|
attr_reader :provider
|
11
|
+
# @return [String]
|
8
12
|
attr_reader :url
|
13
|
+
# @return [String]
|
9
14
|
attr_reader :rules
|
15
|
+
# @return [Boolean]
|
10
16
|
attr_reader :enabled
|
17
|
+
# @return [String]
|
11
18
|
attr_reader :distribution
|
19
|
+
# @return [String]
|
12
20
|
attr_reader :sharing_group_id
|
21
|
+
# @return [String]
|
13
22
|
attr_reader :tag_id
|
23
|
+
# @return [String]
|
14
24
|
attr_reader :default
|
25
|
+
# @return [String]
|
15
26
|
attr_reader :source_format
|
27
|
+
# @return [Boolean]
|
16
28
|
attr_reader :fixed_event
|
29
|
+
# @return [Boolean]
|
17
30
|
attr_reader :delta_merge
|
31
|
+
# @return [String]
|
18
32
|
attr_reader :event_id
|
33
|
+
# @return [String]
|
19
34
|
attr_reader :publish
|
35
|
+
# @return [String]
|
20
36
|
attr_reader :override_ids
|
37
|
+
# @return [String]
|
21
38
|
attr_reader :settings
|
39
|
+
# @return [String]
|
22
40
|
attr_reader :input_source
|
41
|
+
# @return [Boolean]
|
23
42
|
attr_reader :delete_local_file
|
43
|
+
# @return [Boolean]
|
24
44
|
attr_reader :lookup_visible
|
45
|
+
# @return [String]
|
25
46
|
attr_reader :headers
|
47
|
+
# @return [Boolean]
|
26
48
|
attr_reader :caching_enabled
|
27
49
|
|
28
50
|
def initialize(**attributes)
|
@@ -52,6 +74,11 @@ module MISP
|
|
52
74
|
@caching_enabled = attributes.dig(:caching_enabled) || true
|
53
75
|
end
|
54
76
|
|
77
|
+
#
|
78
|
+
# Returns a hash representation of the attribute data.
|
79
|
+
#
|
80
|
+
# @return [Hash]
|
81
|
+
#
|
55
82
|
def to_h
|
56
83
|
{
|
57
84
|
id: id,
|
@@ -79,32 +106,51 @@ module MISP
|
|
79
106
|
}.compact
|
80
107
|
end
|
81
108
|
|
109
|
+
#
|
110
|
+
# List feeds
|
111
|
+
#
|
112
|
+
# @return [Array<MISP::Feed>]
|
113
|
+
#
|
82
114
|
def list
|
83
115
|
_get("/feeds/index") do |feeds|
|
84
116
|
feeds.map do |feed|
|
85
|
-
Feed.new
|
117
|
+
Feed.new feed
|
86
118
|
end
|
87
119
|
end
|
88
120
|
end
|
89
121
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
122
|
+
#
|
123
|
+
# Create a feed
|
124
|
+
#
|
125
|
+
# @return [MISP::Feed]
|
126
|
+
#
|
94
127
|
def get
|
95
|
-
_get("/feeds/view/#{id}") { |feed| Feed.new
|
96
|
-
end
|
97
|
-
|
98
|
-
def self.get(id)
|
99
|
-
new(id: id).get
|
128
|
+
_get("/feeds/view/#{id}") { |feed| Feed.new feed }
|
100
129
|
end
|
101
130
|
|
131
|
+
#
|
132
|
+
# Create a feed
|
133
|
+
#
|
134
|
+
# @param [Hash] **attributes attributes
|
135
|
+
#
|
136
|
+
# @return [MIPS::Feed]
|
137
|
+
#
|
102
138
|
def create(**attributes)
|
103
|
-
_post("/feeds/add", wrap(attributes)) { |feed| Feed.new
|
139
|
+
_post("/feeds/add", wrap(attributes)) { |feed| Feed.new feed }
|
104
140
|
end
|
105
141
|
|
106
|
-
|
107
|
-
|
142
|
+
class << self
|
143
|
+
def list
|
144
|
+
new.list
|
145
|
+
end
|
146
|
+
|
147
|
+
def get(id)
|
148
|
+
new(id: id).get
|
149
|
+
end
|
150
|
+
|
151
|
+
def create(**attributes)
|
152
|
+
new.create attributes
|
153
|
+
end
|
108
154
|
end
|
109
155
|
end
|
110
156
|
end
|
data/lib/misp/galaxy.rb
CHANGED
@@ -2,13 +2,20 @@
|
|
2
2
|
|
3
3
|
module MISP
|
4
4
|
class Galaxy < Base
|
5
|
+
# @return [String]
|
5
6
|
attr_reader :id
|
7
|
+
# @return [String]
|
6
8
|
attr_reader :uuid
|
9
|
+
# @return [String]
|
7
10
|
attr_reader :name
|
11
|
+
# @return [String]
|
8
12
|
attr_reader :type
|
13
|
+
# @return [String]
|
9
14
|
attr_reader :description
|
15
|
+
# @return [String]
|
10
16
|
attr_reader :version
|
11
17
|
|
18
|
+
# @return [Array<MISP::GalaxyCluster>]
|
12
19
|
attr_reader :galaxy_clusters
|
13
20
|
|
14
21
|
def initialize(**attributes)
|
@@ -24,6 +31,11 @@ module MISP
|
|
24
31
|
@galaxy_clusters = build_plural_attribute(items: attributes.dig(:GalaxyCluster), klass: GalaxyCluster)
|
25
32
|
end
|
26
33
|
|
34
|
+
#
|
35
|
+
# Returns a hash representation of the attribute data.
|
36
|
+
#
|
37
|
+
# @return [Hash]
|
38
|
+
#
|
27
39
|
def to_h
|
28
40
|
{
|
29
41
|
id: id,
|
@@ -36,24 +48,36 @@ module MISP
|
|
36
48
|
}.compact
|
37
49
|
end
|
38
50
|
|
51
|
+
#
|
52
|
+
# List galaxies
|
53
|
+
#
|
54
|
+
# @return [Array<Galaxy>]
|
55
|
+
#
|
39
56
|
def list
|
40
57
|
_get("/galaxies/") do |galaxies|
|
41
58
|
galaxies.map do |galaxy|
|
42
|
-
Galaxy.new
|
59
|
+
Galaxy.new galaxy
|
43
60
|
end
|
44
61
|
end
|
45
62
|
end
|
46
63
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
64
|
+
#
|
65
|
+
# Get a galaxy
|
66
|
+
#
|
67
|
+
# @return [MISP::Galaxy]
|
68
|
+
#
|
51
69
|
def get
|
52
|
-
_get("/galaxies/view/#{id}") { |galaxy| Galaxy.new
|
70
|
+
_get("/galaxies/view/#{id}") { |galaxy| Galaxy.new galaxy }
|
53
71
|
end
|
54
72
|
|
55
|
-
|
56
|
-
|
73
|
+
class << self
|
74
|
+
def list
|
75
|
+
new.list
|
76
|
+
end
|
77
|
+
|
78
|
+
def get(id)
|
79
|
+
new(id: id).get
|
80
|
+
end
|
57
81
|
end
|
58
82
|
end
|
59
83
|
end
|
data/lib/misp/galaxy_cluster.rb
CHANGED
@@ -2,16 +2,27 @@
|
|
2
2
|
|
3
3
|
module MISP
|
4
4
|
class GalaxyCluster < Base
|
5
|
+
# @return [String]
|
5
6
|
attr_reader :id
|
7
|
+
# @return [String]
|
6
8
|
attr_reader :uuid
|
9
|
+
# @return [String]
|
7
10
|
attr_reader :type
|
11
|
+
# @return [String]
|
8
12
|
attr_reader :value
|
13
|
+
# @return [String]
|
9
14
|
attr_reader :tag_name
|
15
|
+
# @return [String]
|
10
16
|
attr_reader :description
|
17
|
+
# @return [String]
|
11
18
|
attr_reader :galaxy_id
|
19
|
+
# @return [String]
|
12
20
|
attr_reader :source
|
21
|
+
# @return [Array<String>]
|
13
22
|
attr_reader :authors
|
23
|
+
# @return [String]
|
14
24
|
attr_reader :tag_id
|
25
|
+
# @return [Hash]
|
15
26
|
attr_reader :meta
|
16
27
|
|
17
28
|
def initialize(**attributes)
|
@@ -30,6 +41,11 @@ module MISP
|
|
30
41
|
@meta = attributes.dig(:meta)
|
31
42
|
end
|
32
43
|
|
44
|
+
#
|
45
|
+
# Returns a hash representation of the attribute data.
|
46
|
+
#
|
47
|
+
# @return [Hash]
|
48
|
+
#
|
33
49
|
def to_h
|
34
50
|
{
|
35
51
|
id: id,
|
data/lib/misp/org.rb
CHANGED
@@ -2,8 +2,11 @@
|
|
2
2
|
|
3
3
|
module MISP
|
4
4
|
class Org < Base
|
5
|
+
# @return [String]
|
5
6
|
attr_reader :id
|
7
|
+
# @return [String]
|
6
8
|
attr_reader :name
|
9
|
+
# @return [String]
|
7
10
|
attr_reader :uuid
|
8
11
|
|
9
12
|
def initialize(**attributes)
|
@@ -14,6 +17,11 @@ module MISP
|
|
14
17
|
@uuid = attributes.dig(:uuid)
|
15
18
|
end
|
16
19
|
|
20
|
+
#
|
21
|
+
# Returns a hash representation of the attribute data.
|
22
|
+
#
|
23
|
+
# @return [Hash]
|
24
|
+
#
|
17
25
|
def to_h
|
18
26
|
{
|
19
27
|
id: id,
|
data/lib/misp/orgc.rb
CHANGED
@@ -2,8 +2,11 @@
|
|
2
2
|
|
3
3
|
module MISP
|
4
4
|
class Orgc < Base
|
5
|
+
# @return [String]
|
5
6
|
attr_reader :id
|
7
|
+
# @return [String]
|
6
8
|
attr_reader :name
|
9
|
+
# @return [String]
|
7
10
|
attr_reader :uuid
|
8
11
|
|
9
12
|
def initialize(**attributes)
|
@@ -14,6 +17,11 @@ module MISP
|
|
14
17
|
@uuid = attributes.dig(:uuid)
|
15
18
|
end
|
16
19
|
|
20
|
+
#
|
21
|
+
# Returns a hash representation of the attribute data.
|
22
|
+
#
|
23
|
+
# @return [Hash]
|
24
|
+
#
|
17
25
|
def to_h
|
18
26
|
{
|
19
27
|
id: id,
|
data/lib/misp/server.rb
CHANGED
@@ -2,8 +2,11 @@
|
|
2
2
|
|
3
3
|
module MISP
|
4
4
|
class Server < Base
|
5
|
+
# @return [String]
|
5
6
|
attr_reader :id
|
7
|
+
# @return [String]
|
6
8
|
attr_reader :url
|
9
|
+
# @return [String]
|
7
10
|
attr_reader :name
|
8
11
|
|
9
12
|
def initialize(**attributes)
|
@@ -14,6 +17,11 @@ module MISP
|
|
14
17
|
@name = attributes.dig(:name)
|
15
18
|
end
|
16
19
|
|
20
|
+
#
|
21
|
+
# Returns a hash representation of the attribute data.
|
22
|
+
#
|
23
|
+
# @return [Hash]
|
24
|
+
#
|
17
25
|
def to_h
|
18
26
|
{
|
19
27
|
id: id,
|
@@ -22,16 +30,23 @@ module MISP
|
|
22
30
|
}.compact
|
23
31
|
end
|
24
32
|
|
33
|
+
#
|
34
|
+
# List servers
|
35
|
+
#
|
36
|
+
# @return [Array<MISP::Server>]
|
37
|
+
#
|
25
38
|
def list
|
26
39
|
_get("/servers/") do |servers|
|
27
40
|
servers.map do |server|
|
28
|
-
Server.new
|
41
|
+
Server.new server
|
29
42
|
end
|
30
43
|
end
|
31
44
|
end
|
32
45
|
|
33
|
-
|
34
|
-
|
46
|
+
class << self
|
47
|
+
def list
|
48
|
+
new.list
|
49
|
+
end
|
35
50
|
end
|
36
51
|
end
|
37
52
|
end
|
data/lib/misp/sharing_group.rb
CHANGED
@@ -1,21 +1,42 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module MISP
|
4
|
-
class SharingGroup <
|
4
|
+
class SharingGroup < Base
|
5
|
+
# @return [String]
|
5
6
|
attr_reader :id
|
7
|
+
# @return [String]
|
6
8
|
attr_reader :name
|
9
|
+
# @return [String]
|
7
10
|
attr_reader :releasability
|
11
|
+
# @return [String]
|
8
12
|
attr_reader :description
|
13
|
+
# @return [String]
|
9
14
|
attr_reader :uuid
|
15
|
+
# @return [String]
|
10
16
|
attr_reader :organisation_uuid
|
17
|
+
# @return [String]
|
11
18
|
attr_reader :org_id
|
19
|
+
# @return [String]
|
12
20
|
attr_reader :sync_user_id
|
21
|
+
# @return [Boolean]
|
13
22
|
attr_reader :active
|
23
|
+
# @return [String]
|
14
24
|
attr_reader :created
|
25
|
+
# @return [String]
|
15
26
|
attr_reader :modified
|
27
|
+
# @return [Boolean]
|
16
28
|
attr_reader :local
|
29
|
+
# @return [Boolean]
|
17
30
|
attr_reader :roaming
|
18
31
|
|
32
|
+
# @return [MISP::Org, nil]
|
33
|
+
attr_reader :organization
|
34
|
+
|
35
|
+
# @return [Array<MISP::SharingGroupOrg>]
|
36
|
+
attr_reader :sharing_group_orgs
|
37
|
+
# @return [Array<MISP::SharingGroupServer>]
|
38
|
+
attr_reader :sharing_group_servers
|
39
|
+
|
19
40
|
def initialize(**attributes)
|
20
41
|
attributes = normalize_attributes(attributes)
|
21
42
|
|
@@ -33,12 +54,17 @@ module MISP
|
|
33
54
|
@local = attributes.dig(:local)
|
34
55
|
@roaming = attributes.dig(:roaming)
|
35
56
|
|
36
|
-
@
|
57
|
+
@organisation = build_attribute(item: attributes.dig(:Organization), klass: Org)
|
37
58
|
|
38
59
|
@sharing_group_orgs = build_plural_attribute(items: attributes.dig(:SharingGroupOrg), klass: SharingGroupOrg)
|
39
60
|
@sharing_group_servers = build_plural_attribute(items: attributes.dig(:SharingGroupServer), klass: SharingGroupServer)
|
40
61
|
end
|
41
62
|
|
63
|
+
#
|
64
|
+
# Returns a hash representation of the attribute data.
|
65
|
+
#
|
66
|
+
# @return [Hash]
|
67
|
+
#
|
42
68
|
def to_h
|
43
69
|
{
|
44
70
|
id: id,
|
@@ -60,25 +86,39 @@ module MISP
|
|
60
86
|
}.compact
|
61
87
|
end
|
62
88
|
|
89
|
+
#
|
90
|
+
# List sharing groups
|
91
|
+
#
|
92
|
+
# @return [Array<MISP::SharingGroup>]
|
93
|
+
#
|
63
94
|
def list
|
64
95
|
_get("/sharing_groups/") do |res|
|
65
|
-
sharing_groups = res.dig(
|
96
|
+
sharing_groups = res.dig(:response) || []
|
66
97
|
sharing_groups.map do |sharing_group|
|
67
|
-
SharingGroup.new
|
98
|
+
SharingGroup.new sharing_group
|
68
99
|
end
|
69
100
|
end
|
70
101
|
end
|
71
102
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
103
|
+
#
|
104
|
+
# Create a sharing group
|
105
|
+
#
|
106
|
+
# @param [Hash] **attributes attributes
|
107
|
+
#
|
108
|
+
# @return [MISP::SharingGroup]
|
109
|
+
#
|
76
110
|
def create(**attributes)
|
77
|
-
_post("/sharing_groups/add", wrap(attributes)) { |sharing_group| SharingGroup.new
|
111
|
+
_post("/sharing_groups/add", wrap(attributes)) { |sharing_group| SharingGroup.new sharing_group }
|
78
112
|
end
|
79
113
|
|
80
|
-
|
81
|
-
|
114
|
+
class << self
|
115
|
+
def list
|
116
|
+
new.list
|
117
|
+
end
|
118
|
+
|
119
|
+
def create(**attributes)
|
120
|
+
new.create attributes
|
121
|
+
end
|
82
122
|
end
|
83
123
|
end
|
84
124
|
end
|
@@ -1,12 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module MISP
|
4
|
-
class SharingGroupOrg <
|
4
|
+
class SharingGroupOrg < Base
|
5
|
+
# @return [String]
|
5
6
|
attr_reader :id
|
7
|
+
# @return [String]
|
6
8
|
attr_reader :sharing_group_id
|
9
|
+
# @return [String]
|
7
10
|
attr_reader :org_id
|
11
|
+
# @return [String]
|
8
12
|
attr_reader :extend
|
9
13
|
|
14
|
+
# @return [MISP::Organization, nil]
|
10
15
|
attr_reader :organization
|
11
16
|
|
12
17
|
def initialize(**attributes)
|
@@ -20,6 +25,11 @@ module MISP
|
|
20
25
|
@organization = build_attribute(item: attributes.dig(:Organization), klass: Org)
|
21
26
|
end
|
22
27
|
|
28
|
+
#
|
29
|
+
# Returns a hash representation of the attribute data.
|
30
|
+
#
|
31
|
+
# @return [Hash]
|
32
|
+
#
|
23
33
|
def to_h
|
24
34
|
{
|
25
35
|
erver: erver,
|
@@ -1,12 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module MISP
|
4
|
-
class SharingGroupServer <
|
4
|
+
class SharingGroupServer < Base
|
5
|
+
# @return [String]
|
5
6
|
attr_reader :id
|
7
|
+
# @return [String]
|
6
8
|
attr_reader :sharing_group_id
|
9
|
+
# @return [String]
|
7
10
|
attr_reader :server_id
|
11
|
+
# @return [Boolean]
|
8
12
|
attr_reader :all_orgs
|
9
13
|
|
14
|
+
# @return [Array<MISP::Server>]
|
10
15
|
attr_reader :servers
|
11
16
|
|
12
17
|
def initialize(**attributes)
|
@@ -20,6 +25,11 @@ module MISP
|
|
20
25
|
@servers = build_plural_attribute(items: attributes.dig(:Server), klass: Server)
|
21
26
|
end
|
22
27
|
|
28
|
+
#
|
29
|
+
# Returns a hash representation of the attribute data.
|
30
|
+
#
|
31
|
+
# @return [Hash]
|
32
|
+
#
|
23
33
|
def to_h
|
24
34
|
{
|
25
35
|
id: id,
|
data/lib/misp/tag.rb
CHANGED
@@ -2,10 +2,15 @@
|
|
2
2
|
|
3
3
|
module MISP
|
4
4
|
class Tag < Base
|
5
|
+
# @return [String]
|
5
6
|
attr_accessor :id
|
7
|
+
# @return [String]
|
6
8
|
attr_accessor :name
|
9
|
+
# @return [String]
|
7
10
|
attr_accessor :colour
|
11
|
+
# @return [Boolean]
|
8
12
|
attr_accessor :exportable
|
13
|
+
# @return [Boolean]
|
9
14
|
attr_accessor :hide_tag
|
10
15
|
|
11
16
|
def initialize(**attributes)
|
@@ -18,6 +23,11 @@ module MISP
|
|
18
23
|
@hide_tag = attributes.dig(:hide_tag)
|
19
24
|
end
|
20
25
|
|
26
|
+
#
|
27
|
+
# Returns a hash representation of the attribute data.
|
28
|
+
#
|
29
|
+
# @return [Hash]
|
30
|
+
#
|
21
31
|
def to_h
|
22
32
|
{
|
23
33
|
id: id,
|
@@ -28,42 +38,75 @@ module MISP
|
|
28
38
|
}.compact
|
29
39
|
end
|
30
40
|
|
31
|
-
|
32
|
-
|
41
|
+
#
|
42
|
+
# Get a tag
|
43
|
+
#
|
44
|
+
# @return [MISP::Tag]
|
45
|
+
#
|
46
|
+
def get
|
47
|
+
_get("/tags/view/#{id}") { |json| Tag.new json }
|
33
48
|
end
|
34
49
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
new.create attributes
|
50
|
+
#
|
51
|
+
# Create a tag
|
52
|
+
#
|
53
|
+
# @param [Hash] **attributes attributes
|
54
|
+
#
|
55
|
+
# @return [MISP::Tag]
|
56
|
+
#
|
57
|
+
def create(**attributes)
|
58
|
+
_post("/tags/add", wrap(attributes)) { |json| Tag.new json }
|
45
59
|
end
|
46
60
|
|
61
|
+
#
|
62
|
+
# Delete a tag
|
63
|
+
#
|
64
|
+
# @return [Hash]
|
65
|
+
#
|
47
66
|
def delete
|
48
67
|
_post("/tags/delete/#{id}") { |json| json }
|
49
68
|
end
|
50
69
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
70
|
+
#
|
71
|
+
# Update a tag
|
72
|
+
#
|
73
|
+
# @param [Hash] **attributes attributes
|
74
|
+
#
|
75
|
+
# @return [MISP::Tag]
|
76
|
+
#
|
55
77
|
def update(**attributes)
|
56
78
|
payload = to_h.merge(attributes)
|
57
|
-
_post("/tags/edit/#{id}", wrap(payload)) { |json| Tag.new
|
58
|
-
end
|
59
|
-
|
60
|
-
def self.update(id, **attributes)
|
61
|
-
Tag.new(id: id).update attributes
|
79
|
+
_post("/tags/edit/#{id}", wrap(payload)) { |json| Tag.new json }
|
62
80
|
end
|
63
81
|
|
82
|
+
#
|
83
|
+
# Search for tags
|
84
|
+
#
|
85
|
+
# @param [Hash] **params parameters
|
86
|
+
#
|
87
|
+
# @return [MISP::Tag]
|
88
|
+
#
|
64
89
|
def search(**params)
|
65
90
|
_post("/tags/search", params) do |tags|
|
66
|
-
tags.map { |tag| Tag.new
|
91
|
+
tags.map { |tag| Tag.new tag }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
class << self
|
96
|
+
def get(id)
|
97
|
+
new(id: id).get
|
98
|
+
end
|
99
|
+
|
100
|
+
def create(**attributes)
|
101
|
+
new.create attributes
|
102
|
+
end
|
103
|
+
|
104
|
+
def delete(id)
|
105
|
+
Tag.new(id: id).delete
|
106
|
+
end
|
107
|
+
|
108
|
+
def update(id, **attributes)
|
109
|
+
Tag.new(id: id).update attributes
|
67
110
|
end
|
68
111
|
end
|
69
112
|
end
|
data/lib/misp/version.rb
CHANGED
data/misp.gemspec
CHANGED
@@ -26,8 +26,8 @@ Gem::Specification.new do |spec|
|
|
26
26
|
|
27
27
|
spec.add_development_dependency "bundler", "~> 2.0"
|
28
28
|
spec.add_development_dependency "coveralls", "~> 0.8"
|
29
|
-
spec.add_development_dependency "rake", "~>
|
29
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
30
30
|
spec.add_development_dependency "rspec", "~> 3.8"
|
31
31
|
spec.add_development_dependency "vcr", "~> 5.0"
|
32
|
-
spec.add_development_dependency "webmock", "~> 3.
|
32
|
+
spec.add_development_dependency "webmock", "~> 3.7"
|
33
33
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: misp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Manabu Niseki
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '13.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '13.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '3.
|
89
|
+
version: '3.7'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '3.
|
96
|
+
version: '3.7'
|
97
97
|
description: A dead simple MISP API wrapper for Ruby
|
98
98
|
email:
|
99
99
|
- manabu.niseki@gmail.com
|