Issues (380)

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  Header Injection
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

class/PostHandler.php (6 issues)

1
<?php
2
3
namespace XoopsModules\Newbb;
4
5
//
6
//  ------------------------------------------------------------------------ //
7
//                XOOPS - PHP Content Management System                      //
8
//                  Copyright (c) 2000-2020 XOOPS.org                        //
9
//                       <https://xoops.org>                             //
10
//  ------------------------------------------------------------------------ //
11
//  This program is free software; you can redistribute it and/or modify     //
12
//  it under the terms of the GNU General Public License as published by     //
13
//  the Free Software Foundation; either version 2 of the License, or        //
14
//  (at your option) any later version.                                      //
15
//                                                                           //
16
//  You may not change or alter any portion of this comment or credits       //
17
//  of supporting developers from this source code or any supporting         //
18
//  source code which is considered copyrighted (c) material of the          //
19
//  original comment or credit authors.                                      //
20
//                                                                           //
21
//  This program is distributed in the hope that it will be useful,          //
22
//  but WITHOUT ANY WARRANTY; without even the implied warranty of           //
23
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            //
24
//  GNU General Public License for more details.                             //
25
//                                                                           //
26
//  You should have received a copy of the GNU General Public License        //
27
//  along with this program; if not, write to the Free Software              //
28
//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA //
29
//  ------------------------------------------------------------------------ //
30
//  Author: phppp (D.J., [email protected])                                  //
31
//  URL: https://xoops.org                                                    //
32
//  Project: Article Project                                                 //
33
//  ------------------------------------------------------------------------ //
34
35
use XoopsModules\Newbb;
36
37
38
39
\defined('NEWBB_FUNCTIONS_INI') || require $GLOBALS['xoops']->path('modules/newbb/include/functions.ini.php');
40
41
/**
42
 * Class PostHandler
43
 */
44
class PostHandler extends \XoopsPersistableObjectHandler
45
{
46
    /**
47
     * @param \XoopsDatabase|null $db
48
     */
49
    public function __construct(\XoopsDatabase $db = null)
50
    {
51
        parent::__construct($db, 'newbb_posts', Post::class, 'post_id', 'subject');
52
    }
53
54
    /**
55
     * @param mixed $id
56
     * @param null  $var
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $var is correct as it would always require null to be passed?
Loading history...
57
     * @return null|\XoopsObject
58
     */
59
    public function get($id = null, $var = null) //get($id)
60
    {
61
        $id    = (int)$id;
62
        $post  = null;
63
        $sql   = 'SELECT p.*, t.* FROM ' . $this->db->prefix('newbb_posts') . ' p LEFT JOIN ' . $this->db->prefix('newbb_posts_text') . ' t ON p.post_id=t.post_id WHERE p.post_id=' . $id;
64
        $array = $this->db->fetchArray($this->db->query($sql));
65
        if ($array) {
66
            $post = $this->create(false);
67
            $post->assignVars($array);
68
        }
69
70
        return $post;
71
    }
72
73
    /**
74
     * @param int              $limit
75
     * @param int              $start
76
     * @param \CriteriaElement $criteria
77
     * @param null             $fields
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $fields is correct as it would always require null to be passed?
Loading history...
78
     * @param bool             $asObject
79
     * @param int              $topic_id
80
     * @param int              $approved
81
     * @return array
82
     */
83
    //    public function getByLimit($topic_id, $limit, $approved = 1)
84
    public function &getByLimit(
85
        $limit = 0,
86
        $start = 0,
87
        \CriteriaElement $criteria = null,
88
        $fields = null,
89
        $asObject = true,
90
        $topic_id = 0,
91
        $approved = 1
92
    ) {
93
        $sql    = 'SELECT p.*, t.*, tp.topic_status FROM '
94
                  . $this->db->prefix('newbb_posts')
95
                  . ' p LEFT JOIN '
96
                  . $this->db->prefix('newbb_posts_text')
97
                  . ' t ON p.post_id=t.post_id LEFT JOIN '
98
                  . $this->db->prefix('newbb_topics')
99
                  . ' tp ON tp.topic_id=p.topic_id WHERE p.topic_id='
100
                  . $topic_id
101
                  . ' AND p.approved ='
102
                  . $approved
103
                  . ' ORDER BY p.post_time DESC';
104
        $result = $this->db->query($sql, $limit, 0);
105
        $ret    = [];
106
        while (false !== ($myrow = $this->db->fetchArray($result))) {
107
            $post = $this->create(false);
108
            $post->assignVars($myrow);
109
110
            $ret[$myrow['post_id']] = $post;
111
            unset($post);
112
        }
113
114
        return $ret;
115
    }
116
117
    /**
118
     * @param Post $post
119
     * @return mixed
120
     */
121
    public function getPostForPDF($post)
122
    {
123
        return $post->getPostBody(true);
124
    }
125
126
    /**
127
     * @param Post $post
128
     * @return mixed
129
     */
130
    public function getPostForPrint($post)
131
    {
132
        return $post->getPostBody();
133
    }
134
135
    /**
136
     * @param int|Post|\XoopsObject $post
137
     * @param bool                  $force
138
     * @return bool
139
     */
140
    public function approve(&$post, $force = false)
141
    {
142
        if (empty($post)) {
143
            return false;
144
        }
145
        if (\is_numeric($post)) {
146
            $post = $this->get($post);
147
        }
148
149
        $wasApproved = $post->getVar('approved');
150
        // irmtfan approve post if the approved = 0 (pending) or -1 (deleted)
151
        if (empty($force) && $wasApproved > 0) {
152
            return true;
153
        }
154
        $post->setVar('approved', 1);
155
        $this->insert($post, true);
156
157
        /** @var Newbb\TopicHandler $topicHandler */
158
        $topicHandler = \XoopsModules\Newbb\Helper::getInstance()->getHandler('Topic');
159
        $topicObject  = $topicHandler->get($post->getVar('topic_id'));
160
        if ($topicObject->getVar('topic_last_post_id') < $post->getVar('post_id')) {
161
            $topicObject->setVar('topic_last_post_id', $post->getVar('post_id'));
162
        }
163
        if ($post->isTopic()) {
164
            $topicObject->setVar('approved', 1);
165
        } else {
166
            $topicObject->setVar('topic_replies', $topicObject->getVar('topic_replies') + 1);
167
        }
168
        $topicHandler->insert($topicObject, true);
169
170
        /** @var Newbb\ForumHandler $forumHandler */
171
        $forumHandler = \XoopsModules\Newbb\Helper::getInstance()->getHandler('Forum');
172
        $forumObject  = $forumHandler->get($post->getVar('forum_id'));
173
        if ($forumObject->getVar('forum_last_post_id') < $post->getVar('post_id')) {
174
            $forumObject->setVar('forum_last_post_id', $post->getVar('post_id'));
175
        }
176
        $forumObject->setVar('forum_posts', $forumObject->getVar('forum_posts') + 1);
177
        if ($post->isTopic()) {
178
            $forumObject->setVar('forum_topics', $forumObject->getVar('forum_topics') + 1);
179
        }
180
        $forumHandler->insert($forumObject, true);
181
182
        // Update user stats
183
        if ($post->getVar('uid') > 0) {
184
            /** @var \XoopsMemberHandler $memberHandler */
185
            $memberHandler = \xoops_getHandler('member');
186
            $poster        = $memberHandler->getUser($post->getVar('uid'));
187
            if (\is_object($poster) && $post->getVar('uid') == $poster->getVar('uid')) {
188
                $poster->setVar('posts', $poster->getVar('posts') + 1);
189
                $res = $memberHandler->insertUser($poster, true);
190
                unset($poster);
191
            }
192
        }
193
194
        // Update forum stats
195
        /** @var StatsHandler $statsHandler */
196
        $statsHandler = \XoopsModules\Newbb\Helper::getInstance()->getHandler('Stats');
197
        $statsHandler->update($post->getVar('forum_id'), 'post');
198
        if ($post->isTopic()) {
199
            $statsHandler->update($post->getVar('forum_id'), 'topic');
200
        }
201
202
        return true;
203
    }
204
205
    /**
206
     * @param \XoopsObject $post
207
     * @param bool         $force
208
     * @return bool
209
     */
210
    public function insert(\XoopsObject $post, $force = true) //insert(&$post, $force = true)
211
    {
212
        $topicObject = null;
213
        // Set the post time
214
        // The time should be "publish" time. To be adjusted later
215
        if (!$post->getVar('post_time')) {
216
            $post->setVar('post_time', \time());
217
        }
218
219
        /** @var Newbb\TopicHandler $topicHandler */
220
        $topicHandler = \XoopsModules\Newbb\Helper::getInstance()->getHandler('Topic');
221
        // Verify the topic ID
222
        $topic_id = $post->getVar('topic_id');
223
        if ($topic_id) {
224
            $topicObject = $topicHandler->get($topic_id);
225
            // Invalid topic OR the topic is no approved and the post is not top post
226
            if (!$topicObject//    || (!$post->isTopic() && $topicObject->getVar("approved") < 1)
227
            ) {
228
                return false;
229
            }
230
        }
231
        if (empty($topic_id)) {
232
            $post->setVar('topic_id', 0);
233
            $post->setVar('pid', 0);
234
            $post->setNew();
235
            $topicObject = $topicHandler->create();
236
        }
237
        $textHandler    = \XoopsModules\Newbb\Helper::getInstance()->getHandler('Text');
238
        $post_text_vars = ['post_text', 'post_edit', 'dohtml', 'doxcode', 'dosmiley', 'doimage', 'dobr'];
239
        if ($post->isNew()) {
240
            if (!$topic_id = $post->getVar('topic_id')) {
241
                $topicObject->setVar('topic_title', $post->getVar('subject', 'n'));
242
                $topicObject->setVar('topic_poster', $post->getVar('uid'));
243
                $topicObject->setVar('forum_id', $post->getVar('forum_id'));
244
                $topicObject->setVar('topic_time', $post->getVar('post_time'));
245
                $topicObject->setVar('poster_name', $post->getVar('poster_name'));
246
                $topicObject->setVar('approved', $post->getVar('approved'));
247
248
                if (!$topic_id = $topicHandler->insert($topicObject, $force)) {
249
                    $post->deleteAttachment();
250
                    $post->setErrors('insert topic error');
251
252
                    //xoops_error($topicObject->getErrors());
253
                    return false;
254
                }
255
                $post->setVar('topic_id', $topic_id);
256
257
                $pid = 0;
258
                $post->setVar('pid', 0);
259
            } elseif (!$post->getVar('pid')) {
260
                $pid = $topicHandler->getTopPostId($topic_id);
261
                $post->setVar('pid', $pid);
262
            }
263
264
            $textObject = $textHandler->create();
265
            foreach ($post_text_vars as $key) {
266
                $textObject->vars[$key] = $post->vars[$key];
267
            }
268
            $post->destroyVars($post_text_vars);
269
270
            //            if (!$post_id = parent::insert($post, $force)) {
271
            //                return false;
272
            //            }
273
274
            if (!$post_id = parent::insert($post, $force)) {
275
                return false;
276
            }
277
            $post->unsetNew();
278
279
            $textObject->setVar('post_id', $post_id);
280
            if (!$textHandler->insert($textObject, $force)) {
281
                $this->delete($post);
282
                $post->setErrors('post text insert error');
283
284
                //xoops_error($textObject->getErrors());
285
                return false;
286
            }
287
            if ($post->getVar('approved') > 0) {
288
                $this->approve($post, true);
289
            }
290
            $post->setVar('post_id', $post_id);
291
        } else {
292
            if ($post->isTopic()) {
293
                if ($post->getVar('subject') !== $topicObject->getVar('topic_title')) {
294
                    $topicObject->setVar('topic_title', $post->getVar('subject', 'n'));
295
                }
296
                if ($post->getVar('approved') !== $topicObject->getVar('approved')) {
297
                    $topicObject->setVar('approved', $post->getVar('approved'));
298
                }
299
                $topicObject->setDirty();
300
                if (!$result = $topicHandler->insert($topicObject, $force)) {
301
                    $post->setErrors('update topic error');
302
303
                    //xoops_error($topicObject->getErrors());
304
                    return false;
305
                }
306
            }
307
            $textObject = $textHandler->get($post->getVar('post_id'));
308
            $textObject->setDirty();
309
            foreach ($post_text_vars as $key) {
310
                $textObject->vars[$key] = $post->vars[$key];
311
            }
312
            $post->destroyVars($post_text_vars);
313
            if (!$post_id = parent::insert($post, $force)) {
314
                //xoops_error($post->getErrors());
315
                return false;
316
            }
317
            $post->unsetNew();
318
319
            if (!$textHandler->insert($textObject, $force)) {
320
                $post->setErrors('update post text error');
321
322
                //xoops_error($textObject->getErrors());
323
                return false;
324
            }
325
        }
326
327
        return $post->getVar('post_id');
328
    }
329
330
    /**
331
     * @param \XoopsObject|Post $post
332
     * @param bool              $isDeleteOne
333
     * @param bool              $force
334
     * @return bool
335
     */
336
    public function delete(\XoopsObject $post, $isDeleteOne = true, $force = false)
337
    {
338
        if (!\is_object($post) || 0 == $post->getVar('post_id')) {
339
            return false;
340
        }
341
342
        if ($isDeleteOne) {
343
            if ($post->isTopic()) {
344
                $criteria = new \CriteriaCompo(new \Criteria('topic_id', $post->getVar('topic_id')));
345
                $criteria->add(new \Criteria('approved', 1));
346
                $criteria->add(new \Criteria('pid', 0, '>'));
347
                if ($this->getPostCount($criteria) > 0) {
348
                    return false;
349
                }
350
            }
351
352
            return $this->myDelete($post, $force);
353
        }
354
        require_once $GLOBALS['xoops']->path('class/xoopstree.php');
355
        $mytree = new Newbb\Tree($this->db->prefix('newbb_posts'), 'post_id', 'pid');
356
        $arr    = $mytree->getAllChild($post->getVar('post_id'));
357
        // irmtfan - delete childs in a reverse order
358
        for ($i = \count($arr) - 1; $i >= 0; $i--) {
359
            $childpost = $this->create(false);
360
            $childpost->assignVars($arr[$i]);
361
            $this->myDelete($childpost, $force);
362
            unset($childpost);
363
        }
364
        $this->myDelete($post, $force);
365
366
        return true;
367
    }
368
369
    /**
370
     * @param Post|\XoopsObject $post
371
     * @param bool              $force
372
     * @return bool
373
     */
374
    public function myDelete(Post $post, $force = false)
375
    {
376
        global $xoopsModule;
377
378
        if (!\is_object($post) || 0 == $post->getVar('post_id')) {
379
            return false;
380
        }
381
382
        /* Set active post as deleted */
383
        if ($post->getVar('approved') > 0 && empty($force)) {
384
            $sql = 'UPDATE ' . $this->db->prefix('newbb_posts') . ' SET approved = -1 WHERE post_id = ' . $post->getVar('post_id');
385
            if (!$result = $this->db->queryF($sql)) {
386
            }
387
            /* delete pending post directly */
388
        } else {
389
            $sql = \sprintf('DELETE FROM `%s` WHERE post_id = %u', $this->db->prefix('newbb_posts'), $post->getVar('post_id'));
390
            if (!$result = $this->db->queryF($sql)) {
391
                $post->setErrors('delete post error: ' . $sql);
392
393
                return false;
394
            }
395
            $post->deleteAttachment();
396
397
            $sql = \sprintf('DELETE FROM `%s` WHERE post_id = %u', $this->db->prefix('newbb_posts_text'), $post->getVar('post_id'));
398
            if (!$result = $this->db->queryF($sql)) {
399
                $post->setErrors('Could not remove post text: ' . $sql);
400
401
                return false;
402
            }
403
        }
404
405
        if ($post->isTopic()) {
406
            $topicHandler = \XoopsModules\Newbb\Helper::getInstance()->getHandler('Topic');
407
            /** @var Topic $topicObject */
408
            $topicObject = $topicHandler->get($post->getVar('topic_id'));
409
            if (\is_object($topicObject) && $topicObject->getVar('approved') > 0 && empty($force)) {
410
                $topiccount_toupdate = 1;
411
                $topicObject->setVar('approved', -1);
412
                $topicHandler->insert($topicObject);
413
                \xoops_notification_deletebyitem($xoopsModule->getVar('mid'), 'thread', $post->getVar('topic_id'));
414
            } else {
415
                if (\is_object($topicObject)) {
416
                    if ($topicObject->getVar('approved') > 0) {
417
                        \xoops_notification_deletebyitem($xoopsModule->getVar('mid'), 'thread', $post->getVar('topic_id'));
418
                    }
419
420
                    $poll_id = $topicObject->getVar('poll_id');
421
                    // START irmtfan poll_module
422
                    $topicObject->deletePoll($poll_id);
423
                    // END irmtfan poll_module
424
                }
425
426
                $sql = \sprintf('DELETE FROM `%s` WHERE topic_id = %u', $this->db->prefix('newbb_topics'), $post->getVar('topic_id'));
427
                if (!$result = $this->db->queryF($sql)) {
428
                    //xoops_error($this->db->error());
429
                }
430
                $sql = \sprintf('DELETE FROM `%s` WHERE topic_id = %u', $this->db->prefix('newbb_votedata'), $post->getVar('topic_id'));
431
                if (!$result = $this->db->queryF($sql)) {
432
                    //xoops_error($this->db->error());
433
                }
434
            }
435
        } else {
436
            $sql = 'UPDATE ' . $this->db->prefix('newbb_topics') . ' t
437
                            LEFT JOIN ' . $this->db->prefix('newbb_posts') . ' p ON p.topic_id = t.topic_id
438
                            SET t.topic_last_post_id = p.post_id
439
                            WHERE t.topic_last_post_id = ' . $post->getVar('post_id') . '
440
                                    AND p.post_id = (SELECT MAX(post_id) FROM ' . $this->db->prefix('newbb_posts') . ' WHERE topic_id=t.topic_id)';
441
            if (!$result = $this->db->queryF($sql)) {
442
            }
443
        }
444
445
        $postcount_toupdate = $post->getVar('approved');
446
447
        if ($postcount_toupdate > 0) {
448
            // Update user stats
449
            if ($post->getVar('uid') > 0) {
450
                /** @var \XoopsMemberHandler $memberHandler */
451
                $memberHandler = \xoops_getHandler('member');
452
                $poster        = $memberHandler->getUser($post->getVar('uid'));
453
                if (\is_object($poster) && $post->getVar('uid') == $poster->getVar('uid')) {
454
                    $poster->setVar('posts', $poster->getVar('posts') - 1);
455
                    $res = $memberHandler->insertUser($poster, true);
456
                    unset($poster);
457
                }
458
            }
459
            // irmtfan - just update the pid for approved posts when the post is not topic (pid=0)
460
            if (!$post->isTopic()) {
461
                $sql = 'UPDATE ' . $this->db->prefix('newbb_posts') . ' SET pid = ' . $post->getVar('pid') . ' WHERE approved=1 AND pid=' . $post->getVar('post_id');
462
                if (!$result = $this->db->queryF($sql)) {
463
                    //xoops_error($this->db->error());
464
                }
465
            }
466
        }
467
468
        return true;
469
    }
470
471
    // START irmtfan enhance getPostCount when there is join (read_mode = 2)
472
473
    /**
474
     * @param null $criteria
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $criteria is correct as it would always require null to be passed?
Loading history...
475
     * @param null $join
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $join is correct as it would always require null to be passed?
Loading history...
476
     * @return int|null
477
     */
478
    public function getPostCount($criteria = null, $join = null)
479
    {
480
        // if not join get the count from XOOPS/class/model/stats as before
481
        if (empty($join)) {
482
            return parent::getCount($criteria);
483
        }
484
485
        $sql = 'SELECT COUNT(*) as count' . ' FROM ' . $this->db->prefix('newbb_posts') . ' AS p' . ' LEFT JOIN ' . $this->db->prefix('newbb_posts_text') . ' AS t ON t.post_id = p.post_id';
486
        // LEFT JOIN
487
        $sql .= $join;
488
        // WHERE
489
        if (null !== $criteria && $criteria instanceof \CriteriaElement) {
490
            $sql .= ' ' . $criteria->renderWhere();
491
        }
492
        if (!$result = $this->db->query($sql)) {
493
            //xoops_error($this->db->error().'<br>'.$sql);
494
            return null;
495
        }
496
        $myrow = $this->db->fetchArray($result);
497
        $count = $myrow['count'];
498
499
        return $count;
500
    }
501
502
    // END irmtfan enhance getPostCount when there is join (read_mode = 2)
503
    /*
504
     * TODO: combining viewtopic.php
505
     */
506
507
    /**
508
     * @param null $criteria
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $criteria is correct as it would always require null to be passed?
Loading history...
509
     * @param int  $limit
510
     * @param int  $start
511
     * @param null $join
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $join is correct as it would always require null to be passed?
Loading history...
512
     * @return array
513
     */
514
    public function getPostsByLimit($criteria = null, $limit = 1, $start = 0, $join = null)
515
    {
516
        $ret = [];
517
        $sql = 'SELECT p.*, t.* ' . ' FROM ' . $this->db->prefix('newbb_posts') . ' AS p' . ' LEFT JOIN ' . $this->db->prefix('newbb_posts_text') . ' AS t ON t.post_id = p.post_id';
518
        if (!empty($join)) {
519
            $sql .= $join;
520
        }
521
        if (null !== $criteria && $criteria instanceof \CriteriaElement) {
522
            $sql .= ' ' . $criteria->renderWhere();
523
            if ('' !== $criteria->getSort()) {
524
                $sql .= ' ORDER BY ' . $criteria->getSort() . ' ' . $criteria->getOrder();
525
            }
526
        }
527
        $result = $this->db->query($sql, (int)$limit, (int)$start);
528
        if (!$result) {
529
            //xoops_error($this->db->error());
530
            return $ret;
531
        }
532
        while (false !== ($myrow = $this->db->fetchArray($result))) {
533
            $post = $this->create(false);
534
            $post->assignVars($myrow);
535
            $ret[$myrow['post_id']] = $post;
536
            unset($post);
537
        }
538
539
        return $ret;
540
    }
541
542
    /**
543
     * @return bool
544
     */
545
    public function synchronization()
546
    {
547
        //$this->cleanOrphan();
548
        return true;
549
    }
550
551
    /**
552
     * clean orphan items from database
553
     *
554
     * @param string $table_link
555
     * @param string $field_link
556
     * @param string $field_object
557
     * @return bool   true on success
558
     */
559
    public function cleanOrphan($table_link = '', $field_link = '', $field_object = '') //cleanOrphan()
560
    {
561
        $this->deleteAll(new \Criteria('post_time', 0), true, true);
562
        parent::cleanOrphan($this->db->prefix('newbb_topics'), 'topic_id');
563
        parent::cleanOrphan($this->db->prefix('newbb_posts_text'), 'post_id');
564
565
        $sql = 'DELETE FROM ' . $this->db->prefix('newbb_posts_text') . ' WHERE (post_id NOT IN ( SELECT DISTINCT post_id FROM ' . $this->table . ') )';
566
        if (!$result = $this->db->queryF($sql)) {
567
            //xoops_error($this->db->error());
568
            return false;
569
        }
570
571
        return true;
572
    }
573
574
    /**
575
     * clean expired objects from database
576
     *
577
     * @param int $expire time limit for expiration
578
     * @return bool true on success
579
     */
580
    public function cleanExpires($expire = 0)
581
    {
582
        // irmtfan if 0 no cleanup look include/plugin.php
583
        if (!\func_num_args()) {
584
            $newbbConfig = \newbbLoadConfig();
585
            $expire      = isset($newbbConfig['pending_expire']) ? (int)$newbbConfig['pending_expire'] : 7;
586
            $expire      = $expire * 24 * 3600; // days to seconds
587
        }
588
        if (empty($expire)) {
589
            return false;
590
        }
591
        $crit_expire = new \CriteriaCompo(new \Criteria('approved', 0, '<='));
592
        //if (!empty($expire)) {
593
        $crit_expire->add(new \Criteria('post_time', \time() - (int)$expire, '<'));
594
595
        //}
596
        return $this->deleteAll($crit_expire, true/*, true*/);
597
    }
598
}
599