csp-util 1.1.0 → 1.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 973e6b8fb98154dde0ede0195239e6974d647ddf9787853cf2ac588b9af4e726
4
- data.tar.gz: 630209282c527e0f137bdff3196c1a5c8652853596ef941456f38d0ae845c09a
3
+ metadata.gz: 5685705b8d2a895ab24cd1924ffb2bf3e29b4e076c08341bd40fe59bd2882910
4
+ data.tar.gz: 351d968a887cce2d67a987441d5380a50f6d9ef0cfe4c4192df059bb44289b97
5
5
  SHA512:
6
- metadata.gz: 33be4aa362dd9670036da991d8db6dd15c82d1110239294461049520c04ecff87a1328b674d79329ab86e1173d1481a7056420f6108218907db76fa72ffcdb5d
7
- data.tar.gz: 81b1d97f0835daa75da66182f48e81646551e1959810d0f79c2ddc938fb5139b9a38d224588330f4308c8edf4343762c4df583ca5db4275801036a5a7bd55a0d
6
+ metadata.gz: ae550162fe492a7a8b72586e26d4dabfada9accddd944b1df3ef2c71b8d11a7cc77380283244f5622003cab35979c1109f6ef4155418beba209c0caefcbc98aa
7
+ data.tar.gz: 3bc808773778786e4d8836beb47c6a071e68bf0569477d7d5909dc79c5f7bade9aeb2baa6b57be63f66480ae986c800fc3693b4d9c52d3942b6213ed1f0e90ef
data/lib/csp_util.rb CHANGED
@@ -2,5 +2,4 @@
2
2
 
3
3
  require_relative 'csp_util/errors'
4
4
  require_relative 'csp_util/directive'
5
- require_relative 'csp_util/join_directives'
6
- require_relative 'csp_util/parse_directives'
5
+ require_relative 'csp_util/directives'
@@ -17,31 +17,56 @@ module CSPUtil
17
17
 
18
18
  attr_reader :name, :value
19
19
 
20
- def initialize(token)
21
- dir_name, dir_value = token.split(' ', 2)
22
- validate_name!(dir_name)
23
-
24
- @name = dir_name
25
- @value =
26
- if dir_value
27
- dir_value.split(' ').map(&:strip)
28
- else
29
- []
30
- end
20
+ def initialize(name=nil, value=nil)
21
+ self.name = name if name
22
+ self.value = value if value
23
+ return self
31
24
  end
32
25
 
33
- def same_name?(another_directive)
34
- return false unless name
26
+ def parse!(token)
27
+ name, value = token.split(' ', 2)
28
+ self.name = name
29
+ self.value = value
30
+ return self
31
+ end
32
+
33
+ def name=(name)
34
+ validate_name!(name)
35
+ @name = name
36
+ end
37
+
38
+ def value=(value)
39
+ if value.is_a?(Array)
40
+ @value = value.map(&:strip)
41
+ elsif value
42
+ @value = value.split(' ').map(&:strip)
43
+ else
44
+ @value = []
45
+ end
46
+ end
35
47
 
36
- name.casecmp(another_directive.name).zero?
48
+ def add_value(value)
49
+ if value.is_a?(Array)
50
+ @value = (@value << value).flatten.uniq
51
+ else
52
+ @value = (@value << value.strip).uniq
53
+ end
54
+ end
55
+
56
+ def delete_value(value)
57
+ @value.delete(value)
58
+ end
59
+
60
+ def same_name?(another_directive)
61
+ @name.casecmp(another_directive.name).zero?
37
62
  end
38
63
 
39
64
  def to_h
40
- { name: name, value: value }
65
+ { name: @name, value: @value }
41
66
  end
42
67
 
43
68
  def to_s
44
- [name, value.join(' ')].reject(&:empty?).join(' ')
69
+ [@name, @value.join(' ')].reject(&:empty?).join(' ')
45
70
  end
46
71
 
47
72
  private
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CSPUtil
4
+ class << self
5
+ def join_directives(directives)
6
+ directives.map(&:to_s).join('; ')
7
+ end
8
+
9
+ def add_to_directives(directives, directive)
10
+ # add value to existing directive
11
+ directives.each do |d|
12
+ if d.same_name?(directive)
13
+ d.add_value(directive.value)
14
+ return directives
15
+ end
16
+ end
17
+
18
+ # or add directive
19
+ return directives << directive
20
+ end
21
+
22
+ def delete_from_directives(directives, directive)
23
+ directives.each do |d|
24
+ if d.same_name?(directive)
25
+ d.value = d.value - directive.value
26
+ break
27
+ end
28
+ end
29
+
30
+ directives.reject! do |d|
31
+ d.value.size == 0
32
+ end
33
+
34
+ return directives
35
+ end
36
+
37
+ def parse_directives(serialized_policy)
38
+ tokens = serialized_policy.split(';')
39
+ tokens.each_with_object([]) do |token, directives|
40
+ token.strip!
41
+ next if token.empty?
42
+
43
+ directive = Directive.new
44
+ directive.parse!(token)
45
+ validate_uniqueness!(directive, directives)
46
+
47
+ directives << directive
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def validate_uniqueness!(directive, directives)
54
+ return if directives.none? { |d| d.same_name?(directive) }
55
+
56
+ raise(DuplicateDirective, directive.name)
57
+ end
58
+ end
59
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CSPUtil
4
- VERSION = '1.1.0'
4
+ VERSION = '1.2.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: csp-util
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Templarbit
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-10 00:00:00.000000000 Z
11
+ date: 2018-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -83,9 +83,8 @@ files:
83
83
  - csp-util.gemspec
84
84
  - lib/csp_util.rb
85
85
  - lib/csp_util/directive.rb
86
+ - lib/csp_util/directives.rb
86
87
  - lib/csp_util/errors.rb
87
- - lib/csp_util/join_directives.rb
88
- - lib/csp_util/parse_directives.rb
89
88
  - lib/csp_util/version.rb
90
89
  homepage: https://github.com/templarbit/ruby-csp-util
91
90
  licenses:
@@ -107,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
106
  version: '0'
108
107
  requirements: []
109
108
  rubyforge_project:
110
- rubygems_version: 2.7.4
109
+ rubygems_version: 2.7.6
111
110
  signing_key:
112
111
  specification_version: 4
113
112
  summary: Content-Security-Policy utils
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module CSPUtil
4
- class << self
5
- def join_directives(directives)
6
- directives.map(&:to_s).join('; ')
7
- end
8
- end
9
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module CSPUtil
4
- class << self
5
- def parse_directives(serialized_policy)
6
- tokens = serialized_policy.split(';')
7
-
8
- tokens.each_with_object([]) do |token, directives|
9
- token.strip!
10
- next if token.empty?
11
-
12
- directive = Directive.new(token)
13
- validate_uniqueness!(directive, directives)
14
-
15
- directives << directive
16
- end
17
- end
18
-
19
- private
20
-
21
- def validate_uniqueness!(directive, directives)
22
- return if directives.none? { |d| d.same_name?(directive) }
23
-
24
- raise(DuplicateDirective, directive.name)
25
- end
26
- end
27
- end