zm-ruby-client 0.10.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +58 -0
- data/Gemfile +8 -0
- data/LICENSE +674 -0
- data/README.md +47 -0
- data/SECURITY.md +21 -0
- data/lib/zm/client/account/account.rb +335 -0
- data/lib/zm/client/account/account_dls_membership_collection.rb +22 -0
- data/lib/zm/client/account/account_dls_owner_collection.rb +22 -0
- data/lib/zm/client/account/accounts_builder.rb +19 -0
- data/lib/zm/client/account/accounts_collection.rb +48 -0
- data/lib/zm/client/account.rb +7 -0
- data/lib/zm/client/ace/ace.rb +32 -0
- data/lib/zm/client/ace/aces_builder.rb +25 -0
- data/lib/zm/client/ace/aces_collection.rb +36 -0
- data/lib/zm/client/ace.rb +5 -0
- data/lib/zm/client/appointment/appointment.rb +143 -0
- data/lib/zm/client/appointment/appointment_jsns_builder.rb +125 -0
- data/lib/zm/client/appointment/appointment_jsns_initializer.rb +129 -0
- data/lib/zm/client/appointment/appointments_builder.rb +33 -0
- data/lib/zm/client/appointment/appointments_collection.rb +106 -0
- data/lib/zm/client/appointment.rb +7 -0
- data/lib/zm/client/backup/backup.rb +59 -0
- data/lib/zm/client/backup/backups_builder.rb +26 -0
- data/lib/zm/client/backup/backups_collection.rb +22 -0
- data/lib/zm/client/backup.rb +5 -0
- data/lib/zm/client/base/account_object.rb +17 -0
- data/lib/zm/client/base/admin_object.rb +45 -0
- data/lib/zm/client/base/object.rb +80 -0
- data/lib/zm/client/base/objects_builder.rb +31 -0
- data/lib/zm/client/base/objects_collection.rb +135 -0
- data/lib/zm/client/base.rb +7 -0
- data/lib/zm/client/cluster/cluster.rb +117 -0
- data/lib/zm/client/cluster/cluster_config.rb +100 -0
- data/lib/zm/client/cluster.rb +4 -0
- data/lib/zm/client/common/message.rb +10 -0
- data/lib/zm/client/common/recipients.rb +67 -0
- data/lib/zm/client/common.rb +4 -0
- data/lib/zm/client/config.rb +12 -0
- data/lib/zm/client/connector/rest_account.rb +74 -0
- data/lib/zm/client/connector/soap_account.rb +562 -0
- data/lib/zm/client/connector/soap_admin.rb +512 -0
- data/lib/zm/client/connector/soap_base.rb +65 -0
- data/lib/zm/client/connector/soap_error.rb +26 -0
- data/lib/zm/client/connector/soap_xml_builder.rb +68 -0
- data/lib/zm/client/constant.rb +217 -0
- data/lib/zm/client/contact/contact.rb +124 -0
- data/lib/zm/client/contact/contact_member.rb +73 -0
- data/lib/zm/client/contact/contacts_builder.rb +24 -0
- data/lib/zm/client/contact/contacts_collection.rb +26 -0
- data/lib/zm/client/contact/mod_group_contact.rb +74 -0
- data/lib/zm/client/contact.rb +7 -0
- data/lib/zm/client/cos/cos.rb +59 -0
- data/lib/zm/client/cos/coses_builder.rb +29 -0
- data/lib/zm/client/cos/coses_collection.rb +33 -0
- data/lib/zm/client/cos.rb +5 -0
- data/lib/zm/client/data_source.rb +5 -0
- data/lib/zm/client/distributionlist/distributionlist.rb +125 -0
- data/lib/zm/client/distributionlist/distributionlists_builder.rb +29 -0
- data/lib/zm/client/distributionlist/distributionlists_collection.rb +41 -0
- data/lib/zm/client/distributionlist.rb +5 -0
- data/lib/zm/client/document/document.rb +47 -0
- data/lib/zm/client/document/documents_builder.rb +31 -0
- data/lib/zm/client/document/documents_collection.rb +93 -0
- data/lib/zm/client/document.rb +5 -0
- data/lib/zm/client/domain/domain.rb +74 -0
- data/lib/zm/client/domain/domains_builder.rb +32 -0
- data/lib/zm/client/domain/domains_collection.rb +36 -0
- data/lib/zm/client/domain.rb +5 -0
- data/lib/zm/client/folder/folder.rb +215 -0
- data/lib/zm/client/folder/folder_grant.rb +58 -0
- data/lib/zm/client/folder/folder_retention_policy.rb +48 -0
- data/lib/zm/client/folder/folders_builder.rb +58 -0
- data/lib/zm/client/folder/folders_collection.rb +70 -0
- data/lib/zm/client/folder/mod_document_folder.rb +17 -0
- data/lib/zm/client/folder.rb +8 -0
- data/lib/zm/client/identity/identities_builder.rb +25 -0
- data/lib/zm/client/identity/identities_collection.rb +26 -0
- data/lib/zm/client/identity/identity.rb +75 -0
- data/lib/zm/client/identity.rb +5 -0
- data/lib/zm/client/license/license.rb +29 -0
- data/lib/zm/client/license/licenses_collection.rb +28 -0
- data/lib/zm/client/license.rb +4 -0
- data/lib/zm/client/message/message.rb +225 -0
- data/lib/zm/client/message/messages_builder.rb +31 -0
- data/lib/zm/client/message/messages_collection.rb +111 -0
- data/lib/zm/client/message.rb +5 -0
- data/lib/zm/client/mountpoint/mountpoint.rb +95 -0
- data/lib/zm/client/mountpoint/mountpoints_builder.rb +38 -0
- data/lib/zm/client/mountpoint/mountpoints_collection.rb +61 -0
- data/lib/zm/client/mountpoint.rb +5 -0
- data/lib/zm/client/mta_queue/mta_queue.rb +60 -0
- data/lib/zm/client/mta_queue/mta_queues_builder.rb +26 -0
- data/lib/zm/client/mta_queue/mta_queues_collection.rb +95 -0
- data/lib/zm/client/mta_queue.rb +5 -0
- data/lib/zm/client/mta_queue_item/mta_queue_item.rb +51 -0
- data/lib/zm/client/mta_queue_item/mta_queue_items_builder.rb +27 -0
- data/lib/zm/client/mta_queue_item/mta_queue_items_collection.rb +99 -0
- data/lib/zm/client/mta_queue_item.rb +5 -0
- data/lib/zm/client/resource/resource.rb +149 -0
- data/lib/zm/client/resource/resources_builder.rb +29 -0
- data/lib/zm/client/resource/resources_collection.rb +41 -0
- data/lib/zm/client/resource.rb +5 -0
- data/lib/zm/client/search_folder/search_folder.rb +63 -0
- data/lib/zm/client/search_folder/search_folders_builder.rb +26 -0
- data/lib/zm/client/search_folder/search_folders_collection.rb +28 -0
- data/lib/zm/client/search_folder.rb +5 -0
- data/lib/zm/client/server/server.rb +516 -0
- data/lib/zm/client/server/servers_builder.rb +26 -0
- data/lib/zm/client/server/servers_collection.rb +37 -0
- data/lib/zm/client/server.rb +5 -0
- data/lib/zm/client/share/share.rb +60 -0
- data/lib/zm/client/share/shares_builder.rb +23 -0
- data/lib/zm/client/share/shares_collection.rb +48 -0
- data/lib/zm/client/share.rb +5 -0
- data/lib/zm/client/signature/signature.rb +62 -0
- data/lib/zm/client/signature/signature_jsns_builder.rb +29 -0
- data/lib/zm/client/signature/signatures_builder.rb +26 -0
- data/lib/zm/client/signature/signatures_collection.rb +28 -0
- data/lib/zm/client/signature.rb +6 -0
- data/lib/zm/client/tag/tag.rb +45 -0
- data/lib/zm/client/tag/tags_builder.rb +25 -0
- data/lib/zm/client/tag/tags_collection.rb +26 -0
- data/lib/zm/client/tag.rb +5 -0
- data/lib/zm/client/task/task.rb +74 -0
- data/lib/zm/client/task/tasks_builder.rb +31 -0
- data/lib/zm/client/task/tasks_collection.rb +100 -0
- data/lib/zm/client/task.rb +5 -0
- data/lib/zm/client/upload/upload.rb +154 -0
- data/lib/zm/client/upload.rb +3 -0
- data/lib/zm/client/version.rb +18 -0
- data/lib/zm/client.rb +5 -0
- data/lib/zm/modules/common/account_common.rb +71 -0
- data/lib/zm/modules/common/cos_common.rb +463 -0
- data/lib/zm/modules/common/dl_common.rb +33 -0
- data/lib/zm/modules/common/identity_common.rb +19 -0
- data/lib/zm/modules/common/resource_common.rb +59 -0
- data/lib/zm/modules/common/signature_common.rb +16 -0
- data/lib/zm/modules/common/zimbra-attrs.json +1 -0
- data/lib/zm/utils/thread_pool.rb +72 -0
- data/lib/zm-ruby-client.rb +1 -0
- data/test/accounts.rb +62 -0
- data/test/cluster_config.rb +30 -0
- data/test/coses.rb +26 -0
- data/test/domains.rb +62 -0
- data/zm-ruby-client.gemspec +24 -0
- metadata +243 -0
@@ -0,0 +1,217 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Zm
|
4
|
+
module Client
|
5
|
+
COMMA = ','
|
6
|
+
DOUBLEPOINT = ' :: '
|
7
|
+
|
8
|
+
module Regex
|
9
|
+
UUID_REGEX = %r{[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}}
|
10
|
+
BASEDN_REGEX = %r{^uid=}
|
11
|
+
SHARED_CONTACT = %r{[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}:[0-9]+}
|
12
|
+
end
|
13
|
+
|
14
|
+
module FolderDefault
|
15
|
+
ROOT = { id: 1, name: '', path: '/', type: 'unknown' }.freeze
|
16
|
+
BRIEFCASE = { id: 16, name: 'Briefcase', path: '/Briefcase', type: 'document' }.freeze
|
17
|
+
CALENDAR = { id: 10, name: 'Calendar', path: '/Calendar', type: 'appointment' }.freeze
|
18
|
+
CHATS = { id: 14, name: 'Chats', path: '/Chats', type: 'message' }.freeze
|
19
|
+
CONTACTS = { id: 7, name: 'Contacts', path: '/Contacts', type: 'contact' }.freeze
|
20
|
+
DRAFTS = { id: 6, name: 'Drafts', path: '/Drafts', type: 'message' }.freeze
|
21
|
+
EMAILED = { id: 13, name: 'Emailed Contacts', path: '/Emailed Contacts', type: 'contact' }.freeze
|
22
|
+
INBOX = { id: 2, name: 'Inbox', path: '/Inbox', type: 'message' }.freeze
|
23
|
+
JUNK = { id: 4, name: 'Junk', path: '/Junk', type: 'message' }.freeze
|
24
|
+
SENT = { id: 5, name: 'Sent', path: '/Sent', type: 'message' }.freeze
|
25
|
+
TASKS = { id: 15, name: 'Tasks', path: '/Tasks', type: 'task' }.freeze
|
26
|
+
TRASH = { id: 3, name: 'Trash', path: '/Trash', type: 'unknown' }.freeze
|
27
|
+
|
28
|
+
ALL = [
|
29
|
+
ROOT,
|
30
|
+
BRIEFCASE,
|
31
|
+
CALENDAR,
|
32
|
+
CHATS,
|
33
|
+
CONTACTS,
|
34
|
+
DRAFTS,
|
35
|
+
EMAILED,
|
36
|
+
INBOX,
|
37
|
+
JUNK,
|
38
|
+
SENT,
|
39
|
+
TASKS,
|
40
|
+
TRASH
|
41
|
+
].freeze
|
42
|
+
|
43
|
+
IDS = ALL.map { |folder| folder[:id] }.freeze
|
44
|
+
end
|
45
|
+
|
46
|
+
module ShareType
|
47
|
+
VIEWER = :r
|
48
|
+
MANAGER = :rwidx
|
49
|
+
ADMIN = :rwidxa
|
50
|
+
end
|
51
|
+
|
52
|
+
module FolderView
|
53
|
+
UNKNOWN = 'unknown'
|
54
|
+
MESSAGE = 'message'
|
55
|
+
APPOINTMENT = 'appointment'
|
56
|
+
TASK = 'task'
|
57
|
+
DOCUMENT = 'document'
|
58
|
+
CONTACT = 'contact'
|
59
|
+
ALL = [MESSAGE, APPOINTMENT, TASK, DOCUMENT, CONTACT].freeze
|
60
|
+
end
|
61
|
+
|
62
|
+
module FolderType
|
63
|
+
FOLDER = :folder
|
64
|
+
LINK = :link
|
65
|
+
SEARCH = :search
|
66
|
+
ALL = [FOLDER, LINK, SEARCH].freeze
|
67
|
+
end
|
68
|
+
|
69
|
+
module SoapUtils
|
70
|
+
MAX_RESULT = 1_000_000
|
71
|
+
ON = 1
|
72
|
+
OFF = 0
|
73
|
+
OFFSET = 0
|
74
|
+
LIMIT_RESULT = 10_000
|
75
|
+
end
|
76
|
+
|
77
|
+
module SearchType
|
78
|
+
ACCOUNT = :accounts
|
79
|
+
DL = :distributionlists
|
80
|
+
ALIAS = :aliases
|
81
|
+
RESOURCE = :resources
|
82
|
+
DOMAIN = :domains
|
83
|
+
COS = :coses
|
84
|
+
|
85
|
+
module Attributes
|
86
|
+
ACCOUNT = %i[
|
87
|
+
displayName
|
88
|
+
zimbraId
|
89
|
+
cn
|
90
|
+
sn
|
91
|
+
zimbraMailHost
|
92
|
+
uid
|
93
|
+
zimbraCOSId
|
94
|
+
zimbraAccountStatus
|
95
|
+
zimbraLastLogonTimestamp
|
96
|
+
description
|
97
|
+
zimbraIsSystemAccount
|
98
|
+
zimbraIsDelegatedAdminAccount
|
99
|
+
zimbraAuthTokenValidityValue
|
100
|
+
zimbraMailStatus
|
101
|
+
zimbraIsAdminAccount
|
102
|
+
zimbraIsExternalVirtualAccount
|
103
|
+
].freeze
|
104
|
+
|
105
|
+
DL = %i[
|
106
|
+
displayName
|
107
|
+
zimbraId
|
108
|
+
zimbraMailHost
|
109
|
+
uid
|
110
|
+
description
|
111
|
+
zimbraMailStatus
|
112
|
+
zimbraMailAlias
|
113
|
+
].freeze
|
114
|
+
|
115
|
+
ALIAS = %i[
|
116
|
+
zimbraAliasTargetId
|
117
|
+
zimbraId
|
118
|
+
targetName
|
119
|
+
uid
|
120
|
+
type
|
121
|
+
description
|
122
|
+
zimbraIsDelegatedAdminAccount
|
123
|
+
zimbraIsAdminAccount
|
124
|
+
zimbraIsSystemResource
|
125
|
+
zimbraIsSystemAccount
|
126
|
+
zimbraIsExternalVirtualAccount
|
127
|
+
].freeze
|
128
|
+
|
129
|
+
RESOURCE = %i[
|
130
|
+
displayName
|
131
|
+
zimbraId
|
132
|
+
zimbraMailHost
|
133
|
+
uid
|
134
|
+
zimbraAccountStatus
|
135
|
+
description
|
136
|
+
zimbraCalResType
|
137
|
+
zimbraIsDelegatedAdminAccount
|
138
|
+
zimbraIsAdminAccount
|
139
|
+
zimbraIsSystemResource
|
140
|
+
zimbraIsSystemAccount
|
141
|
+
zimbraIsExternalVirtualAccount
|
142
|
+
].freeze
|
143
|
+
|
144
|
+
DOMAIN = %i[
|
145
|
+
description
|
146
|
+
zimbraDomainName
|
147
|
+
zimbraDomainStatus
|
148
|
+
zimbraId
|
149
|
+
zimbraDomainType
|
150
|
+
zimbraDomainDefaultCOSId
|
151
|
+
].freeze
|
152
|
+
|
153
|
+
COS = %i[
|
154
|
+
cn
|
155
|
+
description
|
156
|
+
zimbraMailHostPool
|
157
|
+
zimbraMailQuota
|
158
|
+
].freeze
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
module ServerServices
|
163
|
+
AMAVIS = 'amavis'
|
164
|
+
ANTIVIRUS = 'antivirus'
|
165
|
+
ANTISPAM = 'antispam'
|
166
|
+
OPENDKIM = 'opendkim'
|
167
|
+
DNSCACHE = 'dnscache'
|
168
|
+
LOGGER = 'logger'
|
169
|
+
LDAP = 'ldap'
|
170
|
+
SERVICE = 'service'
|
171
|
+
ZIMBRA = 'zimbra'
|
172
|
+
ZIMBRA_ADMIN = 'zimbraAdmin'
|
173
|
+
ZIMLET = 'zimlet'
|
174
|
+
MAILBOX = 'mailbox'
|
175
|
+
MEMCACHED = 'memcached'
|
176
|
+
SPELL = 'spell'
|
177
|
+
MTA = 'mta'
|
178
|
+
PROXY = 'proxy'
|
179
|
+
STATS = 'stats'
|
180
|
+
SNMP = 'snmp'
|
181
|
+
end
|
182
|
+
|
183
|
+
module MtaQueueName
|
184
|
+
INCOMING = 'incoming'
|
185
|
+
DEFERRED = 'deferred'
|
186
|
+
CORRUPT = 'corrupt'
|
187
|
+
ACTIVE = 'active'
|
188
|
+
HOLD = 'hold'
|
189
|
+
ALL = [INCOMING, DEFERRED, CORRUPT, ACTIVE, HOLD]
|
190
|
+
end
|
191
|
+
|
192
|
+
module MtaQueueAction
|
193
|
+
HOLD = 'hold'
|
194
|
+
RELEASE = 'release'
|
195
|
+
DELETE = 'delete'
|
196
|
+
REQUEUE = 'requeue'
|
197
|
+
end
|
198
|
+
|
199
|
+
module BackupTypes
|
200
|
+
FULL = 'full'
|
201
|
+
INCREMENTAL = 'incremental'
|
202
|
+
end
|
203
|
+
|
204
|
+
module CountTypes
|
205
|
+
USER_ACCOUNT = 'userAccount'
|
206
|
+
ACCOUNT = 'account'
|
207
|
+
ALIAS = 'alias'
|
208
|
+
DL = 'dl'
|
209
|
+
DOMAIN = 'domain'
|
210
|
+
COS = 'cos'
|
211
|
+
SERVER = 'server'
|
212
|
+
RESOURCE = 'calresource'
|
213
|
+
INTERNAL_USER_ACCOUNT = 'internalUserAccount'
|
214
|
+
ALL = [USER_ACCOUNT, ACCOUNT, ALIAS, DL, DOMAIN, COS, SERVER, RESOURCE, INTERNAL_USER_ACCOUNT]
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Zm
|
4
|
+
module Client
|
5
|
+
# class account tag
|
6
|
+
class Contact < Base::AccountObject
|
7
|
+
GROUP_PATTERN = 'group'
|
8
|
+
|
9
|
+
INSTANCE_VARIABLE_KEYS = %i[
|
10
|
+
anniversary assistantPhone birthday callbackPhone carPhone company companyPhone custom1 department email email2
|
11
|
+
email3 email4 email5 email6 email7 firstName fullName homeCity homeCountry homeFax homePhone homePostalCode
|
12
|
+
homeState homeStreet homeURL imAddress1 imAddress2 imAddress3 imAddress4 imAddress5 jobTitle lastName maidenName
|
13
|
+
middleName mobilePhone namePrefix nameSuffix nickname notes otherCity otherCountry otherFax otherPhone
|
14
|
+
otherPostalCode otherState otherStreet otherURL pager workCity workCountry workFax workPhone workPostalCode
|
15
|
+
workState workStreet workURL image
|
16
|
+
].freeze
|
17
|
+
|
18
|
+
attr_accessor *INSTANCE_VARIABLE_KEYS
|
19
|
+
attr_accessor :id, :name, :l, :type, :members, :old_members, :tn
|
20
|
+
|
21
|
+
def initialize(parent, json = nil)
|
22
|
+
@parent = parent
|
23
|
+
@members = []
|
24
|
+
@custom_keys = []
|
25
|
+
init_from_json(json) if json.is_a?(Hash)
|
26
|
+
yield(self) if block_given?
|
27
|
+
@old_members = @members.clone
|
28
|
+
end
|
29
|
+
|
30
|
+
def is_group?
|
31
|
+
@type == GROUP_PATTERN
|
32
|
+
end
|
33
|
+
|
34
|
+
def emails
|
35
|
+
[email, email2, email3, email4, email5, email6, email7].compact
|
36
|
+
end
|
37
|
+
|
38
|
+
def emails_h
|
39
|
+
{
|
40
|
+
'email' => email,
|
41
|
+
'email2' => email2,
|
42
|
+
'email3' => email3,
|
43
|
+
'email4' => email4,
|
44
|
+
'email5' => email5,
|
45
|
+
'email6' => email6,
|
46
|
+
'email7' => email7
|
47
|
+
}.compact
|
48
|
+
end
|
49
|
+
|
50
|
+
def concat
|
51
|
+
[id, name, l] + all_instance_variable_keys.map { |key| instance_variable_get(arrow_name(key)) }
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_h
|
55
|
+
hashmap = Hash[all_instance_variable_keys.map { |key| [key, instance_variable_get(arrow_name(key))] }]
|
56
|
+
hashmap.delete_if { |_, v| v.nil? }
|
57
|
+
hashmap
|
58
|
+
end
|
59
|
+
|
60
|
+
def init_from_json(json)
|
61
|
+
@id = json[:id]
|
62
|
+
@name = json[:fileAsStr]
|
63
|
+
@l = json[:l]
|
64
|
+
@tn = json[:tn]
|
65
|
+
|
66
|
+
init_instance_variable_from_json(json[:_attrs])
|
67
|
+
|
68
|
+
return unless is_group?
|
69
|
+
|
70
|
+
extend(GroupContact)
|
71
|
+
init_members_from_json(json[:m])
|
72
|
+
end
|
73
|
+
|
74
|
+
def init_instance_variable_from_json(json_attrs)
|
75
|
+
return if json_attrs.nil?
|
76
|
+
|
77
|
+
@type = json_attrs[:type]
|
78
|
+
|
79
|
+
make_custom_keys(json_attrs)
|
80
|
+
|
81
|
+
all_instance_variable_keys.each do |key|
|
82
|
+
instance_variable_set(arrow_name(key), json_attrs[key])
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def make_custom_keys(json_attrs)
|
87
|
+
@custom_keys = json_attrs.keys - INSTANCE_VARIABLE_KEYS - %i[type fileAs]
|
88
|
+
return if @custom_keys.empty?
|
89
|
+
|
90
|
+
self.class.attr_accessor(*@custom_keys)
|
91
|
+
rescue StandardError => _
|
92
|
+
@custom_keys.clear
|
93
|
+
nil
|
94
|
+
end
|
95
|
+
|
96
|
+
def all_instance_variable_keys
|
97
|
+
INSTANCE_VARIABLE_KEYS + @custom_keys
|
98
|
+
end
|
99
|
+
|
100
|
+
def add_custom_property(key, value)
|
101
|
+
instance_variable_set(arrow_name(key), value)
|
102
|
+
@custom_keys << key unless all_instance_variable_keys.include?(key)
|
103
|
+
end
|
104
|
+
|
105
|
+
def create!
|
106
|
+
rep = @parent.sacc.create_contact(@parent.token, l, instance_variables_array(all_instance_variable_keys))
|
107
|
+
init_from_json(rep[:Body][:CreateContactResponse][:cn].first)
|
108
|
+
end
|
109
|
+
|
110
|
+
def delete!
|
111
|
+
@parent.sacc.contact_action(@parent.token, :delete, id)
|
112
|
+
end
|
113
|
+
|
114
|
+
def update!(hash)
|
115
|
+
@parent.sacc.modify_contact(@parent.token, id, hash)
|
116
|
+
hash.each { |k, v| send "#{k}=", v }
|
117
|
+
end
|
118
|
+
|
119
|
+
def modify!
|
120
|
+
@parent.sacc.modify_contact(@parent.token, id, instance_variables_array(all_instance_variable_keys))
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Zm
|
4
|
+
module Client
|
5
|
+
class ConcatMember
|
6
|
+
INTERNAL = 'C'
|
7
|
+
FREE = 'I'
|
8
|
+
LDAP = 'G'
|
9
|
+
ADD = '+'
|
10
|
+
DEL = '-'
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def find_type_by_value(value)
|
14
|
+
return INTERNAL if !value.to_i.zero? || Zm::Client::Regex::SHARED_CONTACT.match(value)
|
15
|
+
return LDAP if Zm::Client::Regex::BASEDN_REGEX.match(value)
|
16
|
+
|
17
|
+
FREE
|
18
|
+
end
|
19
|
+
|
20
|
+
def init_by_value(value)
|
21
|
+
type_v = find_type_by_value(value)
|
22
|
+
new(type_v, value)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
attr_reader :type, :value, :op
|
27
|
+
|
28
|
+
def initialize(type, value, op = nil)
|
29
|
+
@op = op
|
30
|
+
@type = type
|
31
|
+
@value = value
|
32
|
+
end
|
33
|
+
|
34
|
+
def concat
|
35
|
+
[@value, @type, @op]
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_s
|
39
|
+
concat.join(' :: ')
|
40
|
+
end
|
41
|
+
|
42
|
+
def internal?
|
43
|
+
@type == INTERNAL && !Zm::Client::Regex::SHARED_CONTACT.match(value)
|
44
|
+
end
|
45
|
+
|
46
|
+
def shared?
|
47
|
+
@type == INTERNAL && Zm::Client::Regex::SHARED_CONTACT.match(value)
|
48
|
+
end
|
49
|
+
|
50
|
+
def free?
|
51
|
+
@type == FREE
|
52
|
+
end
|
53
|
+
|
54
|
+
def ldap?
|
55
|
+
@type == LDAP
|
56
|
+
end
|
57
|
+
|
58
|
+
def add!
|
59
|
+
@op = ADD
|
60
|
+
end
|
61
|
+
|
62
|
+
def remove!
|
63
|
+
@op = DEL
|
64
|
+
end
|
65
|
+
|
66
|
+
def construct_soap_node
|
67
|
+
node = { type: @type, value: @value }
|
68
|
+
node[:op] = @op unless @op.nil?
|
69
|
+
node
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Zm
|
4
|
+
module Client
|
5
|
+
# class factory [contacts]
|
6
|
+
class ContactBuilder < Base::ObjectsBuilder
|
7
|
+
|
8
|
+
def initialize(parent, json)
|
9
|
+
@parent = parent
|
10
|
+
@json = json
|
11
|
+
end
|
12
|
+
|
13
|
+
def make
|
14
|
+
root = @json[:Body][:GetContactsResponse][:cn]
|
15
|
+
return [] if root.nil?
|
16
|
+
|
17
|
+
root = [root] unless root.is_a?(Array)
|
18
|
+
root.map do |s|
|
19
|
+
Contact.new(@parent, s)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Zm
|
4
|
+
module Client
|
5
|
+
# collection account contacts
|
6
|
+
class ContactsCollection < Base::ObjectsCollection
|
7
|
+
def initialize(parent)
|
8
|
+
@parent = parent
|
9
|
+
end
|
10
|
+
|
11
|
+
def new
|
12
|
+
contact = Contact.new(@parent)
|
13
|
+
yield(contact) if block_given?
|
14
|
+
contact
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def build_response
|
20
|
+
rep = @parent.sacc.get_all_contacts(@parent.token)
|
21
|
+
cb = ContactBuilder.new @parent, rep
|
22
|
+
cb.make
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GroupContact
|
4
|
+
def init_members_from_json(m)
|
5
|
+
return if m.nil?
|
6
|
+
|
7
|
+
@members = m.map { |m| Zm::Client::ConcatMember.new(m[:type], m[:value]) }
|
8
|
+
end
|
9
|
+
|
10
|
+
def create!
|
11
|
+
rep = @parent.sacc.create_group_contact(@parent.token, l, construct_soap_attrs, construct_soap_node_members)
|
12
|
+
init_from_json(rep[:Body][:CreateContactResponse][:cn].first)
|
13
|
+
end
|
14
|
+
|
15
|
+
def modify!
|
16
|
+
@parent.sacc.modify_group_contact(@parent.token, id, construct_soap_attrs, construct_soap_node_members)
|
17
|
+
end
|
18
|
+
|
19
|
+
def construct_soap_attrs
|
20
|
+
[[:nickname, @name], [:fullname, @name], [:fileAs, "8:#{@name}"], %i[type group]]
|
21
|
+
end
|
22
|
+
|
23
|
+
def add_contacts(contacts)
|
24
|
+
contacts = [contacts] unless contacts.is_a?(Array)
|
25
|
+
new_members = contacts.map { |c| add_member_by_value(c.id) }
|
26
|
+
add_members(new_members)
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_members(new_members)
|
30
|
+
new_members = [new_members] unless new_members.is_a?(Array)
|
31
|
+
@members += new_members
|
32
|
+
end
|
33
|
+
|
34
|
+
def add_members_by_values(member_values)
|
35
|
+
member_values = [member_values] unless member_values.is_a?(Array)
|
36
|
+
current_member_values = @members.map(&:value)
|
37
|
+
member_values.reject! { |value| current_member_values.include?(value) }
|
38
|
+
member_values.each { |value| add_member_by_value(value) }
|
39
|
+
end
|
40
|
+
|
41
|
+
def add_member_by_value(value)
|
42
|
+
@members << Zm::Client::ConcatMember.init_by_value(value)
|
43
|
+
end
|
44
|
+
|
45
|
+
def delete_members(del_members)
|
46
|
+
del_members = [del_members] unless del_members.is_a?(Array)
|
47
|
+
@members -= del_members
|
48
|
+
end
|
49
|
+
|
50
|
+
def del_members_by_values(member_values)
|
51
|
+
member_values = [member_values] unless member_values.is_a?(Array)
|
52
|
+
@members.delete_if { |m| member_values.include?(m.value) }
|
53
|
+
end
|
54
|
+
|
55
|
+
def ldap_members
|
56
|
+
return [] if @members.nil?
|
57
|
+
|
58
|
+
@members.select(&:ldap?)
|
59
|
+
end
|
60
|
+
|
61
|
+
def has_ldap_members?
|
62
|
+
ldap_members.any?
|
63
|
+
end
|
64
|
+
|
65
|
+
def construct_soap_node_members
|
66
|
+
if recorded?
|
67
|
+
(old_members - @members).each(&:remove!)
|
68
|
+
(@members - old_members).each(&:add!)
|
69
|
+
(old_members + @members).uniq.reject { |m| m.op.nil? }.map(&:construct_soap_node)
|
70
|
+
else
|
71
|
+
@members.map(&:construct_soap_node)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'zm/modules/common/cos_common'
|
4
|
+
module Zm
|
5
|
+
module Client
|
6
|
+
# objectClass: zimbraCos
|
7
|
+
class Cos < Base::AdminObject
|
8
|
+
def initialize(parent)
|
9
|
+
extend(CosCommon)
|
10
|
+
super(parent)
|
11
|
+
end
|
12
|
+
|
13
|
+
def init_from_json(json)
|
14
|
+
super(json)
|
15
|
+
@zimbraMailHostPool = [@zimbraMailHostPool] if @zimbraMailHostPool.is_a?(String)
|
16
|
+
@zimbraZimletAvailableZimlets = [@zimbraZimletAvailableZimlets] if @zimbraZimletAvailableZimlets.is_a?(String)
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_h
|
20
|
+
hashmap = Hash[all_instance_variable_keys.map { |key| [key, instance_variable_get(arrow_name(key))] }]
|
21
|
+
hashmap.delete_if { |_, v| v.nil? }
|
22
|
+
hashmap
|
23
|
+
end
|
24
|
+
|
25
|
+
def all_instance_variable_keys
|
26
|
+
attrs_write
|
27
|
+
end
|
28
|
+
|
29
|
+
def duplicate(attrs = {})
|
30
|
+
# n = clone
|
31
|
+
# attrs.each{|k,v| n.instance_variable_set(k, v) }
|
32
|
+
# n.id = nil
|
33
|
+
# n.zimbraId = nil
|
34
|
+
# n
|
35
|
+
end
|
36
|
+
|
37
|
+
def modify!
|
38
|
+
# sac.modify_cos(id, instance_variables_array)
|
39
|
+
end
|
40
|
+
|
41
|
+
def create!
|
42
|
+
sac.create_cos(name, instance_variables_array(attrs_write))
|
43
|
+
end
|
44
|
+
|
45
|
+
def servers
|
46
|
+
@servers ||= read_servers
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def read_servers
|
52
|
+
sc = ServersCollection.new self
|
53
|
+
@zimbraMailHostPool.map do |server_id|
|
54
|
+
sc.find_by id: server_id
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Zm
|
4
|
+
module Client
|
5
|
+
# class factory [coses]
|
6
|
+
class CosesBuilder < Base::ObjectsBuilder
|
7
|
+
def initialize(parent, json)
|
8
|
+
super(parent, json)
|
9
|
+
@child_class = Cos
|
10
|
+
end
|
11
|
+
|
12
|
+
# def make
|
13
|
+
# return [] if json_items.nil?
|
14
|
+
#
|
15
|
+
# json_items.map do |entry|
|
16
|
+
# cos = Cos.new(@parent)
|
17
|
+
# cos.init_from_json(entry)
|
18
|
+
# cos
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def json_items
|
25
|
+
@json_items ||= @json[:Body][json_key][:cos]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Zm
|
4
|
+
module Client
|
5
|
+
# Collection coses
|
6
|
+
class CosesCollection < Base::ObjectsCollection
|
7
|
+
def initialize(parent)
|
8
|
+
@child_class = Cos
|
9
|
+
@parent = parent
|
10
|
+
reset_query_params
|
11
|
+
end
|
12
|
+
|
13
|
+
def find_by(hash, *attrs)
|
14
|
+
rep = sac.get_cos(hash.values.first, hash.keys.first, attrs.join(COMMA))
|
15
|
+
entry = rep[:Body][:GetCosResponse][:cos].first
|
16
|
+
|
17
|
+
build_from_entry(entry)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def build_response
|
23
|
+
CosesBuilder.new(@parent, make_query).make
|
24
|
+
end
|
25
|
+
|
26
|
+
def reset_query_params
|
27
|
+
super
|
28
|
+
@search_type = SearchType::COS
|
29
|
+
@attrs = SearchType::Attributes::COS.dup
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|