Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
<?php
/**
* MessageFolder.class.php
*
* This is a FolderType implementation for message folders.
* A message folder contains the attachments of a Stud.IP message.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* @author Moritz Strohm <strohm@data-quest.de>
* @copyright 2016 data-quest
* @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2
* @category Stud.IP
*/
class MessageFolder extends StandardFolder implements FolderType
{
protected $folder;
/**
* @param Folder|null folder The folder object for this FolderType
*/
public function __construct($folder = null)
{
if ($folder instanceof MessageFolder) {
$this->folder = $folder->folder;
} elseif ($folder instanceof Folder) {
$this->folder = $folder;
} else {
$this->folder = Folder::build($folder);
}
$this->folder['folder_type'] = get_class($this);
}
/**
* @param string $attribute
* @return mixed
*/
public function __get($attribute)
{
return $this->folder[$attribute];
}
/**
* Retrieves or creates the top folder for a message.
*
* Creating top folders for messages is a special task since
* message attachments can be stored when the message wasn't sent yet.
* This means that message attachments of an unsent message are stored
* in a top folder with a range-ID that doesn't belong to a message
* table entry (yet). Therefore we must create the top folder
* manually when we can't find the top folder by the method
* Folder::getTopFolder.
*
* @param string $message_id The message-ID of the message whose top folder
* shall be returned
*
* @return MessageFolder|null The top folder of the message identified by
* $message_id. If the folder can't be retrieved, null is returned.
*/
public static function findTopFolder($message_id)
{
//try to find the top folder:
$folder = Folder::findOneByrange_id($message_id);
//check if that was successful:
if ($folder) {
return new MessageFolder($folder);
}
}
/**
* Creates a root folder (top folder) for a message referenced by its ID.
*
* @param string $message_id The ID of a message for which a root folder
* shall be generated.
*
* @return MessageFolder A new MessageFolder as root folder for a message.
*/
public static function createTopFolder($message_id)
{
return new MessageFolder(
Folder::createTopFolder(
$message_id,
'message',
'MessageFolder'
)
);
}
/**
* Returns the amount of attachments for a message.
*
* @param string $message_id The ID of a message.
*
* @return int The amount of attachments that have been found for the message.
*/
public static function getNumMessageAttachments($message_id)
{
$message_top_folder = self::findTopFolder($message_id);
if (!$message_top_folder) {
return 0;
}
//return the amount of file references that are logically inside the
//top folder. This is the amount of message attachments.
$num_file_ref = FileRef::countBySql('folder_id = :folder_id', [
'folder_id' => $message_top_folder->getId()
]);
return $num_file_ref;
}
/**
* This method returns always false since MessageFolder types are not
* creatable in standard folders. They are a standalone folder type.
*/
public static function availableInRange($range_id_or_object, $user_id)
{
return false;
}
/**
* Returns a localised name of the MessageFolder type.
*/
public static function getTypeName()
{
return _('Nachrichtenordner');
}
/**
* Returns the Icon object for the MessageFolder type.
*/
public function getIcon($role = Icon::DEFAULT_ROLE)
{
return Icon::create('folder-message', $role);
}
/**
* Returns the ID of the folder object of this MessageFolder.
*/
public function getId()
{
return $this->folder->id;
}
/**
* See method MessageFolder::isReadable.
*/
public function isVisible($user_id)
{
return $this->isReadable($user_id);
}
/**
* This method checks if a specified user can read the MessageFolder object.
*
* @param string $user_id The ID of the user whose read permission
* shall be checked.
*
* @return True, if the user, specified by $user_id, can read the folder,
* false otherwise.
*/
public function isReadable($user_id)
{
$condition = 'message_id = :message_id AND user_id = :user_id';
return MessageUser::countBySql($condition, [
'message_id' => $this->folder->range_id,
'user_id' => $user_id,
]) > 0;
}
/**
* MessageFolders are only writable for their owners.
*/
public function isWritable($user_id)
{
return $user_id === $this->folder->user_id;
}
/**
* MessageFolders are never editable.
*/
public function isEditable($user_id)
{
return false;
}
/**
* MessageFolders will never allow subfolders.
*/
public function isSubfolderAllowed($user_id)
{
return false;
}
/**
* MessageFolders don't have a description template.
*/
public function getDescriptionTemplate()
{
return '';
}
/**
* MessageFolders don't have subfolders.
*/
public function getSubfolders()
{
return [];
}
/**
* MessageFolders don't have parents.
*/
public function getParent()
{
return null;
}
/**
* MessageFolders don't have an edit template.
*/
public function getEditTemplate()
{
return '';
}
/**
* MessageFolders don't have an edit template and therefore cannot
* handle requests from such templates.
*/
public function setDataFromEditTemplate($request)
{
}
/**
* This method handles file upload validation.
*
* @param array $uploaded_file The uploaded file that shall be validated.
* @param string $user_id The user who wishes to upload a file
* in this MessageFolder.
*
* @return string|null An error message on failure, null on success.
*/
public function validateUpload(FileType $newfile, $user_id)
{
$status = $GLOBALS['perm']->get_perm($user_id);
return $this->getValidationMessages(
FileManager::loadUploadTypeConfig('attachments', $status),
$newfile
);
}
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
/**
* Handles the deletion of a file inside this folder.
*
* @param string $file_ref_id The ID of the FileRef whose file
* shall be deleted.
*
* @return True, if the file has been deleted successfully, false otherwise.
*/
public function deleteFile($file_ref_id)
{
$file_refs = $this->folderdata->file_refs;
if ($file_refs) {
foreach ($file_refs as $file_ref) {
if ($file_ref->id === $file_ref_id) {
//we found the FileRef that shall be deleted
return $file_ref->delete();
}
}
}
//if no file refs are present or the file ref can't be found
//we return false:
return false;
}
/**
* Stores the MessageFolder object.
*
* @return True, if the MessageFolder has been stored successfully,
* false otheriwse.
*/
public function store()
{
return $this->folder->store();
}
/**
* MessageFolders cannot have subfolders.
*/
public function createSubfolder(FolderType $folderdata)
{
return null;
}
/**
* MessageFolders cannot have subfolders.
*/
public function deleteSubfolder($subfolder_id)
{
}
/**
* Deletes the MessageFolder object.
*
* @return True, if the MessageFolder has been deleted successfully,
* false otheriwse.
*/
public function delete()
{
return $this->folder->delete();
}
/**
* See method MessageFolder::isReadable
*/
public function isFileDownloadable($file_ref_id, $user_id)
{
return $this->isReadable($user_id);
}
/**
* Files inside MessageFolders are not editable.
*/
public function isFileEditable($file_ref_id, $user_id)
{
//message attachments are never editable!
return false;
}
/**
* Files inside MessageFolders are not writable.
*/
public function isFileWritable($file_ref_id, $user_id)
{
//message attachments are never writable!
return false;
}
/**
* @see FolderType::copySettings()
*/
public function copySettings()
{
return ['description' => $this->description];
}
}