ruby-jss 0.9.2 → 0.10.0a1

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.

Potentially problematic release.


This version of ruby-jss might be problematic. Click here for more details.

Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +13 -1
  3. data/README.md +7 -7
  4. data/bin/cgrouper +6 -6
  5. data/bin/netseg-update +1 -1
  6. data/lib/jss.rb +1 -0
  7. data/lib/jss/api_connection.rb +428 -44
  8. data/lib/jss/api_object.rb +119 -68
  9. data/lib/jss/api_object/account.rb +12 -12
  10. data/lib/jss/api_object/advanced_search.rb +12 -12
  11. data/lib/jss/api_object/categorizable.rb +4 -4
  12. data/lib/jss/api_object/category.rb +2 -2
  13. data/lib/jss/api_object/computer.rb +111 -58
  14. data/lib/jss/api_object/computer_invitation.rb +2 -2
  15. data/lib/jss/api_object/creatable.rb +19 -8
  16. data/lib/jss/api_object/criteriable/criteria.rb +8 -8
  17. data/lib/jss/api_object/distribution_point.rb +14 -48
  18. data/lib/jss/api_object/extension_attribute.rb +14 -11
  19. data/lib/jss/api_object/extension_attribute/computer_extension_attribute.rb +18 -18
  20. data/lib/jss/api_object/group.rb +7 -7
  21. data/lib/jss/api_object/ldap_server.rb +51 -60
  22. data/lib/jss/api_object/locatable.rb +2 -2
  23. data/lib/jss/api_object/matchable.rb +8 -9
  24. data/lib/jss/api_object/mobile_device.rb +61 -59
  25. data/lib/jss/api_object/mobile_device_application.rb +3 -3
  26. data/lib/jss/api_object/network_segment.rb +24 -19
  27. data/lib/jss/api_object/package.rb +6 -6
  28. data/lib/jss/api_object/peripheral.rb +5 -5
  29. data/lib/jss/api_object/policy.rb +5 -5
  30. data/lib/jss/api_object/restricted_software.rb +4 -4
  31. data/lib/jss/api_object/scopable/scope.rb +3 -3
  32. data/lib/jss/api_object/script.rb +1 -1
  33. data/lib/jss/api_object/self_servable.rb +3 -3
  34. data/lib/jss/api_object/self_servable/icon.rb +7 -2
  35. data/lib/jss/api_object/updatable.rb +2 -2
  36. data/lib/jss/api_object/uploadable.rb +1 -1
  37. data/lib/jss/api_object/user.rb +2 -2
  38. data/lib/jss/composer.rb +37 -10
  39. data/lib/jss/ruby_extensions/string.rb +51 -42
  40. data/lib/jss/server.rb +27 -6
  41. data/lib/jss/utility.rb +44 -0
  42. data/lib/jss/validate.rb +85 -0
  43. data/lib/jss/version.rb +1 -1
  44. metadata +5 -4
@@ -1,26 +1,26 @@
1
1
  ### Copyright 2017 Pixar
2
2
 
3
- ###
3
+ ###
4
4
  ### Licensed under the Apache License, Version 2.0 (the "Apache License")
5
5
  ### with the following modification; you may not use this file except in
6
6
  ### compliance with the Apache License and the following modification to it:
7
7
  ### Section 6. Trademarks. is deleted and replaced with:
8
- ###
8
+ ###
9
9
  ### 6. Trademarks. This License does not grant permission to use the trade
10
10
  ### names, trademarks, service marks, or product names of the Licensor
11
11
  ### and its affiliates, except as required to comply with Section 4(c) of
12
12
  ### the License and to reproduce the content of the NOTICE file.
13
- ###
13
+ ###
14
14
  ### You may obtain a copy of the Apache License at
15
- ###
15
+ ###
16
16
  ### http://www.apache.org/licenses/LICENSE-2.0
17
- ###
17
+ ###
18
18
  ### Unless required by applicable law or agreed to in writing, software
19
19
  ### distributed under the Apache License with the above modification is
20
20
  ### distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21
21
  ### KIND, either express or implied. See the Apache License for the specific
22
22
  ### language governing permissions and limitations under the Apache License.
23
- ###
23
+ ###
24
24
  ###
25
25
 
26
26
  ###
@@ -94,7 +94,7 @@ module JSS
94
94
  ### @return [void]
95
95
  ###
96
96
  def criteria= (new_criteria)
97
- unless new_criteria.kind_of? Array and new_criteria.reject{|c| c.kind_of? JSS::Criteriable::Criterion }.empty?
97
+ unless new_criteria.kind_of? Array && new_criteria.reject{|c| c.is_a? JSS::Criteriable::Criterion }.empty?
98
98
  raise JSS::InvalidDataError, "Argument must be an Array of JSS::Criteriable::Criterion instances."
99
99
  end
100
100
  new_criteria.each{ |nc| criterion_ok? nc }
@@ -140,7 +140,7 @@ module JSS
140
140
  ###
141
141
  ### @return [void]
142
142
  ###
143
- def insert_criterion(priority,criterion)
143
+ def insert_criterion(priority, criterion)
144
144
  criterion_ok? criterion
145
145
  @criteria.insert criterion[:priority], criterion
146
146
  set_priorities
@@ -26,22 +26,11 @@
26
26
  ###
27
27
  module JSS
28
28
 
29
- #####################################
30
- ### Module Variables
31
- #####################################
32
-
33
- ### the master dist. point, see JSS.master_distribution_point
34
- @@master_distribution_point = nil
35
-
36
- ### the dist point for this machine right now
37
- @@my_distribution_point =nil
38
-
39
29
  #####################################
40
30
  ### Module Methods
41
31
  #####################################
42
32
 
43
33
 
44
-
45
34
  ###
46
35
  ### A Distribution Point in the JSS
47
36
  ###
@@ -96,15 +85,6 @@ module JSS
96
85
 
97
86
  DEFAULT_MOUNTPOINT_PREFIX = "CasperDistribution-id"
98
87
 
99
- #####################################
100
- ### Class Variables
101
- #####################################
102
-
103
- @@master_distribution_point = nil
104
-
105
- @@my_distribution_point = nil
106
-
107
- #####################################
108
88
  ### Class Methods
109
89
  #####################################
110
90
 
@@ -112,21 +92,14 @@ module JSS
112
92
  ### distribution point in the JSS. If there's only one
113
93
  ### in the JSS, return it even if not marked as master.
114
94
  ###
95
+ ### @param refresh[Boolean] should the distribution point be re-queried?
96
+ ###
97
+ ### @param api[JSS::APIConnection] which API connection should we query?
98
+ ###
115
99
  ### @return [JSS::DistributionPoint]
116
100
  ###
117
- def self.master_distribution_point(refresh = false)
118
- @@master_distribution_point = nil if refresh
119
- return @@master_distribution_point if @@master_distribution_point
120
-
121
- case self.all.count
122
- when 0
123
- raise JSS::NoSuchItemError, "No distribution points defined"
124
- when 1
125
- @@master_distribution_point = self.new :id => self.all_ids[0]
126
- else
127
- @@master_distribution_point = self.new :id => :master
128
- end
129
- @@master_distribution_point
101
+ def self.master_distribution_point(refresh = false, api: JSS.api)
102
+ api.master_distribution_point refresh
130
103
  end
131
104
 
132
105
  ### Get the DistributionPoint instance for the machine running
@@ -135,20 +108,12 @@ module JSS
135
108
  ###
136
109
  ### @param refresh[Boolean] should the distribution point be re-queried?
137
110
  ###
111
+ ### @param api[JSS::APIConnection] which API connection should we query?
112
+ ###
138
113
  ### @return [JSS::DistributionPoint]
139
114
  ###
140
- def self.my_distribution_point(refresh = false)
141
- @@my_distribution_point = nil if refresh
142
- return @@my_distribution_point if @@my_distribution_point
143
-
144
- my_net_seg = JSS::NetworkSegment.my_network_segment[0]
145
- specific = if my_net_seg
146
- JSS::NetworkSegment.new(:id => my_net_seg).distribution_point
147
- else
148
- nil
149
- end
150
- @@my_distribution_point = specific ? self.new(:name => specific) : self.master_distribution_point
151
- @@my_distribution_point
115
+ def self.my_distribution_point(refresh = false, api: JSS.api)
116
+ api.my_distribution_point refresh
152
117
  end
153
118
 
154
119
  #####################################
@@ -242,7 +207,6 @@ module JSS
242
207
  ### @return [String] the ssh password as a SHA256 digest
243
208
  attr_reader :ssh_password_sha256
244
209
 
245
- ###
246
210
  ### As well as the standard :id, :name, and :data, you can
247
211
  ### instantiate this class with :id => :master, in which case you'll
248
212
  ### get the Master Distribution Point as defined in the JSS.
@@ -251,14 +215,16 @@ module JSS
251
215
  ### You can also do this more easily by calling JSS.master_distribution_point
252
216
  ###
253
217
  def initialize(args = {})
218
+ args[:api] ||= JSS.api
219
+ @api = args[:api]
254
220
 
255
221
  @init_data = nil
256
222
 
257
223
  ### looking for master?
258
224
  if args[:id] == :master
259
225
 
260
- self.class.all_ids.each do |id|
261
- @init_data = JSS.api_connection.get_rsrc("#{RSRC_BASE}/id/#{id}")[RSRC_OBJECT_KEY]
226
+ self.class.all_ids(api: @api).each do |id|
227
+ @init_data = @api.get_rsrc("#{RSRC_BASE}/id/#{id}")[RSRC_OBJECT_KEY]
262
228
  if @init_data[:is_master]
263
229
  @id = @init_data[:id]
264
230
  @name = @init_data[:name]
@@ -201,15 +201,15 @@ module JSS
201
201
  ### @see JSS::APIObject#delete
202
202
  ###
203
203
  def delete
204
- orig_open_timeout = JSS.api_connection.cnx.options[:open_timeout]
205
- orig_timeout = JSS.api_connection.cnx.options[:timeout]
206
- JSS.api_connection.timeout = orig_timeout + 1800
207
- JSS.api_connection.open_timeout = orig_open_timeout + 1800
204
+ orig_open_timeout = @api.cnx.options[:open_timeout]
205
+ orig_timeout = @api.cnx.options[:timeout]
206
+ @api.timeout = orig_timeout + 1800
207
+ @api.open_timeout = orig_open_timeout + 1800
208
208
  begin
209
209
  super
210
210
  ensure
211
- JSS.api_connection.timeout = orig_timeout
212
- JSS.api_connection.open_timeout = orig_open_timeout
211
+ @api.timeout = orig_timeout
212
+ @api.open_timeout = orig_open_timeout
213
213
  end
214
214
  end
215
215
 
@@ -333,7 +333,7 @@ module JSS
333
333
  begin
334
334
 
335
335
  search_class = self.class::TARGET_CLASS::SEARCH_CLASS
336
- acs = search_class.new :id => :new, :name => "JSSgem-EA-#{Time.now.to_jss_epoch}-result-search"
336
+ acs = search_class.new api: @api, :id => :new, :name => "ruby-jss-EA-result-search-#{Time.now.to_jss_epoch}"
337
337
  acs.display_fields = [@name]
338
338
  crit_list = [JSS::Criteriable::Criterion.new(:and_or => "and", :name => @name, :search_type => search_type.to_s, :value => desired_value)]
339
339
  acs.criteria = JSS::Criteriable::Criteria.new crit_list
@@ -387,11 +387,11 @@ module JSS
387
387
  ###
388
388
  def latest_values
389
389
  raise JSS::NoSuchItemError, "EA Not In JSS! Use #create to create this #{self.class::RSRC_OBJECT_KEY}." unless @in_jss
390
- tmp_advsrch = "JSSgem-EA-#{Time.now.to_jss_epoch}-latest-search"
390
+ tmp_advsrch = "ruby-jss-EA-latest-search-#{Time.now.to_jss_epoch}"
391
391
 
392
392
  begin
393
393
  search_class = self.class::TARGET_CLASS::SEARCH_CLASS
394
- acs = search_class.new :id => :new, :name => tmp_advsrch
394
+ acs = search_class.new id: :new, name: tmp_advsrch, api: @api
395
395
  acs.display_fields = self.class::TARGET_CLASS == JSS::User ? [@name, USERNAME_FIELD] : [@name, USERNAME_FIELD, LAST_RECON_FIELD]
396
396
 
397
397
  # search for 'Username like "" ' because all searchable object classes have a "Username" value
@@ -415,8 +415,11 @@ module JSS
415
415
  end #acs.search_results.each
416
416
 
417
417
  ensure
418
- acs.delete
419
- self.class::TARGET_CLASS::SEARCH_CLASS.new(:name => tmp_advsrch).delete if self.class::TARGET_CLASS::SEARCH_CLASS.all_names(:refresh).include? tmp_advsrch
418
+ if defined? acs
419
+ acs.delete
420
+ else
421
+ search_class.fetch(:name => tmp_advsrch, api: @api).delete if search_class.all_names(:refresh, api: @api).include? tmp_advsrch
422
+ end
420
423
  end
421
424
 
422
425
  results
@@ -1,26 +1,26 @@
1
1
  ### Copyright 2017 Pixar
2
2
 
3
- ###
3
+ ###
4
4
  ### Licensed under the Apache License, Version 2.0 (the "Apache License")
5
5
  ### with the following modification; you may not use this file except in
6
6
  ### compliance with the Apache License and the following modification to it:
7
7
  ### Section 6. Trademarks. is deleted and replaced with:
8
- ###
8
+ ###
9
9
  ### 6. Trademarks. This License does not grant permission to use the trade
10
10
  ### names, trademarks, service marks, or product names of the Licensor
11
11
  ### and its affiliates, except as required to comply with Section 4(c) of
12
12
  ### the License and to reproduce the content of the NOTICE file.
13
- ###
13
+ ###
14
14
  ### You may obtain a copy of the Apache License at
15
- ###
15
+ ###
16
16
  ### http://www.apache.org/licenses/LICENSE-2.0
17
- ###
17
+ ###
18
18
  ### Unless required by applicable law or agreed to in writing, software
19
19
  ### distributed under the Apache License with the above modification is
20
20
  ### distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21
21
  ### KIND, either express or implied. See the Apache License for the specific
22
22
  ### language governing permissions and limitations under the Apache License.
23
- ###
23
+ ###
24
24
  ###
25
25
 
26
26
  ###
@@ -81,10 +81,10 @@ module JSS
81
81
 
82
82
  ### these ext attribs are related to these kinds of objects
83
83
  TARGET_CLASS = JSS::Computer
84
-
84
+
85
85
  ### A criterion that will return all members of the TARGET_CLASS
86
86
  ALL_TARGETS_CRITERION = JSS::Criteriable::Criterion.new(:and_or => "and", :name => "Username", :search_type => "like", :value => '')
87
-
87
+
88
88
  ### When the intput type is script, what platforms can they run on?
89
89
  PLATFORMS = ["Mac","Windows"]
90
90
 
@@ -111,12 +111,12 @@ module JSS
111
111
  ### scripts defined when the type is "script",
112
112
  ### however the API will only return the Mac script info if both are defined.
113
113
  ###
114
- ### @return [String]
114
+ ### @return [String]
115
115
  attr_reader :platform
116
116
 
117
117
  ### @return [String] the script code that will be executed when the @input_type is "script",
118
118
  attr_reader :script
119
-
119
+
120
120
 
121
121
  ### The scripting language of the @script when @input_type is "script",
122
122
  ### and the @platform is "Windows"
@@ -246,7 +246,7 @@ module JSS
246
246
  @script = new_val
247
247
  @need_to_update = true
248
248
  end #
249
-
249
+
250
250
 
251
251
  ###
252
252
  ### Change the scripting_language of this EA.
@@ -288,12 +288,12 @@ module JSS
288
288
  raise JSS::InvalidConnectionError, "Database connection required for 'history' query." unless JSS::DB_CNX.connected?
289
289
 
290
290
  computer_id = case computer
291
- when *JSS::Computer.all_ids
291
+ when *JSS::Computer.all_ids(api: @api)
292
292
  computer
293
- when *JSS::Computer.all_names
294
- JSS::Computer.map_all_ids_to(:name).invert[computer]
293
+ when *JSS::Computer.all_names(api: @api)
294
+ JSS::Computer.map_all_ids_to(:name, api: @api).invert[computer]
295
295
  else nil
296
- end # case
296
+ end # case
297
297
 
298
298
  raise JSS::NoSuchItemError, "No computer found matching '#{computer}'" unless computer_id
299
299
 
@@ -323,12 +323,12 @@ module JSS
323
323
 
324
324
  history
325
325
  end # history
326
-
327
-
326
+
327
+
328
328
  ### Aliases here, since YARD seems to have issues with them above
329
329
  alias code script
330
330
  alias code= script=
331
-
331
+
332
332
  ######################
333
333
  ### Private Instance Methods
334
334
  #####################
@@ -88,16 +88,16 @@ module JSS
88
88
  ### Returns an Array of all the smart
89
89
  ### groups.
90
90
  ###
91
- def self.all_smart(refresh = false)
92
- self.all(refresh).select{|g| g[:is_smart] }
91
+ def self.all_smart(refresh = false, api: JSS.api)
92
+ all(refresh, api: api).select{|g| g[:is_smart] }
93
93
  end
94
94
 
95
95
  ###
96
96
  ### Returns an Array of all the static
97
97
  ### groups.
98
98
  ###
99
- def self.all_static(refresh = false)
100
- self.all(refresh).select{|g| not g[:is_smart] }
99
+ def self.all_static(refresh = false, api: JSS.api)
100
+ all(refresh, api: api).select{|g| not g[:is_smart] }
101
101
  end
102
102
 
103
103
  #####################################
@@ -304,7 +304,7 @@ module JSS
304
304
  ### @return [Array<Hash>] the refresh membership
305
305
  ###
306
306
  def refresh_members
307
- @members = JSS.api_connection.get_rsrc(@rest_rsrc)[self.class::RSRC_OBJECT_KEY][self.class::MEMBER_CLASS::RSRC_LIST_KEY]
307
+ @members = @api.get_rsrc(@rest_rsrc)[self.class::RSRC_OBJECT_KEY][self.class::MEMBER_CLASS::RSRC_LIST_KEY]
308
308
  end
309
309
 
310
310
  ###
@@ -315,7 +315,7 @@ module JSS
315
315
  ### @return [void]
316
316
  ###
317
317
  def site= (new_val)
318
- raise JSS::NoSuchItemError, "No site named #{new_val} in the JSS" unless JSS::Site.all_names.include? new_val
318
+ raise JSS::NoSuchItemError, "No site named #{new_val} in the JSS" unless JSS::Site.all_names(api: @api).include? new_val
319
319
  @site = new_val
320
320
  @need_to_update = true
321
321
  end
@@ -341,7 +341,7 @@ module JSS
341
341
  ### @return [Hash{:id=>Integer,:name=>String}] the valid id and name
342
342
  ###
343
343
  def check_member(m)
344
- potential_members = self.class::MEMBER_CLASS.map_all_ids_to(:name)
344
+ potential_members = self.class::MEMBER_CLASS.map_all_ids_to(:name, api: @api)
345
345
  if m.to_s =~ /^\d+$/
346
346
  return {:id=>m.to_i, :name=> potential_members[m]} if potential_members.keys.include? m.to_i
347
347
  else
@@ -1,26 +1,26 @@
1
1
  ### Copyright 2017 Pixar
2
2
 
3
- ###
3
+ ###
4
4
  ### Licensed under the Apache License, Version 2.0 (the "Apache License")
5
5
  ### with the following modification; you may not use this file except in
6
6
  ### compliance with the Apache License and the following modification to it:
7
7
  ### Section 6. Trademarks. is deleted and replaced with:
8
- ###
8
+ ###
9
9
  ### 6. Trademarks. This License does not grant permission to use the trade
10
10
  ### names, trademarks, service marks, or product names of the Licensor
11
11
  ### and its affiliates, except as required to comply with Section 4(c) of
12
12
  ### the License and to reproduce the content of the NOTICE file.
13
- ###
13
+ ###
14
14
  ### You may obtain a copy of the Apache License at
15
- ###
15
+ ###
16
16
  ### http://www.apache.org/licenses/LICENSE-2.0
17
- ###
17
+ ###
18
18
  ### Unless required by applicable law or agreed to in writing, software
19
19
  ### distributed under the Apache License with the above modification is
20
20
  ### distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21
21
  ### KIND, either express or implied. See the Apache License for the specific
22
22
  ### language governing permissions and limitations under the Apache License.
23
- ###
23
+ ###
24
24
  ###
25
25
 
26
26
  ###
@@ -49,21 +49,21 @@ module JSS
49
49
  ### LDAP servers, and checking group membership.
50
50
  ###
51
51
  ### When an LDAPServer instance is created, if it
52
- ### uses anonymous binding for lookups (the Authentication Type is set to 'none') then
52
+ ### uses anonymous binding for lookups (the Authentication Type is set to 'none') then
53
53
  ### the LDAP connection is established immediately. Otherwise, you must use the {#connect}
54
54
  ### method, and provide the appropriate password for the lookup account defined.
55
55
  ###
56
- ### Since LDAP server connections are used to verify the validity of LDAP users & groups used in
56
+ ### Since LDAP server connections are used to verify the validity of LDAP users & groups used in
57
57
  ### scopes, if you don't connect to all LDAP servers before modifying any scope's user & group
58
58
  ### limitations or exceptions, those new values may not be verifiable. Unverified limitations and
59
- ### exceptions, when sent to the API, will result in a REST 409 Conflict error if the user or
59
+ ### exceptions, when sent to the API, will result in a REST 409 Conflict error if the user or
60
60
  ### group doesn't exist. Unfortunately, 409 Conflict errors are very generic and don't indicate the
61
- ### source of the problem (in this case, a non-existent user or group limitation or exception to the
61
+ ### source of the problem (in this case, a non-existent user or group limitation or exception to the
62
62
  ### scope). The {JSS::Scopable} module tries to catch these errors and raise a more useful
63
63
  ### exception when they happen.
64
64
  ###
65
65
  ### The class method {LDAPServer.all_ldaps} returns a Hash of JSS::LDAPServer instances.
66
- ### one for each server defined in the JSS.
66
+ ### one for each server defined in the JSS.
67
67
  ###
68
68
  ### The class methods {LDAPServer.user_in_ldap?} and {LDAPServer.group_in_ldap?} can be
69
69
  ### used to check all defined LDAP servers for a user or group. They are used by
@@ -76,44 +76,33 @@ module JSS
76
76
  ###
77
77
  class LDAPServer < JSS::APIObject
78
78
 
79
- #####################################
80
- ### Mix-Ins
81
- #####################################
82
79
 
83
- #####################################
84
- ### Class Variables
85
- #####################################
86
-
87
- @@all_ldaps = nil
88
-
89
- #####################################
90
80
  ### Class Methods
91
81
  #####################################
92
-
82
+
83
+ ### DEPRECATED: Please Use ::all_objects
93
84
  ###
94
85
  ### @param refresh[Boolean] should the LDAP server data be re-read from the API?
95
86
  ###
96
87
  ### @return [Hash{String => JSS::LDAPServer}] JSS::LDAPServer instances for all defined servers
97
88
  ###
98
- def self.all_ldaps(refresh = false)
99
- @@all_ldaps = nil if refresh
100
- return @@all_ldaps if @@all_ldaps
101
-
102
- @@all_ldaps = {}
103
- JSS::LDAPServer.all.each { |svr| @@all_ldaps[svr[:name]] = JSS::LDAPServer.new(:id =>svr[:id])}
104
-
105
- @@all_ldaps
89
+ def self.all_ldaps(refresh = false, api: JSS.api)
90
+ hash = {}
91
+ all_objects(refresh, api: api) { |ls| hash[ls.name] = s }
92
+ hash
106
93
  end
107
-
94
+
108
95
  ###
109
96
  ### @param user[String] a username to search for in all LDAP servers
110
97
  ###
111
98
  ### @return [Boolean] does the user exist in any LDAP server?
112
99
  ###
113
- def self.user_in_ldap? (user)
114
- gotuser = false
115
- self.all_ldaps.values.each{|ldap| gotuser = true unless ldap.find_user(user, :exact).empty? }
116
- return gotuser
100
+ def self.user_in_ldap?(user, api: JSS.api)
101
+ all_objects(refresh, api: api).each do |ldap|
102
+ next if ldap.find_user(user, :exact).empty?
103
+ return true
104
+ end
105
+ false
117
106
  end
118
107
 
119
108
  ###
@@ -121,10 +110,12 @@ module JSS
121
110
  ###
122
111
  ### @return [Boolean] does the group exist in any LDAP server?
123
112
  ###
124
- def self.group_in_ldap? (group)
125
- gotgroup = false
126
- self.all_ldaps.values.each{|ldap| gotgroup = true unless ldap.find_group(group, :exact).empty? }
127
- return gotgroup
113
+ def self.group_in_ldap? (group, api: JSS.api)
114
+ all_objects(refresh, api: api).each do |ldap|
115
+ next if ldap.find_group(group, :exact).empty?
116
+ return true
117
+ end
118
+ false
128
119
  end
129
120
 
130
121
 
@@ -258,10 +249,10 @@ module JSS
258
249
  ### - :map_user_membership_to_group_field =>
259
250
  ###
260
251
  attr_reader :user_group_membership_mappings
261
-
252
+
262
253
  ### @return [Boolean] we we connected to this server at the moment?
263
254
  attr_reader :connected
264
-
255
+
265
256
  #####################################
266
257
  ### Constructor
267
258
  #####################################
@@ -313,7 +304,7 @@ module JSS
313
304
 
314
305
  @connection = nil
315
306
  @connected = false
316
-
307
+
317
308
  # If we are using anonymous binding, connect now
318
309
  connect if @authentication_type == :anonymous
319
310
  end
@@ -333,9 +324,9 @@ module JSS
333
324
  ### @return [Array<Hash>] The @user_attrs_to_get for all usernames matching the query
334
325
  ###
335
326
  def find_user(user, exact = false, additional_filter = nil)
336
-
327
+
337
328
  raise JSS::InvalidConnectionError, "Not connected to LDAP server '#{@name}'. Please use #connect first." unless @connected
338
-
329
+
339
330
  if @use_wildcards and not exact
340
331
  user_filter = Net::LDAP::Filter.contains(@user_mappings[:map_username], user)
341
332
  else
@@ -391,9 +382,9 @@ module JSS
391
382
  ### @return [Array<Hash>] The @user_group_attrs_to_get for all groups matching the query
392
383
  ###
393
384
  def find_group(group, exact = false, additional_filter = nil)
394
-
385
+
395
386
  raise JSS::InvalidConnectionError, "Not connected to LDAP server '#{@name}'. Please use #connect first." unless @connected
396
-
387
+
397
388
  if @use_wildcards and not exact
398
389
  group_filter = Net::LDAP::Filter.contains(@user_group_mappings[:map_group_name], group)
399
390
  else
@@ -448,9 +439,9 @@ module JSS
448
439
  ### @todo Implement checking groups membership in 'other' ldap area
449
440
  ###
450
441
  def check_membership(user, group)
451
-
442
+
452
443
  raise JSS::InvalidConnectionError, "Not connected to LDAP server '#{@name}'. Please use #connect first." unless @connected
453
-
444
+
454
445
  found_user = find_user(user, :exact)[0]
455
446
  found_group = find_group(group, :exact)[0]
456
447
 
@@ -492,15 +483,15 @@ module JSS
492
483
  ### @param pw[String,Symbol] the LDAP connection password for this server. Can be nil if
493
484
  ### authentication type is 'none'.
494
485
  ### If :prompt, the user is promted on the commandline to enter the password for the :user.
495
- ### If :stdin#, the password is read from a line of std in represented by the digit at #,
496
- ### so :stdin3 reads the passwd from the third line of standard input. defaults to line 2,
486
+ ### If :stdin#, the password is read from a line of std in represented by the digit at #,
487
+ ### so :stdin3 reads the passwd from the third line of standard input. defaults to line 2,
497
488
  ### if no digit is supplied. see {JSS.stdin}
498
489
  ###
499
490
  ###
500
491
  ### @return [Boolean] did we connect to the LDAP server with the defined credentials
501
492
  ###
502
493
  def connect(pw = nil)
503
-
494
+
504
495
  unless @authentication_type == :anonymous
505
496
  # how do we get the password?
506
497
  password = if pw == :prompt
@@ -513,24 +504,24 @@ module JSS
513
504
  else
514
505
  pw
515
506
  end
516
-
517
-
507
+
508
+
518
509
  raise JSS::InvalidDataError, "Incorrect password for LDAP connection account '#{@lookup_dn}'" unless @lookup_pw_sha256 == Digest::SHA2.new(256).update(password.to_s).to_s
519
- end # unless
510
+ end # unless
520
511
 
521
512
  @connection = Net::LDAP.new :host => @hostname, :port => @port, :auth => {:method => @authentication_type, :username => @lookup_dn, :password => password }
522
-
513
+
523
514
  @connected = true
524
515
  end # connect
525
-
526
-
527
-
516
+
517
+
518
+
528
519
  ###
529
520
  ### Aliases
530
521
  ###
531
-
522
+
532
523
  alias connected? connected
533
-
524
+
534
525
  end # class ldap server
535
526
 
536
527
  end # module