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
Bug
introduced
by
![]() |
|||||
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
|
|||||
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
![]() |
|||||
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
|
|||||
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
|
|||||
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 |