phoseum-cli 0.0.16 → 0.0.21
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 +4 -4
- data/bin/phoseum-cli +145 -27
- data/lib/phoseum/phoseum-cli-lib.rb +118 -78
- data/lib/phoseum/phoseum-common-lib.rb +45 -11
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e2bd25792289a6beebdf3d17cb4b4365086d407348c4ca7e17862b65522f57d
|
4
|
+
data.tar.gz: f4fbfa8dc826cfb429b15b3ccbc79446af45d6a44dbd99e01ce96ee77dfa15b6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f25658cea0878061423c1761a5017fcbc4e78535bbce0175266539732f7eb862db30342d7a7276e182a71461548f021112c460c8d253dabc5624d17bc2597285
|
7
|
+
data.tar.gz: 7cd9478c899d770e8cb15e1d83f1e0a030783ac3f5f10bdf99d2e8c046588001c77818b9d6abeb900fa2b979fa9bd47f87427f2305db0074d4cd501b4daabb77
|
data/bin/phoseum-cli
CHANGED
@@ -277,6 +277,15 @@ def user_mgmt(action,user,pass='',role='')
|
|
277
277
|
end
|
278
278
|
|
279
279
|
def user_login(puser='',ppass='')
|
280
|
+
|
281
|
+
server_value = cross_versions()
|
282
|
+
if server_value['version'] != VERSION_SIGN
|
283
|
+
puts "Server and Client version won't match, please make them match to continue.".red
|
284
|
+
puts "Remote version: #{server_value['version']}"
|
285
|
+
puts "Local version: #{VERSION_SIGN}"
|
286
|
+
exit 1
|
287
|
+
end
|
288
|
+
|
280
289
|
post_body={}
|
281
290
|
user= !puser ? '' : puser
|
282
291
|
pass= !ppass ? '' : ppass
|
@@ -332,7 +341,6 @@ def user_login(puser='',ppass='')
|
|
332
341
|
return false
|
333
342
|
end
|
334
343
|
|
335
|
-
|
336
344
|
def delete(what='',path='')
|
337
345
|
if !validate_token($config['TOKEN'])
|
338
346
|
if token = user_login()
|
@@ -380,20 +388,28 @@ case options
|
|
380
388
|
end
|
381
389
|
health(what,value)
|
382
390
|
when -> (cre) { cre[:create_user] }
|
383
|
-
puts "Creating User".green if !$QUIET
|
384
391
|
if options[:create_user]
|
385
392
|
value=check_string_sanity(options[:create_user])
|
393
|
+
username_sanity(value)
|
394
|
+
puts "Creating User #{value}".green if !$QUIET
|
386
395
|
what='add_user'
|
387
|
-
if !options[:role]
|
388
|
-
puts "You need to select one of the valid Roles".red
|
396
|
+
if !options[:role] || options[:role] != "Super" && options[:role] != "User"
|
397
|
+
puts "You need to select one of the valid Roles (Super or User)".red
|
389
398
|
exit 1
|
390
399
|
else
|
391
400
|
print "Please type the password twice for user #{value}.\n\t"
|
392
401
|
new_password=STDIN.getpass('Password: ')
|
393
402
|
print "\t"
|
394
403
|
confirm=STDIN.getpass('Confirm: ')
|
404
|
+
password_sanity(new_password)
|
395
405
|
if new_password == confirm
|
396
|
-
|
406
|
+
if add_user(value,new_password,options[:role])
|
407
|
+
puts "User #{value} added successfully".green
|
408
|
+
exit 0
|
409
|
+
else
|
410
|
+
puts "Failed to add User #{value}".red
|
411
|
+
exit 1
|
412
|
+
end
|
397
413
|
end
|
398
414
|
end
|
399
415
|
end
|
@@ -435,15 +451,24 @@ case options
|
|
435
451
|
if options[:user]
|
436
452
|
what='user'
|
437
453
|
value=options[:user]
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
454
|
+
secretinfo = api_caller({"action" => "check-secret"},true)
|
455
|
+
if secretinfo['error']
|
456
|
+
err_msg = JSON.parse(secretinfo)
|
457
|
+
puts err_msg['error'].red
|
458
|
+
puts "You cannot delete users if you don't have the Server Secret."
|
459
|
+
exit 1
|
460
|
+
end
|
461
|
+
if secretinfo['success']
|
462
|
+
if confirm_action("Are you sure you want to delete the #{what} #{value}")
|
463
|
+
puts "Deleting #{what} #{value}".green if !$QUIET
|
464
|
+
if delete_user(value)
|
465
|
+
puts "#{value} successfully deleted.".green
|
466
|
+
else
|
467
|
+
puts "#{value} failed to be deleted.".red
|
468
|
+
end
|
442
469
|
else
|
443
|
-
puts "#{
|
470
|
+
puts "Deleting #{what} cancelled.".green
|
444
471
|
end
|
445
|
-
else
|
446
|
-
puts "Deleting #{what} cancelled.".green
|
447
472
|
end
|
448
473
|
end
|
449
474
|
if !what
|
@@ -452,17 +477,116 @@ case options
|
|
452
477
|
end
|
453
478
|
when -> (o) { o[:options] }
|
454
479
|
if options[:user]
|
455
|
-
|
456
|
-
|
457
|
-
if
|
458
|
-
|
459
|
-
confirm=STDIN.gets.chomp
|
460
|
-
else
|
461
|
-
puts "User Check Failed".red
|
480
|
+
user_work=check_string_sanity(options[:user])
|
481
|
+
tokeninfo = api_caller({"action" => "token-payload", "token" => "#{$config['TOKEN']}"})
|
482
|
+
if tokeninfo['error']
|
483
|
+
puts "Your token seems invalid, please login again (-l or -c)".red
|
462
484
|
exit 1
|
463
485
|
end
|
486
|
+
auth_user = ''
|
487
|
+
role_user = ''
|
488
|
+
if tokeninfo['success']
|
489
|
+
payload = tokeninfo['payload']
|
490
|
+
tkdata = JSON.parse(payload)
|
491
|
+
auth_user = tkdata[0]['data']['user'].clone
|
492
|
+
role_user = tkdata[0]['data']['role'].clone
|
493
|
+
puts "Current user is #{auth_user}".green
|
494
|
+
end
|
495
|
+
|
496
|
+
secretinfo = api_caller({"action" => "check-secret"},true)
|
497
|
+
if secretinfo['error']
|
498
|
+
err_msg = JSON.parse(secretinfo)
|
499
|
+
puts err_msg['error'].red
|
500
|
+
puts "You will only be able to change your own password."
|
501
|
+
if user_work != auth_user
|
502
|
+
puts "Requesting other user than your own at command line is wrong, aborting. (#{user_work} is not #{auth_user})".red
|
503
|
+
exit 1
|
504
|
+
end
|
505
|
+
end
|
506
|
+
if secretinfo['success']
|
507
|
+
puts secretinfo['success'].green
|
508
|
+
if role_user == "Super"
|
509
|
+
puts "You will be able to change any user on the system".green
|
510
|
+
else
|
511
|
+
if user_work != auth_user
|
512
|
+
puts "Having a regular user will now allow to change other users's options".yellow
|
513
|
+
puts "Requesting other user than your own at command line is wrong, aborting. (#{user_work} is not #{auth_user})".red
|
514
|
+
exit 1
|
515
|
+
end
|
516
|
+
end
|
517
|
+
end
|
518
|
+
|
519
|
+
if user_work == auth_user
|
520
|
+
print "Please type new password for user #{user_work} .\n\t"
|
521
|
+
new_password=STDIN.getpass('Password: ')
|
522
|
+
print "\t"
|
523
|
+
check_password=STDIN.getpass('Confirm: ')
|
524
|
+
if new_password != check_password
|
525
|
+
puts "Passwords won't match, try again.".red
|
526
|
+
exit 1
|
527
|
+
end
|
528
|
+
if change_user_password(auth_user,check_password)
|
529
|
+
puts "Password changed successfully".green
|
530
|
+
exit 0
|
531
|
+
else
|
532
|
+
puts "Could not change user password.".red
|
533
|
+
exit 1
|
534
|
+
end
|
535
|
+
end
|
536
|
+
|
537
|
+
if user_work != auth_user && secretinfo['success']
|
538
|
+
print "\n Change [P]assword, [U]sername, [R]ole from user #{user_work} :[P/U/R]: "
|
539
|
+
opt_action=STDIN.gets.chomp
|
540
|
+
if opt_action == "P"
|
541
|
+
print "Please type new password for user #{user_work} .\n\t"
|
542
|
+
new_password=STDIN.getpass('Password: ')
|
543
|
+
print "\t"
|
544
|
+
check_password=STDIN.getpass('Confirm: ')
|
545
|
+
if new_password != check_password
|
546
|
+
puts "Passwords won't match, try again.".red
|
547
|
+
exit 1
|
548
|
+
end
|
549
|
+
password_sanity(new_password)
|
550
|
+
if change_user_password(options[:user],check_password,true)
|
551
|
+
puts "Password changed successfully".green
|
552
|
+
exit 0
|
553
|
+
else
|
554
|
+
puts "Could not change user password.".red
|
555
|
+
exit 1
|
556
|
+
end
|
557
|
+
end
|
558
|
+
if opt_action == "U"
|
559
|
+
print "\tPlease type new username for user #{user_work} : "
|
560
|
+
new_user_proto=STDIN.gets.chomp
|
561
|
+
new_user=check_string_sanity(new_user_proto)
|
562
|
+
username_sanity(new_user)
|
563
|
+
if change_username(user_work,new_user)
|
564
|
+
puts "Username changed successfully".green
|
565
|
+
exit 0
|
566
|
+
else
|
567
|
+
puts "Could not change username.".red
|
568
|
+
exit 1
|
569
|
+
end
|
570
|
+
end
|
571
|
+
if opt_action == "R"
|
572
|
+
print " Please select between roles [S]uper,[U]ser for user #{user_work} :[S/U]: "
|
573
|
+
new_role=STDIN.gets.chomp
|
574
|
+
if new_role == "S" || new_role == "U"
|
575
|
+
role_nominal = new_role == "S" ? "Super" : "User"
|
576
|
+
if change_role(user_work,role_nominal)
|
577
|
+
puts "Username changed successfully".green
|
578
|
+
exit 0
|
579
|
+
else
|
580
|
+
puts "Could not change username.".red
|
581
|
+
exit 1
|
582
|
+
end
|
583
|
+
else
|
584
|
+
puts "Unknown option: #{new_role} .".red
|
585
|
+
exit 1
|
586
|
+
end
|
587
|
+
end
|
588
|
+
end
|
464
589
|
else
|
465
|
-
# if !what
|
466
590
|
puts "Got no user to work with. Exiting.".red
|
467
591
|
exit 1
|
468
592
|
end
|
@@ -498,13 +622,6 @@ case options
|
|
498
622
|
upload(album_clean,usable_name,usable_desc)
|
499
623
|
end
|
500
624
|
when -> (l) { l[:login] }
|
501
|
-
server_value = cross_versions()
|
502
|
-
if server_value['version'] != VERSION_SIGN
|
503
|
-
puts "Server and Client version won't match, please make them match to continue.".red
|
504
|
-
puts "Remote version: #{server_value['version']}"
|
505
|
-
puts "Local version: #{VERSION_SIGN}"
|
506
|
-
exit 1
|
507
|
-
end
|
508
625
|
puts "Start login process".green if !$QUIET
|
509
626
|
if user_login
|
510
627
|
puts "Login successful".green
|
@@ -524,6 +641,7 @@ case options
|
|
524
641
|
test
|
525
642
|
else
|
526
643
|
ARGV[0] = '--help'
|
644
|
+
local_version
|
527
645
|
option_parser(ARGV)
|
528
646
|
exit 1
|
529
647
|
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
|
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,45 +235,31 @@ def search_image(sign,album='')
|
|
228
235
|
end
|
229
236
|
end
|
230
237
|
|
231
|
-
def
|
238
|
+
def api_caller(json_body,auth=false,cli=false)
|
232
239
|
headers = {}
|
233
|
-
if
|
234
|
-
|
235
|
-
|
236
|
-
|
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(
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
http.request(request)
|
248
|
-
end
|
249
|
-
begin
|
250
|
-
list = JSON.parse(response.body)
|
251
|
-
if list['error']
|
252
|
-
return false
|
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'])
|
253
256
|
end
|
254
|
-
|
255
|
-
|
257
|
+
else
|
258
|
+
if cli
|
259
|
+
request.basic_auth("cli", "loginNOauth")
|
256
260
|
end
|
257
|
-
rescue
|
258
|
-
puts "\nThe server sent out an Error:".red
|
259
|
-
puts clean_html(response.body)
|
260
|
-
exit 1
|
261
261
|
end
|
262
|
-
end
|
263
262
|
|
264
|
-
def cross_versions
|
265
|
-
headers = {}
|
266
|
-
base = URI.parse("#{$config['SERVERURL']}")
|
267
|
-
request = Net::HTTP::Post.new(base,headers)
|
268
|
-
request.basic_auth("cli", "loginNOauth")
|
269
|
-
request.body = JSON.generate({"action" => "version-check" })
|
270
263
|
response = Net::HTTP.start(base.hostname, $config['PORT'],
|
271
264
|
:timeout => $config['CALL_TIMEOUT'],
|
272
265
|
:use_ssl => base.scheme == "https",
|
@@ -278,56 +271,103 @@ def cross_versions
|
|
278
271
|
begin
|
279
272
|
list = JSON.parse(response.body)
|
280
273
|
return list
|
281
|
-
# if list['error']
|
282
|
-
# return false
|
283
|
-
# end
|
284
|
-
# if list['success']
|
285
|
-
# return true
|
286
|
-
# end
|
287
274
|
rescue
|
288
|
-
|
289
|
-
|
290
|
-
|
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
|
291
282
|
end
|
292
283
|
end
|
293
284
|
|
285
|
+
def validate_token(token)
|
286
|
+
result = api_caller({"action" => "check-token" })
|
287
|
+
if result['error']
|
288
|
+
return false
|
289
|
+
end
|
290
|
+
if result['success']
|
291
|
+
return true
|
292
|
+
end
|
293
|
+
end
|
294
294
|
|
295
|
-
def
|
296
|
-
|
297
|
-
if
|
298
|
-
headers={ "bearer" => "#{$config['TOKEN']}" }
|
299
|
-
else
|
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']
|
300
298
|
return false
|
301
299
|
end
|
302
|
-
|
303
|
-
|
304
|
-
request.body = JSON.generate({"action" => "delete-user", "username" => username })
|
305
|
-
response = Net::HTTP.start(base.hostname, $config['PORT'],
|
306
|
-
:timeout => $config['CALL_TIMEOUT'],
|
307
|
-
:use_ssl => base.scheme == "https",
|
308
|
-
:verify_mode => OpenSSL::SSL::VERIFY_PEER,
|
309
|
-
:ca_file => $config['CA_TRUST']
|
310
|
-
) do |http|
|
311
|
-
http.request(request)
|
300
|
+
if result['success']
|
301
|
+
return true
|
312
302
|
end
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
303
|
+
end
|
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
|
314
|
+
|
315
|
+
def add_user(user,password,role)
|
316
|
+
result = api_caller({"action" => "create-user", "user" => user, "password" => password, "role" => role},true)
|
317
|
+
if result['error']
|
318
|
+
return false
|
319
|
+
end
|
320
|
+
if result['success']
|
321
|
+
return true
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
|
326
|
+
def change_role(user,new_role)
|
327
|
+
result = api_caller({"action" => "change-role", "username" => user, "new-role" => new_role},true)
|
328
|
+
if result['error']
|
329
|
+
return false
|
330
|
+
end
|
331
|
+
if result['success']
|
332
|
+
return true
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
def password_sanity(password)
|
337
|
+
if password.length < MIN_PASS
|
338
|
+
puts "New password is shorter than #{MIN_PASS} chars, please use a bigger password.".red
|
339
|
+
exit 1
|
340
|
+
end
|
341
|
+
if !password.test_password
|
342
|
+
puts "Password must be at least #{MIN_PASS} and contain at least one capital, one symbol, one number, one regular characters.".red
|
343
|
+
exit 1
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
def username_sanity(username)
|
348
|
+
if username.length < MIN_USER
|
349
|
+
puts "New Username is shorter than #{MIN_USER} chars, please use a bigger username.".red
|
324
350
|
exit 1
|
325
351
|
end
|
326
352
|
end
|
327
353
|
|
354
|
+
def cross_versions
|
355
|
+
return api_caller({"action" => "version-check" },true,true)
|
356
|
+
end
|
357
|
+
|
358
|
+
def delete_user(username)
|
359
|
+
result = api_caller({"action" => "delete-user", "username" => username},true)
|
360
|
+
if result['error']
|
361
|
+
return false
|
362
|
+
end
|
363
|
+
if result['success']
|
364
|
+
return true
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
328
368
|
def local_version
|
329
369
|
puts "This CLI library is running version: #{VERSION_SIGN}"
|
330
370
|
return
|
331
371
|
end
|
332
372
|
|
333
|
-
VERSION_SIGN="0.0.
|
373
|
+
VERSION_SIGN="0.0.21"
|
@@ -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
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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.
|
4
|
+
version: 0.0.21
|
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-
|
11
|
+
date: 2020-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yaml
|