mdata 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/mdata +276 -1
- data/lib/mdata/types/ObjectPermissions.rb +61 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: faff685b0e5287c5c54d944f31011ca28d113241
|
4
|
+
data.tar.gz: 12e1cfd3508ba85da9372d305202c1af962c7a7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ef8902458d53e2c807f321417cf88d0cfe167602c248fe22efc26e534015688b36805f9f85204109cb5377eb1dbec58d5292d5d151e6387db0e03fc125a2446
|
7
|
+
data.tar.gz: 4b63b2a5e5dc49d42946ae6d2a1cc2cce2cdf22929d977c51fb762d952c64b13845c1d9a4ecae4c9f6a0b07c1bbbce362f8f0a82ce165b0a9fd4cce782264699
|
data/bin/mdata
CHANGED
@@ -5,7 +5,7 @@ require 'commander/import'
|
|
5
5
|
require 'mdata/metadata'
|
6
6
|
require 'terminal-table'
|
7
7
|
|
8
|
-
program :version, '1.
|
8
|
+
program :version, '1.2.0'
|
9
9
|
program :description, 'Your Salesforce metadata navigator and manipulator'
|
10
10
|
program :help, 'Author', 'Ben Burwell <ben.burwell@trifecta.com>'
|
11
11
|
|
@@ -385,6 +385,274 @@ command :'profile classAccess:copy' do |c|
|
|
385
385
|
end
|
386
386
|
end
|
387
387
|
|
388
|
+
command :'profile objectPermissions:read' do |c|
|
389
|
+
c.syntax = 'mdata profile objectPermissions:read --profile PROFILE [options]'
|
390
|
+
c.summary = 'Read object permissions from a profile'
|
391
|
+
c.option '--profile PROFILE', String, 'The profile to examine'
|
392
|
+
c.option '--object OBJECT', String, 'Optionally, an object to look for'
|
393
|
+
c.action do |args, opts|
|
394
|
+
begin
|
395
|
+
raise ArgumentError, 'no profile specified' if opts.profile.nil?
|
396
|
+
profile = Salesforce::Metadata::Profile.read opts.profile, opts.dir
|
397
|
+
profile.objectPermissions.keep_if { |x| x.object == opts.object } unless opts.object.nil?
|
398
|
+
profile.objectPermissions.sort! { |a, b| a.object <=> b.object }
|
399
|
+
rows = []
|
400
|
+
profile.objectPermissions.each do |fp|
|
401
|
+
rows << [ fp.object, fp.to_flag_style ]
|
402
|
+
end
|
403
|
+
table = Terminal::Table.new :rows => rows, :headings => ['Object', 'Permissions']
|
404
|
+
puts table
|
405
|
+
rescue ArgumentError => e
|
406
|
+
puts "Error executing command: #{e.message}"
|
407
|
+
end
|
408
|
+
end
|
409
|
+
end
|
410
|
+
|
411
|
+
# Profile - Object Permissions - Set
|
412
|
+
command :'profile objectPermissions:set' do |c|
|
413
|
+
c.syntax = 'mdata profile objectPermissions:set --profile PROFILE --object OBJECT [options]'
|
414
|
+
c.summary = 'Overwrites any existing permissions for the object on the profile with the ones specified'
|
415
|
+
c.option '--profile PROFILE', String, 'The profile to configure'
|
416
|
+
c.option '--object OBJECT', String, 'The object to assign permissions for'
|
417
|
+
c.option '--allowCreate', 'Set the allowCreate permission'
|
418
|
+
c.option '--allowEdit', 'Set the allowEdit permission'
|
419
|
+
c.option '--allowRead', 'Set the allowRead permission'
|
420
|
+
c.option '--allowDelete', 'Set the allowDelete permission'
|
421
|
+
c.option '--modifyAllRecords', 'Set the modifyAllRecords permission'
|
422
|
+
c.option '--viewAllRecords', 'Set the viewAllRecords permission'
|
423
|
+
c.action do |args, opts|
|
424
|
+
begin
|
425
|
+
raise ArgumentError, 'no profile specified' if opts.profile.nil?
|
426
|
+
raise ArgumentError, 'no object specified' if opts.object.nil?
|
427
|
+
profile = Salesforce::Metadata::Profile.read opts.profile, opts.dir
|
428
|
+
idx = profile.objectPermissions.find_index { |x| x.object == opts.object }
|
429
|
+
|
430
|
+
if idx.nil?
|
431
|
+
op = Salesforce::Types::ProfileObjectPermissions.new
|
432
|
+
op.object = opts.object
|
433
|
+
profile.objectPermissions.push op
|
434
|
+
idx = profile.objectPermissions.count - 1
|
435
|
+
end
|
436
|
+
|
437
|
+
profile.objectPermissions[idx].allowCreate = case opts.allowCreate
|
438
|
+
when nil then 'false'
|
439
|
+
else 'true'
|
440
|
+
end
|
441
|
+
profile.objectPermissions[idx].allowEdit = case opts.allowEdit
|
442
|
+
when nil then 'false'
|
443
|
+
else 'true'
|
444
|
+
end
|
445
|
+
profile.objectPermissions[idx].allowRead = case opts.allowRead
|
446
|
+
when nil then 'false'
|
447
|
+
else 'true'
|
448
|
+
end
|
449
|
+
profile.objectPermissions[idx].allowDelete = case opts.allowDelete
|
450
|
+
when nil then 'false'
|
451
|
+
else 'true'
|
452
|
+
end
|
453
|
+
profile.objectPermissions[idx].modifyAllRecords = case opts.modifyAllRecords
|
454
|
+
when nil then 'false'
|
455
|
+
else 'true'
|
456
|
+
end
|
457
|
+
profile.objectPermissions[idx].viewAllRecords = case opts.viewAllRecords
|
458
|
+
when nil then 'false'
|
459
|
+
else 'true'
|
460
|
+
end
|
461
|
+
profile.save
|
462
|
+
rescue ArgumentError => e
|
463
|
+
puts "Error executing command: #{e.message}"
|
464
|
+
end
|
465
|
+
end
|
466
|
+
end
|
467
|
+
|
468
|
+
# Profile - Object Permissions - Grant
|
469
|
+
command :'profile objectPermissions:grant' do |c|
|
470
|
+
c.syntax = 'mdata profile objectPermissions:grant --profile PROFILE --object OBJECT [options]'
|
471
|
+
c.summary = 'Grant permissions on an object to a profile'
|
472
|
+
c.option '--profile PROFILE', String, 'The profile to configure'
|
473
|
+
c.option '--object OBJECT', String, 'The object to assign permissions for'
|
474
|
+
c.option '--allowCreate', 'Grant the allowCreate permission'
|
475
|
+
c.option '--allowEdit', 'Grant the allowEdit permission'
|
476
|
+
c.option '--allowRead', 'Grant the allowRead permission'
|
477
|
+
c.option '--allowDelete', 'Grant the allowDelete permission'
|
478
|
+
c.option '--modifyAllRecords', 'Grant the modifyAllRecords permission'
|
479
|
+
c.option '--viewAllRecords', 'Grant the viewAllRecords permission'
|
480
|
+
c.action do |args, opts|
|
481
|
+
begin
|
482
|
+
raise ArgumentError, 'no profile specified' if opts.profile.nil?
|
483
|
+
raise ArgumentError, 'no object specified' if opts.object.nil?
|
484
|
+
profile = Salesforce::Metadata::Profile.read opts.profile, opts.dir
|
485
|
+
idx = profile.objectPermissions.find_index { |x| x.object == opts.object }
|
486
|
+
|
487
|
+
if idx.nil?
|
488
|
+
op = Salesforce::Types::ProfileObjectPermissions.new
|
489
|
+
op.object = opts.object
|
490
|
+
profile.objectPermissions.push op
|
491
|
+
idx = profile.objectPermissions.count - 1
|
492
|
+
end
|
493
|
+
|
494
|
+
profile.objectPermissions[idx].allowCreate = 'true' unless opts.allowCreate.nil?
|
495
|
+
profile.objectPermissions[idx].allowEdit = 'true' unless opts.allowEdit.nil?
|
496
|
+
profile.objectPermissions[idx].allowRead = 'true' unless opts.allowRead.nil?
|
497
|
+
profile.objectPermissions[idx].allowDelete = 'true' unless opts.allowDelete.nil?
|
498
|
+
profile.objectPermissions[idx].modifyAllRecords = 'true' unless opts.modifyAllRecords.nil?
|
499
|
+
profile.objectPermissions[idx].viewAllRecords = 'true' unless opts.viewAllRecords.nil?
|
500
|
+
profile.save
|
501
|
+
rescue ArgumentError => e
|
502
|
+
puts "Error executing command: #{e.message}"
|
503
|
+
end
|
504
|
+
end
|
505
|
+
end
|
506
|
+
|
507
|
+
# Profile - Object Permissions - Revoke
|
508
|
+
command :'profile objectPermissions:revoke' do |c|
|
509
|
+
c.syntax = 'mdata profile objectPermissions:revoke --profile PROFILE --object OBJECT [options]'
|
510
|
+
c.summary = 'Revoke permissions on an object from a profile'
|
511
|
+
c.option '--profile PROFILE', String, 'The profile to configure'
|
512
|
+
c.option '--object OBJECT', String, 'The object to assign permissions for'
|
513
|
+
c.option '--allowCreate', 'Revoke the allowCreate permission'
|
514
|
+
c.option '--allowEdit', 'Revoke the allowEdit permission'
|
515
|
+
c.option '--allowRead', 'Revoke the allowRead permission'
|
516
|
+
c.option '--allowDelete', 'Revoke the allowDelete permission'
|
517
|
+
c.option '--modifyAllRecords', 'Revoke the modifyAllRecords permission'
|
518
|
+
c.option '--viewAllRecords', 'Revoke the viewAllRecords permission'
|
519
|
+
c.action do |args, opts|
|
520
|
+
begin
|
521
|
+
raise ArgumentError, 'no profile specified' if opts.profile.nil?
|
522
|
+
raise ArgumentError, 'no object specified' if opts.object.nil?
|
523
|
+
profile = Salesforce::Metadata::Profile.read opts.profile, opts.dir
|
524
|
+
idx = profile.objectPermissions.find_index { |x| x.object == opts.object }
|
525
|
+
|
526
|
+
if idx.nil?
|
527
|
+
op = Salesforce::Types::ProfileObjectPermissions.new
|
528
|
+
op.object = opts.object
|
529
|
+
profile.objectPermissions.push op
|
530
|
+
idx = profile.objectPermissions.count - 1
|
531
|
+
end
|
532
|
+
|
533
|
+
profile.objectPermissions[idx].allowCreate = 'false' unless opts.allowCreate.nil?
|
534
|
+
profile.objectPermissions[idx].allowEdit = 'false' unless opts.allowEdit.nil?
|
535
|
+
profile.objectPermissions[idx].allowRead = 'false' unless opts.allowRead.nil?
|
536
|
+
profile.objectPermissions[idx].allowDelete = 'false' unless opts.allowDelete.nil?
|
537
|
+
profile.objectPermissions[idx].modifyAllRecords = 'false' unless opts.modifyAllRecords.nil?
|
538
|
+
profile.objectPermissions[idx].viewAllRecords = 'false' unless opts.viewAllRecords.nil?
|
539
|
+
profile.save
|
540
|
+
rescue ArgumentError => e
|
541
|
+
puts "Error executing command: #{e.message}"
|
542
|
+
end
|
543
|
+
end
|
544
|
+
end
|
545
|
+
|
546
|
+
# Profile - Object Permissions - Delete
|
547
|
+
command :'profile objectPermissions:delete' do |c|
|
548
|
+
c.syntax = 'mdata profile objectPermissions:delete --profile PROFILE --object OBJECT'
|
549
|
+
c.summary = 'Completely removes the permissions for a particular object. Useful if an object is deleted.'
|
550
|
+
c.option '--profile PROFILE', String, 'The profile to configure'
|
551
|
+
c.option '--object OBJECT', String, 'The object to delete permissions for'
|
552
|
+
c.action do |args, opts|
|
553
|
+
begin
|
554
|
+
raise ArgumentError, 'no profile specified' if opts.profile.nil?
|
555
|
+
raise ArgumentError, 'no object specified' if opts.object.nil?
|
556
|
+
profile = Salesforce::Metadata::Profile.read opts.profile, opts.dir
|
557
|
+
profile.objectPermissions.delete_if { |x| x.object == opts.object }
|
558
|
+
profile.save
|
559
|
+
rescue ArgumentError => e
|
560
|
+
puts "Error executing command: #{e.message}"
|
561
|
+
end
|
562
|
+
end
|
563
|
+
end
|
564
|
+
|
565
|
+
# Profile - Object Permissions - Copy
|
566
|
+
command :'profile objectPermissions:copy' do |c|
|
567
|
+
c.syntax = 'mdata profile objectPermissions:copy --fromProfile PROFILE --toProfile PROFILE --fromObject OBJECT --toObject OBJECT [options]'
|
568
|
+
c.summary = 'Copies the specified permissions for an object from one profile to another'
|
569
|
+
c.description = [
|
570
|
+
'Copies the permissions on fromProfile for the object fromObject to toObject on toProfile.',
|
571
|
+
'',
|
572
|
+
'If you are copying the permissions from one object to another on the same profile, you can use',
|
573
|
+
'the --profile option rather than specifying the same --fromProfile and --toProfile.',
|
574
|
+
'',
|
575
|
+
'Likewise, if you are copying the permissions for an object from one profile to another, you can',
|
576
|
+
'specify an --object rather than a --fromObject and --toObject.'
|
577
|
+
].join("\n")
|
578
|
+
c.option '--fromProfile PROFILE', String, 'The source profile'
|
579
|
+
c.option '--toProfile PROFILE', String, 'The destination profile'
|
580
|
+
c.option '--profile PROFILE', String, 'A profile to use as the source and destination'
|
581
|
+
c.option '--fromObject OBJECT', String, 'The source object'
|
582
|
+
c.option '--toObject OBJECT', String, 'The destination object'
|
583
|
+
c.option '--object OBJECT', String, 'An object to use as the source and destination'
|
584
|
+
c.option '--all', 'Copy all permissions'
|
585
|
+
c.option '--allowCreate', 'Copy the allowCreate permission'
|
586
|
+
c.option '--allowEdit', 'Copy the allowEdit permission'
|
587
|
+
c.option '--allowRead', 'Copy the allowRead permission'
|
588
|
+
c.option '--allowDelete', 'Copy the allowDelete permission'
|
589
|
+
c.option '--modifyAllRecords', 'Copy the modifyAllRecords permission'
|
590
|
+
c.option '--viewAllRecords', 'Copy the viewAllRecords permission'
|
591
|
+
c.action do |args, opts|
|
592
|
+
# Override options for helper options
|
593
|
+
opts.fromProfile = opts.profile if opts.profile
|
594
|
+
opts.toProfile = opts.profile if opts.profile
|
595
|
+
opts.fromObject = opts.object if opts.object
|
596
|
+
opts.toObject = opts.object if opts.object
|
597
|
+
opts.allowCreate = true if opts.all
|
598
|
+
opts.allowEdit = true if opts.all
|
599
|
+
opts.allowRead = true if opts.all
|
600
|
+
opts.allowDelete = true if opts.all
|
601
|
+
opts.modifyAllRecords = true if opts.all
|
602
|
+
opts.viewAllRecords = true if opts.all
|
603
|
+
|
604
|
+
begin
|
605
|
+
raise ArgumentError, 'no source profile specified' if opts.fromProfile.nil?
|
606
|
+
raise ArgumentError, 'no destination profile specified' if opts.toProfile.nil?
|
607
|
+
raise ArgumentError, 'no source object specified' if opts.fromObject.nil?
|
608
|
+
raise ArgumentError, 'no destination object specified' if opts.toObject.nil?
|
609
|
+
|
610
|
+
from_profile = Salesforce::Metadata::Profile.read opts.fromProfile, opts.dir
|
611
|
+
src_idx = from_profile.objectPermissions.find_index { |x| x.object == opts.fromObject }
|
612
|
+
raise ArgumentError, 'source object not found in source profile' if src_idx.nil?
|
613
|
+
|
614
|
+
to_profile = Salesforce::Metadata::Profile.read opts.toProfile, opts.dir
|
615
|
+
dst_idx = to_profile.objectPermissions.find_index { |x| x.object == opts.toObject }
|
616
|
+
|
617
|
+
if dst_idx.nil?
|
618
|
+
op = Salesforce::Types::ProfileObjectPermissions.new
|
619
|
+
op.object = opts.toObject
|
620
|
+
to_profile.objectPermissions.push op
|
621
|
+
dst_idx = to_profile.objectPermissions.count - 1
|
622
|
+
end
|
623
|
+
|
624
|
+
unless opts.allowCreate.nil?
|
625
|
+
val = from_profile.objectPermissions[src_idx].allowCreate
|
626
|
+
to_profile.objectPermissions[dst_idx].allowCreate = val
|
627
|
+
end
|
628
|
+
unless opts.allowEdit.nil?
|
629
|
+
val = from_profile.objectPermissions[src_idx].allowEdit
|
630
|
+
to_profile.objectPermissions[dst_idx].allowEdit = val
|
631
|
+
end
|
632
|
+
unless opts.allowRead.nil?
|
633
|
+
val = from_profile.objectPermissions[src_idx].allowRead
|
634
|
+
to_profile.objectPermissions[dst_idx].allowRead = val
|
635
|
+
end
|
636
|
+
unless opts.allowDelete.nil?
|
637
|
+
val = from_profile.objectPermissions[src_idx].allowDelete
|
638
|
+
to_profile.objectPermissions[dst_idx].allowDelete = val
|
639
|
+
end
|
640
|
+
unless opts.modifyAllRecords.nil?
|
641
|
+
val = from_profile.objectPermissions[src_idx].modifyAllRecords
|
642
|
+
to_profile.objectPermissions[dst_idx].modifyAllRecords = val
|
643
|
+
end
|
644
|
+
unless opts.viewAllRecords.nil?
|
645
|
+
val = from_profile.objectPermissions[src_idx].viewAllRecords
|
646
|
+
to_profile.objectPermissions[dst_idx].viewAllRecords = val
|
647
|
+
end
|
648
|
+
|
649
|
+
to_profile.save
|
650
|
+
rescue ArgumentError => e
|
651
|
+
puts "Error executing command: #{e.message}"
|
652
|
+
end
|
653
|
+
end
|
654
|
+
end
|
655
|
+
|
388
656
|
alias_command :'pr fp:r', :'profile fieldPermissions:read'
|
389
657
|
alias_command :'pr fp:s', :'profile fieldPermissions:set'
|
390
658
|
alias_command :'pr fp:g', :'profile fieldPermissions:grant'
|
@@ -397,3 +665,10 @@ alias_command :'pr ca:g', :'profile classAccess:grant'
|
|
397
665
|
alias_command :'pr ca:v', :'profile classAccess:revoke'
|
398
666
|
alias_command :'pr ca:d', :'profile classAccess:delete'
|
399
667
|
alias_command :'pr ca:c', :'profile classAccess:copy'
|
668
|
+
|
669
|
+
alias_command :'pr op:r', :'profile objectPermissions:read'
|
670
|
+
alias_command :'pr op:s', :'profile objectPermissions:set'
|
671
|
+
alias_command :'pr op:g', :'profile objectPermissions:grant'
|
672
|
+
alias_command :'pr op:v', :'profile objectPermissions:revoke'
|
673
|
+
alias_command :'pr op:c', :'profile objectPermissions:copy'
|
674
|
+
alias_command :'pr op:d', :'profile objectPermissions:delete'
|
@@ -16,6 +16,67 @@ module Salesforce
|
|
16
16
|
xml_accessor :modifyAllRecords
|
17
17
|
xml_accessor :object
|
18
18
|
xml_accessor :viewAllRecords
|
19
|
+
|
20
|
+
# Get an array of granted permissions
|
21
|
+
#
|
22
|
+
# @return [Array] an array of strings, like ['allowCreate', 'allowRead']
|
23
|
+
def get_permissions
|
24
|
+
permissions = []
|
25
|
+
permissions.push 'allowCreate' if @allowCreate == 'true'
|
26
|
+
permissions.push 'allowDelete' if @allowDelete == 'true'
|
27
|
+
permissions.push 'allowEdit' if @allowEdit == 'true'
|
28
|
+
permissions.push 'allowRead' if @allowRead == 'true'
|
29
|
+
permissions.push 'modifyAllRecords' if @modifyAllRecords == 'true'
|
30
|
+
permissions.push 'viewAllRecords' if @viewAllRecords == 'true'
|
31
|
+
permissions
|
32
|
+
end
|
33
|
+
|
34
|
+
# A Unix flag style representation of the permissions, suitable for
|
35
|
+
# printing in a table
|
36
|
+
#
|
37
|
+
# @return [String] the granted permissions
|
38
|
+
def to_flag_style
|
39
|
+
permissions = ''
|
40
|
+
|
41
|
+
if @allowCreate
|
42
|
+
permissions += 'allowCreate '
|
43
|
+
else
|
44
|
+
permissions += ' '
|
45
|
+
end
|
46
|
+
|
47
|
+
if @allowDelete
|
48
|
+
permissions += 'allowDelete '
|
49
|
+
else
|
50
|
+
permissions += ' '
|
51
|
+
end
|
52
|
+
|
53
|
+
if @allowEdit
|
54
|
+
permissions += 'allowEdit '
|
55
|
+
else
|
56
|
+
permissions += ' '
|
57
|
+
end
|
58
|
+
|
59
|
+
if @allowRead
|
60
|
+
permissions += 'allowRead '
|
61
|
+
else
|
62
|
+
permissions += ' '
|
63
|
+
end
|
64
|
+
|
65
|
+
if @modifyAllRecords
|
66
|
+
permissions += 'modifyAllRecords '
|
67
|
+
else
|
68
|
+
permissions += ' '
|
69
|
+
end
|
70
|
+
|
71
|
+
if @viewAllRecords
|
72
|
+
permissions += 'viewAllRecords'
|
73
|
+
else
|
74
|
+
permissions += ' '
|
75
|
+
end
|
76
|
+
|
77
|
+
permissions
|
78
|
+
end
|
79
|
+
|
19
80
|
end
|
20
81
|
|
21
82
|
# See https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_profile.htm#profileobjectpermissions_title
|