Test Failed
Push — master ( 647c72...cd42b5 )
by
unknown
10:25
created

OutOfOfficeSettingsModule   A

Complexity

Total Complexity 34

Size/Duplication

Total Lines 181
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 86
dl 0
loc 181
rs 9.68
c 0
b 0
f 0
wmc 34

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
B saveOofSettings() 0 29 9
A getOwnerPermissionStores() 0 31 5
F getOofSettings() 0 55 12
B execute() 0 19 7
1
<?php
2
	/**
3
	 * OutOfOfficeSettingsModule Module
4
	 */
5
	class OutOfOfficeSettingsModule extends Module
6
	{
7
		/**
8
		 * Constructor
9
		 * @param int $id unique id.
10
		 * @param array $data list of all actions.
11
		 */
12
		function __construct($id, $data)
13
		{
14
			parent::__construct($id, $data);
15
		
16
			$this->properties = $GLOBALS["properties"]->getOutOfOfficeProperties();
0 ignored issues
show
Bug Best Practice introduced by
The property properties does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
17
		}
18
19
		/**
20
		 * Executes all the actions in the $data variable.
21
		 */
22
		function execute()
23
		{
24
			foreach ($this->data as $actionType => $action) {
25
				if (isset($actionType)) {
26
					try {
27
						switch ($actionType) {
28
							case "list" :
29
								$this->getOofSettings();
30
								break;
31
							case "save" :
32
								$this->saveOofSettings($action);
33
								break;
34
							default:
35
								$this->handleUnknownActionType($actionType);
36
						}
37
					} catch (SettingsException $e) {
38
						$this->processException($e, $actionType);
39
					} catch (MAPIException $e) {
40
						$this->processException($e, $actionType);
41
					}
42
				 }
43
			}
44
		}
45
46
		/**
47
		 * Read 'out of office' settings from PR_EC_OUTOFOFFICE_*
48
		 *
49
		 * Internal function to retrieve the 'out of office' settings from the store, these settings are normal properties on the store
50
		 * @access private
51
		 */
52
		function getOofSettings()
53
		{
54
			$otherStores = $this->getOwnerPermissionStores();
55
			array_unshift($otherStores, $GLOBALS['mapisession']->getDefaultMessageStore());
56
57
			$oofSettings = Array();
58
			foreach ($otherStores as $storeEntryId => $storeObj) {
59
				$props = mapi_getprops($storeObj, $this->properties);
60
				if (!isset($props[PR_EC_OUTOFOFFICE_STATE])) {
61
					$props[PR_EC_OUTOFOFFICE_STATE] = false;
62
				}
63
				if (!isset($props[PR_EC_OUTOFOFFICE_INTERNALREPLY])) {
64
					$props[PR_EC_OUTOFOFFICE_INTERNALREPLY] = '';
65
				}
66
				if (!isset($props[PR_EC_OUTOFOFFICE_INTERNALSUBJECT])) {
67
					$props[PR_EC_OUTOFOFFICE_INTERNALSUBJECT] = '';
68
				}
69
				if (!isset($props[PR_EC_OUTOFOFFICE_BEGIN])) {
70
					$props[PR_EC_OUTOFOFFICE_BEGIN] = 0;
71
				}
72
				if (!isset($props[PR_EC_OUTOFOFFICE_END]) || $props[PR_EC_OUTOFOFFICE_END] === FUTURE_ENDDATE) {
73
					$props[PR_EC_OUTOFOFFICE_END] = 0;
74
				}
75
				if (!isset($props[PR_EC_OUTOFOFFICE_ALLOWEXTERNAL])) {
76
					$props[PR_EC_OUTOFOFFICE_ALLOWEXTERNAL] = 0;
77
				}
78
				if (!isset($props[PR_EC_OUTOFOFFICE_EXTERNALAUDIENCE])) {
79
					$props[PR_EC_OUTOFOFFICE_EXTERNALAUDIENCE] = 0;
80
				}
81
				if (!isset($props[PR_EC_OUTOFOFFICE_EXTERNALREPLY])) {
82
					$props[PR_EC_OUTOFOFFICE_EXTERNALREPLY] = '';
83
				}
84
				if (!isset($props[PR_EC_OUTOFOFFICE_EXTERNALSUBJECT])) {
85
					$props[PR_EC_OUTOFOFFICE_EXTERNALSUBJECT] = '';
86
				}
87
88
				$externalProps['props']['entryid'] = bin2hex($props[PR_MAILBOX_OWNER_ENTRYID]);
89
				$externalProps['props']['store_entryid'] = bin2hex($props[PR_ENTRYID]);
90
				$externalProps['props']['set'] = $props[PR_EC_OUTOFOFFICE_STATE];
91
				$externalProps['props']['internal_reply'] = trim($props[PR_EC_OUTOFOFFICE_INTERNALREPLY]);
92
				$externalProps['props']['internal_subject'] = trim($props[PR_EC_OUTOFOFFICE_INTERNALSUBJECT]);
93
				$externalProps['props']['from'] = $props[PR_EC_OUTOFOFFICE_BEGIN];
94
				$externalProps['props']['until'] = $props[PR_EC_OUTOFOFFICE_END];
95
				$externalProps['props']['allow_external'] = $props[PR_EC_OUTOFOFFICE_ALLOWEXTERNAL];
96
				$externalProps['props']['external_audience'] = $props[PR_EC_OUTOFOFFICE_EXTERNALAUDIENCE];
97
				$externalProps['props']['external_reply'] = trim($props[PR_EC_OUTOFOFFICE_EXTERNALREPLY]);
98
				$externalProps['props']['external_subject'] = trim($props[PR_EC_OUTOFOFFICE_EXTERNALSUBJECT]);
99
100
				array_push($oofSettings, $externalProps);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $externalProps seems to be defined later in this foreach loop on line 88. Are you sure it is defined here?
Loading history...
101
			}
102
103
			// Send success message to client
104
			$this->addActionData('list', Array('item' => $oofSettings));
105
106
			$GLOBALS["bus"]->addData($this->getResponseData());
107
		}
108
109
		/**
110
		 * Function returns array of user stores who has given 'Owner' permission to logged in user.
111
		 * Internal function to retrieve the shared stores with 'owner' permission.
112
		 * @access private
113
		 * @return {Array} array of user stores who has given 'owner' permission.
0 ignored issues
show
Documentation Bug introduced by
The doc comment {Array} at position 0 could not be parsed: Unknown type name '{' at position 0 in {Array}.
Loading history...
114
		 */
115
		function getOwnerPermissionStores()
116
		{
117
			$stores = $GLOBALS['mapisession']->getOtherUserStore();
118
119
			// $sharedOwnerStores array will contains store of users who has given 'owner' permission.
120
			// Or store of users which can be fully accessible by default user in case of 'Admin User'.
121
			$sharedOwnerStores = array();
122
123
			foreach ($stores as $storeEntryId => $storeObj) {
124
				$subTree = mapi_getprops($storeObj, array(PR_IPM_SUBTREE_ENTRYID));
125
				try {
126
					$subtreeObj = mapi_msgstore_openentry($storeObj, $subTree[PR_IPM_SUBTREE_ENTRYID]);
127
				} catch (MAPIException $e) {
128
					// we don't have rights to open folder, so don't include User's store.
129
					if ($e->getCode() === MAPI_E_NO_ACCESS) {
130
						continue;
131
					}
132
					// rethrow other errors
133
					throw $e;
134
				}
135
136
				$permission = mapi_getprops($subtreeObj, array(PR_RIGHTS));
137
				$hasSufficientPermission = $permission[PR_RIGHTS]&ecRightsSecretary === ecRightsSecretary;
138
139
				// If User store's IPM subtree has rights higher than 'secretary' then include that User's store.
140
				if ($hasSufficientPermission) {
141
					$sharedOwnerStores[$storeEntryId] = $storeObj;
142
				}
143
			}
144
145
			return $sharedOwnerStores;
146
		}
147
148
		/**
149
		 * Internal function to save the 'out of office' settings to the correct properties on the store.
150
		 * On success function will send 'success' feedback to user.
151
		 *
152
		 * Writes some properties to the PR_EC_OUTOFOFFICE_* properties
153
		 *
154
		 * @param array $action the action data, sent by the client
155
		 * @access private
156
		 */
157
		function saveOofSettings($action)
158
		{
159
			$storeEntryId = $action['store_entryid'];
160
			$oofSettings = $action['props'];
161
			$store = $GLOBALS['mapisession']->openMessageStore(hex2bin($storeEntryId));
162
			$props = Conversion::mapXML2MAPI($this->properties, $oofSettings);
163
164
			// If client sent until value as 0 or User set OOF to true but don't set until
165
			// then save FUTURE_ENDDATE as until date. Also when OOF is already ON and User
166
			// don't change 'until' field then check if 'until' value is available in User's store
167
			// and if not then set until date to FUTURE_ENDDATE.
168
			// Note: If we remove PR_EC_OUTOFOFFICE_END property from User's store,
169
			// then gromox is setting past value "1970-01-01 00:00:00" as until date.
170
			// To avoid this issue and for OOF to work as expected, we are setting until date as FUTURE_ENDDATE.
171
			if (isset($oofSettings['until']) && $oofSettings['until'] === 0 ||
0 ignored issues
show
introduced by
Consider adding parentheses for clarity. Current Interpretation: (IssetNode && $oofSettin... IssetNode && IssetNode, Probably Intended Meaning: IssetNode && ($oofSettin...IssetNode && IssetNode)
Loading history...
172
				!isset($oofSettings['until']) && isset($oofSettings['set'])) {
173
				$props[$this->properties['until']] = FUTURE_ENDDATE;
174
			} else if (!isset($oofSettings['until'], $oofSettings['set'])) {
175
				$untilProp = mapi_getprops($store, array(PR_EC_OUTOFOFFICE_END));
176
				if (!isset($untilProp[PR_EC_OUTOFOFFICE_END]) || $untilProp[PR_EC_OUTOFOFFICE_END] === 0) {
177
					$props[$this->properties['until']] = FUTURE_ENDDATE;
178
				}
179
			}
180
181
			if (!empty($props))	{
182
				mapi_setprops($store, $props);
183
				mapi_savechanges($store);
184
			}
185
			$this->sendFeedback(true);
186
		}
187
	}
188
?>
0 ignored issues
show
Best Practice introduced by
It is not recommended to use PHP's closing tag ?> in files other than templates.

Using a closing tag in PHP files that only contain PHP code is not recommended as you might accidentally add whitespace after the closing tag which would then be output by PHP. This can cause severe problems, for example headers cannot be sent anymore.

A simple precaution is to leave off the closing tag as it is not required, and it also has no negative effects whatsoever.

Loading history...
189