misp 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.
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MISP
4
+ class Configuration
5
+ # @return [URI]
6
+ attr_accessor :api_endpoint
7
+
8
+ # @return [String]
9
+ attr_accessor :api_key
10
+
11
+ def initialize
12
+ @api_endpoint = ENV["MISP_API_ENDPOINT"]
13
+ @api_key = ENV["MISP_API_KEY"]
14
+ end
15
+ end
16
+
17
+ def self.configuration
18
+ @configuration ||= Configuration.new
19
+ end
20
+
21
+ def self.configuration=(config)
22
+ @configuration = config
23
+ end
24
+
25
+ def self.configure
26
+ yield configuration
27
+ end
28
+ end
@@ -0,0 +1,180 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MISP
4
+ class Event < Base
5
+ attr_reader :id
6
+ attr_accessor :orgc_id
7
+ attr_accessor :org_id
8
+ attr_accessor :date
9
+ attr_accessor :threat_level_id
10
+ attr_accessor :info
11
+ attr_accessor :published
12
+ attr_reader :uuid
13
+ attr_accessor :attribute_count
14
+ attr_accessor :analysis
15
+ attr_accessor :timestamp
16
+ attr_accessor :distribution
17
+ attr_accessor :proposal_email_lock
18
+ attr_accessor :locked
19
+ attr_accessor :publish_timestamp
20
+ attr_accessor :sharing_group_id
21
+ attr_accessor :disable_correlation
22
+ attr_accessor :event_creator_email
23
+
24
+ attr_accessor :org
25
+ attr_accessor :orgc
26
+
27
+ attr_accessor :sharing_groups
28
+ attr_accessor :attributes
29
+ attr_accessor :shadow_attributes
30
+ attr_accessor :related_events
31
+ attr_accessor :galaxies
32
+ attr_accessor :tags
33
+
34
+ def initialize(**attrs)
35
+ attrs = normalize_attributes(attrs)
36
+
37
+ @id = attrs.dig(:id)
38
+ @orgc_id = attrs.dig(:orgc_id)
39
+ @org_id = attrs.dig(:org_id)
40
+ @date = attrs.dig(:date)
41
+ @threat_level_id = attrs.dig(:threat_level_id)
42
+ @info = attrs.dig(:info)
43
+ @published = attrs.dig(:published) || false
44
+ @uuid = attrs.dig(:uuid)
45
+ @attribute_count = attrs.dig(:attribute_count)
46
+ @analysis = attrs.dig(:analysis)
47
+ @timestamp = attrs.dig(:timestamp)
48
+ @distribution = attrs.dig(:distribution)
49
+ @proposal_email_lock = attrs.dig(:proposal_email_lock)
50
+ @locked = attrs.dig(:locked) || false
51
+ @publish_timestamp = attrs.dig(:publish_timestamp)
52
+ @sharing_group_id = attrs.dig(:sharing_group_id)
53
+ @disable_correlation = attrs.dig(:disable_correlation)
54
+ @event_creator_email = attrs.dig(:event_creator_email)
55
+
56
+ @org = build_attribute(item: attrs.dig(:Org), klass: Org)
57
+ @orgc = build_attribute(item: attrs.dig(:Orgc), klass: Orgc)
58
+
59
+ @sharing_groups = build_plural_attribute(items: attrs.dig(:SharingGroup), klass: SharingGroup)
60
+ @attributes = build_plural_attribute(items: attrs.dig(:Attribute), klass: Attribute)
61
+ @shadow_attributes = build_plural_attribute(items: attrs.dig(:ShadowAttribute), klass: Attribute )
62
+ @related_events = build_plural_attribute(items: attrs.dig(:RelatedEvent), klass: Attribute)
63
+ @galaxies = build_plural_attribute(items: attrs.dig(:Galaxy), klass: Galaxy)
64
+ @tags = build_plural_attribute(items: attrs.dig(:Tag), klass: Tag)
65
+ end
66
+
67
+ def to_h
68
+ compact(
69
+ id: id,
70
+ orgc_id: orgc_id,
71
+ org_id: org_id,
72
+ date: date,
73
+ threat_level_id: threat_level_id,
74
+ info: info,
75
+ published: published,
76
+ uuid: uuid,
77
+ attribute_count: attribute_count,
78
+ analysis: analysis,
79
+ timestamp: timestamp,
80
+ distribution: distribution,
81
+ proposal_email_lock: proposal_email_lock,
82
+ locked: locked,
83
+ publish_timestamp: publish_timestamp,
84
+ sharing_group_id: sharing_group_id,
85
+ disable_correlation: disable_correlation,
86
+ event_creator_email: event_creator_email,
87
+ Org: org.to_h,
88
+ Orgc: orgc.to_h,
89
+ SharingGroup: sharing_groups.map(&:to_h),
90
+ Attribute: attributes.map(&:to_h),
91
+ ShadowAttribute: shadow_attributes.map(&:to_h),
92
+ RelatedEvent: related_events.map(&:to_h),
93
+ Galaxy: galaxies.map(&:to_h),
94
+ Tag: tags.map(&:to_h)
95
+ )
96
+ end
97
+
98
+ def get(id)
99
+ _get("/events/#{id}") { |event| Event.new symbolize_keys(event) }
100
+ end
101
+
102
+ def self.get(id)
103
+ new.get id
104
+ end
105
+
106
+ def create(**attrs)
107
+ payload = to_h.merge(attrs)
108
+ _post("/events/add", wrap(payload)) { |event| Event.new symbolize_keys(event) }
109
+ end
110
+
111
+ def self.create(**attrs)
112
+ new.create attrs
113
+ end
114
+
115
+ def delete
116
+ _delete("/events/#{id}") { |json| json }
117
+ end
118
+
119
+ def self.delete(id)
120
+ new(id: id).delete
121
+ end
122
+
123
+ def list
124
+ _get("/events/index") do |events|
125
+ events.map do |event|
126
+ Event.new symbolize_keys(event)
127
+ end
128
+ end
129
+ end
130
+
131
+ def self.list
132
+ new.list
133
+ end
134
+
135
+ def update(**attrs)
136
+ payload = to_h.merge(attrs)
137
+ payload[:timestamp] = nil
138
+ _post("/events/#{id}", wrap(payload)) { |event| Event.new symbolize_keys(event) }
139
+ end
140
+
141
+ def self.update(id, **attrs)
142
+ new(id: id).update attrs
143
+ end
144
+
145
+ def search(**params)
146
+ base = {
147
+ returnFormat: "json",
148
+ limit: "100",
149
+ page: "0"
150
+ }
151
+
152
+ _post("/events/restSearch", base.merge(params)) do |json|
153
+ events = json.dig("response") || []
154
+ events.map { |event| Event.new symbolize_keys(event) }
155
+ end
156
+ end
157
+
158
+ def self.search(**params)
159
+ new.search params
160
+ end
161
+
162
+ def add_attribute(attribute)
163
+ attribute = Attribute.new(symbolize_keys(attribute)) unless attribute.is_a?(Attribute)
164
+ attributes << attribute
165
+ self
166
+ end
167
+
168
+ def add_tag(tag)
169
+ tag = Tag.new(symbolize_keys(tag)) unless tag.is_a?(MISP::Tag)
170
+ tags << tag
171
+ self
172
+ end
173
+
174
+ private
175
+
176
+ def compact(hash)
177
+ hash.compact.reject { |_k, v| (v.is_a?(Hash) || v.is_a?(Array)) && v.empty? }
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MISP
4
+ class Feed < Base
5
+ attr_reader :id
6
+ attr_reader :name
7
+ attr_reader :provider
8
+ attr_reader :url
9
+ attr_reader :rules
10
+ attr_reader :enabled
11
+ attr_reader :distribution
12
+ attr_reader :sharing_group_id
13
+ attr_reader :tag_id
14
+ attr_reader :default
15
+ attr_reader :source_format
16
+ attr_reader :fixed_event
17
+ attr_reader :delta_merge
18
+ attr_reader :event_id
19
+ attr_reader :publish
20
+ attr_reader :override_ids
21
+ attr_reader :settings
22
+ attr_reader :input_source
23
+ attr_reader :delete_local_file
24
+ attr_reader :lookup_visible
25
+ attr_reader :headers
26
+ attr_reader :caching_enabled
27
+
28
+ def initialize(**attributes)
29
+ attributes = normalize_attributes(attributes)
30
+
31
+ @id = attributes.dig(:id)
32
+ @name = attributes.dig(:name) || "feed name"
33
+ @provider = attributes.dig(:provider) || "my provider"
34
+ @url = attributes.dig(:url) || "http://example.com"
35
+ @rules = attributes.dig(:rules) || ""
36
+ @enabled = attributes.dig(:enabled)
37
+ @distribution = attributes.dig(:distribution)
38
+ @sharing_group_id = attributes.dig(:sharing_group_id)
39
+ @tag_id = attributes.dig(:tag_id) || "0"
40
+ @default = attributes.dig(:default) || true
41
+ @source_format = attributes.dig(:source_format) || "misp"
42
+ @fixed_event = attributes.dig(:fixed_event) || true
43
+ @delta_merge = attributes.dig(:delta_merge) || false
44
+ @event_id = attributes.dig(:event_id) || "0"
45
+ @publish = attributes.dig(:publish) || true
46
+ @override_ids = attributes.dig(:override_ids) || false
47
+ @settings = attributes.dig(:settings) || ""
48
+ @input_source = attributes.dig(:input_source) || "network"
49
+ @delete_local_file = attributes.dig(:delete_local_file) || false
50
+ @lookup_visible = attributes.dig(:lookup_visible) || true
51
+ @headers = attributes.dig(:headers) || ""
52
+ @caching_enabled = attributes.dig(:caching_enabled) || true
53
+ end
54
+
55
+ def to_h
56
+ {
57
+ id: id,
58
+ name: name,
59
+ provider: provider,
60
+ url: url,
61
+ rules: rules,
62
+ enabled: enabled,
63
+ distribution: distribution,
64
+ sharing_group_id: sharing_group_id,
65
+ tag_id: tag_id,
66
+ default: default,
67
+ source_format: source_format,
68
+ fixed_event: fixed_event,
69
+ delta_merge: delta_merge,
70
+ event_id: event_id,
71
+ publish: publish,
72
+ override_ids: override_ids,
73
+ settings: settings,
74
+ input_source: input_source,
75
+ delete_local_file: delete_local_file,
76
+ lookup_visible: lookup_visible,
77
+ headers: headers,
78
+ caching_enabled: caching_enabled,
79
+ }.compact
80
+ end
81
+
82
+ def list
83
+ _get("/feeds/index") do |feeds|
84
+ feeds.map do |feed|
85
+ Feed.new symbolize_keys(feed)
86
+ end
87
+ end
88
+ end
89
+
90
+ def self.list
91
+ new.list
92
+ end
93
+
94
+ def get
95
+ _get("/feeds/view/#{id}") { |feed| Feed.new symbolize_keys(feed) }
96
+ end
97
+
98
+ def self.get(id)
99
+ new(id: id).get
100
+ end
101
+
102
+ def create(**attributes)
103
+ _post("/feeds/add", wrap(attributes)) { |feed| Feed.new symbolize_keys(feed) }
104
+ end
105
+
106
+ def self.create(attributes)
107
+ new.create attributes
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MISP
4
+ class Galaxy < Base
5
+ attr_reader :id
6
+ attr_reader :uuid
7
+ attr_reader :name
8
+ attr_reader :type
9
+ attr_reader :description
10
+ attr_reader :version
11
+
12
+ attr_reader :galaxy_clusters
13
+
14
+ def initialize(**attributes)
15
+ attributes = normalize_attributes(attributes)
16
+
17
+ @id = attributes.dig(:id)
18
+ @uuid = attributes.dig(:uuid)
19
+ @name = attributes.dig(:name)
20
+ @type = attributes.dig(:type)
21
+ @description = attributes.dig(:description)
22
+ @version = attributes.dig(:version)
23
+
24
+ @galaxy_clusters = build_plural_attribute(items: attributes.dig(:GalaxyCluster), klass: GalaxyCluster)
25
+ end
26
+
27
+ def to_h
28
+ {
29
+ id: id,
30
+ uuid: uuid,
31
+ name: name,
32
+ type: type,
33
+ description: description,
34
+ version: version,
35
+ GalaxyCluster: galaxy_clusters.map(&:to_h)
36
+ }.compact
37
+ end
38
+
39
+ def list
40
+ _get("/galaxies/") do |galaxies|
41
+ galaxies.map do |galaxy|
42
+ Galaxy.new symbolize_keys(galaxy)
43
+ end
44
+ end
45
+ end
46
+
47
+ def self.list
48
+ new.list
49
+ end
50
+
51
+ def get
52
+ _get("/galaxies/view/#{id}") { |galaxy| Galaxy.new symbolize_keys(galaxy) }
53
+ end
54
+
55
+ def self.get(id)
56
+ new(id: id).get
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MISP
4
+ class GalaxyCluster < Base
5
+ attr_reader :id
6
+ attr_reader :uuid
7
+ attr_reader :type
8
+ attr_reader :value
9
+ attr_reader :tag_name
10
+ attr_reader :description
11
+ attr_reader :galaxy_id
12
+ attr_reader :source
13
+ attr_reader :authors
14
+ attr_reader :tag_id
15
+ attr_reader :meta
16
+
17
+ def initialize(**attributes)
18
+ attributes = normalize_attributes(attributes)
19
+
20
+ @id = attributes.dig(:id)
21
+ @uuid = attributes.dig(:uuid)
22
+ @type = attributes.dig(:type)
23
+ @value = attributes.dig(:value)
24
+ @tag_name = attributes.dig(:tag_name)
25
+ @description = attributes.dig(:description)
26
+ @galaxy_id = attributes.dig(:galaxy_id)
27
+ @source = attributes.dig(:source)
28
+ @authors = attributes.dig(:authors)
29
+ @tag_id = attributes.dig(:tag_id)
30
+ @meta = attributes.dig(:meta)
31
+ end
32
+
33
+ def to_h
34
+ {
35
+ id: id,
36
+ uuid: uuid,
37
+ type: type,
38
+ value: value,
39
+ tag_name: tag_name,
40
+ description: description,
41
+ galaxy_id: galaxy_id,
42
+ source: source,
43
+ authors: authors,
44
+ tag_id: tag_id,
45
+ meta: meta,
46
+ }.compact
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MISP
4
+ class Org < Base
5
+ attr_reader :id
6
+ attr_reader :name
7
+ attr_reader :uuid
8
+
9
+ def initialize(**attributes)
10
+ attributes = normalize_attributes(attributes)
11
+
12
+ @id = attributes.dig(:id)
13
+ @name = attributes.dig(:name)
14
+ @uuid = attributes.dig(:uuid)
15
+ end
16
+
17
+ def to_h
18
+ {
19
+ id: id,
20
+ name: name,
21
+ uuid: uuid,
22
+ }.compact
23
+ end
24
+ end
25
+ end