lita-hcadmin 0.3.5 → 0.4.2

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
  SHA1:
3
- metadata.gz: ea505de875b8f0e2b8e23e48b73f74dfdd841aca
4
- data.tar.gz: 1723fa99de97712ef95809ead9eb19061c056360
3
+ metadata.gz: 4e35066ec0936361e47aba8dced07c20c011741d
4
+ data.tar.gz: bf0d87dbc41f183bf67a3fb14c07aebfedd2009c
5
5
  SHA512:
6
- metadata.gz: c4721968c8703aaf7a5dfb4c14a583ff05f3b40b5e88d04c46249775ae5b5c538461322ee6efee7fc81ee1fadb003a1d8a1175af021c818a2d36a751426c9d88
7
- data.tar.gz: a4839fdf71f065c4ffe43ccab69f6be0b41b6033d9953cff4d1575be0b09d1e3229a223a405aed8b1aa1cdc8c120ca3d50beb846e92d82b19fad1940123c61f0
6
+ metadata.gz: 09e7acd16ce9e3de0176420d127f75cd5c52450cd1ffc17ca4e1782c9c232e589de6e0a270bc711004047fed7bb4b453fb4e71318419162a8037652ab1f3a204
7
+ data.tar.gz: d00d1bc5047e1af4bfa5483c807e3a62c2e9dab975604fa4023941747dbac87ab626d1d8100927aa700e21f11cea7720617d690b9e95ac6d665c22728db937d7
data/.rubocop.yml CHANGED
@@ -26,3 +26,9 @@ AllCops:
26
26
  Exclude:
27
27
  - 'Rakefile'
28
28
  - 'lita-hcadmin.gemspec'
29
+
30
+ CyclomaticComplexity:
31
+ Max: 12
32
+
33
+ PerceivedComplexity:
34
+ Max: 12
data/.travis.yml CHANGED
@@ -13,4 +13,5 @@ before_script:
13
13
  - eval "$(/opt/chefdk/bin/chef shell-init bash)"
14
14
  script:
15
15
  - /opt/chefdk/embedded/bin/bundle install
16
+ - /opt/chefdk/embedded/bin/bundle exec bundle-audit check --update
16
17
  - /opt/chefdk/embedded/bin/bundle exec rake
data/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # lita-hcadmin
2
2
 
3
+ [0.4.0]
4
+ ---------
5
+ - [desktophero] - Activate user
6
+ - [desktophero] - Show user admin list
7
+
8
+ [0.3.5]
9
+ ---------
10
+ - [desktophero] - Small updates to existing functions:
11
+ * [desktophero] - Identify room owner now uses HipChat V2 API
12
+ * Remove wild cards from some of the routes
13
+ * Cleaned up needless code for room owner lookup
14
+ * Leveled up some tests
15
+
16
+ [0.3.4]
17
+ ---------
18
+ - [desktophero] - Not released. Found url encoding issue for room owner identify route
19
+
3
20
  [0.3.3]
4
21
  ---------
5
22
  - [desktophero] - Fix unarchive logic for multi-word names
data/Gemfile CHANGED
@@ -8,3 +8,4 @@ gem 'simplecov'
8
8
  gem 'coveralls'
9
9
  gem 'webmock'
10
10
  gem 'rubocop'
11
+ gem 'bundler-audit'
data/README.md CHANGED
@@ -148,6 +148,31 @@ room owner change RealName FakeRoom
148
148
  bot: Uh-oh, 404 returned! The room FakeRoom not found
149
149
  ```
150
150
 
151
+ ### identify user change admins
152
+ ```
153
+ identify user change admins
154
+ bot: Users who can change user details
155
+ MentionName1
156
+ MentionName2
157
+ ```
158
+
159
+ The list of names is defined in `Lita.config.handlers.hcadmin.user_change_admins` as an array of MentionNames
160
+
161
+ ### user activate
162
+ ```
163
+ user activate <email_name@company.com>
164
+ bot: Added user with status code 201
165
+ ```
166
+
167
+ A couple of checks:
168
+ ```
169
+ user activate <bad_email@companyom>
170
+ bot: First value needs to be a valid email address
171
+ ```
172
+ ```
173
+ user activate <in_user_email@company.com>
174
+ bot: That email is already in use.
175
+ ```
151
176
 
152
177
  ## TO-DOs
153
178
  The Issues for this repo will be used to accept, collaborate, and complete `TO-DOs`
@@ -43,6 +43,10 @@ module Lita
43
43
  :identify_room_change_admins,
44
44
  help: { 'identify room change admins' => 'Returns a list of who can change room ownership' })
45
45
 
46
+ route(/identify user change admins/,
47
+ :identify_user_change_admins,
48
+ help: { 'identify user change admins' => 'Returns a list of who can change user accounts' })
49
+
46
50
  route(/identify status/,
47
51
  :identify_status,
48
52
  help: { 'identify status' => 'Returns the status of HipChat.' })
@@ -59,9 +63,9 @@ module Lita
59
63
  :room_unarchive,
60
64
  help: { 'room unarchive room_name ' => 'When run as a room change admin, removes a room from archive' })
61
65
 
62
- route(/((user activate))\s+(.+)/i,
66
+ route(/(?:(?:user activate))\s+(.+)/i,
63
67
  :user_activate,
64
- help: { 'user activate email name' => 'When run as a user admin, generates an invite to the email account' })
68
+ help: { 'user activate email@company' => 'When run as a user admin, generates an invite to the email account' })
65
69
 
66
70
  def hipchat_sponsor(response)
67
71
  response.args.each do |r|
@@ -116,6 +120,20 @@ module Lita
116
120
  response.reply "room change admins: #{room_change_admins.length} found ( #{time.real.to_i} s. to respond )"
117
121
  end
118
122
 
123
+ def identify_user_change_admins(response)
124
+ response.reply 'Users who can change user details:'
125
+ time = Benchmark.measure do
126
+ if user_change_admins.first.to_s.empty? # rubocop:disable Style/GuardClause
127
+ return response.reply 'User change admins: None found from config'
128
+ else
129
+ user_change_admins.each do |a|
130
+ response.reply a.to_s
131
+ end
132
+ end
133
+ end
134
+ response.reply "user change admins: #{user_change_admins.length} found ( #{time.real.to_i} s. to respond )"
135
+ end
136
+
119
137
  def identify_room_count(response)
120
138
  room_count = ''
121
139
  time = Benchmark.measure do
@@ -227,12 +245,38 @@ module Lita
227
245
  end
228
246
 
229
247
  def user_activate(response)
230
- # puts response.args
231
- return response.reply 'First value should be a valid email address' unless valid_email?(response.args[0]) == 0
248
+ return response.reply 'You are not represented in the USER admin group' unless user_in_group(response.user.mention_name, user_change_admins) == true
249
+ user_data = user_account_parse(response.matches)
250
+ user_email = user_data[0]
251
+ user_name = username_from_email(user_email)
252
+ return response.reply 'First value needs to be a valid email address' unless valid_email?(user_email) == 0
253
+ unless email_domain_name.include? domain_from_email(user_email)
254
+ return response.reply "That email address is not in the approved list to activate. Approved email accounts: #{email_domain_name}"
255
+ end
256
+ user_data_check = user_exists?(user_email)
257
+ return response.reply 'That email is already in use but in a different HipChat account.' if user_data_check[:status] == 409
258
+ return response.reply 'That email is already an active user in this HipChat account' if user_data_check[:status] == 200
259
+ return response.reply "I did not understand the status code from HipChat: #{user_data_check[:status]}" unless user_data_check[:status] == 404
260
+ user_response = http_post("https://api.hipchat.com/v2/user?auth_token=#{v2_admin_token}&format=json", name: user_name, email: user_email)
261
+ return response.reply "Error while trying to add user: #{user_response.status} -- #{user_response.body}" unless user_response.status == 201
262
+ response.reply "Added user with status code #{user_response.status}"
232
263
  end
233
264
 
234
265
  private
235
266
 
267
+ def domain_from_email(email)
268
+ at = email.index('@')
269
+ email[at..-1]
270
+ end
271
+
272
+ def user_exists?(email)
273
+ fetch_data('v2', 'user', email)
274
+ end
275
+
276
+ def user_account_parse(data)
277
+ data[0][0].split(' ')
278
+ end
279
+
236
280
  def valid_email?(email_value)
237
281
  valid_email_reg = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
238
282
  email_value =~ valid_email_reg
@@ -263,6 +307,10 @@ module Lita
263
307
  email_name
264
308
  end
265
309
 
310
+ def camelize_username(data)
311
+ data.split('.').collect(&:capitalize).join
312
+ end
313
+
266
314
  def fetch_rooms # full list
267
315
  url = "https://api.hipchat.com/v1/rooms/list?auth_token=#{v1_admin_token}&format=json"
268
316
  proxy = http_proxy || nil
@@ -345,6 +393,10 @@ module Lita
345
393
  config.room_change_admins
346
394
  end
347
395
 
396
+ def user_change_admins
397
+ config.user_change_admins
398
+ end
399
+
348
400
  def normalize_room_name(room_name)
349
401
  room_name = room_name.to_s.downcase.strip
350
402
  room_name
@@ -398,6 +450,18 @@ END_OF_EMAIL
398
450
  response
399
451
  end
400
452
 
453
+ def http_post(url, payload, _proxy = {})
454
+ conn = http_conn(url)
455
+ response = conn.post do |c|
456
+ c.options.timeout = 60
457
+ c.options.open_timeout = 60
458
+ c.headers['Content-Type'] = 'application/json'
459
+ c.headers['Accept'] = 'application/json'
460
+ c.body = payload.to_json
461
+ end
462
+ response
463
+ end
464
+
401
465
  def http_conn(url)
402
466
  @http_conn = Faraday.new(url: url) do |h|
403
467
  h.request :url_encoded
data/lita-hcadmin.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "lita-hcadmin"
3
- spec.version = "0.3.5"
3
+ spec.version = "0.4.2"
4
4
  spec.authors = ["Jason Walker"]
5
5
  spec.email = ["jason.walker@target.com"]
6
6
  spec.description = "HipChat admin plugin for Lita"
@@ -0,0 +1,7 @@
1
+ {
2
+ "error": {
3
+ "code": 409,
4
+ "message": "Email already in use by another user",
5
+ "type": "Conflict"
6
+ }
7
+ }
@@ -33,6 +33,7 @@ describe Lita::Handlers::Hcadmin, lita_handler: true do
33
33
  config.handlers.hcadmin.email_dist_list = 'blahblah@company.com'
34
34
  config.handlers.hcadmin.smtp_server = 'smtp.mailserverstuffandthings.com'
35
35
  config.handlers.hcadmin.room_change_admins = ['TestAdmin', 'AnotherAdmin'] # rubocop:disable Style/WordArray
36
+ config.handlers.hcadmin.user_change_admins = ['UserAdmin', 'AnotherAdmin'] # rubocop:disable Style/WordArray
36
37
  config.handlers.hcadmin.account_name = 'TestHipChatAccount'
37
38
  config.handlers.hcadmin.email_domain_name = ['@company.com', '@network.net']
38
39
  config.handlers.hcadmin.http_logging = false
@@ -165,6 +166,35 @@ describe Lita::Handlers::Hcadmin, lita_handler: true do
165
166
  body: '',
166
167
  headers: {}
167
168
  )
169
+
170
+ stub_request(:post, 'https://api.hipchat.com/v2/user?auth_token=abc&format=json')
171
+ .with(
172
+ body: "{\"name\":\"new.person\",\"email\":\"new.person@company.com\"}", # rubocop:disable Style/StringLiterals
173
+ headers: {
174
+ 'Accept' => 'application/json',
175
+ 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
176
+ 'Content-Type' => 'application/json',
177
+ 'User-Agent' => 'Faraday v0.9.2' })
178
+ .to_return(
179
+ status: 201,
180
+ body: '',
181
+ headers: {}
182
+ )
183
+
184
+ stub_request(:post, 'https://api.hipchat.com/v2/user?auth_token=abc&format=json')
185
+ .with(
186
+ body: "{\"name\":\"email.name\",\"email\":\"email.name@company.com\"}", # rubocop:disable Style/StringLiterals
187
+ headers: {
188
+ 'Accept' => 'application/json',
189
+ 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
190
+ 'Content-Type' => 'application/json',
191
+ 'User-Agent' => 'Faraday v0.9.2' })
192
+ .to_return(
193
+ status: 201,
194
+ body: '',
195
+ headers: {}
196
+ )
197
+
168
198
  stub_request(:get, 'https://api.hipchat.com/v2/room/real%20room?auth_token=abc&format=json')
169
199
  .with(
170
200
  headers: {
@@ -177,6 +207,7 @@ describe Lita::Handlers::Hcadmin, lita_handler: true do
177
207
  body: room_v2_json,
178
208
  headers: {}
179
209
  )
210
+
180
211
  stub_request(:get, 'https://api.hipchat.com/v2/room/foobar?auth_token=abc&format=json')
181
212
  .with(
182
213
  headers: {
@@ -201,6 +232,18 @@ describe Lita::Handlers::Hcadmin, lita_handler: true do
201
232
  body: room_v2_json,
202
233
  headers: {}
203
234
  )
235
+ stub_request(:get, 'https://api.hipchat.com/v2/user/email.name@company.com?auth_token=abc&format=json')
236
+ .with(
237
+ headers: {
238
+ 'Accept' => 'application/json',
239
+ 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
240
+ 'Content-Type' => 'application/json',
241
+ 'User-Agent' => 'Faraday v0.9.2' })
242
+ .to_return(
243
+ status: 404,
244
+ body: user_v2_not_found,
245
+ headers: {}
246
+ )
204
247
  end
205
248
 
206
249
  it 'routes the identify room owner command room name has spaces' do
@@ -239,6 +282,10 @@ describe Lita::Handlers::Hcadmin, lita_handler: true do
239
282
  is_expected.to route_command('identify room change admins').to(:identify_room_change_admins)
240
283
  end
241
284
 
285
+ it 'routes user change admin requests' do
286
+ is_expected.to route_command('identify user change admins').to(:identify_user_change_admins)
287
+ end
288
+
242
289
  it 'routes room owner change requests' do
243
290
  is_expected.to route_command('room owner change mention_name room_name').to(:room_owner_change)
244
291
  end
@@ -252,8 +299,8 @@ describe Lita::Handlers::Hcadmin, lita_handler: true do
252
299
  end
253
300
 
254
301
  describe '#hipchat_sponsor' do
255
- context 'validates the new account request is for a Target.com email address' do
256
- it 'rejects non-Target.com email addresses' do
302
+ context 'validates the new account request is for a company.com email address' do
303
+ it 'rejects non-company.com email addresses' do
257
304
  send_command('hipchat sponsor dummy@gmail.com')
258
305
  expect(replies.last).to eq('The email address has to be one of: ["@company.com", "@network.net"]')
259
306
  end
@@ -422,28 +469,6 @@ describe Lita::Handlers::Hcadmin, lita_handler: true do
422
469
  end
423
470
  end
424
471
 
425
- # describe '#owner_name_from_id' do
426
- # # before(:each) do
427
- # # allow(described_class).to receive(:owner_name_from_id).with(31, user_json).and_return('AwesomeSauce')
428
- # # end
429
- # let(:user_mention_name) { subject.owner_name_from_id(user_json) }
430
- # context 'an owner id can be translated to an owner name' do
431
- # it 'returns the mention name field from JSON data' do
432
- # # expect(described_class.owner_name_from_id(31, user_json)).to eq 'AwesomeSauce'
433
- # expect(user_mention_name).to eq 'AwesomeSauce'
434
- # end
435
- # end
436
- # end
437
- #
438
- # describe '#id_from_name' do
439
- # let(:room_search) { subject.id_from_name('floppy drive', room_json) }
440
- # context 'returns the room_id from the room_name' do
441
- # it 'does not error when getting the ID from name' do
442
- # expect(room_search).to eq 31
443
- # end
444
- # end
445
- # end
446
-
447
472
  describe '#identify_room_count' do
448
473
  context 'room count is returned when called' do
449
474
  it 'returns the number of rooms when requested' do
@@ -573,13 +598,84 @@ describe Lita::Handlers::Hcadmin, lita_handler: true do
573
598
 
574
599
  describe '#user_activate' do
575
600
  context 'reactivates a person' do
601
+ it 'blocks an activation if requestor is not a user admin' do
602
+ send_command('user activate email.name@companycom', as: regular_member)
603
+ expect(replies.last).to include('You are not represented in the USER admin group')
604
+ end
605
+
576
606
  it 'catches if the user does not use a real email address' do
577
- send_command('user activate email@companycom')
578
- expect(replies.last).to include('First value should be a valid email address')
607
+ send_command('user activate email.name@companycom', as: user_change_admin_member)
608
+ expect(replies.last).to include('First value needs to be a valid email address')
579
609
  end
580
- it 'does stuff' do
581
- send_command('user activate email@company.com')
610
+
611
+ it 'rejects non-company.com email addresses' do
612
+ send_command('user activate dummy@gmail.com', as: user_change_admin_member)
613
+ expect(replies.last).to eq('That email address is not in the approved list to activate. Approved email accounts: ["@company.com", "@network.net"]')
614
+ end
615
+
616
+ it 'adds a user if the inputs are sane' do
617
+ send_command('user activate email.name@company.com Test Account', as: user_change_admin_member)
618
+ expect(replies.last).to include('Added user with status code 201')
619
+ end
620
+ end
621
+
622
+ context 'the user account already exists' do
623
+ let(:user_v2_already_exists) { File.read(File.join('spec', 'fixtures', 'user_v2_already_exists.json')) }
624
+ before do
625
+ stub_request(:get, 'https://api.hipchat.com/v2/user/existing.person@company.com?auth_token=abc&format=json')
626
+ .with(
627
+ headers: {
628
+ 'Accept' => 'application/json',
629
+ 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
630
+ 'Content-Type' => 'application/json',
631
+ 'User-Agent' => 'Faraday v0.9.2' })
632
+ .to_return(
633
+ status: 409,
634
+ body: user_v2_already_exists,
635
+ headers: {}
636
+ )
637
+ end
638
+ it 'returns a 409 when the account exists in another account' do
639
+ send_command('user activate existing.person@company.com', as: user_change_admin_member)
640
+ expect(replies.last).to eq 'That email is already in use but in a different HipChat account.'
641
+ end
642
+ end
643
+ context 'the user account already exists' do
644
+ let(:user_v2_new) { File.read(File.join('spec', 'fixtures', 'v2_user_not_found.json')) }
645
+ before do
646
+ stub_request(:get, 'https://api.hipchat.com/v2/user/new.person@company.com?auth_token=abc&format=json')
647
+ .with(
648
+ headers: {
649
+ 'Accept' => 'application/json',
650
+ 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
651
+ 'Content-Type' => 'application/json',
652
+ 'User-Agent' => 'Faraday v0.9.2' })
653
+ .to_return(
654
+ status: 404,
655
+ body: user_v2_not_found,
656
+ headers: {}
657
+ )
658
+ end
659
+ it 'validates a new account is legit' do
660
+ send_command('user activate new.person@company.com', as: user_change_admin_member)
661
+ expect(replies.last).to eq 'Added user with status code 201'
582
662
  end
583
663
  end
584
664
  end
665
+
666
+ describe '#identify_user_change_admins' do
667
+ context 'returns the user change admins' do
668
+ it 'names are returned' do
669
+ send_command('identify user change admins')
670
+ expect(replies.last).to include('user change admins')
671
+ end
672
+ end
673
+
674
+ context 'shows UserAdmin name from hcadmin.config' do
675
+ it 'shows the UserAdmin was returned' do
676
+ send_command('identify user change admins')
677
+ expect(replies).to include('UserAdmin')
678
+ end
679
+ end
680
+ end # end room change admins
585
681
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lita-hcadmin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Walker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-30 00:00:00.000000000 Z
11
+ date: 2016-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lita
@@ -134,6 +134,7 @@ files:
134
134
  - spec/fixtures/stats.json
135
135
  - spec/fixtures/status.json
136
136
  - spec/fixtures/user_data.json
137
+ - spec/fixtures/user_v2_already_exists.json
137
138
  - spec/fixtures/user_v2_data.json
138
139
  - spec/fixtures/user_v2_notreal_email.json
139
140
  - spec/fixtures/users_data.json
@@ -175,6 +176,7 @@ test_files:
175
176
  - spec/fixtures/stats.json
176
177
  - spec/fixtures/status.json
177
178
  - spec/fixtures/user_data.json
179
+ - spec/fixtures/user_v2_already_exists.json
178
180
  - spec/fixtures/user_v2_data.json
179
181
  - spec/fixtures/user_v2_notreal_email.json
180
182
  - spec/fixtures/users_data.json