zm-ruby-client 2.2.7 → 3.0.0
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/.rubocop.yml +6 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +10 -6
- data/Gemfile +1 -6
- data/README.md +10 -15
- data/VERSION +1 -1
- data/lib/zm/client/account/account.rb +35 -22
- data/lib/zm/client/account/account_aliases_collection.rb +14 -6
- data/lib/zm/client/account/account_dls_membership_collection.rb +10 -4
- data/lib/zm/client/account/account_dls_owner_collection.rb +8 -5
- data/lib/zm/client/account/account_jsns_builder.rb +31 -19
- data/lib/zm/client/account/account_jsns_initializer.rb +4 -14
- data/lib/zm/client/account/accounts_builder.rb +1 -1
- data/lib/zm/client/account/accounts_collection.rb +15 -8
- data/lib/zm/client/ace/ace.rb +5 -5
- data/lib/zm/client/ace/ace_jsns_builder.rb +8 -8
- data/lib/zm/client/ace/ace_jsns_initializer.rb +7 -7
- data/lib/zm/client/ace/aces_builder.rb +1 -1
- data/lib/zm/client/ace/aces_collection.rb +2 -2
- data/lib/zm/client/appointment/appointment.rb +27 -24
- data/lib/zm/client/appointment/appointment_jsns_builder.rb +29 -20
- data/lib/zm/client/appointment/appointment_jsns_initializer.rb +14 -13
- data/lib/zm/client/appointment/appointments_builder.rb +1 -1
- data/lib/zm/client/appointment/appointments_collection.rb +8 -7
- data/lib/zm/client/backup/backup.rb +6 -2
- data/lib/zm/client/backup/backup_jsns_initializer.rb +14 -12
- data/lib/zm/client/backup/backups_builder.rb +1 -1
- data/lib/zm/client/backup/backups_collection.rb +2 -1
- data/lib/zm/client/base/account_search_objects_collection.rb +46 -20
- data/lib/zm/client/base/admin_objects_collection.rb +22 -27
- data/lib/zm/client/base/base_account_jsns_builder.rb +1 -4
- data/lib/zm/client/base/base_jsns_initializer.rb +8 -8
- data/lib/zm/client/base/mailbox_infos_collection.rb +23 -15
- data/lib/zm/client/base/mailbox_object.rb +174 -69
- data/lib/zm/client/base/mailbox_prefs_collection.rb +4 -8
- data/lib/zm/client/base/object.rb +2 -2
- data/lib/zm/client/base/objects_builder.rb +7 -3
- data/lib/zm/client/base/objects_collection.rb +4 -13
- data/lib/zm/client/base/zimbra_attribute.rb +4 -17
- data/lib/zm/client/base/zimbra_attributes_collection.rb +16 -9
- data/lib/zm/client/base.rb +0 -1
- data/lib/zm/client/cluster/batch_request.rb +50 -0
- data/lib/zm/client/cluster/cluster.rb +49 -27
- data/lib/zm/client/cluster/cluster_config.rb +129 -40
- data/lib/zm/client/common/recipients.rb +2 -2
- data/lib/zm/client/common/utils.rb +1 -13
- data/lib/zm/client/common.rb +0 -1
- data/lib/zm/client/connector/{rest_account.rb → rest_connector.rb} +40 -50
- data/lib/zm/client/connector/soap_account.rb +19 -15
- data/lib/zm/client/connector/soap_admin.rb +9 -9
- data/lib/zm/client/connector/soap_base.rb +24 -17
- data/lib/zm/client/connector/soap_error.rb +3 -23
- data/lib/zm/client/constant.rb +18 -16
- data/lib/zm/client/contact/contact.rb +21 -40
- data/lib/zm/client/contact/contact_jsns_builder.rb +1 -1
- data/lib/zm/client/contact/contact_jsns_initializer.rb +4 -26
- data/lib/zm/client/contact/contacts_builder.rb +1 -1
- data/lib/zm/client/contact/contacts_collection.rb +4 -24
- data/lib/zm/client/contact/group_contact_jsns_builder.rb +18 -13
- data/lib/zm/client/contact/mod_group_contact.rb +6 -2
- data/lib/zm/client/cos/cos.rb +35 -11
- data/lib/zm/client/cos/cos_domains_collection.rb +1 -1
- data/lib/zm/client/cos/cos_jsns_builder.rb +22 -9
- data/lib/zm/client/cos/cos_jsns_initializer.rb +2 -6
- data/lib/zm/client/cos/cos_servers_collection.rb +5 -6
- data/lib/zm/client/cos/coses_builder.rb +1 -1
- data/lib/zm/client/cos/coses_collection.rb +6 -4
- data/lib/zm/client/datasource/datasource.rb +27 -34
- data/lib/zm/client/datasource/datasource_jsns_builder.rb +1 -1
- data/lib/zm/client/datasource/datasource_jsns_initializer.rb +5 -6
- data/lib/zm/client/datasource/datasources_builder.rb +6 -9
- data/lib/zm/client/datasource/datasources_collection.rb +6 -5
- data/lib/zm/client/distributionlist/distributionlist.rb +22 -42
- data/lib/zm/client/distributionlist/distributionlist_aliases_collection.rb +14 -6
- data/lib/zm/client/distributionlist/distributionlist_jsns_builder.rb +20 -16
- data/lib/zm/client/distributionlist/distributionlist_jsns_initializer.rb +2 -11
- data/lib/zm/client/distributionlist/distributionlist_members_collection.rb +20 -12
- data/lib/zm/client/distributionlist/distributionlist_owners_collection.rb +16 -5
- data/lib/zm/client/distributionlist/distributionlists_builder.rb +1 -1
- data/lib/zm/client/distributionlist/distributionlists_collection.rb +12 -6
- data/lib/zm/client/distributionlist/dls_membership_collection.rb +12 -6
- data/lib/zm/client/document/document.rb +16 -8
- data/lib/zm/client/document/document_jsns_builder.rb +1 -1
- data/lib/zm/client/document/document_jsns_initializer.rb +27 -26
- data/lib/zm/client/document/documents_builder.rb +1 -1
- data/lib/zm/client/document/documents_collection.rb +1 -1
- data/lib/zm/client/domain/domain.rb +18 -37
- data/lib/zm/client/domain/domain_accounts_collection.rb +1 -1
- data/lib/zm/client/domain/domain_distributionlists_collection.rb +1 -1
- data/lib/zm/client/domain/domain_jsns_builder.rb +18 -9
- data/lib/zm/client/domain/domain_jsns_initializer.rb +2 -6
- data/lib/zm/client/domain/domain_resources_collection.rb +1 -1
- data/lib/zm/client/domain/domains_builder.rb +1 -1
- data/lib/zm/client/domain/domains_collection.rb +12 -6
- data/lib/zm/client/filter_rules/filter_rule.rb +0 -9
- data/lib/zm/client/filter_rules/filter_rule_jsns_initializer.rb +7 -6
- data/lib/zm/client/filter_rules/filter_rules_builder.rb +1 -1
- data/lib/zm/client/filter_rules/filter_rules_collection.rb +5 -15
- data/lib/zm/client/filter_rules/outgoing_filter_rules_collection.rb +5 -2
- data/lib/zm/client/folder/folder.rb +73 -56
- data/lib/zm/client/folder/folder_grant.rb +7 -5
- data/lib/zm/client/folder/folder_grant_jsns_builder.rb +6 -3
- data/lib/zm/client/folder/folder_grants_collection.rb +2 -4
- data/lib/zm/client/folder/folder_jsns_builder.rb +14 -7
- data/lib/zm/client/folder/folder_jsns_initializer.rb +58 -40
- data/lib/zm/client/folder/folder_retention_policies_collection.rb +4 -2
- data/lib/zm/client/folder/folders_builder.rb +1 -1
- data/lib/zm/client/folder/folders_collection.rb +21 -18
- data/lib/zm/client/folder/folders_jsns_builder.rb +4 -2
- data/lib/zm/client/folder/mod_document_folder.rb +5 -4
- data/lib/zm/client/identity/identities_builder.rb +1 -1
- data/lib/zm/client/identity/identities_collection.rb +6 -5
- data/lib/zm/client/identity/identity.rb +9 -29
- data/lib/zm/client/identity/identity_jsns_builder.rb +8 -4
- data/lib/zm/client/identity/identity_jsns_initializer.rb +5 -4
- data/lib/zm/client/license/license.rb +7 -1
- data/lib/zm/client/license/license_jsns_initializer.rb +8 -5
- data/lib/zm/client/license/licenses_collection.rb +1 -1
- data/lib/zm/client/mailbox/mailbox_item_concern.rb +33 -0
- data/lib/zm/client/mailbox/mailbox_item_id.rb +7 -0
- data/lib/zm/client/message/attachments_collection.rb +2 -2
- data/lib/zm/client/message/message.rb +56 -52
- data/lib/zm/client/message/message_flags.rb +21 -13
- data/lib/zm/client/message/message_jsns_builder.rb +11 -6
- data/lib/zm/client/message/message_jsns_initializer.rb +24 -23
- data/lib/zm/client/message/messages_builder.rb +1 -1
- data/lib/zm/client/message/messages_collection.rb +1 -15
- data/lib/zm/client/mountpoint/mountpoint.rb +17 -25
- data/lib/zm/client/mountpoint/mountpoint_jsns_builder.rb +6 -3
- data/lib/zm/client/mountpoint/mountpoint_jsns_initializer.rb +25 -24
- data/lib/zm/client/mountpoint/mountpoints_builder.rb +1 -1
- data/lib/zm/client/mountpoint/mountpoints_collection.rb +13 -9
- data/lib/zm/client/mta_queue/mta_queue.rb +6 -2
- data/lib/zm/client/mta_queue/mta_queue_jsns_initializer.rb +3 -7
- data/lib/zm/client/mta_queue/mta_queues_builder.rb +3 -1
- data/lib/zm/client/mta_queue_item/mta_queue_item.rb +5 -3
- data/lib/zm/client/mta_queue_item/mta_queue_item_jsns_initializer.rb +1 -5
- data/lib/zm/client/mta_queue_item/mta_queue_items_builder.rb +3 -1
- data/lib/zm/client/mta_queue_item/mta_queue_items_collection.rb +3 -1
- data/lib/zm/client/resource/resource.rb +6 -18
- data/lib/zm/client/resource/resource_jsns_builder.rb +20 -13
- data/lib/zm/client/resource/resource_jsns_initializer.rb +4 -14
- data/lib/zm/client/resource/resources_builder.rb +1 -1
- data/lib/zm/client/resource/resources_collection.rb +12 -7
- data/lib/zm/client/search_folder/search_folder.rb +13 -29
- data/lib/zm/client/search_folder/search_folder_jsns_builder.rb +6 -6
- data/lib/zm/client/search_folder/search_folder_jsns_initializer.rb +19 -18
- data/lib/zm/client/search_folder/search_folders_builder.rb +1 -1
- data/lib/zm/client/search_folder/search_folders_collection.rb +6 -5
- data/lib/zm/client/server/server.rb +9 -3
- data/lib/zm/client/server/server_accounts_collection.rb +4 -2
- data/lib/zm/client/server/server_jsns_initializer.rb +1 -5
- data/lib/zm/client/server/servers_builder.rb +1 -1
- data/lib/zm/client/server/servers_collection.rb +17 -9
- data/lib/zm/client/share/share.rb +5 -3
- data/lib/zm/client/share/share_jsns_initializer.rb +15 -14
- data/lib/zm/client/share/share_mountpoints_collection.rb +3 -6
- data/lib/zm/client/share/shares_builder.rb +1 -1
- data/lib/zm/client/share/shares_collection.rb +6 -3
- data/lib/zm/client/signature/signature.rb +6 -21
- data/lib/zm/client/signature/signature_jsns_builder.rb +12 -7
- data/lib/zm/client/signature/signature_jsns_initializer.rb +5 -4
- data/lib/zm/client/signature/signatures_builder.rb +1 -1
- data/lib/zm/client/signature/signatures_collection.rb +6 -5
- data/lib/zm/client/soap_request/request_methods_admin.rb +56 -0
- data/lib/zm/client/soap_request/request_methods_mailbox.rb +60 -0
- data/lib/zm/client/soap_request/soap_constants.rb +7 -0
- data/lib/zm/client/soap_request/soap_context.rb +11 -2
- data/lib/zm/client/soap_request.rb +3 -0
- data/lib/zm/client/tag/account_object_tags_collection.rb +11 -9
- data/lib/zm/client/tag/tag.rb +8 -44
- data/lib/zm/client/tag/tag_jsns_builder.rb +4 -2
- data/lib/zm/client/tag/tag_jsns_initializer.rb +7 -6
- data/lib/zm/client/tag/tags_builder.rb +1 -1
- data/lib/zm/client/tag/tags_collection.rb +6 -5
- data/lib/zm/client/task/task.rb +6 -5
- data/lib/zm/client/task/task_jsns_initializer.rb +28 -27
- data/lib/zm/client/task/tasks_builder.rb +1 -1
- data/lib/zm/client/task/tasks_collection.rb +2 -2
- data/lib/zm/client/token.rb +52 -0
- data/lib/zm/client/upload/upload.rb +101 -95
- data/lib/zm/client/zm_logger.rb +83 -0
- data/lib/zm/client.rb +6 -1
- data/lib/zm/modules/base.rb +0 -1
- data/lib/zm/modules/belongs_to_folder.rb +6 -7
- data/lib/zm/modules/belongs_to_tag.rb +3 -1
- data/lib/zm/modules/common/zimbra-attrs.csv +3 -4
- data/lib/zm/modules/inspector.rb +2 -2
- data/lib/zm/modules/missing_method_static_collection.rb +2 -2
- data/lib/zm/support/cache/entry.rb +63 -0
- data/lib/zm/support/cache/file_store.rb +141 -0
- data/lib/zm/support/cache/null_store.rb +43 -0
- data/lib/zm/support/cache/request_strategy.rb +10 -0
- data/lib/zm/support/cache/store.rb +197 -0
- data/lib/zm/support/cache/strategy.rb +13 -0
- data/lib/zm/support/cache.rb +26 -0
- data/lib/zm-ruby-client.rb +2 -2
- data/zm-ruby-client.gemspec +10 -15
- metadata +37 -36
- data/lib/zm/client/common/token_metadata.rb +0 -44
- data/lib/zm/modules/zm_logger.rb +0 -26
|
@@ -8,13 +8,13 @@ module Zm
|
|
|
8
8
|
class SoapAccountConnector < SoapBaseConnector
|
|
9
9
|
class << self
|
|
10
10
|
def create(config)
|
|
11
|
-
|
|
12
|
-
config.
|
|
13
|
-
|
|
14
|
-
config.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
new(
|
|
12
|
+
config.zimbra_public_url
|
|
13
|
+
).tap do |trans|
|
|
14
|
+
trans.logger = config.logger
|
|
15
|
+
trans.cache = config.cache
|
|
16
|
+
trans.timeout = config.timeout
|
|
17
|
+
end
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
|
|
@@ -26,8 +26,8 @@ module Zm
|
|
|
26
26
|
context.token(value)
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
-
def initialize(
|
|
30
|
-
super(
|
|
29
|
+
def initialize(url)
|
|
30
|
+
super(url, SoapAccountConstants::ACCOUNT_SERVICE_URI)
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def auth_preauth(content, by, expires, domainkey)
|
|
@@ -35,11 +35,14 @@ module Zm
|
|
|
35
35
|
preauth = compute_preauth(content, by, ts, expires, domainkey)
|
|
36
36
|
|
|
37
37
|
soap_request = SoapElement.account(SoapAccountConstants::AUTH_REQUEST)
|
|
38
|
-
node_account = SoapElement.create(SoapConstants::ACCOUNT)
|
|
39
|
-
|
|
38
|
+
node_account = SoapElement.create(SoapConstants::ACCOUNT)
|
|
39
|
+
.add_attribute(SoapConstants::BY, by)
|
|
40
|
+
.add_content(content)
|
|
40
41
|
soap_request.add_node(node_account)
|
|
41
|
-
node_preauth = SoapElement.create(SoapConstants::PREAUTH)
|
|
42
|
-
|
|
42
|
+
node_preauth = SoapElement.create(SoapConstants::PREAUTH)
|
|
43
|
+
.add_attribute(SoapConstants::TIMESTAMP, ts)
|
|
44
|
+
.add_attribute(SoapConstants::EXPIRES, expires)
|
|
45
|
+
.add_content(preauth)
|
|
43
46
|
soap_request.add_node(node_preauth)
|
|
44
47
|
|
|
45
48
|
do_login(soap_request)
|
|
@@ -47,8 +50,9 @@ module Zm
|
|
|
47
50
|
|
|
48
51
|
def auth_password(content, by, password)
|
|
49
52
|
soap_request = SoapElement.account(SoapAccountConstants::AUTH_REQUEST)
|
|
50
|
-
node_account = SoapElement.create(SoapConstants::ACCOUNT)
|
|
51
|
-
|
|
53
|
+
node_account = SoapElement.create(SoapConstants::ACCOUNT)
|
|
54
|
+
.add_attribute(SoapConstants::BY, by)
|
|
55
|
+
.add_content(content)
|
|
52
56
|
soap_request.add_node(node_account)
|
|
53
57
|
soap_request.add_attribute('password', password)
|
|
54
58
|
|
|
@@ -8,13 +8,13 @@ module Zm
|
|
|
8
8
|
class SoapAdminConnector < SoapBaseConnector
|
|
9
9
|
class << self
|
|
10
10
|
def create(config)
|
|
11
|
-
|
|
12
|
-
config.
|
|
13
|
-
|
|
14
|
-
config.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
new(
|
|
12
|
+
config.zimbra_admin_url
|
|
13
|
+
).tap do |trans|
|
|
14
|
+
trans.logger = config.logger
|
|
15
|
+
trans.cache = config.cache
|
|
16
|
+
trans.timeout = config.timeout
|
|
17
|
+
end
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
|
|
@@ -26,8 +26,8 @@ module Zm
|
|
|
26
26
|
context.token(value)
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
-
def initialize(
|
|
30
|
-
super(
|
|
29
|
+
def initialize(url)
|
|
30
|
+
super(url, SoapAdminConstants::ADMIN_SERVICE_URI)
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
end
|
|
@@ -2,15 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
require 'json'
|
|
4
4
|
require 'openssl'
|
|
5
|
-
require 'uri'
|
|
6
5
|
|
|
7
6
|
require_relative 'soap_error'
|
|
8
7
|
|
|
9
8
|
module Zm
|
|
10
9
|
module Client
|
|
11
10
|
class SoapBaseConnector
|
|
12
|
-
include ZmLogger
|
|
13
|
-
|
|
14
11
|
BASESPACE = 'urn:zimbra'
|
|
15
12
|
HTTP_HEADERS = {
|
|
16
13
|
'Content-Type' => 'application/json; charset=utf-8',
|
|
@@ -18,8 +15,9 @@ module Zm
|
|
|
18
15
|
}.freeze
|
|
19
16
|
|
|
20
17
|
attr_reader :context
|
|
18
|
+
attr_writer :logger, :cache, :timeout
|
|
21
19
|
|
|
22
|
-
def initialize(
|
|
20
|
+
def initialize(url, soap_path)
|
|
23
21
|
@verbose = false
|
|
24
22
|
@timeout = 300
|
|
25
23
|
|
|
@@ -29,8 +27,9 @@ module Zm
|
|
|
29
27
|
verify_mode: OpenSSL::SSL::VERIFY_NONE
|
|
30
28
|
}
|
|
31
29
|
|
|
30
|
+
@url = url
|
|
32
31
|
@soap_path = soap_path
|
|
33
|
-
|
|
32
|
+
|
|
34
33
|
@context = SoapContext.new
|
|
35
34
|
end
|
|
36
35
|
|
|
@@ -51,7 +50,7 @@ module Zm
|
|
|
51
50
|
|
|
52
51
|
def http_client!
|
|
53
52
|
@http_client = Faraday.new(
|
|
54
|
-
url: @
|
|
53
|
+
url: @url,
|
|
55
54
|
headers: HTTP_HEADERS,
|
|
56
55
|
request: {
|
|
57
56
|
timeout: @timeout
|
|
@@ -70,13 +69,28 @@ module Zm
|
|
|
70
69
|
end
|
|
71
70
|
|
|
72
71
|
def do_request(body, error_handler = SoapError)
|
|
73
|
-
|
|
72
|
+
json_body = body.to_json
|
|
73
|
+
@logger.debug json_body
|
|
74
|
+
|
|
75
|
+
# cache json response
|
|
76
|
+
# no cache if response raise
|
|
77
|
+
json_response = @cache.fetch(json_body) do
|
|
78
|
+
@logger.debug 'Load from remote'
|
|
79
|
+
response = http_client.post(@soap_path, json_body)
|
|
80
|
+
@logger.debug response.body
|
|
81
|
+
|
|
82
|
+
raise(error_handler, JSON.parse(response.body, symbolize_names: true)) if response.status >= 400
|
|
74
83
|
|
|
75
|
-
|
|
76
|
-
raise(error_handler, response.body)
|
|
84
|
+
response.body
|
|
77
85
|
end
|
|
78
86
|
|
|
79
|
-
JSON.parse(
|
|
87
|
+
JSON.parse(json_response, symbolize_names: true)
|
|
88
|
+
|
|
89
|
+
# rescue Faraday::ConnectionFailed, SocketError => error
|
|
90
|
+
# @logger.error "SoapConnectorError (#{error.class}): #{error.message}"
|
|
91
|
+
# # raise error
|
|
92
|
+
# {}
|
|
93
|
+
# nil
|
|
80
94
|
end
|
|
81
95
|
|
|
82
96
|
def envelope(soap_element)
|
|
@@ -85,13 +99,6 @@ module Zm
|
|
|
85
99
|
Header: { context: context.to_hash, _jsns: BASESPACE }
|
|
86
100
|
}
|
|
87
101
|
end
|
|
88
|
-
|
|
89
|
-
def hash_header(token, target_server = nil)
|
|
90
|
-
h_context = { authToken: token, userAgent: { name: :zmsoap }, targetServer: target_server }.delete_if do |_, v|
|
|
91
|
-
v.nil?
|
|
92
|
-
end
|
|
93
|
-
{ Header: { context: h_context, _jsns: BASESPACE } }
|
|
94
|
-
end
|
|
95
102
|
end
|
|
96
103
|
end
|
|
97
104
|
end
|
|
@@ -9,29 +9,9 @@ module Zm
|
|
|
9
9
|
attr_reader :reason, :code
|
|
10
10
|
|
|
11
11
|
def initialize(soapbody)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
init_from_xml(soapbody)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
super "[#{@code}] [#{@reason}]"
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
private
|
|
22
|
-
|
|
23
|
-
def init_from_json(soapbody)
|
|
24
|
-
json = JSON.parse(soapbody, symbolize_names: true)
|
|
25
|
-
@reason = json[:Body][:Fault][:Reason][:Text]
|
|
26
|
-
@code = json[:Body][:Fault][:Detail][:Error][:Code]
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def init_from_xml(soapbody)
|
|
30
|
-
code_match = soapbody.match(%r{<Code>(.*?)</Code>})
|
|
31
|
-
@code = code_match[1]
|
|
32
|
-
|
|
33
|
-
text_match = soapbody.match(%r{<soap:Reason>.*?<soap:Text>(.*?)</soap:Text>}m)
|
|
34
|
-
@reason = text_match[1]
|
|
12
|
+
@reason = soapbody.dig(:Body, :Fault, :Reason, :Text)
|
|
13
|
+
@code = soapbody.dig(:Body, :Fault, :Detail, :Error, :Code)
|
|
14
|
+
super("[#{@code}] [#{@reason}]")
|
|
35
15
|
end
|
|
36
16
|
end
|
|
37
17
|
|
data/lib/zm/client/constant.rb
CHANGED
|
@@ -6,24 +6,26 @@ module Zm
|
|
|
6
6
|
DOUBLEPOINT = ' :: '
|
|
7
7
|
|
|
8
8
|
module Regex
|
|
9
|
-
UUID_REGEX = /[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 = /^uid
|
|
11
|
-
SHARED_CONTACT = /[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]
|
|
9
|
+
UUID_REGEX = /[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 = /^uid=/
|
|
11
|
+
SHARED_CONTACT = /[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
12
|
end
|
|
13
13
|
|
|
14
14
|
module FolderDefault
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
15
|
+
FolderData = Data.define(:id, :name, :path, :type)
|
|
16
|
+
|
|
17
|
+
ROOT = FolderData.new(1, '', '/', 'unknown')
|
|
18
|
+
INBOX = FolderData.new(2, 'Inbox', '/Inbox', 'message')
|
|
19
|
+
TRASH = FolderData.new(3, 'Trash', '/Trash', 'unknown')
|
|
20
|
+
JUNK = FolderData.new(4, 'Junk', '/Junk', 'message')
|
|
21
|
+
SENT = FolderData.new(5, 'Sent', '/Sent', 'message')
|
|
22
|
+
DRAFTS = FolderData.new(6, 'Drafts', '/Drafts', 'message')
|
|
23
|
+
CONTACTS = FolderData.new(7, 'Contacts', '/Contacts', 'contact')
|
|
24
|
+
CALENDAR = FolderData.new(10, 'Calendar', '/Calendar', 'appointment')
|
|
25
|
+
EMAILED = FolderData.new(13, 'Emailed Contacts', '/Emailed Contacts', 'contact')
|
|
26
|
+
CHATS = FolderData.new(14, 'Chats', '/Chats', 'message')
|
|
27
|
+
TASKS = FolderData.new(15, 'Tasks', '/Tasks', 'task')
|
|
28
|
+
BRIEFCASE = FolderData.new(16, 'Briefcase', '/Briefcase', 'document')
|
|
27
29
|
|
|
28
30
|
ALL = [
|
|
29
31
|
ROOT,
|
|
@@ -40,7 +42,7 @@ module Zm
|
|
|
40
42
|
TRASH
|
|
41
43
|
].freeze
|
|
42
44
|
|
|
43
|
-
IDS = ALL.map
|
|
45
|
+
IDS = ALL.map(&:id).freeze
|
|
44
46
|
end
|
|
45
47
|
|
|
46
48
|
module ShareType
|
|
@@ -6,24 +6,27 @@ module Zm
|
|
|
6
6
|
class Contact < Base::Object
|
|
7
7
|
include BelongsToFolder
|
|
8
8
|
include BelongsToTag
|
|
9
|
+
include RequestMethodsMailbox
|
|
10
|
+
include MailboxItemConcern
|
|
9
11
|
|
|
10
12
|
GROUP_PATTERN = 'group'
|
|
11
13
|
|
|
12
|
-
attr_accessor :anniversary, :assistantPhone, :birthday, :callbackPhone, :carPhone, :company,
|
|
13
|
-
:custom1, :department, :email, :email2, :email3, :email4, :email5,
|
|
14
|
-
:
|
|
15
|
-
:
|
|
16
|
-
:
|
|
17
|
-
:
|
|
18
|
-
:
|
|
19
|
-
:
|
|
20
|
-
:
|
|
14
|
+
attr_accessor :anniversary, :assistantPhone, :birthday, :callbackPhone, :carPhone, :company,
|
|
15
|
+
:companyPhone, :custom1, :department, :email, :email2, :email3, :email4, :email5,
|
|
16
|
+
:email6, :email7, :firstName, :fullName, :homeCity, :homeCountry, :homeFax,
|
|
17
|
+
:homePhone, :homePostalCode, :homeState, :homeStreet, :homeURL, :imAddress1,
|
|
18
|
+
:imAddress2, :imAddress3, :imAddress4, :imAddress5, :jobTitle, :lastName,
|
|
19
|
+
:maidenName, :middleName, :mobilePhone, :namePrefix, :nameSuffix, :nickname, :notes,
|
|
20
|
+
:otherCity, :otherCountry, :otherFax, :otherPhone, :otherPostalCode, :otherState,
|
|
21
|
+
:otherStreet, :otherURL, :pager, :workCity, :workCountry, :workFax, :workPhone,
|
|
22
|
+
:workPostalCode, :workState, :workStreet, :workURL, :image, :name, :type,
|
|
23
|
+
:tn, :shared_account_id, :shared_folder_account_id
|
|
21
24
|
|
|
22
25
|
def initialize(parent)
|
|
23
|
-
@l = FolderDefault::CONTACTS
|
|
26
|
+
@l = FolderDefault::CONTACTS.id
|
|
24
27
|
@shared_account_id = nil
|
|
25
28
|
@shared_folder_account_id = nil
|
|
26
|
-
super
|
|
29
|
+
super
|
|
27
30
|
end
|
|
28
31
|
|
|
29
32
|
def group?
|
|
@@ -39,38 +42,18 @@ module Zm
|
|
|
39
42
|
end
|
|
40
43
|
|
|
41
44
|
def create!
|
|
42
|
-
rep = @parent.
|
|
45
|
+
rep = @parent.soap_connector.invoke(build_create)
|
|
43
46
|
ContactJsnsInitializer.update(self, rep[:CreateContactResponse][:cn].first)
|
|
44
47
|
|
|
45
|
-
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def modify!
|
|
49
|
-
@parent.sacc.invoke(jsns_builder.to_update)
|
|
50
|
-
true
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def update!(hash)
|
|
54
|
-
return false if hash.delete_if { |k, v| v.nil? || !respond_to?(k) }.empty?
|
|
55
|
-
|
|
56
|
-
do_update!(hash)
|
|
57
|
-
|
|
58
|
-
hash.each do |key, value|
|
|
59
|
-
update_attribute(key, value)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
true
|
|
48
|
+
id
|
|
63
49
|
end
|
|
64
50
|
|
|
65
51
|
def rename!(*args)
|
|
66
52
|
raise NotImplementedError
|
|
67
53
|
end
|
|
68
54
|
|
|
69
|
-
def
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
@parent.sacc.invoke(jsns_builder.to_delete)
|
|
73
|
-
@id = nil
|
|
55
|
+
def build_rename(*args)
|
|
56
|
+
raise NotImplementedError
|
|
74
57
|
end
|
|
75
58
|
|
|
76
59
|
def reload!
|
|
@@ -79,12 +62,10 @@ module Zm
|
|
|
79
62
|
|
|
80
63
|
private
|
|
81
64
|
|
|
82
|
-
def do_update!(hash)
|
|
83
|
-
@parent.sacc.invoke(jsns_builder.to_patch(hash))
|
|
84
|
-
end
|
|
85
|
-
|
|
86
65
|
def jsns_builder
|
|
87
|
-
@jsns_builder
|
|
66
|
+
return @jsns_builder if defined? @jsns_builder
|
|
67
|
+
|
|
68
|
+
@jsns_builder = ContactJsnsBuilder.new(self)
|
|
88
69
|
end
|
|
89
70
|
end
|
|
90
71
|
end
|
|
@@ -11,32 +11,10 @@ module Zm
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def update(item, json)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
elsif part_id.length == 2
|
|
19
|
-
item.shared_account_id = part_id.first
|
|
20
|
-
item.id = part_id.last.to_i
|
|
21
|
-
else
|
|
22
|
-
item.id = json[:id]
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
part_l = json[:l].split(':')
|
|
26
|
-
|
|
27
|
-
if part_l.length == 1
|
|
28
|
-
item.l = json[:l].to_i
|
|
29
|
-
elsif part_l.length == 2
|
|
30
|
-
item.shared_folder_account_id = part_l.first
|
|
31
|
-
item.l = part_l.last.to_i
|
|
32
|
-
else
|
|
33
|
-
item.l = json[:l]
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# item.id = json[:id]
|
|
37
|
-
item.name = json[:fileAsStr]
|
|
38
|
-
# item.l = json[:l].to_i
|
|
39
|
-
item.tn = json[:tn]
|
|
14
|
+
item.id = json.delete(:id)
|
|
15
|
+
item.l = json.delete(:l)
|
|
16
|
+
item.name = json.delete(:fileAsStr)
|
|
17
|
+
item.tn = json.delete(:tn)
|
|
40
18
|
|
|
41
19
|
if json[:_attrs].is_a?(Hash)
|
|
42
20
|
make_custom_keys(json[:_attrs], item)
|
|
@@ -3,33 +3,13 @@
|
|
|
3
3
|
module Zm
|
|
4
4
|
module Client
|
|
5
5
|
# collection account contacts
|
|
6
|
-
class ContactsCollection < Base::
|
|
6
|
+
class ContactsCollection < Base::AccountSearchObjectsCollection
|
|
7
7
|
def initialize(parent)
|
|
8
|
+
super
|
|
8
9
|
@child_class = Contact
|
|
9
10
|
@builder_class = ContactBuilder
|
|
10
|
-
@
|
|
11
|
-
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def folder(folder)
|
|
15
|
-
return self unless folder.is_a?(Zm::Client::Folder)
|
|
16
|
-
|
|
17
|
-
folder_id(folder.id)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def folder_id(folder_id)
|
|
21
|
-
return self if @folder_id == folder_id
|
|
22
|
-
|
|
23
|
-
@folder_id = folder_id
|
|
24
|
-
self
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
private
|
|
28
|
-
|
|
29
|
-
def make_query
|
|
30
|
-
jsns = @folder_id.nil? ? nil : { l: @folder_id }
|
|
31
|
-
soap_request = SoapElement.mail(SoapMailConstants::GET_CONTACTS_REQUEST).add_attributes(jsns)
|
|
32
|
-
@parent.sacc.invoke(soap_request)
|
|
11
|
+
@type = SoapConstants::CONTACT
|
|
12
|
+
@folder_ids = [FolderDefault::CONTACTS.id]
|
|
33
13
|
end
|
|
34
14
|
end
|
|
35
15
|
end
|
|
@@ -7,17 +7,16 @@ module Zm
|
|
|
7
7
|
EXCLUDE_INSTANCE_VARIABLE_KEYS = %i[@id @name @parent @l @type @tn @jsns_builder].freeze
|
|
8
8
|
|
|
9
9
|
def to_jsns
|
|
10
|
-
|
|
10
|
+
{
|
|
11
11
|
cn: {
|
|
12
12
|
a: instance_variables_array.map(&Utils::A_NODE_PROC),
|
|
13
|
-
l: @item.folder_id || Zm::Client::FolderDefault::CONTACTS
|
|
14
|
-
m:
|
|
15
|
-
{ type: m.type, value: m.value }
|
|
16
|
-
end
|
|
13
|
+
l: @item.folder_id || Zm::Client::FolderDefault::CONTACTS.id,
|
|
14
|
+
m: members_node
|
|
17
15
|
}
|
|
18
16
|
}
|
|
19
17
|
|
|
20
|
-
SoapElement.mail(SoapMailConstants::CREATE_CONTACT_REQUEST)
|
|
18
|
+
SoapElement.mail(SoapMailConstants::CREATE_CONTACT_REQUEST)
|
|
19
|
+
.add_attributes(jsns)
|
|
21
20
|
end
|
|
22
21
|
|
|
23
22
|
def to_update
|
|
@@ -25,30 +24,36 @@ module Zm
|
|
|
25
24
|
cn: {
|
|
26
25
|
a: instance_variables_array.map(&Utils::A_NODE_PROC),
|
|
27
26
|
id: @item.id,
|
|
28
|
-
m:
|
|
29
|
-
{ type: m.type, value: m.value, op: m.op }
|
|
30
|
-
end
|
|
27
|
+
m: members_node
|
|
31
28
|
}
|
|
32
29
|
}
|
|
33
30
|
|
|
34
|
-
SoapElement.mail(SoapMailConstants::MODIFY_CONTACT_REQUEST)
|
|
31
|
+
SoapElement.mail(SoapMailConstants::MODIFY_CONTACT_REQUEST)
|
|
32
|
+
.add_attributes(jsns)
|
|
35
33
|
end
|
|
36
34
|
|
|
37
35
|
def to_patch(hash)
|
|
38
|
-
|
|
36
|
+
{
|
|
39
37
|
cn: {
|
|
40
38
|
id: @item.id,
|
|
41
39
|
a: hash.map(&Utils::A_ARRAY_PROC).flatten(1).map(&Utils::A_NODE_PROC)
|
|
42
40
|
}
|
|
43
41
|
}
|
|
44
42
|
|
|
45
|
-
SoapElement.mail(SoapMailConstants::MODIFY_CONTACT_REQUEST)
|
|
43
|
+
SoapElement.mail(SoapMailConstants::MODIFY_CONTACT_REQUEST)
|
|
44
|
+
.add_attributes(jsns)
|
|
46
45
|
end
|
|
47
46
|
|
|
48
47
|
alias to_create to_jsns
|
|
49
48
|
|
|
49
|
+
def members_node
|
|
50
|
+
@item.members.all.reject(&:current?).map do |m|
|
|
51
|
+
{ type: m.type, value: m.value, op: m.op }
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
50
55
|
def instance_variables_array
|
|
51
|
-
[[:nickname, @item.name], [:
|
|
56
|
+
[[:nickname, @item.name], [:fullname, @item.name], [:fileAs, "8:#{@item.name}"], %i[type group]]
|
|
52
57
|
end
|
|
53
58
|
end
|
|
54
59
|
end
|
|
@@ -2,10 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
module GroupContact
|
|
4
4
|
def members
|
|
5
|
-
@members
|
|
5
|
+
return @members if defined? @members
|
|
6
|
+
|
|
7
|
+
@members = Zm::Client::ContactMembersCollection.new(self)
|
|
6
8
|
end
|
|
7
9
|
|
|
8
10
|
def jsns_builder
|
|
9
|
-
@jsns_builder
|
|
11
|
+
return @jsns_builder if defined? @jsns_builder
|
|
12
|
+
|
|
13
|
+
@jsns_builder = Zm::Client::GroupContactJsnsBuilder.new(self)
|
|
10
14
|
end
|
|
11
15
|
end
|
data/lib/zm/client/cos/cos.rb
CHANGED
|
@@ -7,10 +7,14 @@ module Zm
|
|
|
7
7
|
include HasSoapAdminConnector
|
|
8
8
|
|
|
9
9
|
def modify!
|
|
10
|
-
sac.invoke(
|
|
10
|
+
sac.invoke(build_modify)
|
|
11
11
|
true
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
+
def build_modify
|
|
15
|
+
jsns_builder.to_update
|
|
16
|
+
end
|
|
17
|
+
|
|
14
18
|
def update!(hash)
|
|
15
19
|
return false if hash.delete_if { |k, v| v.nil? || !respond_to?(k) }.empty?
|
|
16
20
|
|
|
@@ -24,49 +28,69 @@ module Zm
|
|
|
24
28
|
end
|
|
25
29
|
|
|
26
30
|
def create!
|
|
27
|
-
resp = sac.invoke(
|
|
31
|
+
resp = sac.invoke(build_create)
|
|
28
32
|
|
|
29
33
|
@id = resp[:CreateCosResponse][:cos].first[:id]
|
|
30
34
|
end
|
|
31
35
|
|
|
36
|
+
def build_create
|
|
37
|
+
jsns_builder.to_create
|
|
38
|
+
end
|
|
39
|
+
|
|
32
40
|
def delete!
|
|
33
|
-
sac.invoke(
|
|
41
|
+
sac.invoke(build_delete)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def build_delete
|
|
45
|
+
jsns_builder.to_delete
|
|
34
46
|
end
|
|
35
47
|
|
|
36
48
|
def clone!(new_name)
|
|
37
|
-
resp = sac.invoke(
|
|
49
|
+
resp = sac.invoke(build_clone(new_name))
|
|
38
50
|
resp[:CopyCosResponse][:cos].first[:id]
|
|
39
51
|
end
|
|
40
52
|
|
|
53
|
+
def build_clone(new_name)
|
|
54
|
+
jsns_builder.to_copy(new_name)
|
|
55
|
+
end
|
|
56
|
+
|
|
41
57
|
def servers
|
|
42
|
-
@servers
|
|
58
|
+
return @servers if defined? @servers
|
|
59
|
+
|
|
60
|
+
@servers = CosServersCollection.new(self)
|
|
43
61
|
end
|
|
44
62
|
|
|
45
63
|
def domains
|
|
46
64
|
return if @id.nil?
|
|
47
65
|
|
|
48
|
-
@domains
|
|
66
|
+
return @domains if defined? @domains
|
|
67
|
+
|
|
68
|
+
@domains = CosDomainsCollection.new(self)
|
|
49
69
|
end
|
|
50
70
|
|
|
51
71
|
def accounts
|
|
52
72
|
return if @id.nil?
|
|
53
73
|
|
|
54
|
-
@accounts
|
|
74
|
+
return @accounts if defined? @accounts
|
|
75
|
+
|
|
76
|
+
@accounts = CosAccountsCollection.new(self)
|
|
55
77
|
end
|
|
56
78
|
|
|
57
79
|
def attrs_write
|
|
58
80
|
@parent.zimbra_attributes.all_cos_attrs_writable_names
|
|
59
81
|
end
|
|
60
82
|
|
|
83
|
+
def jsns_builder
|
|
84
|
+
return @jsns_builder if defined? @jsns_builder
|
|
85
|
+
|
|
86
|
+
@jsns_builder = CosJsnsBuilder.new(self)
|
|
87
|
+
end
|
|
88
|
+
|
|
61
89
|
private
|
|
62
90
|
|
|
63
91
|
def do_update!(hash)
|
|
64
92
|
sac.invoke(jsns_builder.to_patch(hash))
|
|
65
93
|
end
|
|
66
|
-
|
|
67
|
-
def jsns_builder
|
|
68
|
-
@jsns_builder ||= CosJsnsBuilder.new(self)
|
|
69
|
-
end
|
|
70
94
|
end
|
|
71
95
|
end
|
|
72
96
|
end
|