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

MailListModule::createNotifiers()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 0
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
	/**
3
	 * Mail Module
4
	 */
5
	class MailListModule extends ListModule
6
	{
7
		// Temporary var to store the inbox entryid of the processed store
8
		private $_inboxEntryId;
9
10
		private $_inbox = NULL;
11
12
		private $_inboxTotal = NULL;
13
14
		private $_inboxTotalUnread = NULL;
15
16
		/**
17
		 * Constructor
18
		 * @param int $id unique id.
19
		 * @param array $data list of all actions.
20
		 */
21
		function __construct($id, $data)
22
		{
23
			parent::__construct($id, $data);
24
			$this->properties = $GLOBALS["properties"]->getMailListProperties();
25
		}
26
27
		/**
28
		 * Creates the notifiers for this module,
29
		 * and register them to the Bus.
30
		 */
31
		function createNotifiers()
32
		{
33
			$entryid = $this->getEntryID();
34
			$GLOBALS["bus"]->registerNotifier('maillistnotifier', $entryid);
35
		}
36
37
		/**
38
		 * Executes all the actions in the $data variable.
39
		 * @return boolean true on success of false on fialure.
40
		 */
41
		function execute()
42
		{
43
			$GLOBALS['PluginManager']->triggerHook("server.module.maillistmodule.execute.before", array('moduleObject' =>& $this));
44
45
			foreach($this->data as $actionType => $action)
46
			{
47
				if(isset($actionType)) {
48
					try {
49
						$this->store = $this->getActionStore($action);
0 ignored issues
show
Bug Best Practice introduced by
The property store does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
50
						$entryid = $this->getActionEntryID($action);
51
52
						// Reset variables
53
						$this->_inbox = NULL;
54
						$this->_inboxEntryId = NULL;
55
						$this->_inboxTotal = NULL;
56
						$this->_inboxTotalUnread = NULL;
57
58
						$this->currentActionData = array(
0 ignored issues
show
Bug Best Practice introduced by
The property currentActionData does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
59
							'store' => $this->store,
60
							'entryid' => $entryid,
61
							'actionType' => $actionType,
62
							'action' => $action,
63
						);
64
65
						switch($actionType)
66
						{
67
							case "list":
68
							case "updatelist":
69
								$this->getDelegateFolderInfo($this->store);
70
								$this->messageList($this->store, $entryid, $action, $actionType);
0 ignored issues
show
Bug introduced by
$entryid of type object is incompatible with the type string expected by parameter $entryid of ListModule::messageList(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

70
								$this->messageList($this->store, /** @scrutinizer ignore-type */ $entryid, $action, $actionType);
Loading history...
71
								break;
72
							case "search":
73
								// @FIXME add handling for private items
74
								$this->search($this->store, $entryid, $action, $actionType);
75
								break;
76
							case "updatesearch":
77
								$this->updatesearch($this->store, $entryid, $action);
78
								break;
79
							case "stopsearch":
80
								$this->stopSearch($this->store, $entryid, $action);
81
								break;
82
							default:
83
								$this->handleUnknownActionType($actionType);
84
						}
85
					} catch (MAPIException $e) {
86
						$this->processException($e, $actionType);
87
					} catch (SearchException $e) {
88
						$this->processException($e, $actionType);
89
					}
90
				}
91
			}
92
			$GLOBALS['PluginManager']->triggerHook("server.module.maillistmodule.execute.after", array('moduleObject' =>& $this));
93
		}
94
95
		/**
96
		 * Returns the Inbox folder of the currently used store if found, NULL otherwise
97
		 *
98
		 * @return Resource The inbox folder of the currently used store
99
		 */
100
		function getInbox() {
101
			if ($this->_inbox === NULL) {
102
				try {
103
					$this->_inbox = mapi_msgstore_getreceivefolder($this->store);
104
				} catch (MAPIException $e) {
105
					// don't propagate this error to parent handlers, if store doesn't support it
106
					if($e->getCode() === MAPI_E_NO_SUPPORT) {
107
						$e->setHandled();
108
						return NULL;
109
					}
110
				}
111
			}
112
113
			return $this->_inbox;
114
		}
115
116
		/**
117
		 * Returns the entryid of the Inbox folder of the currently used store if found, false otherwise
118
		 *
119
		 * @return String hexamdecimal representation of the entryid of the Inbox
120
		 */
121
		function getInboxEntryId() {
122
			if ($this->_inboxEntryId === NULL) {
123
				$inbox = $this->getInbox();
124
				try {
125
					$inboxProps = mapi_getprops($inbox, array(PR_ENTRYID));
126
					$this->_inboxEntryId = bin2hex($inboxProps[PR_ENTRYID]);
127
				} catch (MAPIException $e) {
128
					// don't propagate this error to parent handlers, if store doesn't support it
129
					if($e->getCode() === MAPI_E_NO_SUPPORT) {
130
						$e->setHandled();
131
						return false;
0 ignored issues
show
Bug Best Practice introduced by
The expression return false returns the type false which is incompatible with the documented return type string.
Loading history...
132
					}
133
				}
134
			}
135
136
			return $this->_inboxEntryId;
137
		}
138
139
		/**
140
		 * Returns the total number of items in the Inbox of the currently used store
141
		 *
142
		 * @return Integer the number if items in the Inbox folder
143
		 */
144
		function getInboxTotal($force = false) {
145
			if ($this->_inboxTotal === NULL || $force) {
146
				$inbox = $this->getInbox();
147
				$contentcount = mapi_getprops($inbox, array(PR_CONTENT_COUNT, PR_CONTENT_UNREAD));
148
				$this->_inboxTotal = $contentcount[PR_CONTENT_COUNT];
149
				$this->_inboxTotalUnread = $contentcount[PR_CONTENT_UNREAD];
150
			}
151
152
			return $this->_inboxTotal;
153
		}
154
155
		/**
156
		 * Returns the number of unread items in the Inbox of the currently used store.
157
		 *
158
		 * @return Integer the numer of unread items in the Inbox folder
159
		 */
160
		function getInboxTotalUnread($force = false) {
161
			if ($this->_inboxTotalUnread === NULL || $force) {
162
				$this->getIboxTotal($force);
0 ignored issues
show
Bug introduced by
The method getIboxTotal() does not exist on MailListModule. Did you maybe mean getInboxTotal()? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

162
				$this->/** @scrutinizer ignore-call */ 
163
           getIboxTotal($force);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
163
			}
164
165
			return $this->_inboxTotalUnread;
166
		}
167
168
		/**
169
		 * Function does customization of exception based on module data.
170
		 * like, here it will generate display message based on actionType
171
		 * for particular exception.
172
		 *
173
		 * @param object $e Exception object
174
		 * @param string $actionType the action type, sent by the client
175
		 * @param MAPIobject $store Store object of the current user.
0 ignored issues
show
Bug introduced by
The type MAPIobject was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
176
		 * @param string $parententryid parent entryid of the message.
177
		 * @param string $entryid entryid of the message.
178
		 * @param array $action the action data, sent by the client
179
		 */
180
		function handleException(&$e, $actionType = null, $store = null, $parententryid = null, $entryid = null, $action = null)
181
		{
182
			if(is_null($e->displayMessage)) {
183
				switch($actionType)
184
				{
185
					case "list":
186
						if($e->getCode() == MAPI_E_NO_ACCESS)
187
							$e->setDisplayMessage(_("You have insufficient privileges to see the contents of this folder."));
188
						else
189
							$e->setDisplayMessage(_("Could not load the contents of this folder."));
190
						break;
191
192
					case "search":
193
						if($e->getCode() == MAPI_E_NO_ACCESS)
194
							$e->setDisplayMessage(_("You have insufficient privileges to perform search operation in this folder."));
195
						else
196
							$e->setDisplayMessage(_("Error in search, please try again"));
197
						break;
198
199
					case "updatesearch":
200
						$e->setDisplayMessage(_("Could not update search results."));
201
						break;
202
203
					case "stopsearch":
204
						$e->setDisplayMessage(_("Could not stop search operation."));
205
						break;
206
				}
207
			}
208
209
			parent::handleException($e, $actionType, $store, $parententryid, $entryid, $action);
210
		}
211
212
		/**
213
		 * Parses the incoming sort request and builds a MAPI sort order.
214
		 * Overridden to rewrite the sorting for flags. (because the flags that are shown in grommunio Web
215
		 * are a combination of several properties)
216
		 *
217
		 * @param array $action the action data, sent by the client
218
		 * @param array|bool $map Normally properties are mapped from the XML to MAPI by the standard
219
		 * $this->properties mapping. However, if you want other mappings, you can specify them in this parameter.
220
		 * @param bool $allow_multi_instance Sort as multi-value instance (every value a different row)
221
		 * @param array|bool a custom set of properties to use instead of the properties stored in module
222
		 */
223
		function parseSortOrder($action, $map = false, $allow_multi_instance = false, $properties = false)
224
		{
225
			if(isset($action['sort'])) {
226
				// Check if the user wants to sort the maillist on flags.
227
				// If so, we will rewrite the sorting a little
228
				if ( is_array($action['sort']) && count($action['sort'])>0 && $action['sort'][0]['field'] === 'flag_due_by' ) {
229
					$dir = $action['sort'][0]['direction'];
230
					$action['sort'] = array(
231
						array(
232
							'field' => 'flag_status',
233
							'direction' => $dir,
234
						),
235
						array(
236
							'field' => 'duedate',
237
							'direction' => $dir === 'ASC' ? 'DESC' : 'ASC',
238
						),
239
						array(
240
							'field' => 'flag_due_by',
241
							'direction' => $dir,
242
						),
243
					);
244
				}
245
			}
246
247
			parent::parseSortOrder($action, $map, $allow_multi_instance, $properties);
248
		}
249
	}
250
?>
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...
251