zm-ruby-client 0.10.4
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 +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
data/README.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# zm-ruby-client
|
|
2
|
+
|
|
3
|
+
Library to interface with Zimbra simply.
|
|
4
|
+
|
|
5
|
+
## Examples of uses:
|
|
6
|
+
|
|
7
|
+
### Connection:
|
|
8
|
+
|
|
9
|
+
```ruby
|
|
10
|
+
admin = Zm::Client::Cluster.new(Zm::Client::ClusterConfig.new('config.json'))
|
|
11
|
+
admin.login
|
|
12
|
+
````
|
|
13
|
+
or
|
|
14
|
+
```ruby
|
|
15
|
+
config = Zm::Client::ClusterConfig.new do |cc|
|
|
16
|
+
cc.zimbra_admin_host = 'mail.domain.tld'
|
|
17
|
+
cc.zimbra_admin_scheme = 'https'
|
|
18
|
+
cc.zimbra_admin_port = 443
|
|
19
|
+
cc.zimbra_admin_login = 'admin@domain.tld'
|
|
20
|
+
cc.zimbra_admin_password = 'secret'
|
|
21
|
+
end
|
|
22
|
+
admin = Zm::Client::Cluster.new(config)
|
|
23
|
+
admin.login
|
|
24
|
+
````
|
|
25
|
+
|
|
26
|
+
### List all accounts
|
|
27
|
+
|
|
28
|
+
```ruby
|
|
29
|
+
filter = '(&(mail=*@domain.tld)(zimbraLastLogonTimestamp<=20190225000000Z))'
|
|
30
|
+
accounts = admin.accounts.where(filter).all
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Find an account
|
|
34
|
+
|
|
35
|
+
```ruby
|
|
36
|
+
account = admin.accounts.find_by name: 'maxime@domain.tld'
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Create an account
|
|
40
|
+
|
|
41
|
+
```ruby
|
|
42
|
+
account = Zm::Client::Account.new(admin) do |acc|
|
|
43
|
+
acc.name = 'maxime@domain.tld'
|
|
44
|
+
end
|
|
45
|
+
account.zimbraMailQuota = 0
|
|
46
|
+
account.save
|
|
47
|
+
```
|
data/SECURITY.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported Versions
|
|
4
|
+
|
|
5
|
+
Use this section to tell people about which versions of your project are
|
|
6
|
+
currently being supported with security updates.
|
|
7
|
+
|
|
8
|
+
| Version | Supported |
|
|
9
|
+
| ------- | ------------------ |
|
|
10
|
+
| 5.1.x | :white_check_mark: |
|
|
11
|
+
| 5.0.x | :x: |
|
|
12
|
+
| 4.0.x | :white_check_mark: |
|
|
13
|
+
| < 4.0 | :x: |
|
|
14
|
+
|
|
15
|
+
## Reporting a Vulnerability
|
|
16
|
+
|
|
17
|
+
Use this section to tell people how to report a vulnerability.
|
|
18
|
+
|
|
19
|
+
Tell them where to go, how often they can expect to get an update on a
|
|
20
|
+
reported vulnerability, what to expect if the vulnerability is accepted or
|
|
21
|
+
declined, etc.
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'zm/modules/common/account_common'
|
|
4
|
+
# require_relative '../../modules/common/account_galsync'
|
|
5
|
+
require 'zm/client/connector/rest_account'
|
|
6
|
+
require 'zm/client/signature'
|
|
7
|
+
require 'zm/client/folder'
|
|
8
|
+
require 'zm/client/mountpoint'
|
|
9
|
+
require 'zm/client/search_folder'
|
|
10
|
+
require 'zm/client/share'
|
|
11
|
+
require 'zm/client/tag'
|
|
12
|
+
require 'zm/client/ace'
|
|
13
|
+
require 'zm/client/contact'
|
|
14
|
+
require 'zm/client/appointment'
|
|
15
|
+
require 'zm/client/task'
|
|
16
|
+
require 'zm/client/document'
|
|
17
|
+
# require 'zm/client/data_source'
|
|
18
|
+
require 'zm/client/message'
|
|
19
|
+
require 'zm/client/identity'
|
|
20
|
+
require 'zm/client/upload'
|
|
21
|
+
require 'addressable/uri'
|
|
22
|
+
|
|
23
|
+
module Zm
|
|
24
|
+
module Client
|
|
25
|
+
# objectClass: zimbraAccount
|
|
26
|
+
class Account < Base::AdminObject
|
|
27
|
+
attr_reader :name, :id, :token
|
|
28
|
+
attr_writer :home_url
|
|
29
|
+
attr_accessor :password, :domainkey, :company, :zimbraCOSId, :zimbraMailHost, :zimbraMailTransport, :carLicense
|
|
30
|
+
|
|
31
|
+
def initialize(parent, attrs = {})
|
|
32
|
+
extend(AccountCommon)
|
|
33
|
+
super(parent)
|
|
34
|
+
@grantee_type = 'usr'.freeze
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def init_by_hash(attrs)
|
|
38
|
+
attrs.each do |k, v|
|
|
39
|
+
self.instance_variable_set(arrow_name(k), v)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def to_h
|
|
44
|
+
hashmap = Hash[all_instance_variable_keys.map { |key| [key, instance_variable_get(arrow_name(key))] }]
|
|
45
|
+
hashmap.delete_if { |_, v| v.nil? }
|
|
46
|
+
hashmap
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def all_instance_variable_keys
|
|
50
|
+
AccountCommon::ZM_ACCOUNT_ATTRS
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def rest_account_connector
|
|
54
|
+
@rest_account_connector ||= RestAccountConnector.new
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
alias rac rest_account_connector
|
|
58
|
+
|
|
59
|
+
def logged?
|
|
60
|
+
!@token.nil?
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def login
|
|
64
|
+
if @parent.logged?
|
|
65
|
+
admin_login
|
|
66
|
+
else
|
|
67
|
+
account_login
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def account_login
|
|
72
|
+
if password
|
|
73
|
+
account_login_password
|
|
74
|
+
else
|
|
75
|
+
account_login_preauth
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def account_login_preauth
|
|
80
|
+
domain_key
|
|
81
|
+
raise ZmError, 'domain key is required to login !' if @domainkey.nil?
|
|
82
|
+
|
|
83
|
+
@token = sacc.auth_preauth(@name, @domainkey)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def account_login_password
|
|
87
|
+
raise ZmError, 'password is required to login !' if password.nil?
|
|
88
|
+
|
|
89
|
+
@token = sacc.auth_password(@name, @password)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def admin_login
|
|
93
|
+
@token = sac.delegate_auth(@name)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def domain_name
|
|
97
|
+
@name.split('@').last
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def domain_key
|
|
101
|
+
@domainkey ||= @parent.domain_key(domain_name)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def infos
|
|
105
|
+
@infos ||= read_infos
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def read_infos
|
|
109
|
+
@infos = sacc.get_info(@token)[:Body][:GetInfoResponse]
|
|
110
|
+
@id = @infos[:id]
|
|
111
|
+
@used = @infos[:used]
|
|
112
|
+
@public_url = @infos[:publicURL]
|
|
113
|
+
@zimbraCOSId = @infos[:cos][:id]
|
|
114
|
+
@home_url = @infos[:rest]
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def cos
|
|
118
|
+
@cos ||= @parent.coses.find_by(id: zimbraCOSId)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def used
|
|
122
|
+
@used ||= sac.get_mailbox(id)[:Body][:GetMailboxResponse][:mbox].first[:s]
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def public_url
|
|
126
|
+
infos if @infos.nil?
|
|
127
|
+
@public_url
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def home_url
|
|
131
|
+
infos if @infos.nil?
|
|
132
|
+
@home_url
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def messages
|
|
136
|
+
@messages ||= MessagesCollection.new(self)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def folders
|
|
140
|
+
@folders ||= FoldersCollection.new(self)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def mountpoints
|
|
144
|
+
@mountpointss ||= MountPointsCollection.new(self)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def search_folders
|
|
148
|
+
@search_folders ||= SearchFoldersCollection.new(self)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def identities
|
|
152
|
+
@identities ||= IdentitiesCollection.new(self)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def shares
|
|
156
|
+
@shares ||= SharesCollection.new(self)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def contacts
|
|
160
|
+
@contacts ||= ContactsCollection.new(self)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def appointments
|
|
164
|
+
@appointments ||= AppointmentsCollection.new(self)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def tags
|
|
168
|
+
@tags ||= TagsCollection.new(self)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def tasks
|
|
172
|
+
@tasks ||= TasksCollection.new(self)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def aces
|
|
176
|
+
@aces ||= AcesCollection.new(self)
|
|
177
|
+
end
|
|
178
|
+
alias rights aces
|
|
179
|
+
|
|
180
|
+
def signatures
|
|
181
|
+
@signatures ||= SignaturesCollection.new(self)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def data_sources
|
|
185
|
+
@data_sources ||= DataSourcesCollection.new sac, self
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def documents
|
|
189
|
+
@documents ||= DocumentsCollection.new(self)
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def message_folders
|
|
193
|
+
@message_folders ||= folders.all.select { |f| f.view == Zm::Client::FolderView::MESSAGE.to_s }
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def contact_folders
|
|
197
|
+
@contact_folders ||= folders.all.select { |f| f.view == Zm::Client::FolderView::CONTACT.to_s }
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def calendar_folders
|
|
201
|
+
@calendar_folders ||= folders.all.select { |f| f.view == Zm::Client::FolderView::APPOINTMENT.to_s }
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def task_folders
|
|
205
|
+
@task_folders ||= folders.all.select { |f| f.view == Zm::Client::FolderView::TASK.to_s }
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def document_folders
|
|
209
|
+
@document_folders ||= folders.all.select { |f| f.view == Zm::Client::FolderView::DOCUMENT.to_s }
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def delete!
|
|
213
|
+
sac.delete_account(@id)
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def update!(hash)
|
|
217
|
+
sac.modify_account(@id, hash)
|
|
218
|
+
|
|
219
|
+
hash.each do |k, v|
|
|
220
|
+
arrow_attr_sym = "@#{k}".to_sym
|
|
221
|
+
|
|
222
|
+
if v.respond_to?(:empty?) && v.empty?
|
|
223
|
+
self.remove_instance_variable(arrow_attr_sym) if self.instance_variable_get(arrow_attr_sym)
|
|
224
|
+
else
|
|
225
|
+
self.instance_variable_set(arrow_attr_sym, v)
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def modify!
|
|
231
|
+
attrs_to_modify = instance_variables_array(attrs_write)
|
|
232
|
+
return if attrs_to_modify.empty?
|
|
233
|
+
|
|
234
|
+
sac.modify_account(@id, attrs_to_modify)
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
def create!
|
|
238
|
+
rep = sac.create_account(
|
|
239
|
+
@name,
|
|
240
|
+
@password,
|
|
241
|
+
instance_variables_array(attrs_write)
|
|
242
|
+
)
|
|
243
|
+
@id = rep[:Body][:CreateAccountResponse][:account].first[:id]
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def aliases
|
|
247
|
+
@aliases ||= set_aliases
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
def set_aliases
|
|
251
|
+
return [] if zimbraMailAlias.nil?
|
|
252
|
+
return [zimbraMailAlias] if zimbraMailAlias.is_a?(String)
|
|
253
|
+
zimbraMailAlias
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def add_alias!(email)
|
|
257
|
+
sac.add_account_alias(@id, email)
|
|
258
|
+
aliases.push(email)
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
def remove_alias!(email)
|
|
262
|
+
sac.remove_account_alias(@id, email)
|
|
263
|
+
aliases.delete(email)
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
def rename!(email)
|
|
267
|
+
sac.rename_account(@id, email)
|
|
268
|
+
@name = email
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
def local_transport
|
|
272
|
+
raise Zm::Client::SoapError, 'zimbraMailHost is null' if zimbraMailHost.nil?
|
|
273
|
+
|
|
274
|
+
"lmtp:#{zimbraMailHost}:7025"
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
def local_transport!
|
|
278
|
+
update!(zimbraMailTransport: local_transport)
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
def is_local_transport?
|
|
282
|
+
return nil unless zimbraMailTransport
|
|
283
|
+
|
|
284
|
+
zimbraMailTransport.start_with?('lmtp')
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def is_external_transport?
|
|
288
|
+
return nil unless zimbraMailTransport
|
|
289
|
+
|
|
290
|
+
zimbraMailTransport.start_with?('smtp')
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
def uploader
|
|
294
|
+
@uploader ||= Upload.new(self)
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
def last_logon
|
|
298
|
+
@last_logon ||= Time.parse zimbraLastLogonTimestamp unless zimbraLastLogonTimestamp.nil?
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
def created_at
|
|
302
|
+
@created_at ||= Time.parse zimbraCreateTimestamp unless zimbraCreateTimestamp.nil?
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
def flush_cache!
|
|
306
|
+
sac.flush_cache('account', 1, @id)
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
def move_mailbox(server)
|
|
310
|
+
raise Zm::Client::SoapError, 'zimbraMailHost is null' if zimbraMailHost.nil?
|
|
311
|
+
|
|
312
|
+
sac.move_mailbox(@name, zimbraMailHost, server.name, server.id)
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
def is_on_to_move?(server)
|
|
316
|
+
resp = sac.query_mailbox_move(@name, server.id)
|
|
317
|
+
resp[:Body][:QueryMailboxMoveResponse][:account].nil?
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
def memberships
|
|
321
|
+
@memberships ||= AccountDlsMembershipCollection.new(self)
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
def dls_owner
|
|
325
|
+
@dls_owner ||= AccountDlsOwnerCollection.new(self)
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
def init_from_json(json)
|
|
329
|
+
@used = json[:used] if json[:used]
|
|
330
|
+
@zimbraMailQuota = json[:limit] if json[:limit]
|
|
331
|
+
super(json)
|
|
332
|
+
end
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Zm
|
|
4
|
+
module Client
|
|
5
|
+
# Collection Account dls membership
|
|
6
|
+
class AccountDlsMembershipCollection < Base::ObjectsCollection
|
|
7
|
+
def initialize(parent)
|
|
8
|
+
@parent = parent
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def make_query
|
|
14
|
+
@parent.sac.get_account_membership(@parent.id, :id)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def build_response
|
|
18
|
+
DistributionListsBuilder.new(@parent, make_query).make
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Zm
|
|
4
|
+
module Client
|
|
5
|
+
# Collection Account dls membership
|
|
6
|
+
class AccountDlsOwnerCollection < Base::ObjectsCollection
|
|
7
|
+
def initialize(parent)
|
|
8
|
+
@parent = parent
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def make_query
|
|
14
|
+
@parent.sac.search_directory("(zimbraACE=#{@parent.id} usr ownDistList)", SoapUtils::MAX_RESULT, nil, nil, nil, nil, nil, nil, SearchType::DL)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def build_response
|
|
18
|
+
DistributionListsBuilder.new(@parent, make_query).make
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Zm
|
|
4
|
+
module Client
|
|
5
|
+
# class factory [accounts]
|
|
6
|
+
class AccountsBuilder < Base::ObjectsBuilder
|
|
7
|
+
def initialize(parent, json)
|
|
8
|
+
super(parent, json)
|
|
9
|
+
@child_class = Account
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
def json_items
|
|
15
|
+
@json_items ||= @json[:Body][json_key][:account]
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Zm
|
|
4
|
+
module Client
|
|
5
|
+
# Collection Accounts
|
|
6
|
+
class AccountsCollection < Base::ObjectsCollection
|
|
7
|
+
def initialize(parent)
|
|
8
|
+
@child_class = Account
|
|
9
|
+
@parent = parent
|
|
10
|
+
reset_query_params
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def ldap
|
|
14
|
+
@apply_cos = 0
|
|
15
|
+
self
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def find_by(hash)
|
|
19
|
+
rep = sac.get_account(hash.values.first, hash.keys.first, attrs_comma, @apply_cos)
|
|
20
|
+
reset_query_params
|
|
21
|
+
entry = rep[:Body][:GetAccountResponse][:account].first
|
|
22
|
+
|
|
23
|
+
build_from_entry(entry)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def find_all_quotas(domain_name = nil, target_server_id = nil)
|
|
27
|
+
json = sac.get_quota_usage(domain_name, @all_servers, @limit, @offset, @sort_by, @sort_ascending, @refresh, target_server_id)
|
|
28
|
+
reset_query_params
|
|
29
|
+
AccountsBuilder.new(@parent, json).make
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def build_response
|
|
35
|
+
AccountsBuilder.new(@parent, make_query).make
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def reset_query_params
|
|
39
|
+
super
|
|
40
|
+
@search_type = SearchType::ACCOUNT
|
|
41
|
+
@attrs = SearchType::Attributes::ACCOUNT.dup
|
|
42
|
+
@all_servers = 1
|
|
43
|
+
@refresh = 0
|
|
44
|
+
@apply_cos = 1
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'zm/client/account/account'
|
|
4
|
+
require 'zm/client/account/accounts_builder'
|
|
5
|
+
require 'zm/client/account/accounts_collection'
|
|
6
|
+
require 'zm/client/account/account_dls_membership_collection'
|
|
7
|
+
require 'zm/client/account/account_dls_owner_collection'
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Zm
|
|
4
|
+
module Client
|
|
5
|
+
# class account ace
|
|
6
|
+
class Ace < Base::AccountObject
|
|
7
|
+
|
|
8
|
+
INSTANCE_VARIABLE_KEYS = %i[zid gt right d]
|
|
9
|
+
|
|
10
|
+
attr_accessor *INSTANCE_VARIABLE_KEYS
|
|
11
|
+
|
|
12
|
+
def init_from_json(json)
|
|
13
|
+
INSTANCE_VARIABLE_KEYS.each do |key|
|
|
14
|
+
var_name = "@#{key}"
|
|
15
|
+
instance_variable_set(var_name, json[key])
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def create!
|
|
20
|
+
# todo
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def delete!
|
|
24
|
+
# todo
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def rename!(new_name)
|
|
28
|
+
# todo
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Zm
|
|
4
|
+
module Client
|
|
5
|
+
# class factory [aces]
|
|
6
|
+
class AcesBuilder < Base::ObjectsBuilder
|
|
7
|
+
def initialize(parent, json)
|
|
8
|
+
@parent = parent
|
|
9
|
+
@json = json
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def make
|
|
13
|
+
root = @json[:Body][:GetRightsResponse][:ace]
|
|
14
|
+
return [] if root.nil?
|
|
15
|
+
|
|
16
|
+
root = [root] unless root.is_a?(Array)
|
|
17
|
+
root.map do |s|
|
|
18
|
+
ace = Ace.new(@parent)
|
|
19
|
+
ace.init_from_json(s)
|
|
20
|
+
ace
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Zm
|
|
4
|
+
module Client
|
|
5
|
+
# collection account aces
|
|
6
|
+
class AcesCollection < Base::ObjectsCollection
|
|
7
|
+
def initialize(parent)
|
|
8
|
+
@parent = parent
|
|
9
|
+
reset_query_params
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def new
|
|
13
|
+
ace = Ace.new(@parent)
|
|
14
|
+
yield(ace) if block_given?
|
|
15
|
+
ace
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def rights(*rights)
|
|
19
|
+
@rights = rights
|
|
20
|
+
self
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def build_response
|
|
26
|
+
rep = @parent.sacc.get_rights(@parent.token, @rights)
|
|
27
|
+
ab = AcesBuilder.new @parent, rep
|
|
28
|
+
ab.make
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def reset_query_params
|
|
32
|
+
@rights = %i[sendAs sendOnBehalfOf]
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|