firebase_id_token 2.5.2 → 4.0.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.
@@ -8,7 +8,8 @@ module FirebaseIdToken
8
8
  let(:mock_certificates) do
9
9
  allow(Certificates)
10
10
  .to(receive(:find))
11
- .with(an_instance_of(String), raise_error: raise_certificates_error)
11
+ .with(an_instance_of(String), raise_error: raise_certificates_error,
12
+ source: :id_token)
12
13
  .and_return(OpenSSL::X509::Certificate.new(jwt['certificate']))
13
14
  end
14
15
 
@@ -31,6 +32,19 @@ module FirebaseIdToken
31
32
  it 'returns nil with a invalid key format' do
32
33
  expect(described_class.verify('aaa')).to be(nil)
33
34
  end
35
+
36
+ it 'returns nil when the token has no sub claim' do
37
+ payload = {
38
+ 'iss' => 'https://securetoken.google.com/firebase-id-token',
39
+ 'aud' => 'firebase-id-token',
40
+ 'exp' => Time.now.to_i + 3600,
41
+ 'iat' => Time.now.to_i - 60
42
+ }
43
+ token = JWT.encode(payload,
44
+ OpenSSL::PKey::RSA.new(jwt['private_key']), 'RS256', kid: 'test')
45
+
46
+ expect(described_class.verify(token)).to be(nil)
47
+ end
34
48
  end
35
49
 
36
50
  describe '#verify!' do
@@ -13,6 +13,10 @@ module FirebaseIdToken
13
13
  FirebaseIdToken.test!
14
14
  end
15
15
 
16
+ after :each do
17
+ FirebaseIdToken.reset
18
+ end
19
+
16
20
  describe '#verify' do
17
21
 
18
22
  it 'test mode is valid' do
@@ -5,7 +5,7 @@ RSpec.describe FirebaseIdToken do
5
5
 
6
6
  let (:mock_certificates) {
7
7
  allow(FirebaseIdToken::Certificates).to receive(:find).
8
- with(an_instance_of(String)) {
8
+ with(an_instance_of(String), any_args) {
9
9
  OpenSSL::X509::Certificate.new(jwt['certificate']) }
10
10
  }
11
11
 
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,7 @@
1
1
  require 'simplecov'
2
+ require 'simplecov_json_formatter'
3
+
4
+ SimpleCov.formatter = SimpleCov::Formatter::JSONFormatter
2
5
  SimpleCov.start
3
6
 
4
7
  require 'bundler/setup'
@@ -8,6 +11,7 @@ require 'httparty'
8
11
  require 'jwt'
9
12
  require 'firebase_id_token'
10
13
  require 'pry'
14
+ require './spec/support/certificates_shared_examples'
11
15
 
12
16
  RSpec.configure do |config|
13
17
  # Enable flags like --only-failures and --next-failure
@@ -0,0 +1,196 @@
1
+ require 'spec_helper'
2
+
3
+ # The ActiveSupport store lazily downloads certificates whenever it is
4
+ # instantiated over an empty cache, while the legacy Redis store only
5
+ # downloads them upon an explicit request. Examples whose outcome depends on
6
+ # the empty-cache behavior branch on the `lazy` option.
7
+ shared_examples_for 'a certificate store' do |opts = {}|
8
+ lazy = opts.fetch(:lazy, false)
9
+
10
+ before :each do
11
+ mock_request
12
+ end
13
+
14
+ describe '#request' do
15
+ it 'requests certificates when the cache is empty' do
16
+ expect(HTTParty).to receive(:get).
17
+ with(FirebaseIdToken::Certificates::URL)
18
+ described_class.request
19
+ end
20
+
21
+ it 'does not requests certificates when the cache is written' do
22
+ expect(HTTParty).to receive(:get).
23
+ with(FirebaseIdToken::Certificates::URL).once
24
+ 2.times { described_class.request }
25
+ end
26
+ end
27
+
28
+ describe '#request!' do
29
+ if lazy
30
+ it 'always requests certificates' do
31
+ # The store lazily loads the empty cache once before the first
32
+ # explicit request, hence the extra call.
33
+ expect(HTTParty).to receive(:get).
34
+ with(FirebaseIdToken::Certificates::URL).exactly(3).times
35
+ 2.times { described_class.request! }
36
+ end
37
+ else
38
+ it 'always requests certificates' do
39
+ expect(HTTParty).to receive(:get).
40
+ with(FirebaseIdToken::Certificates::URL).twice
41
+ 2.times { described_class.request! }
42
+ end
43
+ end
44
+
45
+ it 'sets the certificate expiration time as the cache TTL' do
46
+ described_class.request!
47
+ expect(described_class.ttl).to be > 3600
48
+ end
49
+
50
+ it 'raises a error when certificates expires in less than 1 hour' do
51
+ allow(response).to receive(:headers) {{'cache-control' => low_cache}}
52
+ expect{ described_class.request! }.
53
+ to raise_error(FirebaseIdToken::Exceptions::CertificatesTtlError)
54
+ end
55
+
56
+ it 'raises a error when HTTP response code is other than 200' do
57
+ allow(response).to receive(:code) { 401 }
58
+ expect{ described_class.request! }.
59
+ to raise_error(FirebaseIdToken::Exceptions::CertificatesRequestError)
60
+ end
61
+ end
62
+
63
+ describe '#request_anyway' do
64
+ if lazy
65
+ it 'also requests certificates' do
66
+ expect(HTTParty).to receive(:get).
67
+ with(FirebaseIdToken::Certificates::URL).twice
68
+ described_class.request_anyway
69
+ end
70
+ else
71
+ it 'also requests certificates' do
72
+ expect(HTTParty).to receive(:get).
73
+ with(FirebaseIdToken::Certificates::URL)
74
+ described_class.request_anyway
75
+ end
76
+ end
77
+ end
78
+
79
+ describe '.present?' do
80
+ if lazy
81
+ it 'returns true when the cache is empty, lazily fetching' do
82
+ expect(described_class.present?).to be(true)
83
+ end
84
+ else
85
+ it 'returns false when the cache is empty' do
86
+ expect(described_class.present?).to be(false)
87
+ end
88
+ end
89
+
90
+ it 'returns true when the cache is written' do
91
+ described_class.request
92
+ expect(described_class.present?).to be(true)
93
+ end
94
+ end
95
+
96
+ describe '.all' do
97
+ context 'before requesting certificates' do
98
+ if lazy
99
+ it 'lazily fetches and returns the certificates' do
100
+ expect(described_class.all.first.values[0]).
101
+ to be_a(OpenSSL::X509::Certificate)
102
+ end
103
+ else
104
+ it 'returns a empty Array' do
105
+ expect(described_class.all).to eq([])
106
+ end
107
+ end
108
+ end
109
+
110
+ context 'after requesting certificates' do
111
+ it 'returns a array of hashes: String keys' do
112
+ described_class.request
113
+ expect(described_class.all.first.keys[0]).to be_a(String)
114
+ end
115
+
116
+ it 'returns a array of hashes: OpenSSL::X509::Certificate values' do
117
+ described_class.request
118
+ expect(described_class.all.first.values[0]).
119
+ to be_a(OpenSSL::X509::Certificate)
120
+ end
121
+ end
122
+ end
123
+
124
+ describe '.find' do
125
+ context 'without certificates in the cache' do
126
+ if lazy
127
+ it 'lazily fetches certificates and finds the kid' do
128
+ expect(described_class.find(kid)).to be_a(OpenSSL::X509::Certificate)
129
+ end
130
+ else
131
+ it 'raises a exception' do
132
+ expect{ described_class.find(kid)}.
133
+ to raise_error(FirebaseIdToken::Exceptions::NoCertificatesError)
134
+ end
135
+ end
136
+ end
137
+
138
+ context 'with certificates in the cache' do
139
+ it 'returns a OpenSSL::X509::Certificate when it finds the kid' do
140
+ described_class.request
141
+ expect(described_class.find(kid)).to be_a(OpenSSL::X509::Certificate)
142
+ end
143
+
144
+ it 'returns nil when it can not find the kid' do
145
+ described_class.request
146
+ expect(described_class.find('')).to be(nil)
147
+ end
148
+ end
149
+ end
150
+
151
+ describe '.find!' do
152
+ context 'without certificates in the cache' do
153
+ if lazy
154
+ it 'lazily fetches certificates and finds the kid' do
155
+ expect(described_class.find!(kid)).to be_a(OpenSSL::X509::Certificate)
156
+ end
157
+ else
158
+ it 'raises a exception' do
159
+ expect{ described_class.find!(kid)}.
160
+ to raise_error(FirebaseIdToken::Exceptions::NoCertificatesError)
161
+ end
162
+ end
163
+ end
164
+
165
+ context 'with certificates in the cache' do
166
+ it 'returns a OpenSSL::X509::Certificate when it finds the kid' do
167
+ described_class.request
168
+ expect(described_class.find!(kid)).to be_a(OpenSSL::X509::Certificate)
169
+ end
170
+
171
+ it 'raises a CertificateNotFound error when it can not find the kid' do
172
+ described_class.request
173
+ expect { described_class.find!('') }
174
+ .to raise_error(FirebaseIdToken::Exceptions::CertificateNotFound, /Unable to find/)
175
+ end
176
+ end
177
+
178
+ end
179
+
180
+ describe '.ttl' do
181
+ it 'returns a positive number when has certificates in the cache' do
182
+ described_class.request
183
+ expect(described_class.ttl).to be > 0
184
+ end
185
+
186
+ if lazy
187
+ it 'returns a positive number when the cache is empty, lazily fetching' do
188
+ expect(described_class.ttl).to be > 0
189
+ end
190
+ else
191
+ it 'returns zero when has no certificates in the cache' do
192
+ expect(described_class.ttl).to eq(0)
193
+ end
194
+ end
195
+ end
196
+ end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: firebase_id_token
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.2
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fernando Schuindt
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2023-05-10 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: bundler
@@ -16,203 +15,219 @@ dependencies:
16
15
  requirements:
17
16
  - - "~>"
18
17
  - !ruby/object:Gem::Version
19
- version: '2.3'
18
+ version: '2.4'
20
19
  - - ">="
21
20
  - !ruby/object:Gem::Version
22
- version: 2.3.11
21
+ version: 2.4.13
23
22
  type: :development
24
23
  prerelease: false
25
24
  version_requirements: !ruby/object:Gem::Requirement
26
25
  requirements:
27
26
  - - "~>"
28
27
  - !ruby/object:Gem::Version
29
- version: '2.3'
28
+ version: '2.4'
30
29
  - - ">="
31
30
  - !ruby/object:Gem::Version
32
- version: 2.3.11
31
+ version: 2.4.13
33
32
  - !ruby/object:Gem::Dependency
34
33
  name: rake
35
34
  requirement: !ruby/object:Gem::Requirement
36
35
  requirements:
37
36
  - - "~>"
38
37
  - !ruby/object:Gem::Version
39
- version: '12.3'
38
+ version: '13.0'
40
39
  - - ">="
41
40
  - !ruby/object:Gem::Version
42
- version: 12.3.3
41
+ version: 13.0.6
43
42
  type: :development
44
43
  prerelease: false
45
44
  version_requirements: !ruby/object:Gem::Requirement
46
45
  requirements:
47
46
  - - "~>"
48
47
  - !ruby/object:Gem::Version
49
- version: '12.3'
48
+ version: '13.0'
50
49
  - - ">="
51
50
  - !ruby/object:Gem::Version
52
- version: 12.3.3
51
+ version: 13.0.6
53
52
  - !ruby/object:Gem::Dependency
54
53
  name: rspec
55
54
  requirement: !ruby/object:Gem::Requirement
56
55
  requirements:
57
56
  - - "~>"
58
57
  - !ruby/object:Gem::Version
59
- version: '3.0'
58
+ version: '3.12'
60
59
  type: :development
61
60
  prerelease: false
62
61
  version_requirements: !ruby/object:Gem::Requirement
63
62
  requirements:
64
63
  - - "~>"
65
64
  - !ruby/object:Gem::Version
66
- version: '3.0'
65
+ version: '3.12'
67
66
  - !ruby/object:Gem::Dependency
68
67
  name: redcarpet
69
68
  requirement: !ruby/object:Gem::Requirement
70
69
  requirements:
71
70
  - - "~>"
72
71
  - !ruby/object:Gem::Version
73
- version: '3.4'
74
- - - ">="
75
- - !ruby/object:Gem::Version
76
- version: 3.4.0
72
+ version: '3.6'
77
73
  type: :development
78
74
  prerelease: false
79
75
  version_requirements: !ruby/object:Gem::Requirement
80
76
  requirements:
81
77
  - - "~>"
82
78
  - !ruby/object:Gem::Version
83
- version: '3.4'
84
- - - ">="
85
- - !ruby/object:Gem::Version
86
- version: 3.4.0
79
+ version: '3.6'
87
80
  - !ruby/object:Gem::Dependency
88
81
  name: simplecov
89
82
  requirement: !ruby/object:Gem::Requirement
90
83
  requirements:
91
84
  - - "~>"
92
85
  - !ruby/object:Gem::Version
93
- version: 0.14.1
86
+ version: 0.22.0
94
87
  type: :development
95
88
  prerelease: false
96
89
  version_requirements: !ruby/object:Gem::Requirement
97
90
  requirements:
98
91
  - - "~>"
99
92
  - !ruby/object:Gem::Version
100
- version: 0.14.1
93
+ version: 0.22.0
101
94
  - !ruby/object:Gem::Dependency
102
- name: codeclimate-test-reporter
95
+ name: simplecov_json_formatter
103
96
  requirement: !ruby/object:Gem::Requirement
104
97
  requirements:
105
98
  - - "~>"
106
99
  - !ruby/object:Gem::Version
107
- version: '1.0'
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: 1.0.0
100
+ version: 0.1.2
111
101
  type: :development
112
102
  prerelease: false
113
103
  version_requirements: !ruby/object:Gem::Requirement
114
104
  requirements:
115
105
  - - "~>"
116
106
  - !ruby/object:Gem::Version
117
- version: '1.0'
118
- - - ">="
119
- - !ruby/object:Gem::Version
120
- version: 1.0.0
107
+ version: 0.1.2
121
108
  - !ruby/object:Gem::Dependency
122
109
  name: pry
123
110
  requirement: !ruby/object:Gem::Requirement
124
111
  requirements:
125
112
  - - "~>"
126
113
  - !ruby/object:Gem::Version
127
- version: 0.12.2
114
+ version: 0.14.2
128
115
  type: :development
129
116
  prerelease: false
130
117
  version_requirements: !ruby/object:Gem::Requirement
131
118
  requirements:
132
119
  - - "~>"
133
120
  - !ruby/object:Gem::Version
134
- version: 0.12.2
121
+ version: 0.14.2
135
122
  - !ruby/object:Gem::Dependency
136
123
  name: redis
137
124
  requirement: !ruby/object:Gem::Requirement
138
125
  requirements:
139
126
  - - "~>"
140
127
  - !ruby/object:Gem::Version
141
- version: '4.0'
128
+ version: '5.0'
142
129
  - - ">="
143
130
  - !ruby/object:Gem::Version
144
- version: 4.0.1
145
- type: :runtime
131
+ version: 5.0.6
132
+ type: :development
146
133
  prerelease: false
147
134
  version_requirements: !ruby/object:Gem::Requirement
148
135
  requirements:
149
136
  - - "~>"
150
137
  - !ruby/object:Gem::Version
151
- version: '4.0'
138
+ version: '5.0'
152
139
  - - ">="
153
140
  - !ruby/object:Gem::Version
154
- version: 4.0.1
141
+ version: 5.0.6
155
142
  - !ruby/object:Gem::Dependency
156
143
  name: redis-namespace
157
144
  requirement: !ruby/object:Gem::Requirement
158
145
  requirements:
159
146
  - - "~>"
160
147
  - !ruby/object:Gem::Version
161
- version: '1.6'
148
+ version: '1.10'
149
+ type: :development
150
+ prerelease: false
151
+ version_requirements: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - "~>"
154
+ - !ruby/object:Gem::Version
155
+ version: '1.10'
156
+ - !ruby/object:Gem::Dependency
157
+ name: httparty
158
+ requirement: !ruby/object:Gem::Requirement
159
+ requirements:
162
160
  - - ">="
163
161
  - !ruby/object:Gem::Version
164
- version: 1.6.0
162
+ version: '0.21'
163
+ - - "<"
164
+ - !ruby/object:Gem::Version
165
+ version: '1.0'
165
166
  type: :runtime
166
167
  prerelease: false
167
168
  version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0.21'
173
+ - - "<"
174
+ - !ruby/object:Gem::Version
175
+ version: '1.0'
176
+ - !ruby/object:Gem::Dependency
177
+ name: jwt
178
+ requirement: !ruby/object:Gem::Requirement
168
179
  requirements:
169
180
  - - "~>"
170
181
  - !ruby/object:Gem::Version
171
- version: '1.6'
172
- - - ">="
182
+ version: '2.7'
183
+ type: :runtime
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - "~>"
173
188
  - !ruby/object:Gem::Version
174
- version: 1.6.0
189
+ version: '2.7'
175
190
  - !ruby/object:Gem::Dependency
176
- name: httparty
191
+ name: activesupport
177
192
  requirement: !ruby/object:Gem::Requirement
178
193
  requirements:
179
194
  - - "~>"
180
195
  - !ruby/object:Gem::Version
181
- version: '0.21'
196
+ version: '7.0'
182
197
  - - ">="
183
198
  - !ruby/object:Gem::Version
184
- version: 0.16.2
199
+ version: 7.0.4.3
185
200
  type: :runtime
186
201
  prerelease: false
187
202
  version_requirements: !ruby/object:Gem::Requirement
188
203
  requirements:
189
204
  - - "~>"
190
205
  - !ruby/object:Gem::Version
191
- version: '0.21'
206
+ version: '7.0'
192
207
  - - ">="
193
208
  - !ruby/object:Gem::Version
194
- version: 0.16.2
209
+ version: 7.0.4.3
195
210
  - !ruby/object:Gem::Dependency
196
- name: jwt
211
+ name: json
197
212
  requirement: !ruby/object:Gem::Requirement
198
213
  requirements:
199
214
  - - "~>"
200
215
  - !ruby/object:Gem::Version
201
- version: '2.1'
216
+ version: '2.6'
202
217
  - - ">="
203
218
  - !ruby/object:Gem::Version
204
- version: 2.1.0
219
+ version: 2.6.3
205
220
  type: :runtime
206
221
  prerelease: false
207
222
  version_requirements: !ruby/object:Gem::Requirement
208
223
  requirements:
209
224
  - - "~>"
210
225
  - !ruby/object:Gem::Version
211
- version: '2.1'
226
+ version: '2.6'
212
227
  - - ">="
213
228
  - !ruby/object:Gem::Version
214
- version: 2.1.0
215
- description: A Ruby gem to verify the signature of Firebase ID Tokens. It uses Redis
229
+ version: 2.6.3
230
+ description: A Ruby gem to verify the signature of Firebase ID Tokens. It uses ActiveSupport::Cache
216
231
  to store Google's x509 certificates and manage their expiration time, so you don't
217
232
  need to request Google's API in every execution and can access it as fast as reading
218
233
  from memory.
@@ -222,12 +237,13 @@ executables: []
222
237
  extensions: []
223
238
  extra_rdoc_files: []
224
239
  files:
240
+ - ".github/workflows/test.yml"
225
241
  - ".gitignore"
226
242
  - ".rspec"
243
+ - ".ruby-version"
227
244
  - ".travis.yml"
228
245
  - ".yardopts"
229
246
  - CHANGELOG.md
230
- - CODE_OF_CONDUCT.md
231
247
  - Gemfile
232
248
  - LICENSE.txt
233
249
  - README.md
@@ -238,16 +254,22 @@ files:
238
254
  - firebase_id_token.gemspec
239
255
  - lib/firebase_id_token.rb
240
256
  - lib/firebase_id_token/certificates.rb
257
+ - lib/firebase_id_token/certificates/active_support.rb
258
+ - lib/firebase_id_token/certificates/redis.rb
241
259
  - lib/firebase_id_token/configuration.rb
242
260
  - lib/firebase_id_token/exceptions/certificate_not_found.rb
243
261
  - lib/firebase_id_token/exceptions/certificates_request_error.rb
244
262
  - lib/firebase_id_token/exceptions/certificates_ttl_error.rb
245
263
  - lib/firebase_id_token/exceptions/no_certificates_error.rb
264
+ - lib/firebase_id_token/exceptions/unsupported_cache_operation_error.rb
246
265
  - lib/firebase_id_token/signature.rb
247
266
  - lib/firebase_id_token/testing/certificates.rb
248
267
  - lib/firebase_id_token/version.rb
249
- - spec/firebase_id_token/certificates_spec.rb
268
+ - spec/firebase_id_token/certificates/active_support_spec.rb
269
+ - spec/firebase_id_token/certificates/redis_spec.rb
270
+ - spec/firebase_id_token/certificates_session_cookie_spec.rb
250
271
  - spec/firebase_id_token/configuration_spec.rb
272
+ - spec/firebase_id_token/signature_session_cookie_spec.rb
251
273
  - spec/firebase_id_token/signature_spec.rb
252
274
  - spec/firebase_id_token/signature_test_spec.rb
253
275
  - spec/firebase_id_token_spec.rb
@@ -256,11 +278,11 @@ files:
256
278
  - spec/fixtures/files/jwt.json
257
279
  - spec/fixtures/files/payload.json
258
280
  - spec/spec_helper.rb
281
+ - spec/support/certificates_shared_examples.rb
259
282
  homepage: https://github.com/fschuindt/firebase_id_token
260
283
  licenses:
261
284
  - MIT
262
285
  metadata: {}
263
- post_install_message:
264
286
  rdoc_options: []
265
287
  require_paths:
266
288
  - lib
@@ -275,8 +297,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
275
297
  - !ruby/object:Gem::Version
276
298
  version: '0'
277
299
  requirements: []
278
- rubygems_version: 3.2.3
279
- signing_key:
300
+ rubygems_version: 4.0.3
280
301
  specification_version: 4
281
302
  summary: A Firebase ID Token verifier.
282
303
  test_files: []
data/CODE_OF_CONDUCT.md DELETED
@@ -1,74 +0,0 @@
1
- # Contributor Covenant Code of Conduct
2
-
3
- ## Our Pledge
4
-
5
- In the interest of fostering an open and welcoming environment, we as
6
- contributors and maintainers pledge to making participation in our project and
7
- our community a harassment-free experience for everyone, regardless of age, body
8
- size, disability, ethnicity, gender identity and expression, level of experience,
9
- nationality, personal appearance, race, religion, or sexual identity and
10
- orientation.
11
-
12
- ## Our Standards
13
-
14
- Examples of behavior that contributes to creating a positive environment
15
- include:
16
-
17
- * Using welcoming and inclusive language
18
- * Being respectful of differing viewpoints and experiences
19
- * Gracefully accepting constructive criticism
20
- * Focusing on what is best for the community
21
- * Showing empathy towards other community members
22
-
23
- Examples of unacceptable behavior by participants include:
24
-
25
- * The use of sexualized language or imagery and unwelcome sexual attention or
26
- advances
27
- * Trolling, insulting/derogatory comments, and personal or political attacks
28
- * Public or private harassment
29
- * Publishing others' private information, such as a physical or electronic
30
- address, without explicit permission
31
- * Other conduct which could reasonably be considered inappropriate in a
32
- professional setting
33
-
34
- ## Our Responsibilities
35
-
36
- Project maintainers are responsible for clarifying the standards of acceptable
37
- behavior and are expected to take appropriate and fair corrective action in
38
- response to any instances of unacceptable behavior.
39
-
40
- Project maintainers have the right and responsibility to remove, edit, or
41
- reject comments, commits, code, wiki edits, issues, and other contributions
42
- that are not aligned to this Code of Conduct, or to ban temporarily or
43
- permanently any contributor for other behaviors that they deem inappropriate,
44
- threatening, offensive, or harmful.
45
-
46
- ## Scope
47
-
48
- This Code of Conduct applies both within project spaces and in public spaces
49
- when an individual is representing the project or its community. Examples of
50
- representing a project or community include using an official project e-mail
51
- address, posting via an official social media account, or acting as an appointed
52
- representative at an online or offline event. Representation of a project may be
53
- further defined and clarified by project maintainers.
54
-
55
- ## Enforcement
56
-
57
- Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
- reported by contacting the project team at f.schuindtcs@gmail.com. All
59
- complaints will be reviewed and investigated and will result in a response that
60
- is deemed necessary and appropriate to the circumstances. The project team is
61
- obligated to maintain confidentiality with regard to the reporter of an incident.
62
- Further details of specific enforcement policies may be posted separately.
63
-
64
- Project maintainers who do not follow or enforce the Code of Conduct in good
65
- faith may face temporary or permanent repercussions as determined by other
66
- members of the project's leadership.
67
-
68
- ## Attribution
69
-
70
- This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
- available at [http://contributor-covenant.org/version/1/4][version]
72
-
73
- [homepage]: http://contributor-covenant.org
74
- [version]: http://contributor-covenant.org/version/1/4/