phoseum-cli 0.0.19 → 0.0.20

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: '092592a7b73a29fb773b199b9e29f7054da0da5701583c1162c2500a1860635f'
4
- data.tar.gz: fc71817a9eb49a14d2567694efaa91ee076e991a1780b8abdbf20b3a2c2032db
3
+ metadata.gz: bfc9c3e5f01d6ea982796a580be0195b76156127ab1b39c3c1bfdb0d1ada4f21
4
+ data.tar.gz: eb9e11b414ee5be39678593668f2fa8f02477e61b1cdbd85a0d69fbdf8728d6f
5
5
  SHA512:
6
- metadata.gz: 78a80cda0d947299a0b95b86f2ccebcf1df4d263bdad641ff0d0aec8d3e2445a28d2062ba52f49d520bf334051448adcf02674069992f7b55d22e1eb60e9f288
7
- data.tar.gz: 2b296a8c6ab2f30de4e7c85dd0b9acf55a3c5b8130ed9887c359220da14879d2b73895894b29f450c4b4a390f04edae6473fe317874183284d336066ddaac3cb
6
+ metadata.gz: c433b128e7140e01364e04309bec935cf66efcfebe785ffbe7f4cefbf0dcdf007cb2f8f7f6398eb7fcae87c751fb7f4213110422b03d621120c991369277d8a6
7
+ data.tar.gz: 1435d44fa6d8599e5ba9492fbce3bb5e30dba57e24c225f7ed6cbfd87ae56f7f3cca5820e9c94a7d259ca652e8875ec5ea503ebb1839969561cf99c5c5f28b7c
@@ -391,6 +391,7 @@ case options
391
391
  puts "Creating User".green if !$QUIET
392
392
  if options[:create_user]
393
393
  value=check_string_sanity(options[:create_user])
394
+ username_sanity(value)
394
395
  what='add_user'
395
396
  if !options[:role]
396
397
  puts "You need to select one of the valid Roles".red
@@ -401,6 +402,7 @@ case options
401
402
  print "\t"
402
403
  confirm=STDIN.getpass('Confirm: ')
403
404
  if new_password == confirm
405
+ password_sanity(new_password)
404
406
  user_mgmt(what,value,new_password,options[:role])
405
407
  end
406
408
  end
@@ -443,15 +445,24 @@ case options
443
445
  if options[:user]
444
446
  what='user'
445
447
  value=options[:user]
446
- if confirm_action("Are you sure you want to delete the #{what} #{value}")
447
- puts "Deleting #{what} #{value}".green if !$QUIET
448
- if delete_user(value)
449
- puts "#{value} successfully deleted.".green
448
+ secretinfo = api_caller({"action" => "check-secret"},true)
449
+ if secretinfo['error']
450
+ err_msg = JSON.parse(secretinfo)
451
+ puts err_msg['error'].red
452
+ puts "You cannot delete users if you don't have the Server Secret."
453
+ exit 1
454
+ end
455
+ if secretinfo['success']
456
+ if confirm_action("Are you sure you want to delete the #{what} #{value}")
457
+ puts "Deleting #{what} #{value}".green if !$QUIET
458
+ if delete_user(value)
459
+ puts "#{value} successfully deleted.".green
460
+ else
461
+ puts "#{value} failed to be deleted.".red
462
+ end
450
463
  else
451
- puts "#{value} failed to be deleted.".red
464
+ puts "Deleting #{what} cancelled.".green
452
465
  end
453
- else
454
- puts "Deleting #{what} cancelled.".green
455
466
  end
456
467
  end
457
468
  if !what
@@ -460,25 +471,117 @@ case options
460
471
  end
461
472
  when -> (o) { o[:options] }
462
473
  if options[:user]
474
+ user_work=check_string_sanity(options[:user])
463
475
  tokeninfo = api_caller({"action" => "token-payload", "token" => "#{$config['TOKEN']}"})
464
476
  if tokeninfo['error']
465
- puts "Your token seems invalid, please login again".red
477
+ puts "Your token seems invalid, please login again (-l or -c)".red
466
478
  exit 1
467
479
  end
480
+ auth_user = ''
481
+ role_user = ''
468
482
  if tokeninfo['success']
469
- puts tokeninfo.payload
483
+ payload = tokeninfo['payload']
484
+ tkdata = JSON.parse(payload)
485
+ auth_user = tkdata[0]['data']['user'].clone
486
+ role_user = tkdata[0]['data']['role'].clone
487
+ puts "Current user is #{auth_user}".green
488
+ end
489
+
490
+ secretinfo = api_caller({"action" => "check-secret"},true)
491
+ if secretinfo['error']
492
+ err_msg = JSON.parse(secretinfo)
493
+ puts err_msg['error'].red
494
+ puts "You will only be able to change your own password."
495
+ if user_work != auth_user
496
+ puts "Requesting other user than your own at command line is wrong, aborting. (#{user_work} is not #{auth_user})".red
497
+ exit 1
498
+ end
499
+ end
500
+ if secretinfo['success']
501
+ puts secretinfo['success'].green
502
+ if role_user == "Super"
503
+ puts "You will be able to change any user on the system".green
504
+ else
505
+ if user_work != auth_user
506
+ puts "Having a regular user will now allow to change other users's options".yellow
507
+ puts "Requesting other user than your own at command line is wrong, aborting. (#{user_work} is not #{auth_user})".red
508
+ exit 1
509
+ end
510
+ end
511
+ end
512
+
513
+ if user_work == auth_user
514
+ print "Please type new password for user #{user_work} .\n\t"
515
+ new_password=STDIN.getpass('Password: ')
516
+ print "\t"
517
+ check_password=STDIN.getpass('Confirm: ')
518
+ if new_password != check_password
519
+ puts "Passwords won't match, try again.".red
520
+ exit 1
521
+ end
522
+ if change_user_password(auth_user,check_password)
523
+ puts "Password changed successfully".green
524
+ exit 0
525
+ else
526
+ puts "Could not change user password.".red
527
+ exit 1
528
+ end
529
+ end
530
+
531
+ if user_work != auth_user && secretinfo['success']
532
+ print "\n Change [P]assword, [U]sername, [R]ole from user #{user_work} :[P/U/R]: "
533
+ opt_action=STDIN.gets.chomp
534
+ if opt_action == "P"
535
+ print "Please type new password for user #{user_work} .\n\t"
536
+ new_password=STDIN.getpass('Password: ')
537
+ puts "testing #{new_password}"
538
+ print "\t"
539
+ check_password=STDIN.getpass('Confirm: ')
540
+ if new_password != check_password
541
+ puts "Passwords won't match, try again.".red
542
+ exit 1
543
+ end
544
+ password_sanity(new_password)
545
+ if change_user_password(options[:user],check_password,true)
546
+ puts "Password changed successfully".green
547
+ exit 0
548
+ else
549
+ puts "Could not change user password.".red
550
+ exit 1
551
+ end
552
+ end
553
+ if opt_action == "U"
554
+ print "\tPlease type new username for user #{user_work} : "
555
+ new_user_proto=STDIN.gets.chomp
556
+ new_user=check_string_sanity(new_user_proto)
557
+ username_sanity(new_user)
558
+ if change_username(user_work,new_user)
559
+ puts "Username changed successfully".green
560
+ exit 0
561
+ else
562
+ puts "Could not change username.".red
563
+ exit 1
564
+ end
565
+ end
566
+ if opt_action == "R"
567
+ print " Please select between roles [S]uper,[U]ser for user #{user_work} :[S/U]: "
568
+ new_role=STDIN.gets.chomp
569
+ if new_role == "S" || new_role == "U"
570
+ role_nominal = new_role == "S" ? "Super" : "User"
571
+ if change_role(user_work,role_nominal)
572
+ puts "Username changed successfully".green
573
+ exit 0
574
+ else
575
+ puts "Could not change username.".red
576
+ exit 1
577
+ end
578
+ else
579
+ puts "Unknown option: #{new_role} .".red
580
+ exit 1
581
+ end
582
+ end
470
583
  end
471
- # print "Please confirm #{options[:user]} password.\n\t"
472
- # current_password=STDIN.getpass('Password: ')
473
- # if token = user_login(options[:user],current_password)
474
- # print "\n Change [P]assword, [U]sername, [R]ole :[P/U/R]: "
475
- # confirm=STDIN.gets.chomp
476
- # else
477
- # puts "User Check Failed".red
478
- # exit 1
479
- # end
480
584
  else
481
- # if !what
482
585
  puts "Got no user to work with. Exiting.".red
483
586
  exit 1
484
587
  end
@@ -533,6 +636,7 @@ case options
533
636
  test
534
637
  else
535
638
  ARGV[0] = '--help'
639
+ local_version
536
640
  option_parser(ARGV)
537
641
  exit 1
538
642
  end
@@ -1,4 +1,12 @@
1
1
 
2
+ # Provide some help and options!
3
+ #
4
+ # Example:
5
+ # >> options = option_parser(ARGV)
6
+ # => puts options[:option]
7
+ #
8
+ # Arguments:
9
+ # ARGV: (Array or command line parameters)
2
10
  def option_parser(opts)
3
11
  options = {}
4
12
  OptionParser.new do |opts|
@@ -60,7 +68,7 @@ def option_parser(opts)
60
68
  options[:role] = r
61
69
  end
62
70
 
63
- opts.on("-o", "--options", "Update options from object. Use with: [user]") do |o|
71
+ opts.on("-o", "--options", "Update options from User. Use with: [user]") do |o|
64
72
  options[:options] = o
65
73
  end
66
74
 
@@ -88,6 +96,15 @@ def option_parser(opts)
88
96
  return options
89
97
  end
90
98
 
99
+ # Give yes/no prompt!
100
+ #
101
+ # Example:
102
+ # >> confirm_action("message")
103
+ # => You must write 'YES' to confirm, otherwise NO is assumed
104
+ # => message :[YES/NO]:
105
+ #
106
+ # Arguments:
107
+ # msg: (String)
91
108
  def confirm_action(msg)
92
109
  puts "You must write 'YES' to confirm, otherwise NO is assumed".yellow
93
110
  print "#{msg} :[YES/NO]: "
@@ -138,16 +155,6 @@ def client_checks
138
155
  puts "I could not find a valid SERVERURL configuration. Contains: #{$config['SERVERURL']}".red
139
156
  exit 1
140
157
  end
141
- if !$config['DEFAULT_SECRET']
142
- puts "I could not find the DEFAULT_SECRET from Phoseum config, this will limit our actions.".red
143
- exit 1
144
- elsif $config['DEFAULT_SECRET'] == 'copy-secret-from-server'
145
- puts "DEFAULT_SECRET from Phoseum config. Still on self generated value, copy a valid one from the server.".red
146
- exit 1
147
- elsif $config['DEFAULT_SECRET'] == ''
148
- puts "I could not find the DEFAULT_SECRET from Phoseum config, Variable is empty.".red
149
- exit 1
150
- end
151
158
  if !$config['SERVERURL']
152
159
  puts "I could not find the SERVERURL from Phoseum config, this client is then useless.".red
153
160
  exit 1
@@ -228,16 +235,31 @@ def search_image(sign,album='')
228
235
  end
229
236
  end
230
237
 
231
- def validate_token(token)
238
+ def api_caller(json_body,auth=false,cli=false)
232
239
  headers = {}
233
- if $config['TOKEN']
234
- headers={ "bearer" => "#{$config['TOKEN']}" }
235
- else
236
- return false
240
+ if !auth
241
+ if $config['TOKEN']
242
+ headers={ "bearer" => "#{$config['TOKEN']}" }
243
+ else
244
+ return false
245
+ end
237
246
  end
238
247
  base = URI.parse("#{$config['SERVERURL']}")
239
248
  request = Net::HTTP::Post.new(base,headers)
240
- request.body = JSON.generate({"action" => "check-token" })
249
+ request.body = JSON.generate(json_body)
250
+
251
+ if auth
252
+ if cli
253
+ request.basic_auth("cli", "loginNOauth")
254
+ else
255
+ request.basic_auth("auth", $config['DEFAULT_SECRET'])
256
+ end
257
+ else
258
+ if cli
259
+ request.basic_auth("cli", "loginNOauth")
260
+ end
261
+ end
262
+
241
263
  response = Net::HTTP.start(base.hostname, $config['PORT'],
242
264
  :timeout => $config['CALL_TIMEOUT'],
243
265
  :use_ssl => base.scheme == "https",
@@ -248,108 +270,87 @@ def validate_token(token)
248
270
  end
249
271
  begin
250
272
  list = JSON.parse(response.body)
251
- if list['error']
252
- return false
253
- end
254
- if list['success']
255
- return true
256
- end
273
+ return list
257
274
  rescue
258
- puts "\nThe server sent out an Error:".red
259
- puts clean_html(response.body)
260
- exit 1
275
+ if !auth
276
+ puts "\nThe server sent out an Error:".red
277
+ puts clean_html(response.body)
278
+ exit 1
279
+ else
280
+ return '{"error": "Secret is invalid"}'
281
+ end
261
282
  end
262
283
  end
263
284
 
264
- def api_caller(json_body)
265
- headers = {}
266
- if $config['TOKEN']
267
- headers={ "bearer" => "#{$config['TOKEN']}" }
268
- else
285
+ def validate_token(token)
286
+ result = api_caller({"action" => "check-token" })
287
+ if result['error']
269
288
  return false
270
289
  end
271
- base = URI.parse("#{$config['SERVERURL']}")
272
- request = Net::HTTP::Post.new(base,headers)
273
- request.body = JSON.generate(json_body)
274
- response = Net::HTTP.start(base.hostname, $config['PORT'],
275
- :timeout => $config['CALL_TIMEOUT'],
276
- :use_ssl => base.scheme == "https",
277
- :verify_mode => OpenSSL::SSL::VERIFY_PEER,
278
- :ca_file => $config['CA_TRUST']
279
- ) do |http|
280
- http.request(request)
290
+ if result['success']
291
+ return true
281
292
  end
282
- begin
283
- list = JSON.parse(response.body)
284
- return list
285
- rescue
286
- puts "\nThe server sent out an Error:".red
287
- puts clean_html(response.body)
288
- exit 1
293
+ end
294
+
295
+ def change_user_password(user,pass,auth=false)
296
+ result = api_caller({"action" => "change-password", "username" => user, "password" => pass},auth)
297
+ if result['error']
298
+ return false
299
+ end
300
+ if result['success']
301
+ return true
289
302
  end
290
303
  end
291
304
 
305
+ def change_username(user,new_user)
306
+ result = api_caller({"action" => "change-username", "username" => user, "new-username" => new_user},true)
307
+ if result['error']
308
+ return false
309
+ end
310
+ if result['success']
311
+ return true
312
+ end
313
+ end
292
314
 
293
- def cross_versions
294
- headers = {}
295
- base = URI.parse("#{$config['SERVERURL']}")
296
- request = Net::HTTP::Post.new(base,headers)
297
- request.basic_auth("cli", "loginNOauth")
298
- request.body = JSON.generate({"action" => "version-check" })
299
- response = Net::HTTP.start(base.hostname, $config['PORT'],
300
- :timeout => $config['CALL_TIMEOUT'],
301
- :use_ssl => base.scheme == "https",
302
- :verify_mode => OpenSSL::SSL::VERIFY_PEER,
303
- :ca_file => $config['CA_TRUST']
304
- ) do |http|
305
- http.request(request)
315
+ def change_role(user,new_role)
316
+ result = api_caller({"action" => "change-role", "username" => user, "new-role" => new_role},true)
317
+ if result['error']
318
+ return false
306
319
  end
307
- begin
308
- list = JSON.parse(response.body)
309
- return list
310
- # if list['error']
311
- # return false
312
- # end
313
- # if list['success']
314
- # return true
315
- # end
316
- rescue
317
- puts "\nThe server sent out an Error:".red
318
- puts clean_html(response.body)
320
+ if result['success']
321
+ return true
322
+ end
323
+ end
324
+
325
+ def password_sanity(password)
326
+ if password.length < MIN_PASS
327
+ puts "New password is shorter than #{MIN_PASS} chars, please use a bigger password.".red
328
+ exit 1
329
+ end
330
+ if !password.test_password
331
+ puts "Password must be at least #{MIN_PASS} and contain at least one capital, one symbol, one number, one regular characters.".red
332
+ exit 1
333
+ end
334
+ end
335
+
336
+ def username_sanity(username)
337
+ if new_user.length < MIN_USER
338
+ puts "New Username is shorter than #{MIN_USER} chars, please use a bigger username.".red
319
339
  exit 1
320
340
  end
321
341
  end
322
342
 
343
+ def cross_versions
344
+ return api_caller({"action" => "version-check" },true,true)
345
+ end
346
+
323
347
  def delete_user(username)
324
- headers = {}
325
- if $config['TOKEN']
326
- headers={ "bearer" => "#{$config['TOKEN']}" }
327
- else
348
+ result = api_caller({"action" => "delete-user", "username" => username},true)
349
+ if result['error']
328
350
  return false
329
351
  end
330
- base = URI.parse("#{$config['SERVERURL']}")
331
- request = Net::HTTP::Post.new(base,headers)
332
- request.body = JSON.generate({"action" => "delete-user", "username" => username })
333
- response = Net::HTTP.start(base.hostname, $config['PORT'],
334
- :timeout => $config['CALL_TIMEOUT'],
335
- :use_ssl => base.scheme == "https",
336
- :verify_mode => OpenSSL::SSL::VERIFY_PEER,
337
- :ca_file => $config['CA_TRUST']
338
- ) do |http|
339
- http.request(request)
340
- end
341
- begin
342
- list = JSON.parse(response.body)
343
- if list['error']
344
- return false
345
- end
346
- if list['success']
347
- return true
348
- end
349
- rescue
350
- puts "\nThe server sent out an Error:".red
351
- puts clean_html(response.body)
352
- exit 1
352
+ if result['success']
353
+ return true
353
354
  end
354
355
  end
355
356
 
@@ -358,4 +359,4 @@ def local_version
358
359
  return
359
360
  end
360
361
 
361
- VERSION_SIGN="0.0.19"
362
+ VERSION_SIGN="0.0.20"
@@ -1,17 +1,51 @@
1
+ MIN_USER = 3
2
+ MIN_PASS = 7
3
+
1
4
  class String
2
5
  def remove_non_ascii(replacement='')
3
- n=self.split("")
4
- self.slice!(0..self.size)
5
- n.each { |b|
6
- if b.ord < 48 || b.ord > 57 && b.ord < 65 || b.ord > 90 && b.ord < 97 || b.ord > 122 then
7
- self.concat(replacement)
8
- else
9
- self.concat(b)
10
- end
11
- }
12
- self.to_s
13
- end
6
+ n=self.split("")
7
+ self.slice!(0..self.size)
8
+ n.each { |b|
9
+ if b.ord < 48 || b.ord > 57 && b.ord < 65 || b.ord > 90 && b.ord < 97 || b.ord > 122 then
10
+ self.concat(replacement)
11
+ else
12
+ self.concat(b)
13
+ end
14
+ }
15
+ self.to_s
16
+ end
14
17
 
18
+ def test_password()
19
+ symbol = false
20
+ number = false
21
+ capital= false
22
+ regular= false
23
+ all_valid= true
24
+ puts "Testing #{self}"
25
+ n=self.split("")
26
+ self.slice!(0..self.size)
27
+ n.each { |b|
28
+ # test symbols
29
+ if b.ord > 32 && b.ord < 48 || b.ord > 58 && b.ord < 65 || b.ord > 91 && b.ord < 97 || b.ord > 123 && b.ord < 126 then
30
+ symbol = true
31
+ # test capital letters
32
+ elsif b.ord > 65 && b.ord < 91 then
33
+ capital = true
34
+ # test numbers
35
+ elsif b.ord > 47 && b.ord < 58 then
36
+ number = true
37
+ # test regular alphabet
38
+ elsif b.ord > 96 && b.ord < 123 then
39
+ regular = true
40
+ else
41
+ # com character out of the acceptable ranges
42
+ all_valid = false
43
+ end
44
+ }
45
+ if symbol && capital && number && regular && all_valid
46
+ return true
47
+ end
48
+ end
15
49
  end
16
50
 
17
51
  def check_string_sanity(album)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phoseum-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.19
4
+ version: 0.0.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julio C Hegedus
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-18 00:00:00.000000000 Z
11
+ date: 2020-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: yaml