ruby-jss 1.2.4a4 → 1.3.3
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/CHANGES.md +185 -1
- data/README.md +3 -1
- data/bin/cgrouper +1 -1
- data/bin/jamfHelperBackgrounder +1 -1
- data/bin/netseg-update +1 -1
- data/data/ruby-jss.conf.example +1 -1
- data/lib/jamf.rb +1 -1
- data/lib/jamf/api/abstract_classes/advanced_search.rb +1 -1
- data/lib/jamf/api/abstract_classes/collection_resource.rb +31 -26
- data/lib/jamf/api/abstract_classes/generic_reference.rb +1 -1
- data/lib/jamf/api/abstract_classes/json_object.rb +15 -5
- data/lib/jamf/api/abstract_classes/prestage.rb +2 -2
- data/lib/jamf/api/abstract_classes/prestage_skip_setup_items.rb +1 -1
- data/lib/jamf/api/abstract_classes/resource.rb +1 -1
- data/lib/jamf/api/abstract_classes/singleton_resource.rb +1 -1
- data/lib/jamf/api/attribute_classes/ip_address.rb +1 -1
- data/lib/jamf/api/attribute_classes/timestamp.rb +1 -1
- data/lib/jamf/api/connection.rb +106 -60
- data/lib/jamf/api/connection/api_error.rb +1 -1
- data/lib/jamf/api/connection/api_error_styleguide.rb +1 -1
- data/lib/jamf/api/connection/token.rb +80 -13
- data/lib/jamf/api/json_objects/account_prefs.rb +1 -1
- data/lib/jamf/api/json_objects/android_details.rb +1 -1
- data/lib/jamf/api/json_objects/appletv_details.rb +1 -1
- data/lib/jamf/api/json_objects/attachment.rb +1 -1
- data/lib/jamf/api/json_objects/cellular_network.rb +1 -1
- data/lib/jamf/api/json_objects/change_log_entry.rb +1 -1
- data/lib/jamf/api/json_objects/computer_prestage_skip_setup_items.rb +1 -1
- data/lib/jamf/api/json_objects/country.rb +1 -1
- data/lib/jamf/api/json_objects/criterion.rb +1 -1
- data/lib/jamf/api/json_objects/device_enrollment_device.rb +1 -1
- data/lib/jamf/api/json_objects/device_enrollment_sync_status.rb +1 -1
- data/lib/jamf/api/json_objects/extension_attribute_value.rb +1 -1
- data/lib/jamf/api/json_objects/installed_application.rb +1 -1
- data/lib/jamf/api/json_objects/installed_certificate.rb +1 -1
- data/lib/jamf/api/json_objects/installed_configuration_profile.rb +1 -1
- data/lib/jamf/api/json_objects/installed_ebook.rb +1 -1
- data/lib/jamf/api/json_objects/installed_provisioning_profile.rb +1 -1
- data/lib/jamf/api/json_objects/inventory_preload_extension_attribute.rb +1 -1
- data/lib/jamf/api/json_objects/ios_details.rb +1 -1
- data/lib/jamf/api/json_objects/location.rb +1 -1
- data/lib/jamf/api/json_objects/md_prestage_name.rb +1 -1
- data/lib/jamf/api/json_objects/md_prestage_names.rb +1 -1
- data/lib/jamf/api/json_objects/md_prestage_skip_setup_items.rb +1 -1
- data/lib/jamf/api/json_objects/mobile_device_details.rb +1 -1
- data/lib/jamf/api/json_objects/mobile_device_security.rb +1 -1
- data/lib/jamf/api/json_objects/prestage_assignment.rb +1 -1
- data/lib/jamf/api/json_objects/prestage_location.rb +1 -1
- data/lib/jamf/api/json_objects/prestage_purchasing_data.rb +1 -1
- data/lib/jamf/api/json_objects/prestage_scope.rb +1 -1
- data/lib/jamf/api/json_objects/prestage_sync_status.rb +1 -1
- data/lib/jamf/api/json_objects/purchasing_data.rb +1 -1
- data/lib/jamf/api/mixins/abstract.rb +1 -1
- data/lib/jamf/api/mixins/bulk_deletable.rb +1 -1
- data/lib/jamf/api/mixins/change_log.rb +1 -1
- data/lib/jamf/api/mixins/extendable.rb +1 -1
- data/lib/jamf/api/mixins/immutable.rb +1 -1
- data/lib/jamf/api/mixins/locatable.rb +1 -1
- data/lib/jamf/api/mixins/lockable.rb +1 -1
- data/lib/jamf/api/mixins/referable.rb +1 -1
- data/lib/jamf/api/mixins/searchable.rb +1 -1
- data/lib/jamf/api/mixins/uncreatable.rb +1 -1
- data/lib/jamf/api/mixins/undeletable.rb +1 -1
- data/lib/jamf/api/resources/collection_resources/account.rb +1 -1
- data/lib/jamf/api/resources/collection_resources/advanced_mobile_device_search.rb +1 -1
- data/lib/jamf/api/resources/collection_resources/advanced_user_search.rb +1 -1
- data/lib/jamf/api/resources/collection_resources/building.rb +1 -1
- data/lib/jamf/api/resources/collection_resources/category.rb +1 -1
- data/lib/jamf/api/resources/collection_resources/computer.rb +1 -1
- data/lib/jamf/api/resources/collection_resources/computer_prestage.rb +1 -1
- data/lib/jamf/api/resources/collection_resources/department.rb +1 -1
- data/lib/jamf/api/resources/collection_resources/device_enrollment.rb +1 -1
- data/lib/jamf/api/resources/collection_resources/extension_attribute.rb +1 -1
- data/lib/jamf/api/resources/collection_resources/inventory_preload_record.rb +9 -2
- data/lib/jamf/api/resources/collection_resources/mobile_device.rb +1 -1
- data/lib/jamf/api/resources/collection_resources/mobile_device_prestage.rb +1 -1
- data/lib/jamf/api/resources/collection_resources/script.rb +1 -1
- data/lib/jamf/api/resources/collection_resources/site.rb +1 -1
- data/lib/jamf/api/resources/collection_resources/time_zone.rb +1 -1
- data/lib/jamf/api/resources/singleton_resources/app_store_country_codes.rb +1 -1
- data/lib/jamf/api/resources/singleton_resources/authorization.rb +1 -1
- data/lib/jamf/api/resources/singleton_resources/client_checkin_settings.rb +1 -1
- data/lib/jamf/api/resources/singleton_resources/reenrollment_settings.rb +1 -1
- data/lib/jamf/client.rb +1 -1
- data/lib/jamf/client/jamf_binary.rb +1 -1
- data/lib/jamf/client/jamf_helper.rb +1 -1
- data/lib/jamf/client/management_action.rb +1 -1
- data/lib/jamf/compatibility.rb +1 -1
- data/lib/jamf/composer.rb +1 -1
- data/lib/jamf/configuration.rb +8 -10
- data/lib/jamf/exceptions.rb +6 -1
- data/lib/jamf/ruby_extensions.rb +2 -1
- data/lib/jamf/ruby_extensions/array.rb +2 -2
- data/lib/jamf/ruby_extensions/array/predicates.rb +1 -1
- data/lib/jamf/ruby_extensions/array/utils.rb +4 -4
- data/lib/jamf/ruby_extensions/dig.rb +52 -0
- data/lib/jamf/ruby_extensions/filetest.rb +1 -1
- data/lib/jamf/ruby_extensions/filetest/predicates.rb +1 -1
- data/lib/jamf/ruby_extensions/hash.rb +1 -1
- data/lib/jamf/ruby_extensions/hash/backports.rb +2 -2
- data/lib/jamf/ruby_extensions/ipaddr.rb +1 -1
- data/lib/jamf/ruby_extensions/ipaddr/utils.rb +1 -1
- data/lib/jamf/ruby_extensions/object.rb +1 -1
- data/lib/jamf/ruby_extensions/object/predicates.rb +1 -1
- data/lib/jamf/ruby_extensions/pathname.rb +1 -1
- data/lib/jamf/ruby_extensions/pathname/predicates.rb +1 -1
- data/lib/jamf/ruby_extensions/pathname/utils.rb +1 -1
- data/lib/jamf/ruby_extensions/string.rb +1 -1
- data/lib/jamf/ruby_extensions/string/backports.rb +1 -1
- data/lib/jamf/ruby_extensions/string/conversions.rb +1 -1
- data/lib/jamf/ruby_extensions/string/predicates.rb +14 -4
- data/lib/jamf/utility.rb +1 -1
- data/lib/jamf/validate.rb +1 -1
- data/lib/jamf/version.rb +2 -2
- data/lib/jpapi.rb +1 -1
- data/lib/jss-api.rb +1 -1
- data/lib/jss.rb +5 -2
- data/lib/jss/api_connection.rb +3 -30
- data/lib/jss/api_object.rb +16 -3
- data/lib/jss/api_object/account.rb +1 -1
- data/lib/jss/api_object/advanced_search.rb +1 -1
- data/lib/jss/api_object/advanced_search/advanced_computer_search.rb +1 -1
- data/lib/jss/api_object/advanced_search/advanced_mobile_device_search.rb +1 -1
- data/lib/jss/api_object/advanced_search/advanced_user_search.rb +1 -1
- data/lib/jss/api_object/building.rb +1 -1
- data/lib/jss/api_object/categorizable.rb +1 -1
- data/lib/jss/api_object/category.rb +1 -1
- data/lib/jss/api_object/computer.rb +12 -6
- data/lib/jss/api_object/computer/application_installs.rb +1 -1
- data/lib/jss/api_object/computer_invitation.rb +1 -1
- data/lib/jss/api_object/configuration_profile.rb +4 -2
- data/lib/jss/api_object/configuration_profile/mobile_device_configuration_profile.rb +1 -1
- data/lib/jss/api_object/configuration_profile/osx_configuration_profile.rb +1 -1
- data/lib/jss/api_object/creatable.rb +1 -1
- data/lib/jss/api_object/criteriable.rb +10 -5
- data/lib/jss/api_object/criteriable/criteria.rb +26 -10
- data/lib/jss/api_object/criteriable/criterion.rb +1 -1
- data/lib/jss/api_object/department.rb +1 -1
- data/lib/jss/api_object/directory_binding.rb +273 -0
- data/lib/jss/api_object/directory_binding_type.rb +90 -0
- data/lib/jss/api_object/directory_binding_type/active_directory.rb +502 -0
- data/lib/jss/api_object/directory_binding_type/admitmac.rb +525 -0
- data/lib/jss/api_object/directory_binding_type/centrify.rb +212 -0
- data/lib/jss/api_object/directory_binding_type/open_directory.rb +178 -0
- data/lib/jss/api_object/directory_binding_type/powerbroker_identity_services.rb +73 -0
- data/lib/jss/api_object/disk_encryption_configurations.rb +114 -0
- data/lib/jss/api_object/distribution_point.rb +96 -36
- data/lib/jss/api_object/dock_item.rb +137 -0
- data/lib/jss/api_object/ebook.rb +1 -1
- data/lib/jss/api_object/extendable.rb +67 -28
- data/lib/jss/api_object/extension_attribute.rb +1 -1
- data/lib/jss/api_object/extension_attribute/computer_extension_attribute.rb +1 -1
- data/lib/jss/api_object/extension_attribute/mobile_device_extension_attribute.rb +1 -1
- data/lib/jss/api_object/extension_attribute/user_extension_attribute.rb +1 -1
- data/lib/jss/api_object/group.rb +1 -1
- data/lib/jss/api_object/group/computer_group.rb +1 -1
- data/lib/jss/api_object/group/mobile_device_group.rb +1 -1
- data/lib/jss/api_object/group/user_group.rb +1 -1
- data/lib/jss/api_object/ibeacon.rb +1 -1
- data/lib/jss/api_object/ldap_server.rb +1 -1
- data/lib/jss/api_object/locatable.rb +1 -1
- data/lib/jss/api_object/mac_application.rb +1 -1
- data/lib/jss/api_object/management_history.rb +23 -22
- data/lib/jss/api_object/management_history/audit_event.rb +1 -1
- data/lib/jss/api_object/management_history/casper_imaging_log.rb +1 -1
- data/lib/jss/api_object/management_history/casper_remote_log.rb +1 -1
- data/lib/jss/api_object/management_history/computer_usage_log.rb +1 -1
- data/lib/jss/api_object/management_history/ebook.rb +1 -1
- data/lib/jss/api_object/management_history/hashlike.rb +1 -1
- data/lib/jss/api_object/management_history/mac_app_store_app.rb +1 -1
- data/lib/jss/api_object/management_history/mdm_command.rb +1 -1
- data/lib/jss/api_object/management_history/mobile_device_app.rb +1 -1
- data/lib/jss/api_object/management_history/policy_log.rb +1 -1
- data/lib/jss/api_object/management_history/screen_sharing_log.rb +1 -1
- data/lib/jss/api_object/management_history/user_location_change.rb +1 -1
- data/lib/jss/api_object/matchable.rb +1 -1
- data/lib/jss/api_object/mdm.rb +1 -1
- data/lib/jss/api_object/mobile_device.rb +29 -6
- data/lib/jss/api_object/mobile_device_application.rb +13 -1
- data/lib/jss/api_object/netboot_server.rb +1 -1
- data/lib/jss/api_object/network_segment.rb +153 -59
- data/lib/jss/api_object/package.rb +106 -41
- data/lib/jss/api_object/patch_policy.rb +1 -1
- data/lib/jss/api_object/patch_source.rb +1 -1
- data/lib/jss/api_object/patch_source/patch_external_source.rb +1 -1
- data/lib/jss/api_object/patch_source/patch_internal_source.rb +1 -1
- data/lib/jss/api_object/patch_title.rb +1 -1
- data/lib/jss/api_object/patch_title/version.rb +1 -1
- data/lib/jss/api_object/peripheral.rb +1 -1
- data/lib/jss/api_object/peripheral_type.rb +1 -1
- data/lib/jss/api_object/policy.rb +380 -5
- data/lib/jss/api_object/printer.rb +440 -0
- data/lib/jss/api_object/purchasable.rb +1 -1
- data/lib/jss/api_object/removable_macaddr.rb +1 -1
- data/lib/jss/api_object/restricted_software.rb +1 -1
- data/lib/jss/api_object/scopable.rb +1 -1
- data/lib/jss/api_object/scopable/scope.rb +257 -37
- data/lib/jss/api_object/script.rb +1 -1
- data/lib/jss/api_object/self_servable.rb +7 -7
- data/lib/jss/api_object/self_servable/icon.rb +1 -1
- data/lib/jss/api_object/sitable.rb +6 -2
- data/lib/jss/api_object/site.rb +1 -1
- data/lib/jss/api_object/software_update_server.rb +1 -1
- data/lib/jss/api_object/updatable.rb +1 -1
- data/lib/jss/api_object/uploadable.rb +1 -1
- data/lib/jss/api_object/user.rb +5 -3
- data/lib/jss/api_object/vppable.rb +1 -1
- data/lib/jss/api_object/webhook.rb +1 -1
- data/lib/jss/client.rb +1 -1
- data/lib/jss/client/jamf_binary.rb +1 -1
- data/lib/jss/client/jamf_helper.rb +1 -1
- data/lib/jss/client/management_action.rb +1 -1
- data/lib/jss/compatibility.rb +1 -1
- data/lib/jss/composer.rb +2 -2
- data/lib/jss/configuration.rb +1 -1
- data/lib/jss/db_connection.rb +1 -1
- data/lib/jss/exceptions.rb +1 -1
- data/lib/jss/ruby_extensions.rb +1 -1
- data/lib/jss/ruby_extensions/array.rb +1 -1
- data/lib/jss/ruby_extensions/filetest.rb +1 -1
- data/lib/jss/ruby_extensions/hash.rb +1 -1
- data/lib/jss/ruby_extensions/ipaddr.rb +1 -1
- data/lib/jss/ruby_extensions/pathname.rb +1 -1
- data/lib/jss/ruby_extensions/string.rb +1 -1
- data/lib/jss/ruby_extensions/string/backports.rb +1 -1
- data/lib/jss/ruby_extensions/string/conversions.rb +1 -1
- data/lib/jss/ruby_extensions/string/predicates.rb +14 -4
- data/lib/jss/ruby_extensions/time.rb +1 -1
- data/lib/jss/server.rb +1 -1
- data/lib/jss/utility.rb +9 -23
- data/lib/jss/validate.rb +1 -1
- data/lib/jss/version.rb +2 -2
- data/lib/jss/xml_workaround.rb +1 -1
- data/lib/ruby-jss.rb +1 -1
- data/test/bin/runtests +1 -1
- data/test/lib/testhelper.rb +1 -1
- data/test/lib/testhelper/auth.rb +1 -1
- data/test/lib/testhelper/patch_mgmt.rb +1 -1
- data/test/specs/api_connection_spec.rb +1 -1
- data/test/specs/patch01_source_spec.rb +1 -1
- data/test/specs/patch02_internal_source_spec.rb +1 -1
- data/test/specs/patch03_external_source_spec.rb +1 -1
- data/test/specs/patch04_titles_spec.rb +1 -1
- data/test/specs/patch05_policies_spec.rb +1 -1
- data/test/specs/patch06_cleanup_spec.rb +1 -1
- data/test/specs/policy_spec.rb +1 -1
- metadata +15 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright
|
|
1
|
+
# Copyright 2020 Pixar
|
|
2
2
|
|
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "Apache License")
|
|
4
4
|
# with the following modification; you may not use this file except in
|
|
@@ -41,6 +41,85 @@ module JSS
|
|
|
41
41
|
# This class provides methods for adding, removing, or fully replacing the
|
|
42
42
|
# various items in scope's realms: targets, limitations, and exclusions.
|
|
43
43
|
#
|
|
44
|
+
# IMPORTANT:
|
|
45
|
+
# The classic API has bugs regarding the use of Users, UserGroups,
|
|
46
|
+
# LDAP/Local Users, & LDAP User Groups in scopes. Here's a discussion
|
|
47
|
+
# of those bugs and how ruby-jss handles them.
|
|
48
|
+
#
|
|
49
|
+
# Targets/Inclusions
|
|
50
|
+
# - 'Users' can only be JSS::Users - No LDAP
|
|
51
|
+
# - BUG: They do not appear in API data (XML or JSON) and are
|
|
52
|
+
# NOT SUPPORTED in ruby-jss.
|
|
53
|
+
# - You must use the Web UI to work with them in a Scope.
|
|
54
|
+
# - 'User Groups' can only be JSS::UserGroups - No LDAP
|
|
55
|
+
# - BUG: They do not appear in API data (XML or JSON) and are
|
|
56
|
+
# NOT SUPPORTED in ruby-jss.
|
|
57
|
+
# - You must use the Web UI to work with them in a Scope.
|
|
58
|
+
#
|
|
59
|
+
# Limitations
|
|
60
|
+
# - 'LDAP/Local Users' can be any string
|
|
61
|
+
# - The Web UI accepts any string, even if no matching Local or LDAP user.
|
|
62
|
+
# - The data shows up in API data in scope=>limitations=>users
|
|
63
|
+
# by name only (the string provided), no IDs
|
|
64
|
+
# - 'LDAP User Groups' can only be LDAP groups that actually exist
|
|
65
|
+
# - The Web UI won't let you add a group that doesn't exist in ldap
|
|
66
|
+
# - The data shows up in API data in scope=>limitations=>user_groups
|
|
67
|
+
# by name and LDAP ID (which may be empty)
|
|
68
|
+
# - The data ALSO shows up in API data in scope=>limit_to_users=>user_groups
|
|
69
|
+
# by name only, no LDAP IDs. ruby-jss ignores this and looks at
|
|
70
|
+
# scope=>limitations=>user_groups
|
|
71
|
+
#
|
|
72
|
+
# Exclusions, combines the behavior of Inclusions & Limitations
|
|
73
|
+
# - 'Users' can only be JSS::Users - No LDAP
|
|
74
|
+
# - BUG: They do not appear in API data (XML or JSON) and are
|
|
75
|
+
# NOT SUPPORTED in ruby-jss.
|
|
76
|
+
# - You must use the Web UI to work with them in a Scope.
|
|
77
|
+
# - 'User Groups' can only be JSS::UserGroups - No LDAP
|
|
78
|
+
# - BUG: They do not appear in API data (XML or JSON) and are
|
|
79
|
+
# NOT SUPPORTED in ruby-jss.
|
|
80
|
+
# - You must use the Web UI to work with them in a Scope.
|
|
81
|
+
# - 'LDAP/Local Users' can be any string
|
|
82
|
+
# - The Web UI accepts any string, even if no matching Local or LDAP user.
|
|
83
|
+
# - The data shows up in API data in scope=>exclusions=>users
|
|
84
|
+
# by name only (the string provided), no IDs
|
|
85
|
+
# - 'LDAP User Groups' can only be LDAP groups that actually exist
|
|
86
|
+
# - The Web UI won't let you add a group that doesn't exist in ldap
|
|
87
|
+
# - The data shows up in API data in scope=>exclusions=>user_groups
|
|
88
|
+
# by name and LDAP ID (which may be empty)
|
|
89
|
+
#
|
|
90
|
+
#
|
|
91
|
+
# How ruby-jss handles this:
|
|
92
|
+
#
|
|
93
|
+
# - Methods #set_targets and #add_target will not accept the keys
|
|
94
|
+
# :user, :users, :user_group, :user_groups.
|
|
95
|
+
#
|
|
96
|
+
# - Method #remove_target will ignore them.
|
|
97
|
+
#
|
|
98
|
+
# - Methods #set_limitations, #add_limitation & #remove_limitation will accept:
|
|
99
|
+
# - :user, :ldap_user, or :jamf_ldap_user (and their plurals) for working
|
|
100
|
+
# with 'LDAP/Local Users'. When setting or adding, the provided
|
|
101
|
+
# string(s) must exist as either a JSS::User or an LDAP user
|
|
102
|
+
# - :user_group or :ldap_user_group (and their plurals) for working with
|
|
103
|
+
# 'LDAP User Groups'. When setting or adding, the provided string
|
|
104
|
+
# must exist as a group in LDAP.
|
|
105
|
+
#
|
|
106
|
+
# - Methods #set_exclusions, #add_exclusion & #remove_exclusion will accept:
|
|
107
|
+
# - :user, :ldap_user, or :jamf_ldap_user (and their plurals) for working
|
|
108
|
+
# with 'LDAP/Local Users'. When setting or adding, the provided string(s)
|
|
109
|
+
# must exist as either a JSS::User or an LDAP user.
|
|
110
|
+
# - :user_group or :ldap_user_group (and their plurals) for working with
|
|
111
|
+
# 'LDAP User Groups''. When setting or adding, the provided string
|
|
112
|
+
# must exist as a group in LDAP.
|
|
113
|
+
#
|
|
114
|
+
# Internally in the Scope instance:
|
|
115
|
+
#
|
|
116
|
+
# - The limitations and exclusions that match the WebUI's 'LDAP/Local Users'
|
|
117
|
+
# are in @limitations[:jamf_ldap_users] and @exclusions[:jamf_ldap_users]
|
|
118
|
+
#
|
|
119
|
+
# - The limitations and exclusions that match the WebUI's 'LDAP User Groups'
|
|
120
|
+
# are in @limitations[:ldap_user_groups] and @exclusions[:ldap_user_groups]
|
|
121
|
+
#
|
|
122
|
+
#
|
|
44
123
|
# @see JSS::Scopable
|
|
45
124
|
#
|
|
46
125
|
class Scope
|
|
@@ -50,6 +129,8 @@ module JSS
|
|
|
50
129
|
|
|
51
130
|
# These are the classes that Scopes can use for defining a scope,
|
|
52
131
|
# keyed by appropriate symbols.
|
|
132
|
+
# NOTE: All the user and group ones don't actually refer to
|
|
133
|
+
# JSS::User or JSS::UserGroup. See IMPORTANT discussion above.
|
|
53
134
|
SCOPING_CLASSES = {
|
|
54
135
|
computers: JSS::Computer,
|
|
55
136
|
computer: JSS::Computer,
|
|
@@ -65,16 +146,37 @@ module JSS
|
|
|
65
146
|
department: JSS::Department,
|
|
66
147
|
network_segments: JSS::NetworkSegment,
|
|
67
148
|
network_segment: JSS::NetworkSegment,
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
149
|
+
ibeacon: JSS::IBeacon,
|
|
150
|
+
ibeacons: JSS::IBeacon,
|
|
151
|
+
user: nil,
|
|
152
|
+
users: nil,
|
|
153
|
+
ldap_user: nil,
|
|
154
|
+
ldap_users: nil,
|
|
155
|
+
jamf_ldap_user: nil,
|
|
156
|
+
jamf_ldap_users: nil,
|
|
157
|
+
user_group: nil,
|
|
158
|
+
user_groups: nil,
|
|
159
|
+
ldap_user_group: nil,
|
|
160
|
+
ldap_user_groups: nil
|
|
72
161
|
}.freeze
|
|
73
162
|
|
|
74
|
-
#
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
163
|
+
# These keys always mean :jamf_ldap_users
|
|
164
|
+
LDAP_JAMF_USER_KEYS = %i[
|
|
165
|
+
user
|
|
166
|
+
users
|
|
167
|
+
ldap_user
|
|
168
|
+
ldap_users
|
|
169
|
+
jamf_ldap_user
|
|
170
|
+
jamf_ldap_users
|
|
171
|
+
].freeze
|
|
172
|
+
|
|
173
|
+
# These keys always mean :ldap_user_groups
|
|
174
|
+
LDAP_GROUP_KEYS = %i[
|
|
175
|
+
user_group
|
|
176
|
+
user_groups
|
|
177
|
+
ldap_user_group
|
|
178
|
+
ldap_user_groups
|
|
179
|
+
].freeze
|
|
78
180
|
|
|
79
181
|
# This hash maps the availble Scope Target keys from SCOPING_CLASSES to
|
|
80
182
|
# their corresponding target group keys from SCOPING_CLASSES.
|
|
@@ -88,7 +190,16 @@ module JSS
|
|
|
88
190
|
INCLUSIONS = %i[buildings departments].freeze
|
|
89
191
|
|
|
90
192
|
# These can limit the inclusion list
|
|
91
|
-
|
|
193
|
+
# These are the keys that come from the API
|
|
194
|
+
# the :users key from the API is what we call :jamf_ldap_users
|
|
195
|
+
# and the :user_groups key from the API we call :ldap_user_groups
|
|
196
|
+
# See the IMPORTANT discussion above.
|
|
197
|
+
LIMITATIONS = %i[
|
|
198
|
+
ibeacons
|
|
199
|
+
network_segments
|
|
200
|
+
jamf_ldap_users
|
|
201
|
+
ldap_user_groups
|
|
202
|
+
].freeze
|
|
92
203
|
|
|
93
204
|
# any of them can be excluded
|
|
94
205
|
EXCLUSIONS = INCLUSIONS + LIMITATIONS
|
|
@@ -179,7 +290,9 @@ module JSS
|
|
|
179
290
|
#
|
|
180
291
|
def initialize(target_key, raw_scope = nil)
|
|
181
292
|
raw_scope ||= DEFAULT_SCOPE.dup
|
|
182
|
-
|
|
293
|
+
unless TARGETS_AND_GROUPS.key?(target_key)
|
|
294
|
+
raise JSS::InvalidDataError, "The target class of a Scope must be one of the symbols :#{TARGETS_AND_GROUPS.keys.join(', :')}"
|
|
295
|
+
end
|
|
183
296
|
|
|
184
297
|
@target_key = target_key
|
|
185
298
|
@target_class = SCOPING_CLASSES[@target_key]
|
|
@@ -197,24 +310,64 @@ module JSS
|
|
|
197
310
|
@inclusions = {}
|
|
198
311
|
@inclusion_keys.each do |k|
|
|
199
312
|
raw_scope[k] ||= []
|
|
200
|
-
@inclusions[k] = raw_scope[k].compact.map { |n| n[:id].to_i
|
|
313
|
+
@inclusions[k] = raw_scope[k].compact.map { |n| n[:id].to_i }
|
|
201
314
|
end # @inclusion_keys.each do |k|
|
|
202
315
|
|
|
316
|
+
# the :users key from the API is what we call :jamf_ldap_users
|
|
317
|
+
# and the :user_groups key from the API we call :ldap_user_groups
|
|
318
|
+
# See the IMPORTANT discussion above.
|
|
203
319
|
@limitations = {}
|
|
204
320
|
if raw_scope[:limitations]
|
|
321
|
+
|
|
205
322
|
LIMITATIONS.each do |k|
|
|
206
|
-
|
|
207
|
-
|
|
323
|
+
# :jamf_ldap_users comes from :users in the API data
|
|
324
|
+
if k == :jamf_ldap_users
|
|
325
|
+
api_data = raw_scope[:limitations][:users]
|
|
326
|
+
api_data ||= []
|
|
327
|
+
@limitations[k] = api_data.compact.map { |n| n[:name].to_s }
|
|
328
|
+
|
|
329
|
+
# :ldap_user_groups comes from :user_groups in the API data
|
|
330
|
+
elsif k == :ldap_user_groups
|
|
331
|
+
api_data = raw_scope[:limitations][:user_groups]
|
|
332
|
+
api_data ||= []
|
|
333
|
+
@limitations[k] = api_data.compact.map { |n| n[:name].to_s }
|
|
334
|
+
|
|
335
|
+
# others handled normally.
|
|
336
|
+
else
|
|
337
|
+
api_data = raw_scope[:limitations][k]
|
|
338
|
+
api_data ||= []
|
|
339
|
+
@limitations[k] = api_data.compact.map { |n| n[:id].to_i }
|
|
340
|
+
end
|
|
208
341
|
end # LIMITATIONS.each do |k|
|
|
209
342
|
end # if raw_scope[:limitations]
|
|
210
343
|
|
|
344
|
+
# the :users key from the API is what we call :jamf_ldap_users
|
|
345
|
+
# and the :user_groups key from the API we call :ldap_user_groups
|
|
346
|
+
# See the IMPORTANT discussion above.
|
|
211
347
|
@exclusions = {}
|
|
212
348
|
if raw_scope[:exclusions]
|
|
349
|
+
|
|
213
350
|
@exclusion_keys.each do |k|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
351
|
+
# :jamf_ldap_users comes from :users in the API data
|
|
352
|
+
if k == :jamf_ldap_users
|
|
353
|
+
api_data = raw_scope[:exclusions][:users]
|
|
354
|
+
api_data ||= []
|
|
355
|
+
@exclusions[k] = api_data.compact.map { |n| n[:name].to_s }
|
|
356
|
+
|
|
357
|
+
# :ldap_user_groups comes from :user_groups in the API data
|
|
358
|
+
elsif k == :ldap_user_groups
|
|
359
|
+
api_data = raw_scope[:exclusions][:user_groups]
|
|
360
|
+
api_data ||= []
|
|
361
|
+
@exclusions[k] = api_data.compact.map { |n| n[:name].to_s }
|
|
362
|
+
|
|
363
|
+
# others handled normally.
|
|
364
|
+
else
|
|
365
|
+
api_data = raw_scope[:exclusions][k]
|
|
366
|
+
api_data ||= []
|
|
367
|
+
@exclusions[k] = api_data.compact.map { |n| n[:id].to_i }
|
|
368
|
+
end # if ...elsif... else
|
|
369
|
+
end # @exclusion_keys.each
|
|
370
|
+
end # if raw_scope[:exclusions]
|
|
218
371
|
|
|
219
372
|
@container = nil
|
|
220
373
|
end # init
|
|
@@ -266,10 +419,12 @@ module JSS
|
|
|
266
419
|
# check the idents
|
|
267
420
|
list.map! do |ident|
|
|
268
421
|
item_id = validate_item(:target, key, ident)
|
|
422
|
+
|
|
269
423
|
if @exclusions[key] && @exclusions[key].include?(item_id)
|
|
270
424
|
raise JSS::AlreadyExistsError, \
|
|
271
|
-
|
|
425
|
+
"Can't set #{key} target to '#{ident}' because it's already an explicit exclusion."
|
|
272
426
|
end
|
|
427
|
+
|
|
273
428
|
item_id
|
|
274
429
|
end # each
|
|
275
430
|
|
|
@@ -303,7 +458,7 @@ module JSS
|
|
|
303
458
|
def add_target(key, item)
|
|
304
459
|
key = pluralize_key(key)
|
|
305
460
|
item_id = validate_item(:target, key, item)
|
|
306
|
-
return if @inclusions[key] && @
|
|
461
|
+
return if @inclusions[key] && @exclusions[key].include?(item_id)
|
|
307
462
|
|
|
308
463
|
raise JSS::AlreadyExistsError, "Can't set #{key} target to '#{item}' because it's already an explicit exclusion." if @exclusions[key] && @exclusions[key].include?(item_id)
|
|
309
464
|
|
|
@@ -328,7 +483,8 @@ module JSS
|
|
|
328
483
|
key = pluralize_key(key)
|
|
329
484
|
item_id = validate_item :target, key, item, error_if_not_found: false
|
|
330
485
|
return unless item_id
|
|
331
|
-
return unless @inclusions[key] && @
|
|
486
|
+
return unless @inclusions[key] && @exclusions[key].include?(item_id)
|
|
487
|
+
|
|
332
488
|
@inclusions[key].delete item_id
|
|
333
489
|
@container.should_update if @container
|
|
334
490
|
end
|
|
@@ -357,7 +513,10 @@ module JSS
|
|
|
357
513
|
# check the idents
|
|
358
514
|
list.map! do |ident|
|
|
359
515
|
item_id = validate_item(:limitation, key, ident)
|
|
360
|
-
|
|
516
|
+
if @exclusions[key] && @exclusions[key].include?(item_id)
|
|
517
|
+
raise JSS::AlreadyExistsError, "Can't set #{key} limitation for '#{name}' because it's already an explicit exclusion."
|
|
518
|
+
end
|
|
519
|
+
|
|
361
520
|
item_id
|
|
362
521
|
end # each
|
|
363
522
|
|
|
@@ -386,9 +545,11 @@ module JSS
|
|
|
386
545
|
def add_limitation(key, item)
|
|
387
546
|
key = pluralize_key(key)
|
|
388
547
|
item_id = validate_item(:limitation, key, item)
|
|
389
|
-
return nil if @limitations[key] && @
|
|
548
|
+
return nil if @limitations[key] && @exclusions[key].include?(item_id)
|
|
390
549
|
|
|
391
|
-
|
|
550
|
+
if @exclusions[key] && @exclusions[key].include?(item_id)
|
|
551
|
+
raise JSS::AlreadyExistsError, "Can't set #{key} limitation for '#{name}' because it's already an explicit exclusion."
|
|
552
|
+
end
|
|
392
553
|
|
|
393
554
|
@limitations[key] << item_id
|
|
394
555
|
@container.should_update if @container
|
|
@@ -411,7 +572,8 @@ module JSS
|
|
|
411
572
|
key = pluralize_key(key)
|
|
412
573
|
item_id = validate_item :limitation, key, item, error_if_not_found: false
|
|
413
574
|
return unless item_id
|
|
414
|
-
return unless @limitations[key] && @
|
|
575
|
+
return unless @limitations[key] && @exclusions[key].include?(item_id)
|
|
576
|
+
|
|
415
577
|
@limitations[key].delete item_id
|
|
416
578
|
@container.should_update if @container
|
|
417
579
|
end ###
|
|
@@ -439,9 +601,11 @@ module JSS
|
|
|
439
601
|
item_id = validate_item(:exclusion, key, ident)
|
|
440
602
|
case key
|
|
441
603
|
when *@inclusion_keys
|
|
442
|
-
raise JSS::AlreadyExistsError, "Can't exclude #{key} '#{ident}' because it's already explicitly included." if @inclusions[key] && @
|
|
604
|
+
raise JSS::AlreadyExistsError, "Can't exclude #{key} '#{ident}' because it's already explicitly included." if @inclusions[key] && @exclusions[key].include?(item_id)
|
|
443
605
|
when *LIMITATIONS
|
|
444
|
-
|
|
606
|
+
if @limitations[key] && @exclusions[key].include?(item_id)
|
|
607
|
+
raise JSS::AlreadyExistsError, "Can't exclude #{key} '#{ident}' because it's already an explicit limitation."
|
|
608
|
+
end
|
|
445
609
|
end
|
|
446
610
|
item_id
|
|
447
611
|
end # each
|
|
@@ -469,7 +633,9 @@ module JSS
|
|
|
469
633
|
key = pluralize_key(key)
|
|
470
634
|
item_id = validate_item(:exclusion, key, item)
|
|
471
635
|
return if @exclusions[key] && @exclusions[key].include?(item_id)
|
|
636
|
+
|
|
472
637
|
raise JSS::AlreadyExistsError, "Can't exclude #{key} scope to '#{item}' because it's already explicitly included." if @inclusions[key] && @inclusions[key].include?(item)
|
|
638
|
+
|
|
473
639
|
raise JSS::AlreadyExistsError, "Can't exclude #{key} '#{item}' because it's already an explicit limitation." if @limitations[key] && @limitations[key].include?(item)
|
|
474
640
|
|
|
475
641
|
@exclusions[key] << item_id
|
|
@@ -491,6 +657,7 @@ module JSS
|
|
|
491
657
|
key = pluralize_key(key)
|
|
492
658
|
item_id = validate_item :exclusion, key, item, error_if_not_found: false
|
|
493
659
|
return unless @exclusions[key] && @exclusions[key].include?(item_id)
|
|
660
|
+
|
|
494
661
|
@exclusions[key].delete item_id
|
|
495
662
|
@container.should_update if @container
|
|
496
663
|
end
|
|
@@ -508,24 +675,52 @@ module JSS
|
|
|
508
675
|
@inclusions.each do |klass, list|
|
|
509
676
|
list.compact!
|
|
510
677
|
list.delete 0
|
|
511
|
-
|
|
512
|
-
scope << SCOPING_CLASSES[klass].xml_list(
|
|
678
|
+
list_as_hashes = list.map { |i| { id: i } }
|
|
679
|
+
scope << SCOPING_CLASSES[klass].xml_list(list_as_hashes, :id)
|
|
513
680
|
end
|
|
514
681
|
|
|
515
682
|
limitations = scope.add_element('limitations')
|
|
516
683
|
@limitations.each do |klass, list|
|
|
517
684
|
list.compact!
|
|
518
685
|
list.delete 0
|
|
519
|
-
|
|
520
|
-
|
|
686
|
+
if klass == :jamf_ldap_users
|
|
687
|
+
users_xml = limitations.add_element 'users'
|
|
688
|
+
list.each do |name|
|
|
689
|
+
user_xml = users_xml.add_element 'user'
|
|
690
|
+
user_xml.add_element('name').text = name
|
|
691
|
+
end
|
|
692
|
+
elsif klass == :ldap_user_groups
|
|
693
|
+
user_groups_xml = limitations.add_element 'user_groups'
|
|
694
|
+
list.each do |name|
|
|
695
|
+
user_group_xml = user_groups_xml.add_element 'user_group'
|
|
696
|
+
user_group_xml.add_element('name').text = name
|
|
697
|
+
end
|
|
698
|
+
else
|
|
699
|
+
list_as_hashes = list.map { |i| { id: i } }
|
|
700
|
+
limitations << SCOPING_CLASSES[klass].xml_list(list_as_hashes, :id)
|
|
701
|
+
end
|
|
521
702
|
end
|
|
522
703
|
|
|
523
704
|
exclusions = scope.add_element('exclusions')
|
|
524
705
|
@exclusions.each do |klass, list|
|
|
525
706
|
list.compact!
|
|
526
707
|
list.delete 0
|
|
527
|
-
|
|
528
|
-
|
|
708
|
+
if klass == :jamf_ldap_users
|
|
709
|
+
users_xml = exclusions.add_element 'users'
|
|
710
|
+
list.each do |name|
|
|
711
|
+
user_xml = users_xml.add_element 'user'
|
|
712
|
+
user_xml.add_element('name').text = name
|
|
713
|
+
end
|
|
714
|
+
elsif klass == :ldap_user_groups
|
|
715
|
+
user_groups_xml = exclusions.add_element 'user_groups'
|
|
716
|
+
list.each do |name|
|
|
717
|
+
user_group_xml = user_groups_xml.add_element 'user_group'
|
|
718
|
+
user_group_xml.add_element('name').text = name
|
|
719
|
+
end
|
|
720
|
+
else
|
|
721
|
+
list_as_hashes = list.map { |i| { id: i } }
|
|
722
|
+
exclusions << SCOPING_CLASSES[klass].xml_list(list_as_hashes, :id)
|
|
723
|
+
end
|
|
529
724
|
end
|
|
530
725
|
scope
|
|
531
726
|
end # scope_xml
|
|
@@ -551,6 +746,7 @@ module JSS
|
|
|
551
746
|
private
|
|
552
747
|
|
|
553
748
|
# look up a valid id or nil, for use in a scope type
|
|
749
|
+
# Raise an error if not found, unless error_if_not_found is falsey
|
|
554
750
|
#
|
|
555
751
|
# @param realm [Symbol] How is this key being used in the scope?
|
|
556
752
|
# :target, :limitation, or :exclusion
|
|
@@ -561,7 +757,9 @@ module JSS
|
|
|
561
757
|
# @param ident [String, Integer] A unique identifier for the item being
|
|
562
758
|
# validated, jss id, name, serial number, etc.
|
|
563
759
|
#
|
|
564
|
-
# @
|
|
760
|
+
# @param error_if_not_found [Boolean] raise an error if no match for the ident
|
|
761
|
+
#
|
|
762
|
+
# @return [Integer, String, nil] the valid id or string for the item, or nil if not found
|
|
565
763
|
#
|
|
566
764
|
def validate_item(realm, key, ident, error_if_not_found: true)
|
|
567
765
|
# which keys allowed depends on how the item is used...
|
|
@@ -573,20 +771,42 @@ module JSS
|
|
|
573
771
|
else
|
|
574
772
|
raise ArgumentError, 'Unknown realm, must be :target, :limitation, or :exclusion'
|
|
575
773
|
end
|
|
774
|
+
|
|
576
775
|
key = pluralize_key(key)
|
|
776
|
+
|
|
577
777
|
raise JSS::InvalidDataError, "#{realm} key must be one of :#{possible_keys.join(', :')}" \
|
|
578
778
|
unless possible_keys.include? key
|
|
579
779
|
|
|
580
|
-
|
|
581
|
-
|
|
780
|
+
id = nil
|
|
781
|
+
|
|
782
|
+
# id will be a string
|
|
783
|
+
if key == :jamf_ldap_users
|
|
784
|
+
id = ident if JSS::User.all_names(:refresh).include?(ident) || JSS::LDAPServer.user_in_ldap?(ident)
|
|
785
|
+
|
|
786
|
+
# id will be a string
|
|
787
|
+
elsif key == :ldap_user_groups
|
|
788
|
+
id = ident if JSS::LDAPServer.group_in_ldap? ident
|
|
789
|
+
|
|
790
|
+
# id will be an integer
|
|
791
|
+
else
|
|
792
|
+
id = SCOPING_CLASSES[key].valid_id ident
|
|
793
|
+
end
|
|
794
|
+
|
|
582
795
|
raise JSS::NoSuchItemError, "No existing #{key} matching '#{ident}'" if error_if_not_found && id.nil?
|
|
796
|
+
|
|
583
797
|
id
|
|
584
798
|
end # validate_item(type, key, ident)
|
|
585
799
|
|
|
586
800
|
# the symbols used in the API data are plural, e.g. 'network_segments'
|
|
587
801
|
# this will pluralize them, allowing us to use singulars as well.
|
|
588
802
|
def pluralize_key(key)
|
|
589
|
-
|
|
803
|
+
if LDAP_JAMF_USER_KEYS.include? key
|
|
804
|
+
:jamf_ldap_users
|
|
805
|
+
elsif LDAP_GROUP_KEYS.include? key
|
|
806
|
+
:ldap_user_groups
|
|
807
|
+
else
|
|
808
|
+
key.to_s.end_with?(ESS) ? key : "#{key}s".to_sym
|
|
809
|
+
end
|
|
590
810
|
end
|
|
591
811
|
|
|
592
812
|
end # class Scope
|