Issues (171)

lib/PHPWrapper.php (6 issues)

Labels
Severity
1
<?php
2
3
/*
4
 * SPDX-License-Identifier: AGPL-3.0-only
5
 * SPDX-FileCopyrightText: Copyright 2016 - 2018 Kopano b.v.
6
 * SPDX-FileCopyrightText: Copyright 2020 - 2025 grommunio GmbH
7
 *
8
 * PHP wrapper class for ICS.
9
 */
10
11
namespace grommunio\DAV;
12
13
class PHPWrapper {
14
	private $store;
15
	private $logger;
16
	private $props;
17
	private $fileext;
18
	private $added;
19
	private $modified;
20
	private $deleted;
21
	private $syncstate;
22
	private $folderid;
23
24
	/**
25
	 * Constructor.
26
	 *
27
	 * @param mixed              $store
28
	 * @param GLogger            $logger
29
	 * @param mixed              $props
30
	 * @param string             $fileext
31
	 * @param GrommunioSyncState $syncstate
32
	 * @param string             $folderid
33
	 */
34
	public function __construct($store, $logger, $props, $fileext, $syncstate, $folderid) {
35
		$this->store = $store;
36
		$this->logger = $logger;
37
		$this->props = $props;
38
		$this->fileext = $fileext;
39
		$this->syncstate = $syncstate;
40
		$this->folderid = $folderid;
41
42
		$this->added = [];
43
		$this->modified = [];
44
		$this->deleted = [];
45
	}
46
47
	/**
48
	 * Accessor for $this->added.
49
	 *
50
	 * @return array
51
	 */
52
	public function GetAdded() {
53
		return $this->added;
54
	}
55
56
	/**
57
	 * Accessor for $this->modified.
58
	 *
59
	 * @return array
60
	 */
61
	public function GetModified() {
62
		return $this->modified;
63
	}
64
65
	/**
66
	 * Accessor for $this->deleted.
67
	 *
68
	 * @return array
69
	 */
70
	public function GetDeleted() {
71
		return $this->deleted;
72
	}
73
74
	/**
75
	 * Returns total changes.
76
	 *
77
	 * @return int
78
	 */
79
	public function Total() {
80
		return count($this->added) + count($this->modified) + count($this->deleted);
81
	}
82
83
	/**
84
	 * Imports a single message.
85
	 *
86
	 * @param array  $props
87
	 * @param int    $flags
88
	 * @param object $retmapimessage
89
	 *
90
	 * @return int
91
	 */
92
	public function ImportMessageChange($props, $flags, $retmapimessage) {
93
		$entryid = $props[PR_ENTRYID] ?? null;
0 ignored issues
show
The constant grommunio\DAV\PR_ENTRYID was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
94
		// if the entryid is not available, do the fallback to the sourcekey
95
		if (!$entryid && isset($props[PR_SOURCE_KEY], $props[PR_PARENT_SOURCE_KEY])) {
0 ignored issues
show
The constant grommunio\DAV\PR_SOURCE_KEY was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
The constant grommunio\DAV\PR_PARENT_SOURCE_KEY was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
96
			$entryid = mapi_msgstore_entryidfromsourcekey($this->store, $props[PR_PARENT_SOURCE_KEY], $props[PR_SOURCE_KEY]);
97
		}
98
		$mapimessage = mapi_msgstore_openentry($this->store, $entryid);
99
		$messageProps = mapi_getprops($mapimessage, [PR_SOURCE_KEY, $this->props["goid"]]);
100
101
		$url = null;
102
		if (isset($messageProps[$this->props["goid"]])) {
103
			// get uid from goid and check if it's a valid one
104
			$url = getUidFromGoid($messageProps[$this->props["goid"]]);
0 ignored issues
show
The function getUidFromGoid was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

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

104
			$url = /** @scrutinizer ignore-call */ getUidFromGoid($messageProps[$this->props["goid"]]);
Loading history...
105
			if ($url != null) {
106
				$this->logger->trace("got %s (goid: %s uid: %s), flags: %d", bin2hex($messageProps[PR_SOURCE_KEY]), bin2hex($messageProps[$this->props["goid"]]), $url, $flags);
107
				$this->syncstate->rememberAppttsref($this->folderid, bin2hex($messageProps[PR_SOURCE_KEY]), $url);
108
			}
109
		}
110
		if (!$url) {
111
			$this->logger->trace("got %s (PR_SOURCE_KEY), flags: %d", bin2hex($messageProps[PR_SOURCE_KEY]), $flags);
112
			$url = bin2hex($messageProps[PR_SOURCE_KEY]);
113
		}
114
		$url = rawurlencode($url);
115
116
		if ($flags == SYNC_NEW_MESSAGE) {
0 ignored issues
show
The constant grommunio\DAV\SYNC_NEW_MESSAGE was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
117
			$this->added[] = $url . $this->fileext;
118
		}
119
		else {
120
			$this->modified[] = $url . $this->fileext;
121
		}
122
123
		return SYNC_E_IGNORE;
0 ignored issues
show
The constant grommunio\DAV\SYNC_E_IGNORE was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
124
	}
125
126
	/**
127
	 * Imports a list of messages to be deleted.
128
	 *
129
	 * @param int   $flags
130
	 * @param array $sourcekeys array with sourcekeys
131
	 */
132
	public function ImportMessageDeletion($flags, $sourcekeys) {
133
		foreach ($sourcekeys as $sourcekey) {
134
			$this->logger->trace("got %s", bin2hex($sourcekey));
135
			$appttsref = $this->syncstate->getAppttsref($this->folderid, bin2hex($sourcekey));
136
			if ($appttsref !== null) {
137
				$this->deleted[] = $appttsref . $this->fileext;
138
			}
139
			else {
140
				$this->deleted[] = bin2hex($sourcekey) . $this->fileext;
141
			}
142
		}
143
	}
144
145
	/** Implement MAPI interface */
146
	public function Config($stream, $flags = 0) {}
147
148
	public function GetLastError($hresult, $ulflags, &$lpmapierror) {}
149
150
	public function UpdateState($stream) {}
151
152
	public function ImportMessageMove($sourcekeysrcfolder, $sourcekeysrcmessage, $message, $sourcekeydestmessage, $changenumdestmessage) {}
153
154
	public function ImportPerUserReadStateChange($readstates) {}
155
156
	public function ImportFolderChange($props) {
157
		return 0;
158
	}
159
160
	public function ImportFolderDeletion($flags, $sourcekeys) {
161
		return 0;
162
	}
163
}
164