OSDN Git Service

FIX: Adminクラス、showlist.phpのいくつかの関数でグローバル変数にアクセスできないバグの修正
[nucleus-jp/nucleus-next.git] / nucleus / libs / ADMIN.php
1 <?php\r
2 /**\r
3  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)\r
4  * Copyright (C) 2002-2012 The Nucleus Group\r
5  *\r
6  * This program is free software; you can redistribute it and/or\r
7  * modify it under the terms of the GNU General Public License\r
8  * as published by the Free Software Foundation; either version 2\r
9  * of the License, or (at your option) any later version.\r
10  * (see nucleus/documentation/index.html#license for more info)\r
11  */\r
12 /**\r
13  * The code for the Nucleus admin area\r
14  *\r
15  * @license http://nucleuscms.org/license.txt GNU General Public License\r
16  * @copyright Copyright (C) 2002-2012 The Nucleus Group\r
17  * @version $Id: ADMIN.php 1661 2012-02-12 11:55:39Z sakamocchi $\r
18  */\r
19 \r
20 if ( !function_exists('requestVar') ) exit;\r
21 require_once dirname(__FILE__) . '/showlist.php';\r
22 \r
23 class Admin\r
24 {\r
25         static private $xml_version_info                        = '1.0';\r
26         static private $formal_public_identifier        = '-//W3C//DTD XHTML 1.0 Strict//EN';\r
27         static private $system_identifier                       = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd';\r
28         static private $xhtml_namespace                 = 'http://www.w3.org/1999/xhtml';\r
29 \r
30         static public $headMess;\r
31 \r
32         static private $action;\r
33         static private $skin;\r
34         static private $passvar;\r
35         static private $aOptions;\r
36         \r
37         static public $extrahead;\r
38         static public $blog;\r
39         static public $contents;\r
40         \r
41         /**\r
42          * Admin::$edit_actions\r
43          */\r
44         static private $edit_actions = array(\r
45                 'adminskinoverview',\r
46                 'adminskinieoverview',\r
47                 'adminskinedittype',\r
48                 'adminskinremovetype',\r
49                 'adminskindelete',\r
50                 'adminskinedit',\r
51                 'adminskinieimport',\r
52                 'adminskiniedoimport',\r
53                 'admintemplateedit',\r
54                 'admintemplateoverview',\r
55                 'admintemplatedelete'\r
56         );\r
57         \r
58         /**\r
59          * Admin::$skinless_actions\r
60          */\r
61         static private $skinless_actions = array(\r
62                 'plugindeleteconfirm',\r
63                 'pluginoptionsupdate',\r
64                 'skinremovetypeconfirm',\r
65                 'skinclone',\r
66                 'skindeleteconfirm',\r
67                 'skinnew',\r
68                 'skineditgeneral',\r
69                 'skinieexport',\r
70                 'skinupdate',\r
71                 'templateupdate',\r
72                 'templatedeleteconfirm',\r
73                 'templatenew',\r
74                 'templateclone',\r
75                 'adminskinremovetypeconfirm',\r
76                 'adminskinclone',\r
77                 'adminskindeleteconfirm',\r
78                 'adminskinnew',\r
79                 'adminskineditgeneral',\r
80                 'adminskinieexport',\r
81                 'adminskinupdate',\r
82                 'admintemplateupdate',\r
83                 'admintemplatedeleteconfirm',\r
84                 'admintemplatenew',\r
85                 'admintemplateclone',\r
86                 'blogsettingsupdate',\r
87                 'settingsupdate',\r
88                 'addnewlog2',\r
89                 'additem',\r
90                 'itemdeleteconfirm',\r
91                 'itemupdate',\r
92                 'changemembersettings',\r
93                 'clearactionlog',\r
94                 'memberedit'\r
95                 );\r
96 \r
97                 static private $actions_needless_to_check = array(\r
98                 'showlogin',\r
99                 'login',\r
100                 'overview',\r
101                 'itemlist',\r
102                 'blogcommentlist',\r
103                 'bookmarklet',\r
104                 'blogsettings',\r
105                 'banlist',\r
106                 'createaccount',\r
107                 'deleteblog',\r
108                 'editmembersettings',\r
109                 'createaccount',\r
110                 'forgotpassword',\r
111                 'browseowncomments',\r
112                 'createitem',\r
113                 'itemedit',\r
114                 'itemmove',\r
115                 'categoryedit',\r
116                 'categorydelete',\r
117                 'manage',\r
118                 'actionlog',\r
119                 'settingsedit',\r
120                 'backupoverview',\r
121                 'pluginlist',\r
122                 'createnewlog',\r
123                 'usermanagement',\r
124                 'skinoverview',\r
125                 'templateoverview',\r
126                 'skinieoverview',\r
127                 'itemcommentlist',\r
128                 'commentedit',\r
129                 'commentdelete',\r
130                 'banlistnewfromitem',\r
131                 'banlistdelete',\r
132                 'itemdelete',\r
133                 'manageteam',\r
134                 'teamdelete',\r
135                 'banlistnew',\r
136                 'memberedit',\r
137                 'memberdelete',\r
138                 'pluginhelp',\r
139                 'pluginoptions',\r
140                 'plugindelete',\r
141                 'skinedittype',\r
142                 'skinremovetype',\r
143                 'skindelete',\r
144                 'skinedit',\r
145                 'templateedit',\r
146                 'templatedelete',\r
147                 'activate',\r
148                 'systemoverview',\r
149                 'activatesetpwd',\r
150         );\r
151         \r
152         static public function initialize()\r
153         {\r
154                 global $CONF, $DIR_LIBS, $manager, $member;\r
155                 \r
156                 /* NOTE: 1. decide which skinid to use */\r
157                 $skinid = $CONF['AdminSkin'];\r
158                 /*\r
159                  * NOTE: this is temporary escaped because not implemented yet*/\r
160                 if (isset($member) && $member->isLoggedIn())\r
161                 {\r
162                         $memskin = $member->getAdminSkin();\r
163                         if ( $memskin && Skin::existsID($memskin))\r
164                         {\r
165                                 $skinid = $memskin;\r
166                         }\r
167                 }\r
168                 \r
169                 /* NOTE: 2. make an instance of skin object */\r
170                 if ( !Skin::existsID($skinid) )\r
171                 {\r
172                         return FALSE;\r
173                 }\r
174                 \r
175                 /* NOTE: 3. initializing each members */\r
176                 self::$skin                     =& $manager->getSkin($skinid, 'AdminActions', 'AdminSkin');\r
177                 self::$action           = '';\r
178                 self::$extrahead        = '';\r
179                 self::$passvar          = '';\r
180                 self::$headMess         = '';\r
181                 self::$aOptions         = '';\r
182                 return TRUE;\r
183         }\r
184         \r
185         /**\r
186          * Admin::action()\r
187          * Executes an action\r
188          *\r
189          * @param       string  $action action to be performed\r
190          * @return      void\r
191          */\r
192         static public function action($action)\r
193         {\r
194                 global $CONF, $DIR_LIBS, $manager, $member;\r
195                 \r
196                 /* 1. decide action name */\r
197                 $customAction = postvar('customaction');\r
198                 if ( !empty($customAction) )\r
199                 {\r
200                         $alias = array(\r
201                                 'login' => $customAction,\r
202                                 ''              => $customAction\r
203                         );\r
204                 }\r
205                 else\r
206                 {\r
207                         $alias = array(\r
208                                 'login' => 'overview',\r
209                                 ''              => 'overview',\r
210                         );\r
211                 }\r
212                 if ( array_key_exists($action, $alias) && isset($alias[$action]) )\r
213                 {\r
214                         $action = $alias[$action];\r
215                 }\r
216                 $methodName = "action_{$action}";\r
217                 self::$action = strtolower($action);\r
218                 \r
219                 /* 2. check the action */\r
220                 $synonimActions = array(\r
221                         'banlistnewfromitem',\r
222                         'memberedit',\r
223                         'login',\r
224                 );\r
225                 $allowActions           = array_merge($synonimActions, self::$skinless_actions);\r
226                 $aActionsNotToCheck     = array_merge(self::$actions_needless_to_check, self::$edit_actions, $allowActions);\r
227                 if ( !in_array(self::$action, $aActionsNotToCheck) && !self::existsSkinContents($action) )\r
228                 {\r
229                         if (!$manager->checkTicket())\r
230                         {\r
231                                 self::error(_ERROR_BADTICKET);\r
232                                 return;\r
233                         }\r
234                 }\r
235                 \r
236                 /* 3. parse according to the action */\r
237                 if ( !method_exists('Admin', $methodName) && !in_array(self::$action, $allowActions) && self::existsSkinContents($action) )\r
238                 {\r
239                         /* TODO: what is this?\r
240                         self::action_parseSpecialskin();\r
241                         */\r
242                 }\r
243                 elseif ( method_exists('Admin', $methodName) )\r
244                 {\r
245                         call_user_func(array(__CLASS__, $methodName));\r
246                 }\r
247                 else if ( self::existsSkinContents('adminerrorpage') )\r
248                 {\r
249                         self::error(_BADACTION . ENTITY::hsc($action));\r
250                         return;\r
251                 }\r
252                 elseif ( $id != $CONF['AdminSkin'] )\r
253                 {\r
254                         self::$skin =& $manager->getSkin($CONF['AdminSkin'], 'AdminActions');\r
255                         if ( self::$skin && self::existsSkinContents('adminerrorpage') )\r
256                         {\r
257                                 self::error(_BADACTION . ENTITY::hsc($action));\r
258                                 return;\r
259                         }\r
260                 }\r
261                 else\r
262                 {\r
263                         self::error(_BADACTION . ENTITY::hsc($action));\r
264                         return;\r
265                 }\r
266                 return;\r
267         }\r
268         \r
269         /**\r
270          * Action::existsSkinContents()\r
271          * Check skin contents\r
272          *\r
273          * @param       string  $action action type\r
274          * @return      boolean\r
275          */\r
276         static private function existsSkinContents($action)\r
277         {\r
278                 $in_array  = in_array($action, self::$skinless_actions);\r
279                 \r
280                 if ( $in_array )\r
281                 {\r
282                         return $in_array;\r
283                 }\r
284                 else\r
285                 {\r
286                         $query = "SELECT scontent as result FROM %s WHERE sdesc=%d AND stype=%s";\r
287                         /* TODO: skinid should be a default */\r
288                         if ( !is_object(self::$skin) )\r
289                         {\r
290                                 global $CONF;\r
291                                 return DB::getValue(sprintf($query, sql_table('skin'), $CONF['AdminSkin'], DB::quoteValue($action)));\r
292                         }\r
293                         else\r
294                         {\r
295                                 return DB::getValue(sprintf($query, sql_table('skin'), self::$skin->getID(), DB::quoteValue($action)));\r
296                         }\r
297                 }\r
298                 return;\r
299         }\r
300         \r
301         /**\r
302          * Action::specialActionsAllow()\r
303          * Check exists specialskinparts\r
304          *\r
305          * @param       string  $action action type\r
306          * @return boolean\r
307          */\r
308         static private function specialActionsAllow($action)\r
309         {\r
310                 $query = "SELECT sdesc as result FROM %s WHERE  sdesc = %d AND stype = %s";\r
311                 $query = sprintf($query, sql_table('skin'), (integer) self::$skin->id, DB::quoteValue($action));\r
312                 return DB::getValue($query);\r
313         }\r
314         \r
315         /**\r
316          * Action::action_showlogin()\r
317          * \r
318          * @param       void\r
319          * @return      void\r
320          */\r
321         static private function action_showlogin()\r
322         {\r
323                 global $error;\r
324                 self::action_login($error);\r
325                 return;\r
326         }\r
327         \r
328         /**\r
329          * Action::action_login()\r
330          * \r
331          * @param       string  $msg            message for pageheader\r
332          * @param       integer $passvars       ???\r
333          */\r
334         static private function action_login($msg = '', $passvars = 1)\r
335         {\r
336                 global $member;\r
337                 \r
338                 // skip to overview when allowed\r
339                 if ( $member->isLoggedIn() && $member->canLogin() )\r
340                 {\r
341                         self::action_overview();\r
342                         return;\r
343                 }\r
344                 \r
345                 /* TODO: needless variable??? */\r
346                 self::$passvar = $passvars;\r
347                 if ( $msg )\r
348                 {\r
349                         self::$headMess = $msg;\r
350                 }\r
351                 \r
352                 self::$skin->parse('showlogin');\r
353         }\r
354         \r
355         /**\r
356          * Action::action_overview()\r
357          * provides a screen with the overview of the actions available\r
358          * \r
359          * @param       string  $msg    message for pageheader\r
360          * @return      void\r
361          */\r
362         static private function action_overview($msg = '')\r
363         {\r
364                 if ( $msg )\r
365                 {\r
366                         self::$headMess = $msg;\r
367                 }\r
368                 \r
369                 self::$skin->parse('overview');\r
370                 return;\r
371         }\r
372         \r
373         /**\r
374          * Admin::action_manage()\r
375          * \r
376          * @param       string  $msg    message for pageheader\r
377          * @retrn       void\r
378          */\r
379         static private function action_manage($msg = '')\r
380         {\r
381                 global $member;\r
382                 \r
383                 if ( $msg )\r
384                 {\r
385                         self::$headMess = $msg;\r
386                 }\r
387                 $member->isAdmin() or self::disallow();\r
388                 \r
389                 self::$skin->parse('manage');\r
390                 return;\r
391         }\r
392         \r
393         /**\r
394          * Action::action_itemlist()\r
395          * \r
396          * @param       integer id for weblod\r
397          * @return      void\r
398          */\r
399         static private function action_itemlist($blogid = '')\r
400         {\r
401                 global $member, $manager, $CONF;\r
402                 \r
403                 if ( $blogid == '' )\r
404                 {\r
405                         $blogid = intRequestVar('blogid');\r
406                 }\r
407                 \r
408                 $member->teamRights($blogid) or $member->isAdmin() or self::disallow();\r
409                 \r
410                 self::$skin->parse('itemlist');\r
411                 return;\r
412         }\r
413         \r
414         /**\r
415          * Action::action_batchitem()\r
416          * \r
417          * @param       void\r
418          * @return      void\r
419          */\r
420         static private function action_batchitem()\r
421         {\r
422                 global $member, $manager;\r
423                 \r
424                 $member->isLoggedIn() or self::disallow();\r
425                 \r
426                 $selected       = requestIntArray('batch');\r
427                 $action         = requestVar('batchaction');\r
428                 \r
429                 if ( !is_array($selected) || sizeof($selected) == 0 )\r
430                 {\r
431                         self::error(_BATCH_NOSELECTION);\r
432                         return;\r
433                 }\r
434                 \r
435                 // On move: when no destination blog/category chosen, show choice now\r
436                 $destCatid = intRequestVar('destcatid');\r
437                 if ( ($action == 'move') && (!$manager->existsCategory($destCatid)) )\r
438                 {\r
439                         self::batchMoveSelectDestination('item', $selected);\r
440                 }\r
441                 \r
442                 // On delete: check if confirmation has been given\r
443                 if ( ($action == 'delete') && (requestVar('confirmation') != 'yes') )\r
444                 {\r
445                         self::batchAskDeleteConfirmation('item', $selected);\r
446                 }\r
447                 \r
448                 self::$skin->parse('batchitem');\r
449                 return;\r
450         }\r
451         \r
452         /**\r
453          * Action::action_batchcomment()\r
454          * \r
455          * @param       void\r
456          * @return      void\r
457          */\r
458         static private function action_batchcomment()\r
459         {\r
460                 global $member;\r
461                 \r
462                 $member->isLoggedIn() or self::disallow();\r
463                 \r
464                 $selected       = requestIntArray('batch');\r
465                 $action         = requestVar('batchaction');\r
466                 \r
467                 // Show error when no items were selected\r
468                 if ( !is_array($selected) || sizeof($selected) == 0 )\r
469                 {\r
470                         self::error(_BATCH_NOSELECTION);\r
471                         return;\r
472                 }\r
473                 \r
474                 // On delete: check if confirmation has been given\r
475                 if ( ($action == 'delete') && (requestVar('confirmation') != 'yes') )\r
476                 {\r
477                         self::batchAskDeleteConfirmation('comment', $selected);\r
478                 }\r
479                 \r
480                 self::$skin->parse('batchcomment');\r
481                 return;\r
482         }\r
483         \r
484         /**\r
485          * Admin::setAdminAction()\r
486          *\r
487          * @param       string  $action\r
488          * @return      void\r
489          */\r
490         static public function setAdminAction($action)\r
491         {\r
492                 self::$action = $action;\r
493                 return;\r
494         }\r
495         \r
496         /**\r
497          * Admin::action_batchmember()\r
498          * \r
499          * @param       void\r
500          * @return      void\r
501          */\r
502         static private function action_batchmember()\r
503         {\r
504                 global $member;\r
505                 \r
506                 ($member->isLoggedIn() && $member->isAdmin()) or self::disallow();\r
507                 \r
508                 $selected       = requestIntArray('batch');\r
509                 $action         = requestVar('batchaction');\r
510                 \r
511                 // Show error when no members selected\r
512                 if ( !is_array($selected) || sizeof($selected) == 0 )\r
513                 {\r
514                         self::error(_BATCH_NOSELECTION);\r
515                         return;\r
516                 }\r
517                 \r
518                 // On delete: check if confirmation has been given\r
519                 if ( ($action == 'delete') && (requestVar('confirmation') != 'yes') )\r
520                 {\r
521                         self::batchAskDeleteConfirmation('member',$selected);\r
522                 }\r
523                 \r
524                 self::$skin->parse('batchmember');\r
525                 return;\r
526         }\r
527         \r
528         /**\r
529          * Admin::action_batchteam()\r
530          * \r
531          * @param       void\r
532          * @return      void\r
533          */\r
534         static private function action_batchteam()\r
535         {\r
536                 global $member;\r
537                 \r
538                 $blogid = intRequestVar('blogid');\r
539                 \r
540                 ($member->isLoggedIn() && $member->blogAdminRights($blogid)) or self::disallow();\r
541                 \r
542                 $selected       = requestIntArray('batch');\r
543                 $action         = requestVar('batchaction');\r
544                 \r
545                 if ( !is_array($selected) || sizeof($selected) == 0 )\r
546                 {\r
547                         self::error(_BATCH_NOSELECTION);\r
548                         return;\r
549                 }\r
550                 \r
551                 // On delete: check if confirmation has been given\r
552                 if ( ($action == 'delete') && (requestVar('confirmation') != 'yes') )\r
553                 {\r
554                         self::batchAskDeleteConfirmation('team',$selected);\r
555                 }\r
556                 \r
557                 self::$skin->parse('batchteam');\r
558                 return;\r
559         }\r
560         \r
561         /**\r
562          * Admin::action_batchcategory()\r
563          * \r
564          * @param       void\r
565          * @return      void\r
566          */\r
567         static private function action_batchcategory()\r
568         {\r
569                 global $member, $manager;\r
570                 \r
571                 $member->isLoggedIn() or self::disallow();\r
572                 \r
573                 $selected       = requestIntArray('batch');\r
574                 $action         = requestVar('batchaction');\r
575                 \r
576                 if ( !is_array($selected) || sizeof($selected) == 0 )\r
577                 {\r
578                         self::error(_BATCH_NOSELECTION);\r
579                         return;\r
580                 }\r
581                 \r
582                 // On move: when no destination blog chosen, show choice now\r
583                 $destBlogId = intRequestVar('destblogid');\r
584                 if ( ($action == 'move') && (!$manager->existsBlogID($destBlogId)) )\r
585                 {\r
586                         self::batchMoveCategorySelectDestination('category', $selected);\r
587                 }\r
588                 \r
589                 // On delete: check if confirmation has been given\r
590                 if ( ($action == 'delete') && (requestVar('confirmation') != 'yes') )\r
591                 {\r
592                         self::batchAskDeleteConfirmation('category', $selected);\r
593                 }\r
594                 \r
595                 self::$skin->parse('batchcategory');\r
596                 return;\r
597         }\r
598         \r
599         /**\r
600          * Admin::batchMoveSelectDestination()\r
601          * \r
602          * @param       string  $type   type of batch action\r
603          * @param       integer $ids    needless???\r
604          * @return      void\r
605          * \r
606          * TODO: remove needless argument\r
607          */\r
608         static private function batchMoveSelectDestination($type, $ids)\r
609         {\r
610                 $_POST['batchmove'] = $type;\r
611                 self::$skin->parse('batchmove');\r
612                 return;\r
613         }\r
614         \r
615         /**\r
616          * Admin::batchMoveCategorySelectDestination()\r
617          * \r
618          * @param       string  $type   type of batch action\r
619          * @param       integer $ids    needless???\r
620          * @return      void\r
621          * \r
622          * TODO: remove needless argument\r
623          */\r
624         static private function batchMoveCategorySelectDestination($type, $ids)\r
625         {\r
626                 $_POST['batchmove'] = $type;\r
627                 global $manager;\r
628                 self::$skin->parse('batchmovecat');\r
629                 return;\r
630         }\r
631         \r
632         /**\r
633          * Admin::batchAskDeleteConfirmation()\r
634          * \r
635          * @param       string  $type   type of batch action\r
636          * @param       integer $ids    needless???\r
637          * @return      void\r
638          * \r
639          * TODO: remove needless argument\r
640          */\r
641         static private function batchAskDeleteConfirmation($type, $ids)\r
642         {\r
643                 self::$skin->parse('batchdelete');\r
644                 return;\r
645         }\r
646         \r
647         /**\r
648          * Admin::action_browseownitems()\r
649          * \r
650          * @param       void\r
651          * @return      void\r
652          */\r
653         static private function action_browseownitems()\r
654         {\r
655                 global $member, $manager, $CONF;\r
656                 \r
657                 self::$skin->parse('browseownitems');\r
658                 return;\r
659         }\r
660         \r
661         /**\r
662          * Admin::action_itemcommentlist()\r
663          * Show all the comments for a given item\r
664          * \r
665          * @param       integer $itemid ID for item\r
666          * @return      void\r
667          */\r
668         static private function action_itemcommentlist($itemid = '')\r
669         {\r
670                 global $member, $manager, $CONF;\r
671                 \r
672                 if ( $itemid == '' )\r
673                 {\r
674                         $itemid = intRequestVar('itemid');\r
675                 }\r
676                 \r
677                 // only allow if user is allowed to alter item\r
678                 $member->canAlterItem($itemid) or self::disallow();\r
679                 \r
680                 $item =& $manager->getItem($itemid, 1, 1);\r
681                 $_REQUEST['itemid'] = $item['itemid'];\r
682                 $_REQUEST['blogid'] = $item['blogid'];\r
683                 \r
684                 self::$skin->parse('itemcommentlist');\r
685                 return;\r
686         }\r
687         \r
688         /**\r
689          * Admin::action_browseowncomments()\r
690          * Browse own comments\r
691          * \r
692          * @param       void\r
693          * @return      void\r
694          */\r
695         static private function action_browseowncomments()\r
696         {\r
697                 self::$skin->parse('browseowncomments');\r
698                 return;\r
699         }\r
700         \r
701         /**\r
702          * Admin::action_blogcommentlist()\r
703          * Browse all comments for a weblog\r
704          * \r
705          * @param       integer $blogid ID for weblog\r
706          * @return      void\r
707          */\r
708         static private function action_blogcommentlist($blogid = '')\r
709         {\r
710                 global $member, $manager, $CONF;\r
711                 \r
712                 if ( $blogid == '' )\r
713                 {\r
714                         $blogid = intRequestVar('blogid');\r
715                 }\r
716                 else\r
717                 {\r
718                         $blogid = intval($blogid);\r
719                 }\r
720                 \r
721                 $member->teamRights($blogid) or $member->isAdmin() or self::disallow();\r
722                 \r
723                 /* TODO: we consider to use the other way insterad of this */\r
724                 $_REQUEST['blogid'] = $blogid;\r
725                 \r
726                 self::$skin->parse('blogcommentlist');\r
727                 return;\r
728         }\r
729         \r
730         /**\r
731          * Admin::action_createaccount()\r
732          * \r
733          * @param       void\r
734          * @return      void\r
735          */\r
736         static private function action_createaccount()\r
737         {\r
738                 global $CONF;\r
739                 \r
740                 if ( $CONF['AllowMemberCreate'] != 1 )\r
741                 {\r
742                         self::$skin->parse('createaccountdisable');\r
743                         return;\r
744                 }\r
745                 \r
746                 $name = '';\r
747                 $realname ='';\r
748                 $email = '';\r
749                 $url = '';\r
750                 \r
751                 $contents = array(\r
752                         'name'          => '',\r
753                         'realname'      => '',\r
754                         'email'         => '',\r
755                         'url'           => ''\r
756                 );\r
757                 \r
758                 if ( array_key_exists('showform', $_POST) && $_POST['showform'] == 1 )\r
759                 {\r
760                         $action = new Action();\r
761                         $message = $action->createAccount();\r
762                         if ( $message === 1 )\r
763                         {\r
764                                 self::$headMess = $message;\r
765                                 self::$skin->parse('createaccountsuccess');\r
766                                 return;\r
767                         }\r
768                         \r
769                         /* TODO: validation */\r
770                         if ( array_key_exists('name', $_POST) )\r
771                         {\r
772                                 $contents['name'] = $_POST['name'];\r
773                         }\r
774                         if ( array_key_exists('realname', $_POST) )\r
775                         {\r
776                                 $contents['realname'] = $_POST['realname'];\r
777                         }\r
778                         if ( array_key_exists('email', $_POST) )\r
779                         {\r
780                                 $contents['email'] = $_POST['email'];\r
781                         }\r
782                         if ( array_key_exists('url', $_POST) )\r
783                         {\r
784                                 $contents['url'] = $_POST['url'];\r
785                         }\r
786                         \r
787                         self::$contents = $contents;\r
788                         \r
789                 }\r
790                 \r
791                 self::$skin->parse('createaccountinput');\r
792                 return;\r
793         }\r
794         \r
795         /**\r
796          * Admin::action_createitem()\r
797          * Provide a page to item a new item to the given blog\r
798          * \r
799          * @param       void\r
800          * @return      void\r
801          */\r
802         static private function action_createitem()\r
803         {\r
804                 global $member, $manager;\r
805                 \r
806                 $blogid = intRequestVar('blogid');\r
807                 \r
808                 // check if allowed\r
809                 $member->teamRights($blogid) or self::disallow();\r
810                 \r
811                 $blog =& $manager->getBlog($blogid);\r
812                 $contents = array();\r
813                 \r
814                 $data = array(\r
815                         'blog'          => &$blog,\r
816                         'contents'      => &$contents\r
817                 );\r
818                 $manager->notify('PreAddItemForm', $data);\r
819                 \r
820                 if ( $blog->convertBreaks() )\r
821                 {\r
822                         if ( array_key_exists('body', $contents) && !empty($contents['body']) )\r
823                         {\r
824                                 $contents['body'] = removeBreaks($contents['body']);\r
825                         }\r
826                         if ( array_key_exists('more', $contents) && !empty($contents['more']) )\r
827                         {\r
828                                 $contents['more'] = removeBreaks($contents['more']);\r
829                         }\r
830                 }\r
831                 \r
832                 self::$blog = &$blog;\r
833                 self::$contents = &$contents;\r
834                 \r
835                 self::$skin->parse('createitem');\r
836                 return;\r
837         }\r
838         \r
839         /**\r
840          * Admin::action_itemedit()\r
841          * \r
842          * @param       void\r
843          * @return      void\r
844          */\r
845         static private function action_itemedit()\r
846         {\r
847                 global $member, $manager;\r
848                 \r
849                 $itemid = intRequestVar('itemid');\r
850                 \r
851                 // only allow if user is allowed to alter item\r
852                 $member->canAlterItem($itemid) or self::disallow();\r
853                 \r
854                 $item =& $manager->getItem($itemid, 1, 1);\r
855                 $blog =& $manager->getBlog($item['blogid']);\r
856                 $manager->notify('PrepareItemForEdit', array('blog'=> &$blog, 'item' => &$item));\r
857                 \r
858                 if ( $blog->convertBreaks() )\r
859                 {\r
860                         if ( array_key_exists('body', $item) && !empty($item['body']) )\r
861                         {\r
862                                 $item['body'] = removeBreaks($item['body']);\r
863                         }\r
864                         if ( array_key_exists('more', $item) && !empty($item['more']) )\r
865                         {\r
866                                 $item['more'] = removeBreaks($item['more']);\r
867                         }\r
868                 }\r
869                 \r
870                 self::$blog = &$blog;\r
871                 self::$contents = &$item;\r
872                 \r
873                 self::$skin->parse('itemedit');\r
874                 return;\r
875         }\r
876         \r
877         /**\r
878          * Admin::action_itemupdate()\r
879          * \r
880          * @param       void\r
881          * @return      void\r
882          */\r
883         static private function action_itemupdate()\r
884         {\r
885                 global $member, $manager, $CONF;\r
886                 \r
887                 $itemid = intRequestVar('itemid');\r
888                 $catid  = postVar('catid');\r
889                 \r
890                 // only allow if user is allowed to alter item\r
891                 $member->canUpdateItem($itemid, $catid) or self::disallow();\r
892                 \r
893                 $actiontype = postVar('actiontype');\r
894                 \r
895                 // delete actions are handled by itemdelete (which has confirmation)\r
896                 if ( $actiontype == 'delete' )\r
897                 {\r
898                         self::action_itemdelete();\r
899                         return;\r
900                 }\r
901                 \r
902                 $body           = postVar('body');\r
903                 $title          = postVar('title');\r
904                 $more           = postVar('more');\r
905                 $closed         = intPostVar('closed');\r
906                 $draftid        = intPostVar('draftid');\r
907                 \r
908                 // default action = add now\r
909                 if ( !$actiontype )\r
910                 {\r
911                         $actiontype='addnow';\r
912                 }\r
913                 \r
914                 // create new category if needed\r
915                 if ( i18n::strpos($catid,'newcat') === 0 )\r
916                 {\r
917                         // get blogid\r
918                         list($blogid) = sscanf($catid,"newcat-%d");\r
919                         \r
920                         // create\r
921                         $blog =& $manager->getBlog($blogid);\r
922                         $catid = $blog->createNewCategory();\r
923                         \r
924                         // show error when sth goes wrong\r
925                         if ( !$catid )\r
926                         {\r
927                                 self::doError(_ERROR_CATCREATEFAIL);\r
928                         }\r
929                 }\r
930                 \r
931                 /**\r
932                  * set some variables based on actiontype\r
933                  * \r
934                  * actiontypes:\r
935                  *      draft items -> addnow, addfuture, adddraft, delete\r
936                  *      non-draft items -> edit, changedate, delete\r
937                  * \r
938                  * variables set:\r
939                  *      $timestamp: set to a nonzero value for future dates or date changes\r
940                  *      $wasdraft: set to 1 when the item used to be a draft item\r
941                  *      $publish: set to 1 when the edited item is not a draft\r
942                  */\r
943                 $blogid =  getBlogIDFromItemID($itemid);\r
944                 $blog =& $manager->getBlog($blogid);\r
945                 \r
946                 $wasdrafts = array('adddraft', 'addfuture', 'addnow');\r
947                 $wasdraft  = in_array($actiontype, $wasdrafts) ? 1 : 0;\r
948                 $publish   = ($actiontype != 'adddraft' && $actiontype != 'backtodrafts') ? 1 : 0;\r
949                 if ( $actiontype == 'addfuture' || $actiontype == 'changedate' )\r
950                 {\r
951                         $timestamp = mktime(intPostVar('hour'), intPostVar('minutes'), 0, intPostVar('month'), intPostVar('day'), intPostVar('year'));\r
952                 }\r
953                 else\r
954                 {\r
955                         $timestamp =0;\r
956                 }\r
957                 \r
958                 // edit the item for real\r
959                 Item::update($itemid, $catid, $title, $body, $more, $closed, $wasdraft, $publish, $timestamp);\r
960                 \r
961                 self::updateFuturePosted($blogid);\r
962                 \r
963                 if ( $draftid > 0 )\r
964                 {\r
965                         // delete permission is checked inside Item::delete()\r
966                         Item::delete($draftid);\r
967                 }\r
968                 \r
969                 if ( $catid != intPostVar('catid') )\r
970                 {\r
971                         self::action_categoryedit(\r
972                                 $catid,\r
973                                 $blog->getID(),\r
974                                 $CONF['AdminURL'] . 'index.php?action=itemlist&blogid=' . getBlogIDFromItemID($itemid)\r
975                         );\r
976                 }\r
977                 else\r
978                 {\r
979                         // TODO: set start item correctly for itemlist\r
980                         $item =& $manager->getitem($itemid, 1, 1);\r
981                         $query = "SELECT COUNT(*) FROM %s WHERE unix_timestamp(itime) <= '%s';";\r
982                         $query = sprintf($query, sql_table('item'), $item['timestamp']);\r
983                         $cnt  = DB::getValue($query);\r
984                         $_REQUEST['start'] = $cnt + 1;\r
985                         self::action_itemlist(getBlogIDFromItemID($itemid));\r
986                 }\r
987                 return;\r
988         }\r
989         \r
990         /**\r
991          * Admin::action_itemdelete()\r
992          * Delete item\r
993          * \r
994          * @param       Void\r
995          * @return      Void\r
996          */\r
997         static private function action_itemdelete()\r
998         {\r
999                 global $member, $manager;\r
1000                 \r
1001                 $itemid = intRequestVar('itemid');\r
1002                 \r
1003                 // only allow if user is allowed to alter item\r
1004                 $member->canAlterItem($itemid) or self::disallow();\r
1005                 \r
1006                 if ( !$manager->existsItem($itemid,1,1) )\r
1007                 {\r
1008                         self::error(_ERROR_NOSUCHITEM);\r
1009                         return;\r
1010                 }\r
1011                 \r
1012                 self::$skin->parse('itemdelete');\r
1013                 return;\r
1014         }\r
1015         \r
1016         /**\r
1017          * Admin::action_itemdeleteconfirm()\r
1018          * \r
1019          * @param       void\r
1020          * @return      void\r
1021          */\r
1022         static private function action_itemdeleteconfirm()\r
1023         {\r
1024                 global $member, $manager;\r
1025                 \r
1026                 $itemid = intRequestVar('itemid');\r
1027                 \r
1028                 // only allow if user is allowed to alter item\r
1029                 $member->canAlterItem($itemid) or self::disallow();\r
1030                 \r
1031                 // get item first\r
1032                 $item =& $manager->getItem($itemid, 1, 1);\r
1033                 \r
1034                 // delete item (note: some checks will be performed twice)\r
1035                 self::deleteOneItem($item['itemid']);\r
1036                 \r
1037                 self::action_itemlist($item['blogid']);\r
1038                 return;\r
1039         }\r
1040         \r
1041         /**\r
1042          * Admin::deleteOneItem()\r
1043          * Deletes one item and returns error if something goes wrong\r
1044          * \r
1045          * @param       integer $itemid ID for item\r
1046          * @return      void\r
1047          */\r
1048         static public function deleteOneItem($itemid)\r
1049         {\r
1050                 global $member, $manager;\r
1051                 \r
1052                 // only allow if user is allowed to alter item (also checks if itemid exists)\r
1053                 if ( !$member->canAlterItem($itemid) )\r
1054                 {\r
1055                         return _ERROR_DISALLOWED;\r
1056                 }\r
1057                 \r
1058                 // need to get blogid before the item is deleted\r
1059                 $item =& $manager->getItem($itemid, 1, 1);\r
1060                 \r
1061                 $manager->loadClass('ITEM');\r
1062                 Item::delete($item['itemid']);\r
1063                 \r
1064                 // update blog's futureposted\r
1065                 self::updateFuturePosted($item['itemid']);\r
1066                 return;\r
1067         }\r
1068         \r
1069         /**\r
1070          * Admin::updateFuturePosted()\r
1071          * Update a blog's future posted flag\r
1072          * \r
1073          * @param integer $blogid\r
1074          * @return      void\r
1075          */\r
1076         static private function updateFuturePosted($blogid)\r
1077         {\r
1078                 global $manager;\r
1079                 \r
1080                 $blogid                 =  intval($blogid);\r
1081                 $blog                   =& $manager->getBlog($blogid);\r
1082                 $currenttime    =  $blog->getCorrectTime(time());\r
1083                 \r
1084                 $query = "SELECT * FROM %s WHERE iblog=%d AND iposted=0 AND itime>'%s'";\r
1085                 $query = sprintf($query, sql_table('item'), (integer) $blogid, i18n::formatted_datetime('mysql', $currenttime));\r
1086                 $result = DB::getResult($query);\r
1087                 \r
1088                 if ( $result->rowCount() > 0 )\r
1089                 {\r
1090                                 $blog->setFuturePost();\r
1091                 }\r
1092                 else\r
1093                 {\r
1094                                 $blog->clearFuturePost();\r
1095                 }\r
1096                 return;\r
1097         }\r
1098 \r
1099         /**\r
1100          * Admin::action_itemmove()\r
1101          * \r
1102          * @param       void\r
1103          * @return      void\r
1104          */\r
1105         static private function action_itemmove()\r
1106         {\r
1107                 global $member, $manager;\r
1108                 \r
1109                 $itemid = intRequestVar('itemid');\r
1110                 \r
1111                 $member->canAlterItem($itemid) or self::disallow();\r
1112                 \r
1113                 self::$skin->parse('itemmove');\r
1114                 return;\r
1115         }\r
1116         \r
1117         /**\r
1118          * Admin::action_itemmoveto()\r
1119          * \r
1120          * @param       void\r
1121          * @return      void\r
1122          */\r
1123         static private function action_itemmoveto()\r
1124         {\r
1125                 global $member, $manager;\r
1126                 \r
1127                 $itemid = intRequestVar('itemid');\r
1128                 $catid = requestVar('catid');\r
1129                 \r
1130                 // create new category if needed\r
1131                 if ( i18n::strpos($catid,'newcat') === 0 )\r
1132                 {\r
1133                         // get blogid\r
1134                         list($blogid) = sscanf($catid,'newcat-%d');\r
1135                         \r
1136                         // create\r
1137                         $blog =& $manager->getBlog($blogid);\r
1138                         $catid = $blog->createNewCategory();\r
1139                         \r
1140                         // show error when sth goes wrong\r
1141                         if ( !$catid )\r
1142                         {\r
1143                                 self::doError(_ERROR_CATCREATEFAIL);\r
1144                         }\r
1145                 }\r
1146                 \r
1147                 // only allow if user is allowed to alter item\r
1148                 $member->canUpdateItem($itemid, $catid) or self::disallow();\r
1149                 \r
1150                 $old_blogid = getBlogIDFromItemId($itemid);\r
1151                 \r
1152                 Item::move($itemid, $catid);\r
1153                 \r
1154                 // set the futurePosted flag on the blog\r
1155                 self::updateFuturePosted(getBlogIDFromItemId($itemid));\r
1156                 \r
1157                 // reset the futurePosted in case the item is moved from one blog to another\r
1158                 self::updateFuturePosted($old_blogid);\r
1159                 \r
1160                 if ( $catid != intRequestVar('catid') )\r
1161                 {\r
1162                         self::action_categoryedit($catid, $blog->getID());\r
1163                 }\r
1164                 else\r
1165                 {\r
1166                         self::action_itemlist(getBlogIDFromCatID($catid));\r
1167                 }\r
1168                 return;\r
1169         }\r
1170         \r
1171         /**\r
1172          * Admin::moveOneItem()\r
1173          * Moves one item to a given category (category existance should be checked by caller)\r
1174          * errors are returned\r
1175          * \r
1176          * @param       integer $itemid         ID for item\r
1177          * @param       integer $destCatid      ID for category to which the item will be moved\r
1178          * @return      void\r
1179          */\r
1180         static public function moveOneItem($itemid, $destCatid)\r
1181         {\r
1182                 global $member;\r
1183                 \r
1184                 // only allow if user is allowed to move item\r
1185                 if ( !$member->canUpdateItem($itemid, $destCatid) )\r
1186                 {\r
1187                         return _ERROR_DISALLOWED;\r
1188                 }\r
1189                 \r
1190                 Item::move($itemid, $destCatid);\r
1191                 return;\r
1192         }\r
1193         \r
1194         /**\r
1195          * Admin::action_additem()\r
1196          * Adds a item to the chosen blog\r
1197          * \r
1198          * @param       void\r
1199          * @return      void\r
1200          */\r
1201         static private function action_additem()\r
1202         {\r
1203                 global $manager, $CONF;\r
1204                 \r
1205                 $manager->loadClass('ITEM');\r
1206                 \r
1207                 $result = Item::createFromRequest();\r
1208                 \r
1209                 if ( $result['status'] == 'error' )\r
1210                 {\r
1211                         self::error($result['message']);\r
1212                         return;\r
1213                 }\r
1214                 \r
1215                 $item =& $manager->getItem($result['itemid'], 0, 0);\r
1216                 \r
1217                 if ( $result['status'] == 'newcategory' )\r
1218                 {\r
1219                         $distURI = $manager->addTicketToUrl($CONF['AdminURL'] . 'index.php?action=itemList&blogid=' . $item['blogid']);\r
1220                         self::action_categoryedit($result['catid'], $item['blogid'], $distURI);\r
1221                 }\r
1222                 else\r
1223                 {\r
1224                         $methodName = 'action_itemlist';\r
1225                         self::action_itemlist($item['blogid']);\r
1226                 }\r
1227                 return;\r
1228         }\r
1229         \r
1230         /**\r
1231          * Admin::action_commentedit()\r
1232          * Allows to edit previously made comments\r
1233          * \r
1234          * @param       void\r
1235          * @return      void\r
1236          */\r
1237         static private function action_commentedit()\r
1238         {\r
1239                 global $member, $manager;\r
1240                 \r
1241                 $commentid = intRequestVar('commentid');\r
1242                 \r
1243                 $member->canAlterComment($commentid) or self::disallow();\r
1244                 \r
1245                 $comment = COMMENT::getComment($commentid);\r
1246                 $manager->notify('PrepareCommentForEdit', array('comment' => &$comment));\r
1247                 \r
1248                 Admin::$contents = $comment;\r
1249                 self::$skin->parse('commentedit');\r
1250                 return;\r
1251         }\r
1252         \r
1253         /**\r
1254          * Admin::action_commentupdate()\r
1255          * \r
1256          * @param       void\r
1257          * @return      void\r
1258          */\r
1259         static private function action_commentupdate()\r
1260         {\r
1261                 global $member, $manager;\r
1262                 \r
1263                 $commentid = intRequestVar('commentid');\r
1264                 \r
1265                 $member->canAlterComment($commentid) or self::disallow();\r
1266                 \r
1267                 $url    = postVar('url');\r
1268                 $email  = postVar('email');\r
1269                 $body   = postVar('body');\r
1270                 \r
1271                 // intercept words that are too long\r
1272                 if (preg_match('#[a-zA-Z0-9|\.,;:!\?=\/\\\\]{90,90}#', $body) != FALSE)\r
1273                 {\r
1274                         self::error(_ERROR_COMMENT_LONGWORD);\r
1275                         return;\r
1276                 }\r
1277                 \r
1278                 // check length\r
1279                 if ( i18n::strlen($body) < 3 )\r
1280                 {\r
1281                         self::error(_ERROR_COMMENT_NOCOMMENT);\r
1282                         return;\r
1283                 }\r
1284                 \r
1285                 if ( i18n::strlen($body) > 5000 )\r
1286                 {\r
1287                         self::error(_ERROR_COMMENT_TOOLONG);\r
1288                         return;\r
1289                 }\r
1290                 \r
1291                 // prepare body\r
1292                 $body = Comment::prepareBody($body);\r
1293                 \r
1294                 // call plugins\r
1295                 $data = array(\r
1296                         'body' => &$body\r
1297                 );\r
1298                 $manager->notify('PreUpdateComment', $data);\r
1299                 \r
1300                 $query = "UPDATE %s SET cmail=%s, cemail=%s, cbody=%s WHERE cnumber=%d;";\r
1301                 $query = sprintf($query, sql_table('comment'), DB::quoteValue($url), DB::quoteValue($email), DB::quoteValue($body), (integer) $commentid);\r
1302                 DB::execute($query);\r
1303                 \r
1304                 // get itemid\r
1305                 $query = "SELECT citem FROM %s WHERE cnumber=%d;";\r
1306                 $query = sprintf($query, sql_table('comment'), (integer) $commentid);\r
1307                 \r
1308                 $itemid = DB::getValue($query);\r
1309                 \r
1310                 if ( $member->canAlterItem($itemid) )\r
1311                 {\r
1312                         self::action_itemcommentlist($itemid);\r
1313                 }\r
1314                 else\r
1315                 {\r
1316                         self::action_browseowncomments();\r
1317                 }\r
1318                 return;\r
1319         }\r
1320         \r
1321         /**\r
1322          * Admin::action_commentdelete()\r
1323          * Update comment\r
1324          * \r
1325          * @param       void\r
1326          * @return      void\r
1327          */\r
1328         static private function action_commentdelete()\r
1329         {\r
1330                 global $member, $manager;\r
1331                 \r
1332                 $commentid = intRequestVar('commentid');\r
1333                 $member->canAlterComment($commentid) or self::disallow();\r
1334                 \r
1335                 self::$skin->parse('commentdelete');\r
1336                 return;\r
1337         }\r
1338         \r
1339         /**\r
1340          * Admin::action_commentdeleteconfirm()\r
1341          * \r
1342          * @param       void\r
1343          * @return      void\r
1344          */\r
1345         static private function action_commentdeleteconfirm()\r
1346         {\r
1347                 global $member;\r
1348                 \r
1349                 $commentid = intRequestVar('commentid');\r
1350                 \r
1351                 // get item id first\r
1352                 $query = "SELECT citem FROM %s WHERE cnumber=%d;";\r
1353                 $query = sprintf($query, sql_table('comment'), (integer) $commentid);\r
1354                 \r
1355                 $itemid = DB::getValue($query);\r
1356                 \r
1357                 $error = self::deleteOneComment($commentid);\r
1358                 if ( $error )\r
1359                 {\r
1360                         self::doError($error);\r
1361                 }\r
1362                 \r
1363                 if ( $member->canAlterItem($itemid) )\r
1364                 {\r
1365                         self::action_itemcommentlist($itemid);\r
1366                 }\r
1367                 else\r
1368                 {\r
1369                         self::action_browseowncomments();\r
1370                 }\r
1371                 return;\r
1372         }\r
1373         \r
1374         /**\r
1375          * Admin::deleteOneComment()\r
1376          * \r
1377          * @param       integer $commentid      ID for comment\r
1378          * @return      void\r
1379          */\r
1380         static public function deleteOneComment($commentid)\r
1381         {\r
1382                 global $member, $manager;\r
1383                 \r
1384                 $commentid = (integer) $commentid;\r
1385                 \r
1386                 if ( !$member->canAlterComment($commentid) )\r
1387                 {\r
1388                         return _ERROR_DISALLOWED;\r
1389                 }\r
1390                 \r
1391                 $data = array(\r
1392                         'commentid' => $commentid\r
1393                 );\r
1394                 \r
1395                 $manager->notify('PreDeleteComment', $data);\r
1396                 \r
1397                 // delete the comments associated with the item\r
1398                 $query = "DELETE FROM %s WHERE cnumber=%d;";\r
1399                 $query = sprintf($query, sql_table('comment'), (integer) $commentid);\r
1400                 DB::execute($query);\r
1401                 \r
1402                 $data = array(\r
1403                         'commentid' => $commentid\r
1404                 );\r
1405                 \r
1406                 $manager->notify('PostDeleteComment', $data);\r
1407                 \r
1408                 return '';\r
1409         }\r
1410         \r
1411         /**\r
1412          * Admin::action_usermanagement()\r
1413          * Usermanagement main\r
1414          * \r
1415          * @param       void\r
1416          * @return      void\r
1417          */\r
1418         static private function action_usermanagement()\r
1419         {\r
1420                 global $member, $manager;\r
1421                 \r
1422                 // check if allowed\r
1423                 $member->isAdmin() or self::disallow();\r
1424                 \r
1425                 self::$skin->parse('usermanagement');\r
1426                 return;\r
1427         }\r
1428         \r
1429         /**\r
1430          * Admin::action_memberedit()\r
1431          * Edit member settings\r
1432          * \r
1433          * @param       void\r
1434          * @return      void\r
1435          */\r
1436         static private function action_memberedit()\r
1437         {\r
1438                 self::action_editmembersettings(intRequestVar('memberid'));\r
1439                 return;\r
1440         }\r
1441         \r
1442         /**\r
1443          * Admin::action_editmembersettings()\r
1444          * \r
1445          * @param       integer $memberid       ID for member\r
1446          * @return      void\r
1447          * \r
1448          */\r
1449         static private function action_editmembersettings($memberid = '')\r
1450         {\r
1451                 global $member, $manager, $CONF;\r
1452                 \r
1453                 if ( $memberid == '' )\r
1454                 {\r
1455                         $memberid = $member->getID();\r
1456                 }\r
1457                 \r
1458                 /* TODO: we should consider to use the other way insterad of this */\r
1459                 $_REQUEST['memberid'] = $memberid;\r
1460                 \r
1461                 // check if allowed\r
1462                 ($member->getID() == $memberid) or $member->isAdmin() or self::disallow();\r
1463                 \r
1464                 Admin::$extrahead .= "<script type=\"text/javascript\" src=\"<%skinfile(/javascripts/numbercheck.js)%>\"></script>\n";\r
1465                 \r
1466                 self::$skin->parse('editmembersettings');\r
1467                 return;\r
1468         }\r
1469         \r
1470         /**\r
1471          * Admin::action_changemembersettings()\r
1472          * \r
1473          * @param       void\r
1474          * @return      void\r
1475          */\r
1476         static private function action_changemembersettings()\r
1477         {\r
1478                 global $member, $CONF, $manager;\r
1479                 \r
1480                 $memberid = intRequestVar('memberid');\r
1481                 \r
1482                 // check if allowed\r
1483                 ($member->getID() == $memberid) or $member->isAdmin() or self::disallow();\r
1484                 \r
1485                 $name                   = trim(strip_tags(postVar('name')));\r
1486                 $realname               = trim(strip_tags(postVar('realname')));\r
1487                 $password               = postVar('password');\r
1488                 $repeatpassword = postVar('repeatpassword');\r
1489                 $email                  = strip_tags(postVar('email'));\r
1490                 $url                    = strip_tags(postVar('url'));\r
1491                 $adminskin              = intPostVar('adminskin');\r
1492                 $bookmarklet    = intPostVar('bookmarklet');\r
1493                 \r
1494                 // begin if: sometimes user didn't prefix the URL with http:// or https://, this cause a malformed URL. Let's fix it.\r
1495                 if ( !preg_match('#^https?://#', $url) )\r
1496                 {\r
1497                         $url = 'http://' . $url;\r
1498                 }\r
1499                 \r
1500                 $admin          = postVar('admin');\r
1501                 $canlogin       = postVar('canlogin');\r
1502                 $notes          = strip_tags(postVar('notes'));\r
1503                 $locale         = postVar('locale');\r
1504                 \r
1505                 $mem =& $manager->getMember($memberid);\r
1506                 \r
1507                 if ( $CONF['AllowLoginEdit'] || $member->isAdmin() )\r
1508                 {\r
1509                         if ( !isValidDisplayName($name) )\r
1510                         {\r
1511                                 self::error(_ERROR_BADNAME);\r
1512                                 return;\r
1513                         }\r
1514                         \r
1515                         if ( ($name != $mem->getDisplayName()) && Member::exists($name) )\r
1516                         {\r
1517                                 self::error(_ERROR_NICKNAMEINUSE);\r
1518                                 return;\r
1519                         }\r
1520                         \r
1521                         if ( $password != $repeatpassword )\r
1522                         {\r
1523                                 self::error(_ERROR_PASSWORDMISMATCH);\r
1524                                 return;\r
1525                         }\r
1526                         \r
1527                         if ( $password && (i18n::strlen($password) < 6) )\r
1528                         {\r
1529                                 self::error(_ERROR_PASSWORDTOOSHORT);\r
1530                                 return;\r
1531                         }\r
1532                                 \r
1533                         if ( $password )\r
1534                         {\r
1535                                 $pwdvalid = true;\r
1536                                 $pwderror = '';\r
1537                                 \r
1538                                 $data = array(\r
1539                                         'password'     => $password,\r
1540                                         'errormessage' => &$pwderror,\r
1541                                         'valid'        => &$pwdvalid\r
1542                                 );\r
1543                                 $manager->notify('PrePasswordSet', $data);\r
1544                                 \r
1545                                 if ( !$pwdvalid )\r
1546                                 {\r
1547                                         self::error($pwderror);\r
1548                                         return;\r
1549                                 }\r
1550                         }\r
1551                 }\r
1552                 \r
1553                 if ( !NOTIFICATION::address_validation($email) )\r
1554                 {\r
1555                         self::error(_ERROR_BADMAILADDRESS);\r
1556                         return;\r
1557                 }\r
1558                 if ( !$realname )\r
1559                 {\r
1560                         self::error(_ERROR_REALNAMEMISSING);\r
1561                         return;\r
1562                 }\r
1563                 if ( ($locale != '') && (!in_array($locale, i18n::get_available_locale_list())) )\r
1564                 {\r
1565                         self::error(_ERROR_NOSUCHTRANSLATION);\r
1566                         return;\r
1567                 }\r
1568                 \r
1569                 // check if there will remain at least one site member with both the logon and admin rights\r
1570                 // (check occurs when taking away one of these rights from such a member)\r
1571                 if (    (!$admin && $mem->isAdmin() && $mem->canLogin())\r
1572                         ||      (!$canlogin && $mem->isAdmin() && $mem->canLogin())\r
1573                         )\r
1574                 {\r
1575                         $r = DB::getResult('SELECT * FROM '.sql_table('member').' WHERE madmin=1 and mcanlogin=1');\r
1576                         if ( $r->rowCount() < 2 )\r
1577                         {\r
1578                                 self::error(_ERROR_ATLEASTONEADMIN);\r
1579                                 return;\r
1580                         }\r
1581                 }\r
1582                 \r
1583                 if ( $CONF['AllowLoginEdit'] || $member->isAdmin() )\r
1584                 {\r
1585                         $mem->setDisplayName($name);\r
1586                         if ( $password )\r
1587                         {\r
1588                                 $mem->setPassword($password);\r
1589                         }\r
1590                 }\r
1591                 \r
1592                 $oldEmail = $mem->getEmail();\r
1593                 \r
1594                 $mem->setRealName($realname);\r
1595                 $mem->setEmail($email);\r
1596                 $mem->setURL($url);\r
1597                 $mem->setNotes($notes);\r
1598                 $mem->setLocale($locale);\r
1599                 $mem->setAdminSkin($adminskin);\r
1600                 $mem->setBookmarklet($bookmarklet);\r
1601 \r
1602                 // only allow super-admins to make changes to the admin status\r
1603                 if ( $member->isAdmin() )\r
1604                 {\r
1605                         $mem->setAdmin($admin);\r
1606                         $mem->setCanLogin($canlogin);\r
1607                 }\r
1608                 \r
1609                 $autosave = postVar('autosave');\r
1610                 $mem->setAutosave($autosave);\r
1611                 \r
1612                 $mem->write();\r
1613                 \r
1614                 // store plugin options\r
1615                 $aOptions = requestArray('plugoption');\r
1616                 NucleusPlugin::apply_plugin_options($aOptions);\r
1617                 $data = array(\r
1618                         'context'  => 'member',\r
1619                         'memberid' => $memberid,\r
1620                         'member'   => &$mem\r
1621                 );\r
1622                 $manager->notify('PostPluginOptionsUpdate', $data);\r
1623                 \r
1624                 // if email changed, generate new password\r
1625                 if ( $oldEmail != $mem->getEmail() )\r
1626                 {\r
1627                         $mem->sendActivationLink('addresschange', $oldEmail);\r
1628                         // logout member\r
1629                         $mem->newCookieKey();\r
1630                         \r
1631                         // only log out if the member being edited is the current member.\r
1632                         if ( $member->getID() == $memberid )\r
1633                         {\r
1634                                 $member->logout();\r
1635                         }\r
1636                         self::action_login(_MSG_ACTIVATION_SENT, 0);\r
1637                         return;\r
1638                 }\r
1639                 \r
1640                 if ( ($mem->getID() == $member->getID())\r
1641                         && ($mem->getDisplayName() != $member->getDisplayName()) )\r
1642                 {\r
1643                         $mem->newCookieKey();\r
1644                         $member->logout();\r
1645                         self::action_login(_MSG_LOGINAGAIN, 0);\r
1646                 }\r
1647                 else\r
1648                 {\r
1649                         self::action_overview(_MSG_SETTINGSCHANGED);\r
1650                 }\r
1651                 return;\r
1652         }\r
1653 \r
1654         /**\r
1655          * Admin::action_memberadd()\r
1656          * \r
1657          * @param       void\r
1658          * @return      void\r
1659          * \r
1660          */\r
1661         static private function action_memberadd()\r
1662         {\r
1663                 global $member, $manager;\r
1664                 \r
1665                 // check if allowed\r
1666                 $member->isAdmin() or self::disallow();\r
1667                 \r
1668                 if ( postVar('password') != postVar('repeatpassword') )\r
1669                 {\r
1670                         self::error(_ERROR_PASSWORDMISMATCH);\r
1671                         return;\r
1672                 }\r
1673                 \r
1674                 if ( i18n::strlen(postVar('password')) < 6 )\r
1675                 {\r
1676                         self::error(_ERROR_PASSWORDTOOSHORT);\r
1677                         return;\r
1678                 }\r
1679                 \r
1680                 $res = Member::create(\r
1681                         postVar('name'),\r
1682                         postVar('realname'),\r
1683                         postVar('password'),\r
1684                         postVar('email'),\r
1685                         postVar('url'),\r
1686                         postVar('admin'),\r
1687                         postVar('canlogin'),\r
1688                         postVar('notes')\r
1689                 );\r
1690                 \r
1691                 if ( $res != 1 )\r
1692                 {\r
1693                         self::error($res);\r
1694                         return;\r
1695                 }\r
1696                 \r
1697                 // fire PostRegister event\r
1698                 $newmem = new Member();\r
1699                 $newmem->readFromName(postVar('name'));\r
1700                 $data = array(\r
1701                         'member' => &$newmem\r
1702                 );\r
1703                 $manager->notify('PostRegister', $data);\r
1704                 \r
1705                 self::action_usermanagement();\r
1706                 return;\r
1707         }\r
1708         \r
1709         /**\r
1710          * Admin::action_forgotpassword()\r
1711          * \r
1712          * @param       void\r
1713          * @return      void\r
1714          */\r
1715         static private function action_forgotpassword()\r
1716         {\r
1717                 self::$skin->parse('forgotpassword');\r
1718                 return;\r
1719         }\r
1720         \r
1721         /**\r
1722          * Admin::action_activate()\r
1723          * Account activation\r
1724          * \r
1725          * @param       void\r
1726          * @return      void\r
1727          */\r
1728         static private function action_activate()\r
1729         {\r
1730                 $key = getVar('key');\r
1731                 self::showActivationPage($key);\r
1732                 return;\r
1733         }\r
1734         \r
1735         /**\r
1736          * Admin::showActivationPage()\r
1737          * \r
1738          * @param       void\r
1739          * @return      void\r
1740          */\r
1741         static private function showActivationPage($key, $message = '')\r
1742         {\r
1743                 global $manager;\r
1744                 \r
1745                 // clean up old activation keys\r
1746                 Member::cleanupActivationTable();\r
1747                 \r
1748                 // get activation info\r
1749                 $info = Member::getActivationInfo($key);\r
1750                 \r
1751                 if ( !$info )\r
1752                 {\r
1753                         self::error(_ERROR_ACTIVATE);\r
1754                         return;\r
1755                 }\r
1756                 \r
1757                 $mem =& $manager->getMember($info->vmember);\r
1758                 \r
1759                 if ( !$mem )\r
1760                 {\r
1761                         self::error(_ERROR_ACTIVATE);\r
1762                         return;\r
1763                 }\r
1764                 \r
1765                 /* TODO: we should consider to use the other way insterad of this */\r
1766                 $_POST['ackey']                                 = $key;\r
1767                 $_POST['bNeedsPasswordChange']  = TRUE;\r
1768                 \r
1769                 self::$headMess = $message;\r
1770                 self::$skin->parse('activate');\r
1771                 return;\r
1772         }\r
1773         \r
1774         /**\r
1775          * Admin::action_activatesetpwd()\r
1776          * Account activation - set password part\r
1777          * \r
1778          * @param       void\r
1779          * @return      void\r
1780          */\r
1781         static private function action_activatesetpwd()\r
1782         {\r
1783                 global $manager;\r
1784                 $key = postVar('key');\r
1785                 \r
1786                 // clean up old activation keys\r
1787                 Member::cleanupActivationTable();\r
1788                 \r
1789                 // get activation info\r
1790                 $info = Member::getActivationInfo($key);\r
1791                 \r
1792                 if ( !$info || ($info->type == 'addresschange') )\r
1793                 {\r
1794                         return self::showActivationPage($key, _ERROR_ACTIVATE);\r
1795                 }\r
1796                 \r
1797                 $mem =& $manager->getMember($info->vmember);\r
1798                 \r
1799                 if ( !$mem )\r
1800                 {\r
1801                         return self::showActivationPage($key, _ERROR_ACTIVATE);\r
1802                 }\r
1803                 \r
1804                 $password               = postVar('password');\r
1805                 $repeatpassword = postVar('repeatpassword');\r
1806                 \r
1807                 if ( $password != $repeatpassword )\r
1808                 {\r
1809                         return self::showActivationPage($key, _ERROR_PASSWORDMISMATCH);\r
1810                 }\r
1811                 \r
1812                 if ( $password && (i18n::strlen($password) < 6) )\r
1813                 {\r
1814                         return self::showActivationPage($key, _ERROR_PASSWORDTOOSHORT);\r
1815                 }\r
1816                         \r
1817                 if ( $password )\r
1818                 {\r
1819                         $pwdvalid = true;\r
1820                         $pwderror = '';\r
1821                         \r
1822                         $data = array(\r
1823                                 'password'              => $password,\r
1824                                 'errormessage'  => &$pwderror,\r
1825                                 'valid'                 => &$pwdvalid\r
1826                         );\r
1827                         $manager->notify('PrePasswordSet', $data);\r
1828                         if ( !$pwdvalid )\r
1829                         {\r
1830                                 return self::showActivationPage($key,$pwderror);\r
1831                         }\r
1832                 }\r
1833                 \r
1834                 $error = '';\r
1835                 \r
1836                 $data = array(\r
1837                         'type'   => 'activation',\r
1838                         'member' => $mem,\r
1839                         'error'  => &$error\r
1840                 );\r
1841                 $manager->notify('ValidateForm', $data);\r
1842                 if ( $error != '' )\r
1843                 {\r
1844                         return self::showActivationPage($key, $error);\r
1845                 }\r
1846                 \r
1847                 // set password\r
1848                 $mem->setPassword($password);\r
1849                 $mem->write();\r
1850                 \r
1851                 // do the activation\r
1852                 Member::activate($key);\r
1853                 \r
1854                 self::$skin->parse('activatesetpwd');\r
1855                 return;\r
1856         }\r
1857         \r
1858         /**\r
1859          * Admin::action_manageteam()\r
1860          * Manage team\r
1861          * \r
1862          * @param       void\r
1863          * @return      void\r
1864          */\r
1865         static private function action_manageteam()\r
1866         {\r
1867                 global $member, $manager;\r
1868                 \r
1869                 $blogid = intRequestVar('blogid');\r
1870                 \r
1871                 // check if allowed\r
1872                 $member->blogAdminRights($blogid) or self::disallow();\r
1873                 \r
1874                 self::$skin->parse('manageteam');\r
1875                 return;\r
1876         }\r
1877         \r
1878         /**\r
1879          * Admin::action_teamaddmember()\r
1880          * Add member to team\r
1881          * \r
1882          * @param       void\r
1883          * @return      void\r
1884          */\r
1885         static private function action_teamaddmember()\r
1886         {\r
1887                 global $member, $manager;\r
1888                 \r
1889                 $memberid       = intPostVar('memberid');\r
1890                 $blogid         = intPostVar('blogid');\r
1891                 $admin          = intPostVar('admin');\r
1892                 \r
1893                 // check if allowed\r
1894                 $member->blogAdminRights($blogid) or self::disallow();\r
1895                 \r
1896                 $blog =& $manager->getBlog($blogid);\r
1897                 if ( !$blog->addTeamMember($memberid, $admin) )\r
1898                 {\r
1899                         self::error(_ERROR_ALREADYONTEAM);\r
1900                         return;\r
1901                 }\r
1902                 \r
1903                 self::action_manageteam();\r
1904                 return;\r
1905         }\r
1906         \r
1907         /**\r
1908          * Admin::action_teamdelete()\r
1909          * \r
1910          * @param       void\r
1911          * @return      void\r
1912          */\r
1913         static private function action_teamdelete()\r
1914         {\r
1915                 global $member, $manager;\r
1916                 \r
1917                 $memberid       = intRequestVar('memberid');\r
1918                 $blogid         = intRequestVar('blogid');\r
1919                 \r
1920                 // check if allowed\r
1921                 $member->blogAdminRights($blogid) or self::disallow();\r
1922                 \r
1923                 $teammem =& $manager->getMember($memberid);\r
1924                 $blog =& $manager->getBlog($blogid);\r
1925                 \r
1926                 self::$skin->parse('teamdelete');\r
1927                 return;\r
1928         }\r
1929         \r
1930         /**\r
1931          * Admin::action_teamdeleteconfirm()\r
1932          * \r
1933          * @param       void\r
1934          * @return      void\r
1935          */\r
1936         static private function action_teamdeleteconfirm()\r
1937         {\r
1938                 global $member;\r
1939                 \r
1940                 $memberid = intRequestVar('memberid');\r
1941                 $blogid = intRequestVar('blogid');\r
1942                 \r
1943                 $error = self::deleteOneTeamMember($blogid, $memberid);\r
1944                 if ( $error )\r
1945                 {\r
1946                         self::error($error);\r
1947                         return;\r
1948                 }\r
1949                 self::action_manageteam();\r
1950                 return;\r
1951         }\r
1952         \r
1953         /**\r
1954          * Admin::deleteOneTeamMember()\r
1955          * \r
1956          * @param       void\r
1957          * @return      void\r
1958          */\r
1959         static public function deleteOneTeamMember($blogid, $memberid)\r
1960         {\r
1961                 global $member, $manager;\r
1962                 \r
1963                 $blogid   = intval($blogid);\r
1964                 $memberid = intval($memberid);\r
1965                 \r
1966                 // check if allowed\r
1967                 if ( !$member->blogAdminRights($blogid) )\r
1968                 {\r
1969                         return _ERROR_DISALLOWED;\r
1970                 }\r
1971                 \r
1972                 // check if: - there remains at least one blog admin\r
1973                 //           - (there remains at least one team member)\r
1974                 $tmem =& $manager->getMember($memberid);\r
1975                 \r
1976                 \r
1977                 $data = array(\r
1978                         'member' => &$tmem,\r
1979                         'blogid' => $blogid\r
1980                 );\r             $manager->notify('PreDeleteTeamMember', $data);\r
1981                 \r
1982                 if ( $tmem->isBlogAdmin($blogid) )\r
1983                 {\r
1984                         /* TODO: why we did double check? */\r
1985                         // check if there are more blog members left and at least one admin\r
1986                         // (check for at least two admins before deletion)\r
1987                         $query = "SELECT * FROM %s WHERE tblog=%d and tadmin=1;";\r
1988                         $query = sprintf($query, sql_table('team'), (integer) $blogid);\r
1989                         $r     = DB::getResult($query);\r
1990                         if ( $r->rowCount() < 2 )\r
1991                         {\r
1992                                 return _ERROR_ATLEASTONEBLOGADMIN;\r
1993                         }\r
1994                 }\r
1995                 \r
1996                 $query = "DELETE FROM %s WHERE tblog=%d AND tmember=%d;";\r
1997                 $query = sprintf($query, sql_table('team'), (integer) $blogid, (integer) $memberid);\r
1998                 DB::execute($query);\r
1999                 \r
2000                 $data = array(\r
2001                         'member' => &$tmem,\r
2002                         'blogid' => $blogid\r
2003                 );\r
2004                 $manager->notify('PostDeleteTeamMember', $data);\r
2005                 \r
2006                 return '';\r
2007         }\r
2008         \r
2009         /**\r
2010          * Admin::action_teamchangeadmin()\r
2011          * \r
2012          * @param       void\r
2013          * @return      void\r
2014          */\r
2015         static private function action_teamchangeadmin()\r
2016         {\r
2017                 global $manager, $member;\r
2018                 \r
2019                 $blogid         = intRequestVar('blogid');\r
2020                 $memberid       = intRequestVar('memberid');\r
2021                 \r
2022                 // check if allowed\r
2023                 $member->blogAdminRights($blogid) or self::disallow();\r
2024                 \r
2025                 $mem =& $manager->getMember($memberid);\r
2026                 \r
2027                 // don't allow when there is only one admin at this moment\r
2028                 if ( $mem->isBlogAdmin($blogid) )\r
2029                 {\r
2030                         $query = "SELECT * FROM %s WHERE tblog=%d AND tadmin=1;";\r
2031                         $query = sprintf($query, sql_table('team'), (integer) $blogid);\r
2032                         $r = DB::getResult($query);\r
2033                         if ( $r->rowCount() == 1 )\r
2034                         {\r
2035                                 self::error(_ERROR_ATLEASTONEBLOGADMIN);\r
2036                                 return;\r
2037                         }\r
2038                 }\r
2039                 \r
2040                 if ( $mem->isBlogAdmin($blogid) )\r
2041                 {\r
2042                         $newval = 0;\r
2043                 }\r
2044                 else\r
2045                 {\r
2046                         $newval = 1;\r
2047                 }\r
2048                 \r
2049                 $query = "UPDATE %s SET tadmin=%d WHERE tblog=%d and tmember=%d;";\r
2050                 $query = sprintf($query, (integer) $blogid, (integer) $newval, (integer) $blogid, (integer) $memberid);\r
2051                 DB::execute($query);\r
2052                 \r
2053                 // only show manageteam if member did not change its own admin privileges\r
2054                 if ( $member->isBlogAdmin($blogid) )\r
2055                 {\r
2056                         self::action_manageteam();\r
2057                 }\r
2058                 else\r
2059                 {\r
2060                         self::action_overview(_MSG_ADMINCHANGED);\r
2061                 }\r
2062                 return;\r
2063         }\r
2064         \r
2065         /**\r
2066          * Admin::action_blogsettings()\r
2067          * \r
2068          * @param       void\r
2069          * @return      void\r
2070          */\r
2071         static private function action_blogsettings()\r
2072         {\r
2073                 global $member, $manager;\r
2074                 \r
2075                 $blogid = intRequestVar('blogid');\r
2076                 \r
2077                 // check if allowed\r
2078                 $member->blogAdminRights($blogid) or self::disallow();\r
2079                 \r
2080                 $blog =& $manager->getBlog($blogid);\r
2081                 \r
2082                 Admin::$extrahead .= "<script type=\"text/javascript\" src=\"<%skinfile(/javascripts/numbercheck.js)%>\"></script>\n";\r
2083                 \r
2084                 self::$skin->parse('blogsettings');\r
2085                 return;\r
2086         }\r
2087         \r
2088         /**\r
2089          * Admin::action_categorynew()\r
2090          * \r
2091          * @param       void\r
2092          * @return      void\r
2093          */\r
2094         static private function action_categorynew()\r
2095         {\r
2096                 global $member, $manager;\r
2097                 \r
2098                 $blogid = intRequestVar('blogid');\r
2099                 \r
2100                 $member->blogAdminRights($blogid) or self::disallow();\r
2101                 \r
2102                 $cname = postVar('cname');\r
2103                 $cdesc = postVar('cdesc');\r
2104                 \r
2105                 if ( !isValidCategoryName($cname) )\r
2106                 {\r
2107                         self::error(_ERROR_BADCATEGORYNAME);\r
2108                         return;\r
2109                 }\r
2110                 \r
2111                 $query = "SELECT * FROM %s WHERE cname=%s AND cblog=%d;";\r
2112                 $query = sprintf($query, sql_table('category'), DB::quoteValue($cname), (integer) $blogid);\r
2113                 $res = DB::getResult($query);\r
2114                 if ( $res->rowCount() > 0 )\r
2115                 {\r
2116                         self::error(_ERROR_DUPCATEGORYNAME);\r
2117                         return;\r
2118                 }\r
2119                 \r
2120                 $blog           =& $manager->getBlog($blogid);\r
2121                 $newCatID       =  $blog->createNewCategory($cname, $cdesc);\r
2122                 \r
2123                 self::action_blogsettings();\r
2124                 return;\r
2125         }\r
2126         \r
2127         /**\r
2128          * Admin::action_categoryedit()\r
2129          * \r
2130          * @param       void\r
2131          * @return      void\r
2132          */\r
2133         static private function action_categoryedit($catid = '', $blogid = '', $desturl = '')\r
2134         {\r
2135                 global $member, $manager;\r
2136                 \r
2137                 if ( $blogid == '' )\r
2138                 {\r
2139                         $blogid = intGetVar('blogid');\r
2140                 }\r
2141                 else\r
2142                 {\r
2143                         $blogid = intval($blogid);\r
2144                 }\r
2145                 if ( $catid == '' )\r
2146                 {\r
2147                         $catid = intGetVar('catid');\r
2148                 }\r
2149                 else\r
2150                 {\r
2151                         $catid = intval($catid);\r
2152                 }\r
2153                 \r
2154                 /* TODO: we should consider to use the other way insterad of this */\r
2155                 $_REQUEST['blogid']             = $blogid;\r
2156                 $_REQUEST['catid']              = $catid;\r
2157                 $_REQUEST['desturl']    = $desturl;\r
2158                 $member->blogAdminRights($blogid) or self::disallow();\r
2159                 \r
2160                 Admin::$extrahead .= "<script type=\"text/javascript\" src=\"<%skinfile(/javascripts/numbercheck.js)%>\"></script>\n";\r
2161                 \r
2162                 self::$skin->parse('categoryedit');\r
2163                 return;\r
2164         }\r
2165         \r
2166         /**\r
2167          * Admin::action_categoryupdate()\r
2168          * \r
2169          * @param       void\r
2170          * @return      void\r
2171          */\r
2172         static private function action_categoryupdate()\r
2173         {\r
2174                 global $member, $manager;\r
2175                 \r
2176                 $blogid         = intPostVar('blogid');\r
2177                 $catid          = intPostVar('catid');\r
2178                 $cname          = postVar('cname');\r
2179                 $cdesc          = postVar('cdesc');\r
2180                 $desturl        = postVar('desturl');\r
2181                 \r
2182                 $member->blogAdminRights($blogid) or self::disallow();\r
2183                 \r
2184                 if ( !isValidCategoryName($cname) )\r
2185                 {\r
2186                         self::error(_ERROR_BADCATEGORYNAME);\r
2187                         return;\r
2188                 }\r
2189                 \r
2190                 $query  = "SELECT * FROM %s WHERE cname=%s AND cblog=%d AND not(catid=%d);";\r
2191                 $query  = sprintf($query, sql_table('category'), DB::quoteValue($cname), (integer) $blogid, (integer) $catid);\r
2192                 $res    = DB::getResult($query);\r
2193                 if ( $res->rowCount() > 0 )\r
2194                 {\r
2195                         self::error(_ERROR_DUPCATEGORYNAME);\r
2196                         return;\r
2197                 }\r
2198                 \r
2199                 $query =  "UPDATE %s SET cname=%s, cdesc=%s WHERE catid=%d;";\r
2200                 $query = sprintf($query, sql_table('category'), DB::quoteValue($cname), DB::quoteValue($cdesc), (integer) $catid);\r
2201                 DB::execute($query);\r
2202                 \r
2203                 // store plugin options\r
2204                 $aOptions = requestArray('plugoption');\r
2205                 NucleusPlugin::apply_plugin_options($aOptions);\r
2206                 $data = array(\r
2207                         'context'       => 'category',\r
2208                         'catid'         => $catid\r
2209                 );\r
2210                 $manager->notify('PostPluginOptionsUpdate', $data);\r
2211                 \r
2212                 if ( $desturl )\r
2213                 {\r
2214                         redirect($desturl);\r
2215                         return;\r
2216                 }\r
2217                 \r
2218                 self::action_blogsettings();\r
2219                 \r
2220                 return;\r
2221         }\r
2222         \r
2223         /**\r
2224          * Admin::action_categorydelete()\r
2225          * \r
2226          * @param       void\r
2227          * @return      void\r
2228          */\r
2229         static private function action_categorydelete()\r
2230         {\r
2231                 global $member, $manager;\r
2232                 \r
2233                 $blogid = intRequestVar('blogid');\r
2234                 $catid  = intRequestVar('catid');\r
2235                 \r
2236                 $member->blogAdminRights($blogid) or self::disallow();\r
2237                 \r
2238                 $blog =& $manager->getBlog($blogid);\r
2239                 \r
2240                 // check if the category is valid\r
2241                 if ( !$blog->isValidCategory($catid) )\r
2242                 {\r
2243                         self::error(_ERROR_NOSUCHCATEGORY);\r
2244                         return;\r
2245                 }\r
2246                 \r
2247                 // don't allow deletion of default category\r
2248                 if ( $blog->getDefaultCategory() == $catid )\r
2249                 {\r
2250                         self::error(_ERROR_DELETEDEFCATEGORY);\r
2251                         return;\r
2252                 }\r
2253                 \r
2254                 // check if catid is the only category left for blogid\r
2255                 $query = "SELECT catid FROM %s WHERE cblog=%d;";\r
2256                 $query = sprintf($query, sql_table('category'), $blogid);\r
2257                 $res = DB::getResult($query);\r
2258                 if ( $res->rowCount() == 1 )\r
2259                 {\r
2260                         self::error(_ERROR_DELETELASTCATEGORY);\r
2261                         return;\r
2262                 }\r
2263                 \r
2264                 self::$skin->parse('categorydelete');\r
2265                 return;\r
2266         }\r
2267         \r
2268         /**\r
2269          * Admin::action_categorydeleteconfirm()\r
2270          * \r
2271          * @param       void\r
2272          * @return      void\r
2273          */\r
2274         static private function action_categorydeleteconfirm()\r
2275         {\r
2276                 global $member, $manager;\r
2277                 \r
2278                 $blogid = intRequestVar('blogid');\r
2279                 $catid  = intRequestVar('catid');\r
2280                 \r
2281                 $member->blogAdminRights($blogid) or self::disallow();\r
2282                 \r
2283                 $error = self::deleteOneCategory($catid);\r
2284                 if ( $error )\r
2285                 {\r
2286                         self::error($error);\r
2287                         return;\r
2288                 }\r
2289                 \r
2290                 self::action_blogsettings();\r
2291                 return;\r
2292         }\r
2293         \r
2294         /**\r
2295          * Admin::deleteOneCategory()\r
2296          * Delete a category by its id\r
2297          * \r
2298          * @param       String  $catid  category id for deleting\r
2299          * @return      Void\r
2300          */\r
2301         static public function deleteOneCategory($catid)\r
2302         {\r
2303                 global $manager, $member;\r
2304                 \r
2305                 $catid  = intval($catid);\r
2306                 $blogid = getBlogIDFromCatID($catid);\r
2307                 \r
2308                 if ( !$member->blogAdminRights($blogid) )\r
2309                 {\r
2310                         return ERROR_DISALLOWED;\r
2311                 }\r
2312                 \r
2313                 // get blog\r
2314                 $blog =& $manager->getBlog($blogid);\r
2315                 \r
2316                 // check if the category is valid\r
2317                 if ( !$blog || !$blog->isValidCategory($catid) )\r
2318                 {\r
2319                         return _ERROR_NOSUCHCATEGORY;\r
2320                 }\r
2321                 \r
2322                 $destcatid = $blog->getDefaultCategory();\r
2323                 \r
2324                 // don't allow deletion of default category\r
2325                 if ( $blog->getDefaultCategory() == $catid )\r
2326                 {\r
2327                         return _ERROR_DELETEDEFCATEGORY;\r
2328                 }\r
2329                 \r
2330                 // check if catid is the only category left for blogid\r
2331                 $query = "SELECT catid FROM %s WHERE cblog=%d;";\r
2332                 $query = sprintf($query, sql_table('category'), (integer) $blogid);\r
2333                 \r
2334                 $res = DB::getResult($query);\r
2335                 if ( $res->rowCount() == 1 )\r
2336                 {\r
2337                         return _ERROR_DELETELASTCATEGORY;\r
2338                 }\r
2339                 \r
2340                 $data = array('catid' => $catid);\r
2341                 $manager->notify('PreDeleteCategory', $data);\r
2342                 \r
2343                 // change category for all items to the default category\r
2344                 $query = "UPDATE %s SET icat=%d WHERE icat=%d;";\r
2345                 $query =sprintf($query, sql_table('item'), (integer) $destcatid, (integer) $catid);\r
2346                 DB::execute($query);\r
2347                 \r
2348                 // delete all associated plugin options\r
2349                 NucleusPlugin::delete_option_values('category', (integer) $catid);\r
2350                 \r
2351                 // delete category\r
2352                 $query = "DELETE FROM %s WHERE catid=%d;";\r
2353                 $query = sprintf($query, sql_table('category'), (integer) $catid);\r
2354                 DB::execute($query);\r
2355                 \r
2356                 $data = array('catid' => $catid);\r
2357                 $manager->notify('PostDeleteCategory', $data);\r
2358                 return;\r
2359         }\r
2360         \r
2361         /**\r
2362          * Admin::moveOneCategory()\r
2363          * Delete a category by its id\r
2364          * \r
2365          * @param       int     $catid          category id for move\r
2366          * @param       int     $destblogid     blog id for destination\r
2367          * @return      void\r
2368          */\r
2369         static public function moveOneCategory($catid, $destblogid)\r
2370         {\r
2371                 global $manager, $member;\r
2372                 $catid      = intval($catid);\r
2373                 $destblogid = intval($destblogid);\r
2374                 $blogid     = getBlogIDFromCatID($catid);\r
2375                 // mover should have admin rights on both blogs\r
2376                 if (!$member->blogAdminRights($blogid)) {\r
2377                         return _ERROR_DISALLOWED;\r
2378                 }\r
2379                 if (!$member->blogAdminRights($destblogid)) {\r
2380                         return _ERROR_DISALLOWED;\r
2381                 }\r
2382                 // cannot move to self\r
2383                 if ($blogid == $destblogid) {\r
2384                         return _ERROR_MOVETOSELF;\r
2385                 }\r
2386                 // get blogs\r
2387                 $blog     =& $manager->getBlog($blogid);\r
2388                 $destblog =& $manager->getBlog($destblogid);\r
2389                 // check if the category is valid\r
2390                 if (!$blog || !$blog->isValidCategory($catid)) {\r
2391                         return _ERROR_NOSUCHCATEGORY;\r
2392                 }\r
2393                 // don't allow default category to be moved\r
2394                 if ($blog->getDefaultCategory() == $catid) {\r
2395                         return _ERROR_MOVEDEFCATEGORY;\r
2396                 }\r
2397                 $manager->notify(\r
2398                                 'PreMoveCategory',\r
2399                                 array(\r
2400                                                 'catid'      => &$catid,\r
2401                                                 'sourceblog' => &$blog,\r
2402                                                 'destblog'   => &$destblog\r
2403                                 )\r
2404                 );\r
2405                 // update comments table (cblog)\r
2406                 $query = 'SELECT '\r
2407                 . '    inumber '\r
2408                 . 'FROM '\r
2409                 .      sql_table('item') . ' '\r
2410                 . 'WHERE '\r
2411                 . '    icat = %d';\r
2412                 $items = sql_query(sprintf($query, $catid));\r
2413                 while ($oItem = sql_fetch_object($items)) {\r
2414                         $query = 'UPDATE '\r
2415                         .      sql_table('comment') . ' '\r
2416                         . 'SET '\r
2417                         . '    cblog = %d' . ' '\r
2418                         . 'WHERE '\r
2419                         . '    citem = %d';\r
2420                         sql_query(sprintf($query, $destblogid, $oItem->inumber));\r
2421                 }\r
2422         \r
2423                 // update items (iblog)\r
2424                 $query = 'UPDATE '\r
2425                 .      sql_table('item') . ' '\r
2426                 . 'SET '\r
2427                 . '    iblog = %d '\r
2428                 . 'WHERE '\r
2429                 . '    icat = %d';\r
2430                 sql_query(sprintf($query, $destblogid, $catid));\r
2431         \r
2432                 // move category\r
2433                 $query = 'UPDATE '\r
2434                 .      sql_table('category') . ' '\r
2435                 . 'SET '\r
2436                 . '    cblog = %d' . ' '\r
2437                 . 'WHERE '\r
2438                 . '    catid = %d';\r
2439                 sql_query(sprintf($query, $destblogid, $catid));\r
2440                 $manager->notify(\r
2441                                 'PostMoveCategory',\r
2442                                 array(\r
2443                                                 'catid'      => &$catid,\r
2444                                                 'sourceblog' => &$blog,\r
2445                                                 'destblog'   => $destblog\r
2446                                 )\r
2447                 );\r
2448                 return;\r
2449         }\r
2450 \r
2451         /**\r
2452          * Admin::action_blogsettingsupdate\r
2453          * Updating blog settings\r
2454          * \r
2455          * @param       Void\r
2456          * @return      Void\r
2457          */\r
2458         static private function action_blogsettingsupdate()\r
2459         {\r
2460                 global $member, $manager;\r
2461                 \r
2462                 $blogid = intRequestVar('blogid');\r
2463                 \r
2464                 $member->blogAdminRights($blogid) or self::disallow();\r
2465                 \r
2466                 $blog =& $manager->getBlog($blogid);\r
2467                 \r
2468                 $notify_address = trim(postVar('notify'));\r
2469                 $shortname              = trim(postVar('shortname'));\r
2470                 $updatefile             = trim(postVar('update'));\r
2471                 \r
2472                 $notifyComment  = intPostVar('notifyComment');\r
2473                 $notifyVote             = intPostVar('notifyVote');\r
2474                 $notifyNewItem  = intPostVar('notifyNewItem');\r
2475                 \r
2476                 if ( $notifyComment == 0 )\r
2477                 {\r
2478                         $notifyComment = 1;\r
2479                 }\r
2480                 if ( $notifyVote == 0 )\r
2481                 {\r
2482                         $notifyVote = 1;\r
2483                 }\r
2484                 if ( $notifyNewItem == 0 )\r
2485                 {\r
2486                         $notifyNewItem = 1;\r
2487                 }\r
2488                 $notifyType = $notifyComment * $notifyVote * $notifyNewItem;\r
2489                 \r
2490                 if ( $notify_address && !NOTIFICATION::address_validation($notify_address) )\r
2491                 {\r
2492                         self::error(_ERROR_BADNOTIFY);\r
2493                         return;\r
2494                 }\r
2495                 \r
2496                 if ( !isValidShortName($shortname) )\r
2497                 {\r
2498                         self::error(_ERROR_BADSHORTBLOGNAME);\r
2499                         return;\r
2500                 }\r
2501                 \r
2502                 if ( ($blog->getShortName() != $shortname) && $manager->existsBlog($shortname) )\r
2503                 {\r
2504                         self::error(_ERROR_DUPSHORTBLOGNAME);\r
2505                         return;\r
2506                 }\r
2507                 // check if update file is writable\r
2508                 if ( $updatefile && !is_writeable($updatefile) )\r
2509                 {\r
2510                         self::error(_ERROR_UPDATEFILE);\r
2511                         return;\r
2512                 }\r
2513                 \r
2514                 $blog->setName(trim(postVar('name')));\r
2515                 $blog->setShortName($shortname);\r
2516                 $blog->setNotifyAddress($notify_address);\r
2517                 $blog->setNotifyType($notifyType);\r
2518                 $blog->setMaxComments(postVar('maxcomments'));\r
2519                 $blog->setCommentsEnabled(postVar('comments'));\r
2520                 $blog->setTimeOffset(postVar('timeoffset'));\r
2521                 $blog->setUpdateFile($updatefile);\r
2522                 $blog->setURL(trim(postVar('url')));\r
2523                 $blog->setDefaultSkin(intPostVar('defskin'));\r
2524                 $blog->setDescription(trim(postVar('desc')));\r
2525                 $blog->setPublic(postVar('public'));\r
2526                 $blog->setConvertBreaks(intPostVar('convertbreaks'));\r
2527                 $blog->setAllowPastPosting(intPostVar('allowpastposting'));\r
2528                 $blog->setDefaultCategory(intPostVar('defcat'));\r
2529                 $blog->setSearchable(intPostVar('searchable'));\r
2530                 $blog->setEmailRequired(intPostVar('reqemail'));\r
2531                 $blog->writeSettings();\r
2532                 \r
2533                 // store plugin options\r
2534                 $aOptions = requestArray('plugoption');\r
2535                 NucleusPlugin::apply_plugin_options($aOptions);\r
2536                 \r
2537                 $data = array(\r
2538                         'context' => 'blog',\r
2539                         'blogid'  => $blogid,\r
2540                         'blog'    => &$blog\r
2541                 );\r
2542                 $manager->notify('PostPluginOptionsUpdate', $data);\r
2543                 \r
2544                 self::action_overview(_MSG_SETTINGSCHANGED);\r
2545                 return;\r
2546         }\r
2547         \r
2548         /**\r
2549          * Admin::action_deleteblog()\r
2550          * \r
2551          * @param       void\r
2552          * @return      void\r
2553          */\r
2554         static private function action_deleteblog()\r
2555         {\r
2556                 global $member, $CONF, $manager;\r
2557                 \r
2558                 $blogid = intRequestVar('blogid');\r
2559                 \r
2560                 $member->blogAdminRights($blogid) or self::disallow();\r
2561                 \r
2562                 // check if blog is default blog\r
2563                 if ( $CONF['DefaultBlog'] == $blogid )\r
2564                 {\r
2565                         self::error(_ERROR_DELDEFBLOG);\r
2566                         return;\r
2567                 }\r
2568                 \r
2569                 $blog =& $manager->getBlog($blogid);\r
2570                 \r
2571                 self::$skin->parse('deleteblog');\r
2572                 return;\r
2573         }\r
2574         \r
2575         /**\r
2576          * Admin::action_deleteblogconfirm()\r
2577          * Delete Blog\r
2578          * \r
2579          * @param       Void\r
2580          * @return      Void\r
2581          */\r
2582         static private function action_deleteblogconfirm()\r
2583         {\r
2584                 global $member, $CONF, $manager;\r
2585                 \r
2586                 $blogid = intRequestVar('blogid');\r
2587                 \r
2588                 $data = array('blogid' => $blogid);\r
2589                 $manager->notify('PreDeleteBlog', $data);\r
2590                 \r
2591                 $member->blogAdminRights($blogid) or self::disallow();\r
2592                 \r
2593                 // check if blog is default blog\r
2594                 if ( $CONF['DefaultBlog'] == $blogid )\r
2595                 {\r
2596                         self::error(_ERROR_DELDEFBLOG);\r
2597                         return;\r
2598                 }\r
2599                 \r
2600                 // delete all comments\r
2601                 $query = 'DELETE FROM ' . sql_table('comment') . ' WHERE cblog='.$blogid;\r
2602                 DB::execute($query);\r
2603                 \r
2604                 // delete all items\r
2605                 $query = 'DELETE FROM ' . sql_table('item') . ' WHERE iblog=' . $blogid;\r
2606                 DB::execute($query);\r
2607                 \r
2608                 // delete all team members\r
2609                 $query = 'DELETE FROM ' . sql_table('team') . ' WHERE tblog=' . $blogid;\r
2610                 DB::execute($query);\r
2611                 \r
2612                 // delete all bans\r
2613                 $query = 'DELETE FROM ' . sql_table('ban') . ' WHERE blogid=' . $blogid;\r
2614                 DB::execute($query);\r
2615                 \r
2616                 // delete all categories\r
2617                 $query = 'DELETE FROM ' . sql_table('category') . ' WHERE cblog=' . $blogid;\r
2618                 DB::execute($query);\r
2619                 \r
2620                 // delete all associated plugin options\r
2621                 NucleusPlugin::delete_option_values('blog', $blogid);\r
2622                 \r
2623                 // delete the blog itself\r
2624                 $query = 'DELETE FROM ' . sql_table('blog') . ' WHERE bnumber=' . $blogid;\r
2625                 DB::execute($query);\r
2626                 \r
2627                 $data = array('blogid' => $blogid);\r
2628                 $manager->notify('PostDeleteBlog', $data);\r
2629                 \r
2630                 self::action_overview(_DELETED_BLOG);\r
2631                 return;\r
2632         }\r
2633         \r
2634         /**\r
2635          * Admin::action_memberdelete()\r
2636          * \r
2637          * @param       void\r
2638          * @return      void\r
2639          */\r
2640         static private function action_memberdelete()\r
2641         {\r
2642                 global $member, $manager;\r
2643                 \r
2644                 $memberid = intRequestVar('memberid');\r
2645                 \r
2646                 ($member->getID() == $memberid) or $member->isAdmin() or self::disallow();\r
2647                 \r
2648                 $mem =& $manager->getMember($memberid);\r
2649                 \r
2650                 self::$skin->parse('memberdelete');\r
2651                 return;\r
2652         }\r
2653         \r
2654         /**\r
2655          * Admin::action_memberdeleteconfirm()\r
2656          * \r
2657          * @param       void\r
2658          * @return      void\r
2659          */\r
2660         static private function action_memberdeleteconfirm()\r
2661         {\r
2662                 global $member;\r
2663                 \r
2664                 $memberid = intRequestVar('memberid');\r
2665                 \r
2666                 ($member->getID() == $memberid) or $member->isAdmin() or self::disallow();\r
2667                 \r
2668                 $error = self::deleteOneMember($memberid);\r
2669                 if ( $error )\r
2670                 {\r
2671                         self::error($error);\r
2672                         return;\r
2673                 }\r
2674                 \r
2675                 if ( $member->isAdmin() )\r
2676                 {\r
2677                         self::action_usermanagement();\r
2678                         return;\r
2679                 }\r
2680                 else\r
2681                 {\r
2682                         self::action_overview(_DELETED_MEMBER);\r
2683                         return;\r
2684                 }\r
2685                 return;\r
2686         }\r
2687         \r
2688         /**\r
2689          * Admin::deleteOneMember()\r
2690          * Delete a member by id\r
2691          * \r
2692          * @static\r
2693          * @params      Integer $memberid       member id\r
2694          * @return      String  null string or error messages\r
2695          */\r
2696         static public function deleteOneMember($memberid)\r
2697         {\r
2698                 global $manager;\r
2699                 \r
2700                 $memberid = intval($memberid);\r
2701                 $mem =& $manager->getMember($memberid);\r
2702                 \r
2703                 if ( !$mem->canBeDeleted() )\r
2704                 {\r
2705                         return _ERROR_DELETEMEMBER;\r
2706                 }\r
2707                 \r
2708                 $data = array('member' => &$mem);\r
2709                 $manager->notify('PreDeleteMember', $data);\r
2710                 \r
2711                 /* unlink comments from memberid */\r
2712                 if ( $memberid )\r
2713                 {\r
2714                         $query = "UPDATE %s SET cmember=0, cuser=%s WHERE cmember=%d;";\r
2715                         $query = sprintf($query, sql_table('comment'), DB::quoteValue($mem->getDisplayName()), $memberid);\r
2716                         DB::execute($query);\r
2717                 }\r
2718                 \r
2719                 $query = 'DELETE FROM ' . sql_table('member') . ' WHERE mnumber=' . $memberid;\r
2720                 DB::execute($query);\r
2721                 \r
2722                 $query = 'DELETE FROM ' . sql_table('team') . ' WHERE tmember=' . $memberid;\r
2723                 DB::execute($query);\r
2724                 \r
2725                 $query = 'DELETE FROM ' . sql_table('activation') . ' WHERE vmember=' . $memberid;\r
2726                 DB::execute($query);\r
2727                 \r
2728                 // delete all associated plugin options\r
2729                 NucleusPlugin::delete_option_values('member', $memberid);\r
2730                 \r
2731                 $data = array('member' => &$mem);\r
2732                 $manager->notify('PostDeleteMember', $data);\r
2733                 \r
2734                 return '';\r
2735         }\r
2736         \r
2737         /**\r
2738          * Admin::action_createnewlog()\r
2739          * \r
2740          * @param       void\r
2741          * @return      void\r
2742          */\r
2743         static private function action_createnewlog()\r
2744         {\r
2745                 global $member, $CONF, $manager;\r
2746                 \r
2747                 // Only Super-Admins can do this\r
2748                 $member->isAdmin() or self::disallow();\r
2749                 \r
2750                 self::$skin->parse('createnewlog');\r
2751                 return;\r
2752         }\r
2753         \r
2754         /**\r
2755          * Admin::action_addnewlog()\r
2756          * \r
2757          * @param       void\r
2758          * @return      void\r
2759          */\r
2760         static private function action_addnewlog()\r
2761         {\r
2762                 global $member, $manager, $CONF;\r
2763                 \r
2764                 // Only Super-Admins can do this\r
2765                 $member->isAdmin() or self::disallow();\r
2766                 \r
2767                 $bname                  = trim(postVar('name'));\r
2768                 $bshortname             = trim(postVar('shortname'));\r
2769                 $btimeoffset    = postVar('timeoffset');\r
2770                 $bdesc                  = trim(postVar('desc'));\r
2771                 $bdefskin               = postVar('defskin');\r
2772                 \r
2773                 if ( !isValidShortName($bshortname) )\r
2774                 {\r
2775                         self::error(_ERROR_BADSHORTBLOGNAME);\r
2776                         return;\r
2777                 }\r
2778                 \r
2779                 if ( $manager->existsBlog($bshortname) )\r
2780                 {\r
2781                         self::error(_ERROR_DUPSHORTBLOGNAME);\r
2782                         return;\r
2783                 }\r
2784                 \r
2785                 $data = array(\r
2786                         'name'        => &$bname,\r
2787                         'shortname'   => &$bshortname,\r
2788                         'timeoffset'  => &$btimeoffset,\r
2789                         'description' => &$bdesc,\r
2790                         'defaultskin' => &$bdefskin\r
2791                 );\r
2792                 $manager->notify('PreAddBlog', $data);\r
2793                 \r
2794                 // add slashes for sql queries\r
2795                 $bname                  = DB::quoteValue($bname);\r
2796                 $bshortname             = DB::quoteValue($bshortname);\r
2797                 $btimeoffset    = DB::quoteValue($btimeoffset);\r
2798                 $bdesc                  = DB::quoteValue($bdesc);\r
2799                 $bdefskin               = DB::quoteValue($bdefskin);\r
2800                 \r
2801                 // create blog\r
2802                 $query = "INSERT INTO %s (bname, bshortname, bdesc, btimeoffset, bdefskin) VALUES (%s, %s, %s, %s, %s);";\r
2803                 $query = sprintf($query, sql_table('blog'), $bname, $bshortname, $bdesc, $btimeoffset, $bdefskin);\r
2804                 DB::execute($query);\r
2805                 \r
2806                 $blogid = DB::getInsertId();\r
2807                 $blog   =& $manager->getBlog($blogid);\r
2808                 \r
2809                 // create new category\r
2810                 $catdefname = (!defined('_EBLOGDEFAULTCATEGORY_NAME') ? 'General' : _EBLOGDEFAULTCATEGORY_NAME);\r
2811                 $catdefdesc = (!defined('_EBLOGDEFAULTCATEGORY_DESC') ? 'Items that do not fit in other categories' : _EBLOGDEFAULTCATEGORY_DESC);\r
2812                 \r
2813                 $query = 'INSERT INTO %s (cblog, cname, cdesc) VALUES (%d, %s, %s)';\r
2814                 DB::execute(sprintf($query, sql_table('category'), (integer) $blogid, DB::quoteValue($catdefname), DB::quoteValue($catdefdesc)));\r
2815                 $catid = DB::getInsertId();\r
2816                 \r
2817                 // set as default category\r
2818                 $blog->setDefaultCategory($catid);\r
2819                 $blog->writeSettings();\r
2820                 \r
2821                 // create team member\r
2822                 $query = "INSERT INTO %s (tmember, tblog, tadmin) VALUES (%d, %d, 1);";\r
2823                 $query = sprintf($query, sql_table('team'), (integer) $member->getID(), (integer) $blogid);\r
2824                 DB::execute($query);\r
2825                 \r
2826                 $itemdeftitle = (defined('_EBLOG_FIRSTITEM_TITLE') ? _EBLOG_FIRSTITEM_TITLE : 'First Item');\r
2827                 $itemdefbody  = (defined('_EBLOG_FIRSTITEM_BODY')  ? _EBLOG_FIRSTITEM_BODY  : 'This is the first item in your weblog. Feel free to delete it.');\r
2828                 \r
2829                 $blog->additem(\r
2830                         $blog->getDefaultCategory(),\r
2831                         $itemdeftitle,$itemdefbody,\r
2832                         '',\r
2833                         $blogid,\r
2834                         $member->getID(),\r
2835                         $blog->getCorrectTime(),\r
2836                         0,\r
2837                         0,\r
2838                         0\r
2839                 );\r
2840                 \r
2841                 $data = array('blog' => &$blog);\r
2842                 $manager->notify('PostAddBlog', $data);\r
2843                 \r
2844                 $data = array(\r
2845                         'blog'                  => &$blog,\r
2846                         'name'                  => _EBLOGDEFAULTCATEGORY_NAME,\r
2847                         'description'   => _EBLOGDEFAULTCATEGORY_DESC,\r
2848                         'catid'                 => $catid\r
2849                 );\r
2850                 $manager->notify('PostAddCategory', $data);\r
2851                 \r
2852                 /* TODO: we should consider to use the other way insterad of this */\r
2853                 $_REQUEST['blogid'] = $blogid;\r
2854                 $_REQUEST['catid']  = $catid;\r
2855                 self::$skin->parse('addnewlog');\r
2856                 return;\r
2857         }\r
2858         \r
2859         /**\r
2860          * Admin::action_addnewlog2()\r
2861          * \r
2862          * @param       void\r
2863          * @return      void\r
2864          */\r
2865         static private function action_addnewlog2()\r
2866         {\r
2867                 global $member, $manager;\r
2868                 $blogid = intRequestVar('blogid');\r
2869                 \r
2870                 $member->blogAdminRights($blogid) or self::disallow();\r
2871                 \r
2872                 $burl = requestVar('url');\r
2873                 \r
2874                 $blog =& $manager->getBlog($blogid);\r
2875                 $blog->setURL(trim($burl));\r
2876                 $blog->writeSettings();\r
2877                 \r
2878                 self::action_overview(_MSG_NEWBLOG);\r
2879                 return;\r
2880         }\r
2881         \r
2882         /**\r
2883          * Admin::action_skinieoverview()\r
2884          * \r
2885          * @param       void\r
2886          * @return      void\r
2887          */\r
2888         static private function action_skinieoverview()\r
2889         {\r
2890                 global $member, $DIR_LIBS, $manager;\r
2891                 \r
2892                 $member->isAdmin() or self::disallow();\r
2893                 \r
2894                 include_once($DIR_LIBS . 'skinie.php');\r
2895                 \r
2896                 self::$skin->parse('skinieoverview');\r
2897                 return;\r
2898         }\r
2899         \r
2900         /**\r
2901          * Admin::action_skinieimport()\r
2902          * \r
2903          * @param       void\r
2904          * @return      void\r
2905          */\r
2906         static private function action_skinieimport()\r
2907         {\r
2908                 global $member;\r
2909                 \r
2910                 $member->isAdmin() or self::disallow();\r
2911                 \r
2912                 $skinFileRaw = postVar('skinfile');\r
2913                 $mode = postVar('mode');\r
2914                 \r
2915                 $error = self::skinieimport($mode, $skinFileRaw);\r
2916                 if ( $error )\r
2917                 {\r
2918                         self::error($error);\r
2919                         return;\r
2920                 }\r
2921                 \r
2922                 self::$skin->parse('skinieimport');\r
2923                 return;\r
2924         }\r
2925         \r
2926         /**\r
2927          * Admin::action_skiniedoimport()\r
2928          * \r
2929          * @param       void\r
2930          * @return      void\r
2931          */\r
2932         static private function action_skiniedoimport()\r
2933         {\r
2934                 global $member, $DIR_LIBS, $DIR_SKINS;\r
2935                 \r
2936                 $member->isAdmin() or self::disallow();\r
2937                 \r
2938                 // load skinie class\r
2939                 include_once($DIR_LIBS . 'skinie.php');\r
2940                 \r
2941                 $mode = postVar('mode');\r
2942                 $skinFileRaw = postVar('skinfile');\r
2943                 $allowOverwrite = intPostVar('overwrite');\r
2944                 \r
2945                 $error = self::skinieedoimport($mode, $skinFileRaw, $allowOverwrite);\r
2946                 if ( $error )\r
2947                 {\r
2948                         self::error($msg);\r
2949                         return;\r
2950                 }\r
2951                 \r
2952                 self::$skin->parse('skiniedoimport');\r
2953                 return;\r
2954         }\r
2955         \r
2956         /**\r
2957          * Admin::action_skinieexport()\r
2958          * \r
2959          * @param       void\r
2960          * @return      void\r
2961          */\r
2962         static private function action_skinieexport()\r
2963         {\r
2964                 global $member;\r
2965                 \r
2966                 $member->isAdmin() or self::disallow();\r
2967                 \r
2968                 $aSkins = requestIntArray('skin');\r
2969                 $aTemplates = requestIntArray('template');\r
2970                 $info = postVar('info');\r
2971                 \r
2972                 self::skinieexport($aSkins, $aTemplates, $info);\r
2973                 \r
2974                 return;\r
2975         }\r
2976         \r
2977         /**\r
2978          * Admin::action_templateoverview()\r
2979          * \r
2980          * @param       void\r
2981          * @return      void\r
2982          */\r
2983         static private function action_templateoverview()\r
2984         {\r
2985                 global $member, $manager;\r
2986                 \r
2987                 $member->isAdmin() or self::disallow();\r
2988                 \r
2989                 self::$skin->parse('templateoverview');\r
2990                 return;\r
2991         }\r
2992         \r
2993         /**\r
2994          * Admin::action_templateedit()\r
2995          * \r
2996          * @param       string  $msg    message for pageheader\r
2997          * @return      void\r
2998          */\r
2999         static private function action_templateedit($msg = '')\r
3000         {\r
3001                 global $member, $manager;\r
3002                 if ( $msg )\r
3003                 {\r
3004                         self::$headMess = $msg;\r
3005                 }\r
3006                 \r
3007                 $templateid = intRequestVar('templateid');\r
3008                 \r
3009                 $member->isAdmin() or self::disallow();\r
3010                 \r
3011                 Admin::$extrahead .= "<script type=\"text/javascript\" src=\"<%skinfile(javascript/templateEdit.js)%>\"></script>\n";\r
3012                 Admin::$extrahead .= "<script type=\"text/javascript\">setTemplateEditText('" . Entity::hsc(_EDITTEMPLATE_EMPTY) . "');</script>\n";\r
3013                 \r
3014                 self::$skin->parse('templateedit');\r
3015                 return;\r
3016         }\r
3017         \r
3018         /**\r
3019          * Admin::action_templateupdate()\r
3020          * \r
3021          * @param       void\r
3022          * @return      void\r
3023          */\r
3024         static private function action_templateupdate()\r
3025         {\r
3026                 global $member,$manager;\r
3027                 \r
3028                 $templateid = intRequestVar('templateid');\r
3029                 \r
3030                 $member->isAdmin() or self::disallow();\r
3031                 \r
3032                 $name = postVar('tname');\r
3033                 $desc = postVar('tdesc');\r
3034                 \r
3035                 if ( !isValidTemplateName($name) )\r
3036                 {\r
3037                         self::error(_ERROR_BADTEMPLATENAME);\r
3038                         return;\r
3039                 }\r
3040                 \r
3041                 if ( (Template::getNameFromId($templateid) != $name) && Template::exists($name) )\r
3042                 {\r
3043                         self::error(_ERROR_DUPTEMPLATENAME);\r
3044                         return;\r
3045                 }\r
3046                 \r
3047                 // 1. Remove all template parts\r
3048                 $query = "DELETE FROM %s WHERE tdesc=%d;";\r
3049                 $query = sprintf($query, sql_table('template'), (integer) $templateid);\r
3050                 DB::execute($query);\r
3051                 \r
3052                 // 2. Update description\r
3053                 $query = "UPDATE %s SET tdname=%s, tddesc=%s WHERE tdnumber=%d;";\r
3054                 $query = sprintf($query, sql_table('template_desc'), DB::quoteValue($name), DB::quoteValue($desc), (integer) $templateid);\r
3055                 DB::execute($query);\r
3056                 \r
3057                 // 3. Add non-empty template parts\r
3058                 self::addToTemplate($templateid, 'ITEM_HEADER',                 postVar('ITEM_HEADER'));\r
3059                 self::addToTemplate($templateid, 'ITEM',                                postVar('ITEM'));\r
3060                 self::addToTemplate($templateid, 'ITEM_FOOTER',                 postVar('ITEM_FOOTER'));\r
3061                 self::addToTemplate($templateid, 'MORELINK',                    postVar('MORELINK'));\r
3062                 self::addToTemplate($templateid, 'EDITLINK',                    postVar('EDITLINK'));\r
3063                 self::addToTemplate($templateid, 'NEW',                                 postVar('NEW'));\r
3064                 self::addToTemplate($templateid, 'COMMENTS_HEADER',             postVar('COMMENTS_HEADER'));\r
3065                 self::addToTemplate($templateid, 'COMMENTS_BODY',               postVar('COMMENTS_BODY'));\r
3066                 self::addToTemplate($templateid, 'COMMENTS_FOOTER',             postVar('COMMENTS_FOOTER'));\r
3067                 self::addToTemplate($templateid, 'COMMENTS_CONTINUED',  postVar('COMMENTS_CONTINUED'));\r
3068                 self::addToTemplate($templateid, 'COMMENTS_TOOMUCH',    postVar('COMMENTS_TOOMUCH'));\r
3069                 self::addToTemplate($templateid, 'COMMENTS_AUTH',               postVar('COMMENTS_AUTH'));\r
3070                 self::addToTemplate($templateid, 'COMMENTS_ONE',                postVar('COMMENTS_ONE'));\r
3071                 self::addToTemplate($templateid, 'COMMENTS_MANY',               postVar('COMMENTS_MANY'));\r
3072                 self::addToTemplate($templateid, 'COMMENTS_NONE',               postVar('COMMENTS_NONE'));\r
3073                 self::addToTemplate($templateid, 'ARCHIVELIST_HEADER',  postVar('ARCHIVELIST_HEADER'));\r
3074                 self::addToTemplate($templateid, 'ARCHIVELIST_LISTITEM', postVar('ARCHIVELIST_LISTITEM'));\r
3075                 self::addToTemplate($templateid, 'ARCHIVELIST_FOOTER',  postVar('ARCHIVELIST_FOOTER'));\r
3076                 self::addToTemplate($templateid, 'BLOGLIST_HEADER',             postVar('BLOGLIST_HEADER'));\r
3077                 self::addToTemplate($templateid, 'BLOGLIST_LISTITEM',   postVar('BLOGLIST_LISTITEM'));\r
3078                 self::addToTemplate($templateid, 'BLOGLIST_FOOTER',             postVar('BLOGLIST_FOOTER'));\r
3079                 self::addToTemplate($templateid, 'CATLIST_HEADER',              postVar('CATLIST_HEADER'));\r
3080                 self::addToTemplate($templateid, 'CATLIST_LISTITEM',    postVar('CATLIST_LISTITEM'));\r
3081                 self::addToTemplate($templateid, 'CATLIST_FOOTER',              postVar('CATLIST_FOOTER'));\r
3082                 self::addToTemplate($templateid, 'DATE_HEADER',                 postVar('DATE_HEADER'));\r
3083                 self::addToTemplate($templateid, 'DATE_FOOTER',                 postVar('DATE_FOOTER'));\r
3084                 self::addToTemplate($templateid, 'FORMAT_DATE',                 postVar('FORMAT_DATE'));\r
3085                 self::addToTemplate($templateid, 'FORMAT_TIME',                 postVar('FORMAT_TIME'));\r
3086                 self::addToTemplate($templateid, 'LOCALE',                              postVar('LOCALE'));\r
3087                 self::addToTemplate($templateid, 'SEARCH_HIGHLIGHT',    postVar('SEARCH_HIGHLIGHT'));\r
3088                 self::addToTemplate($templateid, 'SEARCH_NOTHINGFOUND', postVar('SEARCH_NOTHINGFOUND'));\r
3089                 self::addToTemplate($templateid, 'POPUP_CODE',                  postVar('POPUP_CODE'));\r
3090                 self::addToTemplate($templateid, 'MEDIA_CODE',                  postVar('MEDIA_CODE'));\r
3091                 self::addToTemplate($templateid, 'IMAGE_CODE',                  postVar('IMAGE_CODE'));\r
3092                 \r
3093                 $data = array('fields' => array());\r
3094                 $manager->notify('TemplateExtraFields', $data);\r
3095                 foreach ( $data['fields'] as $pfkey=>$pfvalue )\r
3096                 {\r
3097                         foreach ( $pfvalue as $pffield => $pfdesc )\r
3098                         {\r
3099                                 self::addToTemplate($templateid, $pffield, postVar($pffield));\r
3100                         }\r
3101                 }\r
3102                 \r
3103                 // jump back to template edit\r
3104                 self::action_templateedit(_TEMPLATE_UPDATED);\r
3105                 return;\r
3106         }\r
3107         \r
3108         /**\r
3109          * Admin::addToTemplate()\r
3110          * \r
3111          * @param       Integer $id     ID for template\r
3112          * @param       String  $partname       parts name\r
3113          * @param       String  $content        template contents\r
3114          * @return      Integer record index\r
3115          * \r
3116          */\r
3117         static private function addToTemplate($id, $partname, $content)\r
3118         {\r
3119                 // don't add empty parts:\r
3120                 if ( !trim($content) )\r
3121                 {\r
3122                         return -1;\r
3123                 }\r
3124                 \r
3125                 $query = "INSERT INTO %s (tdesc, tpartname, tcontent) VALUES (%d, %s, %s);";\r
3126                 $query = sprintf($query, sql_table('template'), (integer) $id, DB::quoteValue($partname), DB::quoteValue($content));\r
3127                 if ( DB::execute($query) === FALSE )\r
3128                 {\r
3129                         $err = DB::getError();\r
3130                         exit(_ADMIN_SQLDIE_QUERYERROR . $err[2]);\r
3131                 }\r
3132                 return DB::getInsertId();\r
3133         }\r
3134         \r
3135         /**\r
3136          * Admin::action_templatedelete()\r
3137          * \r
3138          * @param       void\r
3139          * @return      void\r
3140          */\r
3141         static private function action_templatedelete()\r
3142         {\r
3143                 global $member, $manager;\r
3144                 \r
3145                 $member->isAdmin() or self::disallow();\r
3146                 \r
3147                 $templateid = intRequestVar('templateid');\r
3148                 // TODO: check if template can be deleted\r
3149                 \r
3150                 self::$skin->parse('templatedelete');\r
3151                 return;\r
3152         }\r
3153         \r
3154         /**\r
3155          * Admin::action_templatedeleteconfirm()\r
3156          * \r
3157          * @param       void\r
3158          * @return      void\r
3159          */\r
3160         static private function action_templatedeleteconfirm()\r
3161         {\r
3162                 global $member, $manager;\r
3163                 \r
3164                 $templateid = intRequestVar('templateid');\r
3165                 \r
3166                 $member->isAdmin() or self::disallow();\r
3167                 \r
3168                 $data = array('templateid' => $templateid);\r
3169                 $manager->notify('PreDeleteTemplate', $data);\r
3170                 \r
3171                 // 1. delete description\r
3172                 DB::execute('DELETE FROM ' . sql_table('template_desc') . ' WHERE tdnumber=' . $templateid);\r
3173                 \r
3174                 // 2. delete parts\r
3175                 DB::execute('DELETE FROM ' . sql_table('template') . ' WHERE tdesc=' . $templateid);\r
3176                 \r
3177                 \r
3178                 $data = array('templateid' => $templateid);\r
3179                 $manager->notify('PostDeleteTemplate', $data);\r
3180                 \r
3181                 self::action_templateoverview();\r
3182                 return;\r
3183         }\r
3184         \r
3185         /**\r
3186          * Admin::action_templatenew()\r
3187          * \r
3188          * @param       void\r
3189          * @return      void\r
3190          */\r
3191         static private function action_templatenew()\r
3192         {\r
3193                 global $member;\r
3194                 \r
3195                 $member->isAdmin() or self::disallow();\r
3196                 \r
3197                 $name = postVar('name');\r
3198                 $desc = postVar('desc');\r
3199                 \r
3200                 if ( !isValidTemplateName($name) )\r
3201                 {\r
3202                         self::error(_ERROR_BADTEMPLATENAME);\r
3203                         return;\r
3204                 }\r
3205                 \r
3206                 if ( Template::exists($name) )\r
3207                 {\r
3208                         self::error(_ERROR_DUPTEMPLATENAME);\r
3209                         return;\r
3210                 }\r
3211                 \r
3212                 $newTemplateId = Template::createNew($name, $desc);\r
3213                 \r
3214                 self::action_templateoverview();\r
3215                 return;\r
3216         }\r
3217         \r
3218         /**\r
3219          * Admin::action_templateclone()\r
3220          * \r
3221          * @param       void\r
3222          * @return      void\r
3223          */\r
3224         static private function action_templateclone()\r
3225         {\r
3226                 global $member;\r
3227                 \r
3228                 $templateid = intRequestVar('templateid');\r
3229                 \r
3230                 $member->isAdmin() or self::disallow();\r
3231                 \r
3232                 // 1. read old template\r
3233                 $name = Template::getNameFromId($templateid);\r
3234                 $desc = Template::getDesc($templateid);\r
3235                 \r
3236                 // 2. create desc thing\r
3237                 $name = "cloned" . $name;\r
3238                 \r
3239                 // if a template with that name already exists:\r
3240                 if ( Template::exists($name) )\r
3241                 {\r
3242                         $i = 1;\r
3243                         while (Template::exists($name . $i))\r
3244                         {\r
3245                                 $i++;\r
3246                         }\r
3247                         $name .= $i;\r
3248                 }\r
3249                 \r
3250                 $newid = Template::createNew($name, $desc);\r
3251                 \r
3252                 // 3. create clone\r
3253                 // go through parts of old template and add them to the new one\r
3254                 $query = "SELECT tpartname, tcontent FROM %s WHERE tdesc=%d;";\r
3255                 $query = sprintf($query, sql_table('template'), (integer) $templateid);\r
3256                 \r
3257                 $res = DB::getResult($query);\r
3258                 foreach ( $res as $row)\r
3259                 {\r
3260                         self::addToTemplate($newid, $row['tpartname'], $row['tcontent']);\r
3261                 }\r
3262                 \r
3263                 self::action_templateoverview();\r
3264                 return;\r
3265         }\r
3266         \r
3267         /**\r
3268          * Admin::action_admintemplateoverview()\r
3269          * \r
3270          * @param       void\r
3271          * @return      void\r
3272          */\r
3273         static private function action_admintemplateoverview()\r
3274         {\r
3275                 global $member;\r
3276                 $member->isAdmin() or self::disallow();\r
3277                 self::$skin->parse('admntemplateoverview');\r
3278                 return;\r
3279         }\r
3280         \r
3281         /**\r
3282          * Admin::action_admintemplateedit()\r
3283          * \r
3284          * @param       string  $msg    message for pageheader\r
3285          * @return      void\r
3286          */\r
3287         static private function action_admintemplateedit($msg = '')\r
3288         {\r
3289                 global $member, $manager;\r
3290                 if ( $msg )\r
3291                 {\r
3292                         self::$headMess = $msg;\r
3293                 }\r
3294                 $member->isAdmin() or self::disallow();\r
3295                 \r
3296                 Admin::$extrahead .= "<script type=\"text/javascript\" src=\"<%skinfile(javascript/templateEdit.js)%>\"></script>\n";\r
3297                 Admin::$extrahead .= '<script type="text/javascript">setTemplateEditText("' . Entity::hsc(_EDITTEMPLATE_EMPTY) . '");</script>' . "\n";\r
3298                 \r
3299                 self::$skin->parse('admintemplateedit');\r
3300                 return;\r
3301         }\r
3302         \r
3303         /**\r
3304          * Admin::action_admintemplateupdate()\r
3305          * \r
3306          * @param       void\r
3307          * @return      void\r
3308          */\r
3309         static private function action_admintemplateupdate()\r
3310         {\r
3311                 global $member, $manager;\r
3312                 $templateid = intRequestVar('templateid');\r
3313                 $member->isAdmin() or self::disallow();\r
3314                 $name = postVar('tname');\r
3315                 $desc = postVar('tdesc');\r
3316                 \r
3317                 if ( !isValidTemplateName($name) )\r
3318                 {\r
3319                         self::error(_ERROR_BADTEMPLATENAME);\r
3320                         return;\r
3321                 }\r
3322                 \r
3323                 if ( (Template::getNameFromId($templateid) != $name) && Template::exists($name) )\r
3324                 {\r
3325                         self::error(_ERROR_DUPTEMPLATENAME);\r
3326                         return;\r
3327                 }\r
3328                 \r
3329                 // 1. Remove all template parts\r
3330                 $query = "DELETE FROM %s WHERE tdesc=%d;";\r
3331                 $query = sprintf($query, sql_table('template'), (integer) $templateid);\r
3332                 DB::execute($query);\r
3333                 \r
3334                 // 2. Update description\r
3335                 $query = "UPDATE %s SET tdname=%s, tddesc=%s WHERE tdnumber=%d;";\r
3336                 $query = sprintf($query, sql_table('template_desc'), DB::quoteValue($name), DB::quoteValue($desc), (integer) $templateid);\r
3337                 DB::execute($query);\r
3338                 \r
3339                 // 3. Add non-empty template parts\r
3340                 self::addToAdminTemplate($templateid, 'NORMALSKINLIST_HEAD',                                    postVar('NORMALSKINLIST_HEAD'));\r
3341                 self::addToAdminTemplate($templateid, 'NORMALSKINLIST_BODY',                                    postVar('NORMALSKINLIST_BODY'));\r
3342                 self::addToAdminTemplate($templateid, 'NORMALSKINLIST_FOOT',                                    postVar('NORMALSKINLIST_FOOT'));\r
3343                 self::addToAdminTemplate($templateid, 'ADMIN_CUSTOMHELPLINK_ICON',                              postVar('ADMIN_CUSTOMHELPLINK_ICON'));\r
3344                 self::addToAdminTemplate($templateid, 'ADMIN_CUSTOMHELPLINK_ANCHOR',                    postVar('ADMIN_CUSTOMHELPLINK_ANCHOR'));\r
3345                 self::addToAdminTemplate($templateid, 'ADMIN_BLOGLINK',                                                 postVar('ADMIN_BLOGLINK'));\r
3346                 self::addToAdminTemplate($templateid, 'ADMIN_BATCHLIST',                                                postVar('ADMIN_BATCHLIST'));\r
3347                 self::addToAdminTemplate($templateid, 'ACTIVATE_FORGOT_TITLE',                                  postVar('ACTIVATE_FORGOT_TITLE'));\r
3348                 self::addToAdminTemplate($templateid, 'ACTIVATE_FORGOT_TEXT',                                   postVar('ACTIVATE_FORGOT_TEXT'));\r
3349                 self::addToAdminTemplate($templateid, 'ACTIVATE_REGISTER_TITLE',                                postVar('ACTIVATE_REGISTER_TITLE'));\r
3350                 self::addToAdminTemplate($templateid, 'ACTIVATE_REGISTER_TEXT',                                 postVar('ACTIVATE_REGISTER_TEXT'));\r
3351                 self::addToAdminTemplate($templateid, 'ACTIVATE_CHANGE_TITLE',                                  postVar('ACTIVATE_CHANGE_TITLE'));\r
3352                 self::addToAdminTemplate($templateid, 'ACTIVATE_CHANGE_TEXT',                                   postVar('ACTIVATE_CHANGE_TEXT'));\r
3353                 self::addToAdminTemplate($templateid, 'TEMPLATE_EDIT_EXPLUGNAME',                               postVar('TEMPLATE_EDIT_EXPLUGNAME'));\r
3354                 self::addToAdminTemplate($templateid, 'TEMPLATE_EDIT_ROW_HEAD',                                 postVar('TEMPLATE_EDIT_ROW_HEAD'));\r
3355                 self::addToAdminTemplate($templateid, 'TEMPLATE_EDIT_ROW_TAIL',                                 postVar('TEMPLATE_EDIT_ROW_TAIL'));\r
3356                 self::addToAdminTemplate($templateid, 'SPECIALSKINLIST_HEAD',                                   postVar('SPECIALSKINLIST_HEAD'));\r
3357                 self::addToAdminTemplate($templateid, 'SPECIALSKINLIST_BODY',                                   postVar('SPECIALSKINLIST_BODY'));\r
3358                 self::addToAdminTemplate($templateid, 'SPECIALSKINLIST_FOOT',                                   postVar('SPECIALSKINLIST_FOOT'));\r
3359                 self::addToAdminTemplate($templateid, 'SYSTEMINFO_GDSETTINGS',                                  postVar('SYSTEMINFO_GDSETTINGS'));\r
3360                 self::addToAdminTemplate($templateid, 'BANLIST_DELETED_LIST',                                   postVar('BANLIST_DELETED_LIST'));\r
3361                 self::addToAdminTemplate($templateid, 'INSERT_PLUGOPTION_TITLE',                                postVar('INSERT_PLUGOPTION_TITLE'));\r
3362                 self::addToAdminTemplate($templateid, 'INSERT_PLUGOPTION_BODY',                                 postVar('INSERT_PLUGOPTION_BODY'));\r
3363                 self::addToAdminTemplate($templateid, 'INPUTYESNO_TEMPLATE_ADMIN',                              postVar('INPUTYESNO_TEMPLATE_ADMIN'));\r
3364                 self::addToAdminTemplate($templateid, 'INPUTYESNO_TEMPLATE_NORMAL',                             postVar('INPUTYESNO_TEMPLATE_NORMAL'));\r
3365                 self::addToAdminTemplate($templateid, 'ADMIN_SPECIALSKINLIST_HEAD',                             postVar('ADMIN_SPECIALSKINLIST_HEAD'));\r
3366                 self::addToAdminTemplate($templateid, 'ADMIN_SPECIALSKINLIST_BODY',                             postVar('ADMIN_SPECIALSKINLIST_BODY'));\r
3367                 self::addToAdminTemplate($templateid, 'ADMIN_SPECIALSKINLIST_FOOT',                             postVar('ADMIN_SPECIALSKINLIST_FOOT'));\r
3368                 self::addToAdminTemplate($templateid, 'SKINIE_EXPORT_LIST',                                             postVar('SKINIE_EXPORT_LIST'));\r
3369                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_SELECT_HEAD',                  postVar('SHOWLIST_LISTPLUG_SELECT_HEAD'));\r
3370                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_SELECT_BODY',                  postVar('SHOWLIST_LISTPLUG_SELECT_BODY'));\r
3371                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_SELECT_FOOT',                  postVar('SHOWLIST_LISTPLUG_SELECT_FOOT'));\r
3372                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_HEAD',                   postVar('SHOWLIST_LISTPLUG_TABLE_HEAD'));\r
3373                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BODY',                   postVar('SHOWLIST_LISTPLUG_TABLE_BODY'));\r
3374                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_FOOT',                   postVar('SHOWLIST_LISTPLUG_TABLE_FOOT'));\r
3375                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_MEMBLIST_HEAD',  postVar('SHOWLIST_LISTPLUG_TABLE_MEMBLIST_HEAD'));\r
3376                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_MEMBLIST_BODY',  postVar('SHOWLIST_LISTPLUG_TABLE_MEMBLIST_BODY'));\r
3377                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_MEMBLIST_FOOT',  postVar('SHOWLIST_LISTPLUG_TABLE_MEMBLIST_FOOT'));\r
3378                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TEAMLIST_HEAD',  postVar('SHOWLIST_LISTPLUG_TABLE_TEAMLIST_HEAD'));\r
3379                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TEAMLIST_BODY',  postVar('SHOWLIST_LISTPLUG_TABLE_TEAMLIST_BODY'));\r
3380                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TEAMLIST_FOOT',  postVar('SHOWLIST_LISTPLUG_TABLE_TEAMLIST_FOOT'));\r
3381                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_HEAD',  postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_HEAD'));\r
3382                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_BODY',  postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_BODY'));\r
3383                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_GURL',  postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_GURL'));\r
3384                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGEVENTLIST',  postVar('SHOWLIST_LISTPLUG_TABLE_PLUGEVENTLIST'));\r
3385                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGNEDUPDATE',  postVar('SHOWLIST_LISTPLUG_TABLE_PLUGNEDUPDATE'));\r
3386                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGIN_DEPEND',  postVar('SHOWLIST_LISTPLUG_TABLE_PLUGIN_DEPEND'));\r
3387                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGIN_DEPREQ',  postVar('SHOWLIST_LISTPLUG_TABLE_PLUGIN_DEPREQ'));\r
3388                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLISTFALSE',  postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLISTFALSE'));\r
3389                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_ACTN',  postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_ACTN'));\r
3390                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_ADMN',  postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_ADMN'));\r
3391                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_HELP',  postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_HELP'));\r
3392                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGOPTSETURL',  postVar('SHOWLIST_LISTPLUG_TABLE_PLUGOPTSETURL'));\r
3393                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_FOOT',  postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_FOOT'));\r
3394                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_POPTLIST_HEAD',  postVar('SHOWLIST_LISTPLUG_TABLE_POPTLIST_HEAD'));\r
3395                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_POPTLIST_BODY',  postVar('SHOWLIST_LISTPLUG_TABLE_POPTLIST_BODY'));\r
3396                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OYESNO',  postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OYESNO'));\r
3397                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OPWORD',  postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OPWORD'));\r
3398                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEP',  postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEP'));\r
3399                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEO',  postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEO'));\r
3400                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEC',  postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEC'));\r
3401                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OTAREA',  postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OTAREA'));\r
3402                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OITEXT',  postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OITEXT'));\r
3403                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGOPTN_FOOT',  postVar('SHOWLIST_LISTPLUG_TABLE_PLUGOPTN_FOOT'));\r
3404                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_POPTLIST_FOOT',  postVar('SHOWLIST_LISTPLUG_TABLE_POPTLIST_FOOT'));\r
3405                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ITEMLIST_HEAD',  postVar('SHOWLIST_LISTPLUG_TABLE_ITEMLIST_HEAD'));\r
3406                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ITEMLIST_BODY',  postVar('SHOWLIST_LISTPLUG_TABLE_ITEMLIST_BODY'));\r
3407                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ITEMLIST_FOOT',  postVar('SHOWLIST_LISTPLUG_TABLE_ITEMLIST_FOOT'));\r
3408                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CMNTLIST_HEAD',  postVar('SHOWLIST_LISTPLUG_TABLE_CMNTLIST_HEAD'));\r
3409                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CMNTLIST_BODY',  postVar('SHOWLIST_LISTPLUG_TABLE_CMNTLIST_BODY'));\r
3410                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CMNTLIST_ABAN',  postVar('SHOWLIST_LISTPLUG_TABLE_CMNTLIST_ABAN'));\r
3411                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CMNTLIST_FOOT',  postVar('SHOWLIST_LISTPLUG_TABLE_CMNTLIST_FOOT'));\r
3412                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGLIST_HEAD',  postVar('SHOWLIST_LISTPLUG_TABLE_BLOGLIST_HEAD'));\r
3413                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGLIST_BODY',  postVar('SHOWLIST_LISTPLUG_TABLE_BLOGLIST_BODY'));\r
3414                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLIST_BD_TADM',  postVar('SHOWLIST_LISTPLUG_TABLE_BLIST_BD_TADM'));\r
3415                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLIST_BD_SADM',  postVar('SHOWLIST_LISTPLUG_TABLE_BLIST_BD_SADM'));\r
3416                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGLIST_FOOT',  postVar('SHOWLIST_LISTPLUG_TABLE_BLOGLIST_FOOT'));\r
3417                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_HEAD',  postVar('SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_HEAD'));\r
3418                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_BODY',  postVar('SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_BODY'));\r
3419                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_FOOT',  postVar('SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_FOOT'));\r
3420                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SHORTNAM_HEAD',  postVar('SHOWLIST_LISTPLUG_TABLE_SHORTNAM_HEAD'));\r
3421                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SHORTNAM_BODY',  postVar('SHOWLIST_LISTPLUG_TABLE_SHORTNAM_BODY'));\r
3422                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SHORTNAM_FOOT',  postVar('SHOWLIST_LISTPLUG_TABLE_SHORTNAM_FOOT'));\r
3423                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CATELIST_HEAD',  postVar('SHOWLIST_LISTPLUG_TABLE_CATELIST_HEAD'));\r
3424                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CATELIST_BODY',  postVar('SHOWLIST_LISTPLUG_TABLE_CATELIST_BODY'));\r
3425                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CATELIST_FOOT',  postVar('SHOWLIST_LISTPLUG_TABLE_CATELIST_FOOT'));\r
3426                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TPLTLIST_HEAD',  postVar('SHOWLIST_LISTPLUG_TABLE_TPLTLIST_HEAD'));\r
3427                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TPLTLIST_BODY',  postVar('SHOWLIST_LISTPLUG_TABLE_TPLTLIST_BODY'));\r
3428                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TPLTLIST_FOOT',  postVar('SHOWLIST_LISTPLUG_TABLE_TPLTLIST_FOOT'));\r
3429                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SKINLIST_HEAD',  postVar('SHOWLIST_LISTPLUG_TABLE_SKINLIST_HEAD'));\r
3430                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SKINLIST_BODY',  postVar('SHOWLIST_LISTPLUG_TABLE_SKINLIST_BODY'));\r
3431                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SKINLIST_FOOT',  postVar('SHOWLIST_LISTPLUG_TABLE_SKINLIST_FOOT'));\r
3432                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_DRFTLIST_HEAD',  postVar('SHOWLIST_LISTPLUG_TABLE_DRFTLIST_HEAD'));\r
3433                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_DRFTLIST_BODY',  postVar('SHOWLIST_LISTPLUG_TABLE_DRFTLIST_BODY'));\r
3434                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_DRFTLIST_FOOT',  postVar('SHOWLIST_LISTPLUG_TABLE_DRFTLIST_FOOT'));\r
3435                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ACTNLIST_HEAD',  postVar('SHOWLIST_LISTPLUG_TABLE_ACTNLIST_HEAD'));\r
3436                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ACTNLIST_BODY',  postVar('SHOWLIST_LISTPLUG_TABLE_ACTNLIST_BODY'));\r
3437                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ACTNLIST_FOOT',  postVar('SHOWLIST_LISTPLUG_TABLE_ACTNLIST_FOOT'));\r
3438                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_IBANLIST_HEAD',  postVar('SHOWLIST_LISTPLUG_TABLE_IBANLIST_HEAD'));\r
3439                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_IBANLIST_BODY',  postVar('SHOWLIST_LISTPLUG_TABLE_IBANLIST_BODY'));\r
3440                 self::addToAdminTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_IBANLIST_FOOT',  postVar('SHOWLIST_LISTPLUG_TABLE_IBANLIST_FOOT'));\r
3441                 self::addToAdminTemplate($templateid, 'PLUGIN_QUICKMENU_TITLE',                                 postVar('PLUGIN_QUICKMENU_TITLE'));\r
3442                 self::addToAdminTemplate($templateid, 'PLUGIN_QUICKMENU_HEAD',                                  postVar('PLUGIN_QUICKMENU_HEAD'));\r
3443                 self::addToAdminTemplate($templateid, 'PLUGIN_QUICKMENU_BODY',                                  postVar('PLUGIN_QUICKMENU_BODY'));\r
3444                 self::addToAdminTemplate($templateid, 'PLUGIN_QUICKMENU_FOOT',                                  postVar('PLUGIN_QUICKMENU_FOOT'));\r
3445                 \r
3446                 $data = array('fields' => array());\r
3447                 $manager->notify('AdminTemplateExtraFields', $data);\r
3448                 foreach ( $data['fields'] as $pfkey => $pfvalue )\r
3449                 {\r
3450                         foreach ( $pfvalue as $pffield => $pfdesc )\r
3451                         {\r
3452                                 self::addToAdminTemplate($templateid, $pffield, postVar($pffield));\r
3453                         }\r
3454                 }\r
3455                 \r
3456                 // jump back to template edit\r
3457                 self::action_admintemplateedit(_TEMPLATE_UPDATED);\r
3458                 return;\r
3459         }\r
3460         \r
3461         /**\r
3462          * Admin::addToAdminTemplate()\r
3463          * \r
3464          * @param       integer $id                     ID for template\r
3465          * @param       string  $partname       name of part for template\r
3466          * @param       void    $contents       content for part of template\r
3467          * @return      integer ID for newly inserted Template\r
3468          */\r
3469         static private function addToAdminTemplate($id, $partname, $content)\r
3470         {\r
3471                 // don't add empty parts:\r
3472                 if ( !trim($content) )\r
3473                 {\r
3474                         return -1;\r
3475                 }\r
3476                 \r
3477                 $query = "INSERT INTO %s (tdesc, tpartname, tcontent ) VALUES (%d, %s, %s);";\r
3478                 $query = sprintf($query, sql_table('template'), (integer) $id, DB::quoteValue($partname), DB::quoteValue($content));\r
3479                 if ( DB::execute($query) === FALSE )\r
3480                 {\r
3481                         $err = DB::getError();\r
3482                         exit(_ADMIN_SQLDIE_QUERYERROR . $err[2]);\r
3483                 }\r
3484                 return DB::getInsertId();\r
3485         }\r
3486         \r
3487         /**\r
3488          * Admin::action_admintemplatedelete()\r
3489          * \r
3490          * @param       void\r
3491          * @return      void\r
3492          */\r
3493         static private function action_admintemplatedelete()\r
3494         {\r
3495                 global $member, $manager;\r
3496                 $member->isAdmin() or self::disallow();\r
3497                 \r
3498                 // TODO: check if template can be deleted\r
3499                 self::$skin->parse('admintemplatedelete');\r
3500                 return;\r
3501         }\r
3502         \r
3503         /**\r
3504          * Admin::action_admintemplatedeleteconfirm()\r
3505          * \r
3506          * @param       void\r
3507          * @return      void\r
3508          */\r
3509         static private function action_admintemplatedeleteconfirm()\r
3510         {\r
3511                 global $member, $manager;\r
3512                 \r
3513                 $templateid = intRequestVar('templateid');\r
3514                 $member->isAdmin() or self::disallow();\r
3515                 \r
3516                 $data = array('templateid' => $templateid);\r
3517                 $manager->notify('PreDeleteAdminTemplate', $data);\r
3518                 \r
3519                 // 1. delete description\r
3520                 $query = "DELETE FROM %s WHERE tdnumber=%s;";\r
3521                 $query = sprintf($query, sql_table('template_desc'), (integer) $templateid);\r
3522                 DB::execute($query);\r
3523                 \r
3524                 // 2. delete parts\r
3525                 $query = "DELETE FROM %s WHERE tdesc=%d;";\r
3526                 $query = sprintf($query, sql_table('template'), (integer) $templateid);\r
3527                 DB::execute($query);\r
3528                 \r
3529                 $data = array('templateid' => $templateid);\r
3530                 $manager->notify('PostDeleteAdminTemplate', $data);\r
3531                 \r
3532                 self::action_admintemplateoverview();\r
3533                 return;\r
3534         }\r
3535         \r
3536         /**\r
3537          * Admin::action_admintemplatenew()\r
3538          * \r
3539          * @param       void\r
3540          * @return      void\r
3541          */\r
3542         static private function action_admintemplatenew()\r
3543         {\r
3544                 global $member;\r
3545                 $member->isAdmin() or self::disallow();\r
3546                 $name = postVar('name');\r
3547                 $desc = postVar('desc');\r
3548                 \r
3549                 if ( !isValidTemplateName($name) )\r
3550                 {\r
3551                         self::error(_ERROR_BADTEMPLATENAME);\r
3552                         return;\r
3553                 }\r
3554                 else if ( !preg_match('#^admin/#', $name) )\r
3555                 {\r
3556                         self::error(_ERROR_BADADMINTEMPLATENAME);\r
3557                         return;\r
3558                 }\r
3559                 else if ( Template::exists($name) )\r
3560                 {\r
3561                         self::error(_ERROR_DUPTEMPLATENAME);\r
3562                         return;\r
3563                 }\r
3564                 \r
3565                 $newTemplateId = Template::createNew($name, $desc);\r
3566                 self::action_admintemplateoverview();\r
3567                 return;\r
3568         }\r
3569         \r
3570         /**\r
3571          * Admin::action_admintemplateclone()\r
3572          * \r
3573          * @param       void\r
3574          * @return      void\r
3575          */\r
3576         static private function action_admintemplateclone()\r
3577         {\r
3578                 global $member;\r
3579                 $templateid = intRequestVar('templateid');\r
3580                 $member->isAdmin() or self::disallow();\r
3581                 \r
3582                 // 1. read old template\r
3583                 $name = Template::getNameFromId($templateid);\r
3584                 $desc = Template::getDesc($templateid);\r
3585                 \r
3586                 // 2. create desc thing\r
3587                 $name = $name . "cloned";\r
3588                 \r
3589                 // if a template with that name already exists:\r
3590                 if ( Template::exists($name) )\r
3591                 {\r
3592                         $i = 1;\r
3593                         while ( Template::exists($name . $i) )\r
3594                         {\r
3595                                 $i++;\r
3596                         }\r
3597                         $name .= $i;\r
3598                 }\r
3599                 \r
3600                 $newid = Template::createNew($name, $desc);\r
3601                 \r
3602                 // 3. create clone\r
3603                 // go through parts of old template and add them to the new one\r
3604                 $query = "SELECT tpartname, tcontent FROM %s WHERE tdesc=%d;";\r
3605                 $query = sprintf($query, sql_table('template'), (integer) $templateid);\r
3606                 \r
3607                 $res = DB::getResult($query);\r
3608                 foreach ( $res as $row )\r
3609                 {\r
3610                         self::addToAdminTemplate($newid, $row['tpartname'], $row['tcontent']);\r
3611                 }\r
3612                 \r
3613                 self::action_admintemplateoverview();\r
3614                 return;\r
3615         }\r
3616 \r
3617         /**\r
3618          * Admin::action_skinoverview()\r
3619          * \r
3620          * @param       void\r
3621          * @return      void\r
3622          */\r
3623         static private function action_skinoverview()\r
3624         {\r
3625                 global $member, $manager;\r
3626                 \r
3627                 $member->isAdmin() or self::disallow();\r
3628                 \r
3629                 self::$skin->parse('skinoverview');\r
3630                 return;\r
3631         }\r
3632         \r
3633         /**\r
3634          * Admin::action_skinnew()\r
3635          * \r
3636          * @param       void\r
3637          * @return      void\r
3638          */\r
3639         static private function action_skinnew()\r
3640         {\r
3641                 global $member;\r
3642                 \r
3643                 $member->isAdmin() or self::disallow();\r
3644                 \r
3645                 $name = trim(postVar('name'));\r
3646                 $desc = trim(postVar('desc'));\r
3647                 \r
3648                 if ( !isValidSkinName($name) )\r
3649                 {\r
3650                         self::error(_ERROR_BADSKINNAME);\r
3651                         return;\r
3652                 }\r
3653                 else if ( SKIN::exists($name) )\r
3654                 {\r
3655                         self::error(_ERROR_DUPSKINNAME);\r
3656                         return;\r
3657                 }\r
3658                 \r
3659                 SKIN::createNew($name, $desc);\r
3660                 \r
3661                 self::action_skinoverview();\r
3662                 return;\r
3663         }\r
3664         \r
3665         /**\r
3666          * Admin::action_skinedit()\r
3667          * \r
3668          * @param       void\r
3669          * @return      void\r
3670          */\r
3671         static private function action_skinedit()\r
3672         {\r
3673                 global $member;\r
3674                 \r
3675                 $member->isAdmin() or self::disallow();\r
3676                 \r
3677                 self::$skin->parse('skinedit');\r
3678                 return;\r
3679         }\r
3680         \r
3681         /**\r
3682          * Admin::action_skineditgeneral()\r
3683          * \r
3684          * @param       void\r
3685          * @return      void\r
3686          */\r
3687         static private function action_skineditgeneral()\r
3688         {\r
3689                 global $member;\r
3690                 \r
3691                 $skinid = intRequestVar('skinid');\r
3692                 \r
3693                 $member->isAdmin() or self::disallow();\r
3694                 \r
3695                 $error = self::skineditgeneral($skinid);\r
3696                 if ( $error )\r
3697                 {\r
3698                         self::error($error);\r
3699                         return;\r
3700                 }\r
3701                 \r
3702                 self::action_skinedit();\r
3703                 return;\r
3704         }\r
3705         \r
3706         static private function action_skinedittype($msg = '')\r
3707         {\r
3708                 global $member;\r
3709                 \r
3710                 $member->isAdmin() or self::disallow();\r
3711                 \r
3712                 if ( $msg )\r
3713                 {\r
3714                         self::$headMess = $msg;\r
3715                 }\r
3716                 \r
3717                 $type = requestVar('type');\r
3718                 $type = trim($type);\r
3719                 $type = strtolower($type);\r
3720                 \r
3721                 if ( !isValidShortName($type) )\r
3722                 {\r
3723                         self::error(_ERROR_SKIN_PARTS_SPECIAL_FORMAT);\r
3724                         return;\r
3725                 }\r
3726                 \r
3727                 self::$skin->parse('skinedittype');\r
3728                 return;\r
3729         }\r
3730         \r
3731         /**\r
3732          * Admin::action_skinupdate()\r
3733          * \r
3734          * @param       void\r
3735          * @return      void\r
3736          */\r
3737         static private function action_skinupdate()\r
3738         {\r
3739                 global $manager, $member;\r
3740                 \r
3741                 $skinid = intRequestVar('skinid');\r
3742                 $content = trim(postVar('content'));\r
3743                 $type = postVar('type');\r
3744                 \r
3745                 $member->isAdmin() or self::disallow();\r
3746                 \r
3747                 $skin =& $manager->getSKIN($skinid);\r
3748                 $skin->update($type, $content);\r
3749                 \r
3750                 self::action_skinedittype(_SKIN_UPDATED);\r
3751                 return;\r
3752         }\r
3753         \r
3754         /**\r
3755          * Admin::action_skindelete()\r
3756          * \r
3757          * @param       void\r
3758          * @return      void\r
3759          */\r
3760         static private function action_skindelete()\r
3761         {\r
3762                 global $CONF, $member;\r
3763                 \r
3764                 $member->isAdmin() or self::disallow();\r
3765                 \r
3766                 $skinid = intRequestVar('skinid');\r
3767                 \r
3768                 // don't allow default skin to be deleted\r
3769                 if ( $skinid == $CONF['BaseSkin'] )\r
3770                 {\r
3771                         self::error(_ERROR_DEFAULTSKIN);\r
3772                         return;\r
3773                 }\r
3774                 \r
3775                 // don't allow deletion of default skins for blogs\r
3776                 $query = "SELECT bname FROM %s WHERE bdefskin=%d";\r
3777                 $query = sprintf($query, sql_table('blog'), (integer) $skinid);\r
3778                 \r
3779                 $name = DB::getValue($query);\r
3780                 if ( $name )\r
3781                 {\r
3782                         self::error(_ERROR_SKINDEFDELETE . Entity::hsc($name));\r
3783                         return;\r
3784                 }\r
3785                 \r
3786                 self::$skin->parse('skindelete');\r
3787                 return;\r
3788         }\r
3789         \r
3790         /**\r
3791          * Admin::action_skindeleteconfirm()\r
3792          * \r
3793          * @param       void\r
3794          * @return      void\r
3795          */\r
3796         static private function action_skindeleteconfirm()\r
3797         {\r
3798                 global $member, $CONF;\r
3799                 \r
3800                 $member->isAdmin() or self::disallow();\r
3801                 \r
3802                 $skinid = intRequestVar('skinid');\r
3803                 \r
3804                 // don't allow default skin to be deleted\r
3805                 if ( $skinid == $CONF['BaseSkin'] )\r
3806                 {\r
3807                         self::error(_ERROR_DEFAULTSKIN);\r
3808                         return;\r
3809                 }\r
3810                 \r
3811                 // don't allow deletion of default skins for blogs\r
3812                 $query = "SELECT bname FROM %s WHERE bdefskin=%d;";\r
3813                 $query = sprintf($query, sql_table('blog'), (integer) $skinid);\r
3814                 \r
3815                 $name = DB::getValue($query);\r
3816                 if ( $name )\r
3817                                 {\r
3818                         self::error(_ERROR_SKINDEFDELETE . Entity::hsc($name));\r
3819                         return;\r
3820                 }\r
3821                 \r
3822                 self::skindeleteconfirm($skinid);\r
3823                 \r
3824                 self::action_skinoverview();\r
3825                 return;\r
3826         }\r
3827         \r
3828         /**\r
3829          * Admin::action_skinremovetype()\r
3830          * \r
3831          * @param       void\r
3832          * @return      void\r
3833          */\r
3834         static private function action_skinremovetype()\r
3835         {\r
3836                 global $member, $CONF;\r
3837                 \r
3838                 $member->isAdmin() or self::disallow();\r
3839                 \r
3840                 $skinid = intRequestVar('skinid');\r
3841                 $skintype = requestVar('type');\r
3842                 \r
3843                 if ( !isValidShortName($skintype) )\r
3844                 {\r
3845                         self::error(_ERROR_SKIN_PARTS_SPECIAL_DELETE);\r
3846                         return;\r
3847                 }\r
3848                 \r
3849                 self::$skin->parse('skinremovetype');\r
3850                 return;\r
3851         }\r
3852         \r
3853         /**\r
3854          * Admin::action_skinremovetypeconfirm()\r
3855          * \r
3856          * @param       void\r
3857          * @return      void\r
3858          */\r
3859         static private function action_skinremovetypeconfirm()\r
3860         {\r
3861                 global $member;\r
3862                 \r
3863                 $member->isAdmin() or self::disallow();\r
3864                 \r
3865                 $skinid = intRequestVar('skinid');\r
3866                 $skintype = requestVar('type');\r
3867                 \r
3868                 $error = self::skinremovetypeconfirm($skinid, $skintype);\r
3869                 if ( $error )\r
3870                 {\r
3871                         self::error($error);\r
3872                         return;\r
3873                 }\r
3874                 \r
3875                 self::action_skinedit();\r
3876                 return;\r
3877         }\r
3878         \r
3879         /**\r
3880          * Admin::action_skinclone()\r
3881          * \r
3882          * @param       void\r
3883          * @return      void\r
3884          */\r
3885         static private function action_skinclone()\r
3886         {\r
3887                 global $member;\r
3888                 \r
3889                 $member->isAdmin() or self::disallow();\r
3890                 \r
3891                 $skinid = intRequestVar('skinid');\r
3892                 \r
3893                 self::skinclone($skinid);\r
3894                 \r
3895                 self::action_skinoverview();\r
3896                 return;\r
3897         }\r
3898         \r
3899         /**\r
3900          * Admin::action_adminskinoverview()\r
3901          * \r
3902          * @param       void\r
3903          * @return      void\r
3904          */\r
3905         static private function action_adminskinoverview()\r
3906         {\r
3907                 global $member;\r
3908                 \r
3909                 $member->isAdmin() or self::disallow();\r
3910                 \r
3911                 self::$skin->parse('adminskinoverview');\r
3912                 return;\r
3913         }\r
3914         \r
3915         /**\r
3916          * Admin::action_adminskinnew()\r
3917          * \r
3918          * @param       void\r
3919          * @return      void\r
3920          */\r
3921         static private function action_adminskinnew()\r
3922         {\r
3923                 global $member;\r
3924                 \r
3925                 $member->isAdmin() or self::disallow();\r
3926                 \r
3927                 $name = trim(postVar('name'));\r
3928                 $desc = trim(postVar('desc'));\r
3929                 \r
3930                 if ( !isValidSkinName($name) )\r
3931                 {\r
3932                         self::error(_ERROR_BADSKINNAME);\r
3933                         return;\r
3934                 }\r
3935                 else if ( !preg_match('#^admin/#', $name) )\r
3936                 {\r
3937                         self::error(_ERROR_BADADMINSKINNAME);\r
3938                         return;\r
3939                 }\r
3940                 else if ( Skin::exists($name) )\r
3941                 {\r
3942                         self::error(_ERROR_DUPSKINNAME);\r
3943                         return;\r
3944                 }\r
3945                 \r
3946                 Skin::createNew($name, $desc);\r
3947                 \r
3948                 self::action_adminskinoverview();\r
3949                 return;\r
3950         }\r
3951         \r
3952         /**\r
3953          * Admin::action_adminskinedit()\r
3954          * \r
3955          * @param       void\r
3956          * @return      void\r
3957          */\r
3958         static private function action_adminskinedit()\r
3959         {\r
3960                 global $member;\r
3961                 \r
3962                 $member->isAdmin() or self::disallow();\r
3963                 \r
3964                 self::$skin->parse('adminskinedit');\r
3965                 \r
3966                 return;\r
3967         }\r
3968         \r
3969         /**\r
3970          * Admin::action_adminskineditgeneral()\r
3971          * \r
3972          * @param       void\r
3973          * @return      void\r
3974          */\r
3975         static private function action_adminskineditgeneral()\r
3976         {\r
3977                 global $member;\r
3978                 \r
3979                 $skinid = intRequestVar('skinid');\r
3980                 \r
3981                 $member->isAdmin() or self::disallow();\r
3982                 \r
3983                 $error = self::skineditgeneral($skinid, 'AdminActions');\r
3984                 if ( $error )\r
3985                 {\r
3986                         self::error($error);\r
3987                         return;\r
3988                 }\r
3989                 \r
3990                 self::action_adminskinedit();\r
3991                 return;\r
3992         }\r
3993         \r
3994         /**\r
3995          * Admin::action_adminskinedittype()\r
3996          * \r
3997          * @param       string  $msg    message for pageheader\r
3998          * @return      void\r
3999          */\r
4000         static private function action_adminskinedittype($msg = '')\r
4001         {\r
4002                 global $member;\r
4003                 \r
4004                 $member->isAdmin() or self::disallow();\r
4005                 \r
4006                 if ( $msg )\r
4007                 {\r
4008                         self::$headMess = $msg;\r
4009                 }\r
4010                 $type = requestVar('type');\r
4011                 $type = trim($type);\r
4012                 $type = strtolower($type);\r
4013                 \r
4014                 if ( !isValidShortName($type) )\r
4015                 {\r
4016                         self::error(_ERROR_SKIN_PARTS_SPECIAL_FORMAT);\r
4017                         return;\r
4018                 }\r
4019                 \r
4020                 self::$skin->parse('adminskinedittype');\r
4021                 return;\r
4022         }\r
4023         \r
4024         /**\r
4025          * Admin::action_adminskinupdate()\r
4026          * \r
4027          * @param       void\r
4028          * @return      void\r
4029          */\r
4030         static private function action_adminskinupdate()\r
4031         {\r
4032                 global $manager, $member;\r
4033                 \r
4034                 $skinid = intRequestVar('skinid');\r
4035                 $content = trim(postVar('content'));\r
4036                 $type = postVar('type');\r
4037                 \r
4038                 $member->isAdmin() or self::disallow();\r
4039                 \r
4040                 $skin =& $manager->getSkin($skinid, 'AdminActions', 'AdminSkin');\r
4041                 $skin->update($type, $content);\r
4042                 \r
4043                 self::action_adminskinedittype(_SKIN_UPDATED);\r
4044                 return;\r
4045         }\r
4046         \r
4047         /**\r
4048          * Admin::action_adminskindelete()\r
4049          * \r
4050          * @param       void\r
4051          * @return      void\r
4052          */\r
4053         static private function action_adminskindelete()\r
4054         {\r
4055                 global $CONF, $member;\r
4056                 \r
4057                 $member->isAdmin() or self::disallow();\r
4058                 \r
4059                 $skinid = intRequestVar('skinid');\r
4060                 \r
4061                 // don't allow default skin to be deleted\r
4062                 if ( $skinid == $CONF['AdminSkin'] || $skinid == $CONF['BookmarkletSkin'] )\r
4063                 {\r
4064                         self::error(_ERROR_DEFAULTSKIN);\r
4065                         return;\r
4066                 }\r
4067                 \r
4068                 /* don't allow if someone use it as a default*/\r
4069                 $query = 'SELECT * FROM %s WHERE madminskin = %d or mbkmklt = %d;';\r
4070                 $res = DB::getResult(sprintf($query, sql_table('member'), $skinid, $skinid));\r
4071                 \r
4072                 $members = array();\r
4073                 while ( $row = $res->fetch() ) {\r
4074                         $members[] = $row['mrealname'];\r
4075                 }\r
4076                 if ( count($members) )\r
4077                 {\r
4078                         self::error(_ERROR_SKINDEFDELETE . implode(' ' . _AND . ' ', $members));\r
4079                         return;\r
4080                 }\r
4081                 \r
4082                 self::$skin->parse('adminskindelete');\r
4083                 return;\r
4084         }\r
4085 \r
4086         /**\r
4087          * Admin::action_adminskindeleteconfirm()\r
4088          * \r
4089          * @param       void\r
4090          * @return      void\r
4091          */\r
4092         static private function action_adminskindeleteconfirm()\r
4093         {\r
4094                 global $member, $CONF;\r
4095                 \r
4096                 $member->isAdmin() or self::disallow();\r
4097                 \r
4098                 $skinid = intRequestVar('skinid');\r
4099                 \r
4100                 // don't allow default skin to be deleted\r
4101                 if ( $skinid == $CONF['AdminSkin'] || $skinid == $CONF['BookmarkletSkin'] )\r
4102                 {\r
4103                         self::error(_ERROR_DEFAULTSKIN);\r
4104                         return;\r
4105                 }\r
4106                 \r
4107                 /* don't allow if someone use it as a default*/\r
4108                 $query = 'SELECT * FROM %s WHERE madminskin = %d or mbkmklt = %d;';\r
4109                 $res = DB::getResult(sprintf($query, sql_table('member'), $skinid, $skinid));\r
4110                 \r
4111                 $members = array();\r
4112                 while ( $row = $res->fetch() ) {\r
4113                         $members[] = $row['mrealname'];\r
4114                 }\r
4115                 if ( count($members) )\r
4116                 {\r
4117                         self::error(_ERROR_SKINDEFDELETE . implode(' ' . _AND . ' ', $members));\r
4118                         return;\r
4119                 }\r
4120                 \r
4121                 self::skindeleteconfirm($skinid);\r
4122                 \r
4123                 self::action_adminskinoverview();\r
4124                 return;\r
4125         }\r
4126         \r
4127         /**\r
4128          * Admin::action_adminskinremovetype()\r
4129          * \r
4130          * @param       void\r
4131          * @return      void\r
4132          */\r
4133         static private function action_adminskinremovetype()\r
4134         {\r
4135                 global $member, $CONF;\r
4136 \r
4137                 $member->isAdmin() or self::disallow();\r
4138                 \r
4139                 $skinid = intRequestVar('skinid');\r
4140                 $skintype = requestVar('type');\r
4141                 \r
4142                 if ( !isValidShortName($skintype) )\r
4143                 {\r
4144                         self::error(_ERROR_SKIN_PARTS_SPECIAL_DELETE);\r
4145                         return;\r
4146                 }\r
4147                 \r
4148                 self::$skin->parse('adminskinremovetype');\r
4149                 return;\r
4150         }\r
4151         \r
4152         /**\r
4153          * Admin::action_adminskinremovetypeconfirm()\r
4154          * \r
4155          * @param       void\r
4156          * @return      void\r
4157          */\r
4158         static private function action_adminskinremovetypeconfirm()\r
4159         {\r
4160                 global $member;\r
4161                 \r
4162                 $member->isAdmin() or self::disallow();\r
4163                 \r
4164                 $skinid = intRequestVar('skinid');\r
4165                 $skintype = requestVar('type');\r
4166                 \r
4167                 $error = self::skinremovetypeconfirm($skinid, $skintype);\r
4168                 if ( $error )\r
4169                 {\r
4170                         self::error($error);\r
4171                         return;\r
4172                 }\r
4173                 \r
4174                 self::action_adminskinedit();\r
4175                 return;\r
4176         }\r
4177 \r
4178         /**\r
4179          * Admin::action_adminskinclone()\r
4180          * \r
4181          * @param       void\r
4182          * @return      void\r
4183          */\r
4184         static private function action_adminskinclone()\r
4185         {\r
4186                 global $member;\r
4187                 \r
4188                 $member->isAdmin() or self::disallow();\r
4189                 \r
4190                 $skinid = intRequestVar('skinid');\r
4191                 \r
4192                 self::skinclone($skinid, 'AdminActions');\r
4193                 \r
4194                 self::action_adminskinoverview();\r
4195                 return;\r
4196         }\r
4197         \r
4198         /**\r
4199          * Admin::action_adminskinieoverview()\r
4200          * \r
4201          * @param       void\r
4202          * @return      void\r
4203          */\r
4204         static private function action_adminskinieoverview()\r
4205         {\r
4206                 global $member;\r
4207                 \r
4208                 $member->isAdmin() or self::disallow();\r
4209                 \r
4210                 self::$skin->parse('adminskinieoverview');\r
4211                 return;\r
4212         }\r
4213 \r
4214         /**\r
4215          * Admin::action_adminskinieimport()\r
4216          * \r
4217          * @param       void\r
4218          * @return      void\r
4219          */\r
4220         static private function action_adminskinieimport()\r
4221         {\r
4222                 global $member;\r
4223                 \r
4224                 $member->isAdmin() or self::disallow();\r
4225                 \r
4226                 $skinFileRaw = postVar('skinfile');\r
4227                 $mode = postVar('mode');\r
4228                 \r
4229                 $error = self::skinieimport($mode, $skinFileRaw);\r
4230                 if ( $error )\r
4231                 {\r
4232                         self::error($error);\r
4233                         return;\r
4234                 }\r
4235                 \r
4236                 if ( !is_object(self::$skin) )\r
4237                 {\r
4238                         self::action_adminskiniedoimport();\r
4239                 }\r
4240                 else\r
4241                 {\r
4242                         self::$skin->parse('adminskinieimport');\r
4243                 }\r
4244                 return;\r
4245         }\r
4246         \r
4247         /**\r
4248          * Admin::action_adminskiniedoimport()\r
4249          * \r
4250          * @param       void\r
4251          * @return      void\r
4252          */\r
4253         static private function action_adminskiniedoimport()\r
4254         {\r
4255                 global $DIR_SKINS, $member;\r
4256                 \r
4257                 $member->isAdmin() or self::disallow();\r
4258                 \r
4259                 $mode = postVar('mode');\r
4260                 $skinFileRaw = postVar('skinfile');\r
4261                 $allowOverwrite = intPostVar('overwrite');\r
4262                 \r
4263                 $error = self::skiniedoimport($mode, $skinFileRaw, $allowOverwrite);\r
4264                 if ( $error )\r
4265                 {\r
4266                         self::error($error);\r
4267                         return;\r
4268                 }\r
4269                 \r
4270                 if ( !is_object(self::$skin) )\r
4271                 {\r
4272                         global $DIR_SKINS;\r
4273                         $query  = "SELECT min(sdnumber) FROM %s WHERE sdname != 'admin/bookmarklet' AND sdname LIKE 'admin/%%'";\r
4274                         $query  = sprintf($query, sql_table('skin_desc'));\r
4275                         $res    = intval(DB::getValue($query));\r
4276                         $query  = "UPDATE %s SET value = %d WHERE name = 'AdminSkin'";\r
4277                         $query  = sprintf($query, sql_table('config'), $res);\r
4278                         DB::execute($query);\r
4279                         $skin   = new Skin(0, 'AdminActions', 'AdminSkin');\r
4280                         $skin->parse('importAdmin', $DIR_SKINS . 'admin/defaultimporter.skn');\r
4281                 }\r
4282                 else\r
4283                 {\r
4284                         self::$skin->parse('adminskiniedoimport');\r
4285                 }\r
4286                 return;\r
4287         }\r
4288 \r
4289         /**\r
4290          * Admin::action_adminskinieexport()\r
4291          * \r
4292          * @param       void\r
4293          * @return      void\r
4294          */\r
4295         static private function action_adminskinieexport()\r
4296         {\r
4297                 global $member;\r
4298                 \r
4299                 $member->isAdmin() or self::disallow();\r
4300                 \r
4301                 // load skinie class\r
4302                 $aSkins = requestIntArray('skin');\r
4303                 $aTemplates = requestIntArray('template');\r
4304                 $info = postVar('info');\r
4305                 \r
4306                 self::skinieexport($aSkins, $aTemplates, $info);\r
4307                 \r
4308                 return;\r
4309         }\r
4310         \r
4311         /**\r
4312          * Admin::action_settingsedit()\r
4313          * \r
4314          * @param       Void\r
4315          * @return      Void\r
4316          */\r
4317         static private function action_settingsedit()\r
4318         {\r
4319                 global $member, $manager, $CONF, $DIR_NUCLEUS, $DIR_MEDIA;\r
4320                 \r
4321                 $member->isAdmin() or self::disallow();\r
4322                 \r
4323                 self::$skin->parse('settingsedit');\r
4324                 return;\r
4325         }\r
4326         \r
4327         /**\r
4328          * Admin::action_settingsupdate()\r
4329          * Update $CONFIG and redirect\r
4330          * \r
4331          * @param       void\r
4332          * @return      void\r
4333          */\r
4334         static private function action_settingsupdate()\r
4335         {\r
4336                 global $member, $CONF;\r
4337                 \r
4338                 $member->isAdmin() or self::disallow();\r
4339                 \r
4340                 // check if email address for admin is valid\r
4341                 if ( !NOTIFICATION::address_validation(postVar('AdminEmail')) )\r
4342                 {\r
4343                         self::error(_ERROR_BADMAILADDRESS);\r
4344                         return;\r
4345                 }\r
4346                 \r
4347                 // save settings\r
4348                 self::updateConfig('DefaultBlog',               postVar('DefaultBlog'));\r
4349                 self::updateConfig('BaseSkin',                  postVar('BaseSkin'));\r
4350                 self::updateConfig('IndexURL',                  postVar('IndexURL'));\r
4351                 self::updateConfig('AdminURL',                  postVar('AdminURL'));\r
4352                 self::updateConfig('PluginURL',                 postVar('PluginURL'));\r
4353                 self::updateConfig('SkinsURL',                  postVar('SkinsURL'));\r
4354                 self::updateConfig('ActionURL',                 postVar('ActionURL'));\r
4355                 self::updateConfig('Locale',                    postVar('Locale'));\r
4356                 self::updateConfig('AdminEmail',                postVar('AdminEmail'));\r
4357                 self::updateConfig('SessionCookie',             postVar('SessionCookie'));\r
4358                 self::updateConfig('AllowMemberCreate', postVar('AllowMemberCreate'));\r
4359                 self::updateConfig('AllowMemberMail',   postVar('AllowMemberMail'));\r
4360                 self::updateConfig('NonmemberMail',             postVar('NonmemberMail'));\r
4361                 self::updateConfig('ProtectMemNames',   postVar('ProtectMemNames'));\r
4362                 self::updateConfig('SiteName',                  postVar('SiteName'));\r
4363                 self::updateConfig('NewMemberCanLogon', postVar('NewMemberCanLogon'));\r
4364                 self::updateConfig('DisableSite',               postVar('DisableSite'));\r
4365                 self::updateConfig('DisableSiteURL',    postVar('DisableSiteURL'));\r
4366                 self::updateConfig('LastVisit',                 postVar('LastVisit'));\r
4367                 self::updateConfig('MediaURL',                  postVar('MediaURL'));\r
4368                 self::updateConfig('AllowedTypes',              postVar('AllowedTypes'));\r
4369                 self::updateConfig('AllowUpload',               postVar('AllowUpload'));\r
4370                 self::updateConfig('MaxUploadSize',             postVar('MaxUploadSize'));\r
4371                 self::updateConfig('MediaPrefix',               postVar('MediaPrefix'));\r
4372                 self::updateConfig('AllowLoginEdit',    postVar('AllowLoginEdit'));\r
4373                 self::updateConfig('DisableJsTools',    postVar('DisableJsTools'));\r
4374                 self::updateConfig('CookieDomain',              postVar('CookieDomain'));\r
4375                 self::updateConfig('CookiePath',                postVar('CookiePath'));\r
4376                 self::updateConfig('CookieSecure',              postVar('CookieSecure'));\r
4377                 self::updateConfig('URLMode',                   postVar('URLMode'));\r
4378                 self::updateConfig('CookiePrefix',              postVar('CookiePrefix'));\r
4379                 self::updateConfig('DebugVars',                 postVar('DebugVars'));\r
4380                 self::updateConfig('DefaultListSize',   postVar('DefaultListSize'));\r
4381                 self::updateConfig('AdminCSS',                  postVar('AdminCSS'));\r
4382                 self::updateConfig('AdminSkin',                 postVar('adminskin'));\r
4383                 self::updateConfig('BookmarkletSkin',   postVar('bookmarklet'));\r
4384 \r
4385                 // load new config and redirect (this way, the new locale will be used is necessary)\r
4386                 // note that when changing cookie settings, this redirect might cause the user\r
4387                 // to have to log in again.\r
4388                 getConfig();\r
4389                 redirect($CONF['AdminURL'] . '?action=manage');\r
4390                 return;\r
4391         }\r
4392         \r
4393         /**\r
4394          * Admin::action_systemoverview()\r
4395          * Output system overview\r
4396          * \r
4397          * @param       void\r
4398          * @return      void\r
4399          */\r
4400         static private function action_systemoverview()\r
4401         {\r
4402                 self::$skin->parse('systemoverview');\r
4403                 return;\r
4404         }\r
4405         \r
4406         /**\r
4407          * Admin::updateConfig()\r
4408          * \r
4409          * @param       string  $name   \r
4410          * @param       string  $val    \r
4411          * @return      integer return the ID in which the latest query posted\r
4412          */\r
4413         static private function updateConfig($name, $val)\r
4414         {\r
4415                 $query = "UPDATE %s SET value=%s WHERE name=%s";\r
4416                 $query = sprintf($query, sql_table('config'), DB::quoteValue($val), DB::quoteValue($name));\r
4417                 if ( DB::execute($query) === FALSE )\r
4418                 {\r
4419                         $err = DB::getError();\r
4420                         die(_ADMIN_SQLDIE_QUERYERROR . $err[2]);\r
4421                 }\r
4422                 return DB::getInsertId();\r
4423         }\r
4424         \r
4425         /**\r
4426          * Admin::error()\r
4427          * Error message\r
4428          * \r
4429          * @param       string  $msg    message that will be shown\r
4430          * @return      void\r
4431          */\r
4432         static public function error($msg)\r
4433         {\r
4434                 self::$headMess = $msg;\r
4435                 self::$skin->parse('adminerrorpage');\r
4436                 return;\r
4437         }\r
4438         \r
4439         /**\r
4440          * Admin::disallow()\r
4441          * add error log and show error page \r
4442          * \r
4443          * @param       void\r
4444          * @return      void\r
4445          */\r
4446         static public function disallow()\r
4447         {\r
4448                 ActionLog::add(WARNING, _ACTIONLOG_DISALLOWED . serverVar('REQUEST_URI'));\r
4449                 self::error(_ERROR_DISALLOWED);\r
4450                 return;\r
4451         }\r
4452 \r
4453         /**\r
4454          * Admin::action_PluginAdmin()\r
4455          * Output pluginadmin\r
4456          *\r
4457          * @param       string  $skinContents\r
4458          * @param       string  $extrahead\r
4459          * @return      void\r
4460          */\r
4461         static public function action_PluginAdmin($skinContents, $extrahead = '')\r
4462         {\r
4463                 self::$extrahead .= $extrahead;\r
4464                 self::$skin->parse('pluginadmin', $skinContents);\r
4465                 return;\r
4466         }\r
4467         \r
4468         /**\r
4469          * Admin::action_bookmarklet()\r
4470          * \r
4471          * @param       void\r
4472          * @return      void\r
4473          */\r
4474         static private function action_bookmarklet()\r
4475         {\r
4476                 global $member, $manager;\r
4477                 \r
4478                 $blogid = intRequestVar('blogid');\r
4479                 $member->teamRights($blogid) or self::disallow();\r
4480                 \r
4481                 self::$skin->parse('bookmarklet');\r
4482                 return;\r
4483         }\r
4484         \r
4485         /**\r
4486          * Admin::action_actionlog()\r
4487          * \r
4488          * @param       void\r
4489          * @return      void\r
4490          */\r
4491         static private function action_actionlog()\r
4492         {\r
4493                 global $member, $manager;\r
4494                 \r
4495                 $member->isAdmin() or self::disallow();\r
4496                 \r
4497                 self::$skin->parse('actionlog');\r
4498                 return;\r
4499         }\r
4500         \r
4501         /**\r
4502          * Admin::action_banlist()\r
4503          * \r
4504          * @param       void\r
4505          * @return      void\r
4506          */\r
4507         static private function action_banlist()\r
4508         {\r
4509                 global $member, $manager;\r
4510                 \r
4511                 $blogid = intRequestVar('blogid');\r
4512                 $member->blogAdminRights($blogid) or self::disallow();\r
4513                 \r
4514                 self::$skin->parse('banlist');\r
4515                 return;\r
4516         }\r
4517         \r
4518         /**\r
4519          * Admin::action_banlistdelete()\r
4520          * \r
4521          * @param       void\r
4522          * @return      void\r
4523          */\r
4524         static private function action_banlistdelete()\r
4525         {\r
4526                 global $member, $manager;\r
4527                 \r
4528                 $blogid = intRequestVar('blogid');\r
4529                 $member->blogAdminRights($blogid) or self::disallow();\r
4530                 \r
4531                 self::$skin->parse('banlistdelete');\r
4532                 return;\r
4533         }\r
4534         \r
4535         /**\r
4536          * Admin::action_banlistdeleteconfirm()\r
4537          * \r
4538          * @param       void\r
4539          * @return      void\r
4540          */\r
4541         static private function action_banlistdeleteconfirm()\r
4542         {\r
4543                 global $member, $manager;\r
4544                 \r
4545                 $blogid         = intPostVar('blogid');\r
4546                 $allblogs       = postVar('allblogs');\r
4547                 $iprange        = postVar('iprange');\r
4548                 \r
4549                 $member->blogAdminRights($blogid) or self::disallow();\r
4550                 \r
4551                 $deleted = array();\r
4552                 \r
4553                 if ( !$allblogs )\r
4554                 {\r
4555                         if ( Ban::removeBan($blogid, $iprange) )\r
4556                         {\r
4557                                 $deleted[] = $blogid;\r
4558                         }\r
4559                 }\r
4560                 else\r
4561                 {\r
4562                         // get blogs fot which member has admin rights\r
4563                         $adminblogs = $member->getAdminBlogs();\r
4564                         foreach ($adminblogs as $blogje)\r
4565                         {\r
4566                                 if ( Ban::removeBan($blogje, $iprange) )\r
4567                                 {\r
4568                                         $deleted[] = $blogje;\r
4569                                 }\r
4570                         }\r
4571                 }\r
4572                 \r
4573                 if ( sizeof($deleted) == 0 )\r
4574                 {\r
4575                         self::error(_ERROR_DELETEBAN);\r
4576                         return;\r
4577                 }\r
4578                 \r
4579                 /* TODO: we should use other ways */\r
4580                 $_REQUEST['delblogs'] = $deleted;\r
4581                 \r
4582                 self::$skin->parse('banlistdeleteconfirm');\r
4583                 return;\r
4584         }\r
4585         \r
4586         /**\r
4587          * Admin::action_banlistnewfromitem()\r
4588          * \r
4589          * @param       void\r
4590          * @return      void\r
4591          */\r
4592         static private function action_banlistnewfromitem()\r
4593         {\r
4594                 global $manager;\r
4595                 \r
4596                 $itemid = intRequestVar('itemid');\r
4597                 $item =& $manager->getItem($itemid, 1, 1);\r
4598                 self::action_banlistnew($item['blogid']);\r
4599                 return;\r
4600         }\r
4601         \r
4602         /**\r
4603          * Admin::action_banlistnew()\r
4604          * \r
4605          * @param       integer $blogid ID for weblog\r
4606          * @return      void\r
4607          */\r
4608         static private function action_banlistnew($blogid = '')\r
4609         {\r
4610                 global $member, $manager;\r
4611                 \r
4612                 if ( $blogid == '' )\r
4613                 {\r
4614                         $blogid = intRequestVar('blogid');\r
4615                 }\r
4616                 \r
4617                 $ip = requestVar('ip');\r
4618                 \r
4619                 $member->blogAdminRights($blogid) or self::disallow();\r
4620                 \r
4621                 /* TODO: we should consider to use the other way instead of this */\r
4622                 $_REQUEST['blogid'] = $blogid;          \r
4623                 \r
4624                 self::$skin->parse('banlistnew');\r
4625                 \r
4626                 return;\r
4627         }\r
4628 \r
4629         /**\r
4630          * Admin::action_banlistadd()\r
4631          * \r
4632          * @param       void\r
4633          * @return      void\r
4634          */\r
4635         static private function action_banlistadd()\r
4636         {\r
4637                 global $member;\r
4638                 \r
4639                 $blogid         = intPostVar('blogid');\r
4640                 $allblogs       = postVar('allblogs');\r
4641                 $iprange        = postVar('iprange');\r
4642                 \r
4643                 if ( $iprange == "custom" )\r
4644                 {\r
4645                         $iprange = postVar('customiprange');\r
4646                 }\r
4647                 $reason   = postVar('reason');\r
4648                 \r
4649                 $member->blogAdminRights($blogid) or self::disallow();\r
4650                 \r
4651                 // TODO: check IP range validity\r
4652                 \r
4653                 if ( !$allblogs )\r
4654                 {\r
4655                         if ( !Ban::addBan($blogid, $iprange, $reason) )\r
4656                         {\r
4657                                 self::error(_ERROR_ADDBAN);\r
4658                                 return;\r
4659                         }\r
4660                 }\r
4661                 else\r
4662                 {\r
4663                         // get blogs fot which member has admin rights\r
4664                         $adminblogs = $member->getAdminBlogs();\r
4665                         $failed = 0;\r
4666                         foreach ($adminblogs as $blogje)\r
4667                         {\r
4668                                 if ( !Ban::addBan($blogje, $iprange, $reason) )\r
4669                                 {\r
4670                                         $failed = 1;\r
4671                                 }\r
4672                         }\r
4673                         if ( $failed )\r
4674                         {\r
4675                                 self::error(_ERROR_ADDBAN);\r
4676                                 return;\r
4677                         }\r
4678                 }\r
4679                 self::action_banlist();\r
4680                 return;\r
4681         }\r
4682         \r
4683         /**\r
4684          * Admin::action_clearactionlog()\r
4685          * \r
4686          * @param       void\r
4687          * @return      void\r
4688          */\r
4689         static private function action_clearactionlog()\r
4690         {\r
4691                 global $member;\r
4692                 \r
4693                 $member->isAdmin() or self::disallow();\r
4694                 \r
4695                 ActionLog::clear();\r
4696                 \r
4697                 self::action_manage(_MSG_ACTIONLOGCLEARED);\r
4698                 return;\r
4699         }\r
4700         \r
4701         /**\r
4702          * Admin::action_backupoverview()\r
4703          * \r
4704          * @param       void\r
4705          * @return      void\r
4706          */\r
4707         static private function action_backupoverview()\r
4708         {\r
4709                 global $member, $manager;\r
4710                 \r
4711                 $member->isAdmin() or self::disallow();\r
4712                 \r
4713                 self::$skin->parse('backupoverview');\r
4714                 return;\r
4715         }\r
4716 \r
4717         /**\r
4718          * Admin::action_backupcreate()\r
4719          * create file for backup\r
4720          * \r
4721          * @param               void\r
4722          * @return      void\r
4723          * \r
4724          */\r
4725         static private function action_backupcreate()\r
4726         {\r
4727                 global $member, $DIR_LIBS;\r
4728                 \r
4729                 $member->isAdmin() or self::disallow();\r
4730                 \r
4731                 // use compression ?\r
4732                 $useGzip = (integer) postVar('gzip');\r
4733                 \r
4734                 include($DIR_LIBS . 'backup.php');\r
4735                 \r
4736                 // try to extend time limit\r
4737                 // (creating/restoring dumps might take a while)\r
4738                 @set_time_limit(1200);\r
4739                 \r
4740                 Backup::do_backup($useGzip);\r
4741                 return;\r
4742         }\r
4743         \r
4744         /**\r
4745          * Admin::action_backuprestore()\r
4746          * restoring from uploaded file\r
4747          * \r
4748          * @param               void\r
4749          * @return      void\r
4750          */\r
4751         static private function action_backuprestore()\r
4752         {\r
4753                 global $member, $DIR_LIBS;\r
4754                 \r
4755                 $member->isAdmin() or self::disallow();\r
4756                 \r
4757                 if ( intPostVar('letsgo') != 1 )\r
4758                 {\r
4759                         self::error(_ERROR_BACKUP_NOTSURE);\r
4760                         return;\r
4761                 }\r
4762                 \r
4763                 include($DIR_LIBS . 'backup.php');\r
4764                 \r
4765                 // try to extend time limit\r
4766                 // (creating/restoring dumps might take a while)\r
4767                 @set_time_limit(1200);\r
4768                 \r
4769                 $message = Backup::do_restore();\r
4770                 if ( $message != '' )\r
4771                 {\r
4772                         self::error($message);\r
4773                         return;\r
4774                 }\r
4775                 self::$skin->parse('backuprestore');\r
4776                 return;\r
4777         }\r
4778         \r
4779         /**\r
4780          * Admin::action_pluginlist()\r
4781          * output the list of installed plugins\r
4782          * \r
4783          * @param       void\r
4784          * @return      void\r
4785          * \r
4786          */\r
4787         static private function action_pluginlist()\r
4788         {\r
4789                 global $DIR_PLUGINS, $member, $manager;\r
4790                 \r
4791                 // check if allowed\r
4792                 $member->isAdmin() or self::disallow();\r
4793                 \r
4794                 self::$skin->parse('pluginlist');\r
4795                 return;\r
4796         }\r
4797         \r
4798         /**\r
4799          * Admin::action_pluginhelp()\r
4800          * \r
4801          * @param       void\r
4802          * @return      void\r
4803          */\r
4804         static private function action_pluginhelp()\r
4805         {\r
4806                 global $member, $manager, $DIR_PLUGINS, $CONF;\r
4807                 \r
4808                 // check if allowed\r
4809                 $member->isAdmin() or self::disallow();\r
4810                 \r
4811                 $plugid = intGetVar('plugid');\r
4812                 \r
4813                 if ( !$manager->pidInstalled($plugid) )\r
4814                 {\r
4815                         self::error(_ERROR_NOSUCHPLUGIN);\r
4816                         return;\r
4817                 }\r
4818                 \r
4819                 self::$skin->parse('pluginhelp');\r
4820                 return;\r
4821         }\r
4822         \r
4823         /**\r
4824          * Admin::action_pluginadd()\r
4825          * \r
4826          * @param       Void\r
4827          * @return      Void\r
4828          * \r
4829          */\r
4830         static private function action_pluginadd()\r
4831         {\r
4832                 global $member, $manager, $DIR_PLUGINS;\r
4833                 \r
4834                 // check if allowed\r
4835                 $member->isAdmin() or self::disallow();\r
4836                 \r
4837                 $name = postVar('filename');\r
4838                 \r
4839                 if ( $manager->pluginInstalled($name) )\r
4840                 {\r
4841                         self::error(_ERROR_DUPPLUGIN);\r
4842                         return;\r
4843                 }\r
4844                 \r
4845                 if ( !checkPlugin($name) )\r
4846                 {\r
4847                         self::error(_ERROR_PLUGFILEERROR . ' (' . Entity::hsc($name) . ')');\r
4848                         return;\r
4849                 }\r
4850                 \r
4851                 // get number of currently installed plugins\r
4852                 $res = DB::getResult('SELECT * FROM ' . sql_table('plugin'));\r
4853                 $numCurrent = $res->rowCount();\r
4854                 \r
4855                 // plugin will be added as last one in the list\r
4856                 $newOrder = $numCurrent + 1;\r
4857                 \r
4858                 $data = array('file' => &$name);\r
4859                 $manager->notify('PreAddPlugin', $data);\r
4860                 \r
4861                 // do this before calling getPlugin (in case the plugin id is used there)\r
4862                 $query = "INSERT INTO %s (porder, pfile) VALUES (%d, %s);";\r
4863                 $query = sprintf($query, sql_table('plugin'), (integer) $newOrder, DB::quoteValue($name));\r
4864                 DB::execute($query);\r
4865                 $iPid = DB::getInsertId();\r
4866                 \r
4867                 $manager->clearCachedInfo('installedPlugins');\r
4868                 \r
4869                 // Load the plugin for condition checking and instalation\r
4870                 $plugin =& $manager->getPlugin($name);\r
4871                 \r
4872                 // check if it got loaded (could have failed)\r
4873                 if ( !$plugin )\r
4874                 {\r
4875                         $query = "DELETE FROM %s WHERE pid=%d;";\r
4876                         $query = sprintf($query, sql_table('plugin'), (integer) $iPid);\r
4877                         \r
4878                         DB::execute($query);\r
4879                         \r
4880                         $manager->clearCachedInfo('installedPlugins');\r
4881                         self::error(_ERROR_PLUGIN_LOAD);\r
4882                         return;\r
4883                 }\r
4884                 \r
4885                 // check if plugin needs a newer Nucleus version\r
4886                 if ( getNucleusVersion() < $plugin->getMinNucleusVersion() )\r
4887                 {\r
4888                         // uninstall plugin again...\r
4889                         self::deleteOnePlugin($plugin->getID());\r
4890                         \r
4891                         // ...and show error\r
4892                         self::error(_ERROR_NUCLEUSVERSIONREQ . Entity::hsc($plugin->getMinNucleusVersion()));\r
4893                         return;\r
4894                 }\r
4895                 \r
4896                 // check if plugin needs a newer Nucleus version\r
4897                 if ( (getNucleusVersion() == $plugin->getMinNucleusVersion()) && (getNucleusPatchLevel() < $plugin->getMinNucleusPatchLevel()) )\r
4898                 {\r
4899                         // uninstall plugin again...\r
4900                         self::deleteOnePlugin($plugin->getID());\r
4901                         \r
4902                         // ...and show error\r
4903                         self::error(_ERROR_NUCLEUSVERSIONREQ . Entity::hsc( $plugin->getMinNucleusVersion() . ' patch ' . $plugin->getMinNucleusPatchLevel() ) );\r
4904                         return;\r
4905                 }\r
4906                 \r
4907                 $pluginList = $plugin->getPluginDep();\r
4908                 foreach ( $pluginList as $pluginName )\r
4909                 {\r
4910                         $res = DB::getResult('SELECT * FROM '.sql_table('plugin') . ' WHERE pfile=' . DB::quoteValue($pluginName));\r
4911                         if ($res->rowCount() == 0)\r
4912                         {\r
4913                                 // uninstall plugin again...\r
4914                                 self::deleteOnePlugin($plugin->getID());\r
4915                                 self::error(sprintf(_ERROR_INSREQPLUGIN, Entity::hsc($pluginName)));\r
4916                                 return;\r
4917                         }\r
4918                 }\r
4919                 \r
4920                 // call the install method of the plugin\r
4921                 $plugin->install();\r
4922                 \r
4923                 $data = array('plugin' => &$plugin);\r
4924                 $manager->notify('PostAddPlugin', $data);\r
4925                 \r
4926                 // update all events\r
4927                 self::action_pluginupdate();\r
4928                 return;\r
4929         }\r
4930         \r
4931         /**\r
4932          * ADMIN:action_pluginupdate():\r
4933          * \r
4934          * @param       Void\r
4935          * @return      Void\r
4936          * \r
4937          */\r
4938         static private function action_pluginupdate()\r
4939         {\r
4940                 global $member, $manager, $CONF;\r
4941                 \r
4942                 // check if allowed\r
4943                 $member->isAdmin() or self::disallow();\r
4944                 \r
4945                 // delete everything from plugin_events\r
4946                 DB::execute('DELETE FROM '.sql_table('plugin_event'));\r
4947                 \r
4948                 // loop over all installed plugins\r
4949                 $res = DB::getResult('SELECT pid, pfile FROM '.sql_table('plugin'));\r
4950                 foreach ( $res as $row )\r
4951                 {\r
4952                         $pid  =  $row['pid'];\r
4953                         $plug =& $manager->getPlugin($row['pfile']);\r
4954                         if ( $plug )\r
4955                         {\r
4956                                 $eventList = $plug->getEventList();\r
4957                                 foreach ( $eventList as $eventName )\r
4958                                 {\r
4959                                         $query = "INSERT INTO %s (pid, event) VALUES (%d, %s)";\r
4960                                         $query = sprintf($query, sql_table('plugin_event'), (integer) $pid, DB::quoteValue($eventName));\r
4961                                         DB::execute($query);\r
4962                                 }\r
4963                         }\r
4964                 }\r
4965                 redirect($CONF['AdminURL'] . '?action=pluginlist');\r
4966                 return;\r
4967         }\r
4968         \r
4969         /**\r
4970          * Admin::action_plugindelete()\r
4971          * \r
4972          * @param       void\r
4973          * @return      void\r
4974          */\r
4975         static private function action_plugindelete()\r
4976         {\r
4977                 global $member, $manager;\r
4978                 \r
4979                 // check if allowed\r
4980                 $member->isAdmin() or self::disallow();\r
4981                 \r
4982                 $pid = intGetVar('plugid');\r
4983                 \r
4984                 if ( !$manager->pidInstalled($pid) )\r
4985                 {\r
4986                         self::error(_ERROR_NOSUCHPLUGIN);\r
4987                         return;\r
4988                 }\r
4989                 \r
4990                 self::$skin->parse('plugindelete');\r
4991                 return;\r
4992         }\r
4993 \r
4994         /**\r
4995          * Admin::action_plugindeleteconfirm()\r
4996          * \r
4997          * @param       void\r
4998          * @return      void\r
4999          */\r
5000         static private function action_plugindeleteconfirm()\r
5001         {\r
5002                 global $member, $manager, $CONF;\r
5003                 \r
5004                 // check if allowed\r
5005                 $member->isAdmin() or self::disallow();\r
5006                 \r
5007                 $pid = intPostVar('plugid');\r
5008                 \r
5009                 $error = self::deleteOnePlugin($pid, 1);\r
5010                 if ( $error )\r
5011                 {\r
5012                         self::error($error);\r
5013                         return;\r
5014                 }\r
5015                 \r
5016                 redirect($CONF['AdminURL'] . '?action=pluginlist');\r
5017                 return;\r
5018         }\r
5019         \r
5020         /**\r
5021          * Admin::\r
5022          * \r
5023          * @param       void\r
5024          * @return      void\r
5025          */\r
5026         static public function deleteOnePlugin($pid, $callUninstall = 0)\r
5027         {\r
5028                 global $manager;\r
5029                 \r
5030                 $pid = intval($pid);\r
5031                 \r
5032                 if ( !$manager->pidInstalled($pid) )\r
5033                 {\r
5034                         return _ERROR_NOSUCHPLUGIN;\r
5035                 }\r
5036                 \r
5037                 $query = "SELECT pfile as result FROM %s WHERE pid=%d;";\r
5038                 $query = sprintf($query, sql_table('plugin'), (integer) $pid);\r
5039                 $name = DB::getValue($query);\r
5040                 \r
5041                 // check dependency before delete\r
5042                 $res = DB::getResult('SELECT pfile FROM ' . sql_table('plugin'));\r
5043                 foreach ( $res as $row )\r
5044                 {\r
5045                         $plug =& $manager->getPlugin($row['pfile']);\r
5046                         if ( $plug )\r
5047                         {\r
5048                                 $depList = $plug->getPluginDep();\r
5049                                 foreach ( $depList as $depName )\r
5050                                 {\r
5051                                         if ( $name == $depName )\r
5052                                         {\r
5053                                                 return sprintf(_ERROR_DELREQPLUGIN, $row['pfile']);\r
5054                                         }\r
5055                                 }\r
5056                         }\r
5057                 }\r
5058                 \r
5059                 $data = array('plugid' => $pid);\r
5060                 $manager->notify('PreDeletePlugin', $data);\r
5061                 \r
5062                 // call the unInstall method of the plugin\r
5063                 if ( $callUninstall )\r
5064                 {\r
5065                         $plugin =& $manager->getPlugin($name);\r
5066                         if ( $plugin )\r
5067                         {\r
5068                                 $plugin->unInstall();\r
5069                         }\r
5070                 }\r
5071                 \r
5072                 // delete all subscriptions\r
5073                 DB::execute('DELETE FROM ' . sql_table('plugin_event') . ' WHERE pid=' . $pid);\r
5074                 \r
5075                 // delete all options\r
5076                 // get OIDs from plugin_option_desc\r
5077                 $res = DB::getResult('SELECT oid FROM ' . sql_table('plugin_option_desc') . ' WHERE opid=' . $pid);\r
5078                 $aOIDs = array();\r
5079                 foreach ( $res as $row )\r
5080                 {\r
5081                         array_push($aOIDs, $row['oid']);\r
5082                 }\r
5083                 \r
5084                 // delete from plugin_option and plugin_option_desc\r
5085                 DB::execute('DELETE FROM ' . sql_table('plugin_option_desc') . ' WHERE opid=' . $pid);\r
5086                 if (count($aOIDs) > 0)\r
5087                 {\r
5088                         DB::execute('DELETE FROM ' . sql_table('plugin_option') . ' WHERE oid in (' . implode(',', $aOIDs) . ')');\r
5089                 }\r
5090                 \r
5091                 // update order numbers\r
5092                 $res = DB::getValue('SELECT porder FROM ' . sql_table('plugin') . ' WHERE pid=' . $pid);\r
5093                 DB::execute('UPDATE ' . sql_table('plugin') . ' SET porder=(porder - 1) WHERE porder>' . $res);\r
5094                 \r
5095                 // delete row\r
5096                 DB::execute('DELETE FROM ' . sql_table('plugin') . ' WHERE pid=' . $pid);\r
5097                 \r
5098                 $manager->clearCachedInfo('installedPlugins');\r
5099                 $data = array('plugid' => $pid);\r
5100                 $manager->notify('PostDeletePlugin', $data);\r
5101                 \r
5102                 return '';\r
5103         }\r
5104         \r
5105         /**\r
5106          * Admin::action_pluginup()\r
5107          * \r
5108          * @param       void\r
5109          * @return      void\r
5110          */\r
5111         static private function action_pluginup()\r
5112         {\r
5113                 global $member, $manager, $CONF;\r
5114                 \r
5115                 // check if allowed\r
5116                 $member->isAdmin() or self::disallow();\r
5117                 \r
5118                 $plugid = intGetVar('plugid');\r
5119                 \r
5120                 if ( !$manager->pidInstalled($plugid) )\r
5121                 {\r
5122                         self::error(_ERROR_NOSUCHPLUGIN);\r
5123                         return;\r
5124                 }\r
5125                 \r
5126                 // 1. get old order number\r
5127                 $oldOrder = DB::getValue('SELECT porder FROM ' . sql_table('plugin') . ' WHERE pid=' . $plugid);\r
5128                 \r
5129                 // 2. calculate new order number\r
5130                 $newOrder = ($oldOrder > 1) ? ($oldOrder - 1) : 1;\r
5131                 \r
5132                 // 3. update plug numbers\r
5133                 DB::execute('UPDATE ' . sql_table('plugin') . ' SET porder=' . $oldOrder . ' WHERE porder=' . $newOrder);\r
5134                 DB::execute('UPDATE ' . sql_table('plugin') . ' SET porder=' . $newOrder . ' WHERE pid=' . $plugid);\r
5135                 \r
5136                 //self::action_pluginlist();\r
5137                 // To avoid showing ticket in the URL, redirect to pluginlist, instead.\r
5138                 redirect($CONF['AdminURL'] . '?action=pluginlist');\r
5139                 return;\r
5140         }\r
5141         \r
5142         /**\r
5143          * Admin::action_plugindown()\r
5144          * \r
5145          * @param       void\r
5146          * @return      void\r
5147          */\r
5148         static private function action_plugindown()\r
5149         {\r
5150                 global $member, $manager, $CONF;\r
5151                 \r
5152                 // check if allowed\r
5153                 $member->isAdmin() or self::disallow();\r
5154                 \r
5155                 $plugid = intGetVar('plugid');\r
5156                 if ( !$manager->pidInstalled($plugid) )\r
5157                 {\r
5158                         self::error(_ERROR_NOSUCHPLUGIN);\r
5159                         return;\r
5160                 }\r
5161                 \r
5162                 // 1. get old order number\r
5163                 $oldOrder = DB::getValue('SELECT porder FROM ' . sql_table('plugin') . ' WHERE pid=' . $plugid);\r
5164                 \r
5165                 $res = DB::getResult('SELECT * FROM ' . sql_table('plugin'));\r
5166                 $maxOrder = $res->rowCount();\r
5167                 \r
5168                 // 2. calculate new order number\r
5169                 $newOrder = ($oldOrder < $maxOrder) ? ($oldOrder + 1) : $maxOrder;\r
5170                 \r
5171                 // 3. update plug numbers\r
5172                 DB::execute('UPDATE ' . sql_table('plugin') . ' SET porder=' . $oldOrder . ' WHERE porder=' . $newOrder);\r
5173                 DB::execute('UPDATE ' . sql_table('plugin') . ' SET porder=' . $newOrder . ' WHERE pid=' . $plugid);\r
5174                 \r
5175                 //self::action_pluginlist();\r
5176                 // To avoid showing ticket in the URL, redirect to pluginlist, instead.\r
5177                 redirect($CONF['AdminURL'] . '?action=pluginlist');\r
5178                 return;\r
5179         }\r
5180         \r
5181         /**\r
5182          * Admin::action_pluginoptions()\r
5183          * \r
5184          * Output Plugin option page\r
5185          * \r
5186          * @access      public\r
5187          * @param       string $message message when fallbacked\r
5188          * @return      void\r
5189          * \r
5190          */\r
5191         static private function action_pluginoptions($message = '')\r
5192         {\r
5193                 global $member, $manager;\r
5194                 \r
5195                 // check if allowed\r
5196                 $member->isAdmin() or self::disallow();\r
5197                 \r
5198                 $pid = intRequestVar('plugid');\r
5199                 if ( !$manager->pidInstalled($pid) )\r
5200                 {\r
5201                         self::error(_ERROR_NOSUCHPLUGIN);\r
5202                         return;\r
5203                 }\r
5204                 \r
5205                 if ( isset($message) )\r
5206                 {\r
5207                         self::$headMess = $message;\r
5208                 }\r
5209                 $plugname       = $manager->getPluginNameFromPid($pid);\r
5210                 $plugin         = $manager->getPlugin($plugname);\r
5211                 Admin::$extrahead .= "<script type=\"text/javascript\" src=\"<%skinfile(/javascripts/numbercheck.js)%>\"></script>\n";\r
5212                 \r
5213                 self::$skin->parse('pluginoptions');\r
5214                 return;\r
5215         }\r
5216         \r
5217         /**\r
5218          * Admin::action_pluginoptionsupdate()\r
5219          * \r
5220          * Update plugin options and fallback to plugin option page\r
5221          * \r
5222          * @access      public\r
5223          * @param       void\r
5224          * @return      void\r
5225          */\r
5226         static private function action_pluginoptionsupdate()\r
5227         {\r
5228                 global $member, $manager;\r
5229                 \r
5230                 // check if allowed\r
5231                 $member->isAdmin() or self::disallow();\r
5232                 \r
5233                 $pid = intRequestVar('plugid');\r
5234                 \r
5235                 if ( !$manager->pidInstalled($pid) )\r
5236                 {\r
5237                         self::error(_ERROR_NOSUCHPLUGIN);\r
5238                         return;\r
5239                 }\r
5240                 \r
5241                 $aOptions = requestArray('plugoption');\r
5242                 NucleusPlugin::apply_plugin_options($aOptions);\r
5243                 \r
5244                 $data = array(\r
5245                         'context'       => 'global',\r
5246                         'plugid'        => $pid\r
5247                 );\r
5248                 $manager->notify('PostPluginOptionsUpdate', $data);\r
5249                 \r
5250                 self::action_pluginoptions(_PLUGS_OPTIONS_UPDATED);\r
5251                 return;\r
5252         }\r
5253         \r
5254         /**\r
5255          * Admin::skineditgeneral()\r
5256          * \r
5257          * @param       integer $skinid\r
5258          * @param       string  $handler\r
5259          * @return      string  empty or message if failed\r
5260          */\r
5261         static private function skineditgeneral($skinid, $handler='')\r
5262         {\r
5263                 global $manager;\r
5264                 \r
5265                 $name = postVar('name');\r
5266                 $desc = postVar('desc');\r
5267                 $type = postVar('type');\r
5268                 $inc_mode = postVar('inc_mode');\r
5269                 $inc_prefix = postVar('inc_prefix');\r
5270                 \r
5271                 $skin =& $manager->getSkin($skinid, $handler);\r
5272                 \r
5273                 // 1. Some checks\r
5274                 if ( !isValidSkinName($name) )\r
5275                 {\r
5276                         return _ERROR_BADSKINNAME;\r
5277                 }\r
5278                 \r
5279                 if ( ($skin->getName() != $name) && SKIN::exists($name) )\r
5280                 {\r
5281                         return _ERROR_DUPSKINNAME;\r
5282                 }\r
5283                 \r
5284                 if ( !$type )\r
5285                 {\r
5286                         $type = 'text/html';\r
5287                 }\r
5288                 \r
5289                 if ( !$inc_mode )\r
5290                 {\r
5291                         $inc_mode = 'normal';\r
5292                 }\r
5293                 \r
5294                 // 2. Update description\r
5295                 $skin->updateGeneralInfo($name, $desc, $type, $inc_mode, $inc_prefix);\r
5296                 \r
5297                 return '';\r
5298         }\r
5299         /**\r
5300          * Admin::skindeleteconfirm()\r
5301          * \r
5302          * @param       integer $skinid\r
5303          * @return      void\r
5304          */\r
5305         static private function skindeleteconfirm($skinid)\r
5306         {\r
5307                 global $manager;\r
5308                 \r
5309                 if ( !preg_match('#^admin/#', self::$action) )\r
5310                 {\r
5311                         $event_identifier = 'Skin';\r
5312                 }\r
5313                 else\r
5314                 {\r
5315                         $event_identifier = 'AdminSkin';\r
5316                 }\r
5317                 \r
5318                 $manager->notify("PreDelete{$event_identifier}", array('skinid' => $skinid));\r
5319                 \r
5320                 // 1. delete description\r
5321                 $query = "DELETE FROM %s WHERE sdnumber=%d;";\r
5322                 $query = sprintf($query, sql_table('skin_desc'), (integer) $skinid);\r
5323                 DB::execute($query);\r
5324                 \r
5325                 // 2. delete parts\r
5326                 $query = "DELETE FROM %s WHERE sdesc=%d;";\r
5327                 $query = sprintf($query, sql_table('skin'), (integer) $skinid);\r
5328                 DB::execute($query);\r
5329                 \r
5330                 $manager->notify("PostDelete{$event_identifier}", array('skinid' => $skinid));\r
5331                 \r
5332                 return;\r
5333         }\r
5334         \r
5335         /**\r
5336          * Admin::skinremovetypeconfirm()\r
5337          * \r
5338          * @param       integer $skinid\r
5339          * @param       string  $skintype\r
5340          * @return      string  empty or message if failed\r
5341          */\r
5342         static private function skinremovetypeconfirm($skinid, $skintype)\r
5343         {\r
5344                 global $manager;\r
5345                 \r
5346                 if ( !preg_match('#^admin/#', self::$action) )\r
5347                 {\r
5348                         $event_identifier = 'Skin';\r
5349                 }\r
5350                 else\r
5351                 {\r
5352                         $event_identifier = 'AdminSkin';\r
5353                 }\r
5354                 \r
5355                 if ( !isValidShortName($skintype) )\r
5356                 {\r
5357                         return _ERROR_SKIN_PARTS_SPECIAL_DELETE;\r
5358                 }\r
5359                 \r
5360                 $data = array(\r
5361                         'skinid'        => $skinid,\r
5362                         'skintype'      => $skintype\r
5363                 );\r
5364                 $manager->notify("PreDelete{$event_identifier}Part", $data);\r
5365                 \r
5366                 // delete part\r
5367                 $query = 'DELETE FROM %s WHERE sdesc = %d AND stype = %s;';\r
5368                 $query = sprintf($query, sql_table('skin'), (integer) $skinid, DB::quoteValue($skintype) );\r
5369                 DB::execute($query);\r
5370                 \r
5371                 $data = array(\r
5372                         'skinid'        => $skinid,\r
5373                         'skintype'      => $skintype\r
5374                 );\r
5375                 $manager->notify("PostDelete{$event_identifier}Part", $data);\r
5376                 \r
5377                 return '';\r
5378         }\r
5379         \r
5380         /**\r
5381          * Admin::skinclone()\r
5382          * \r
5383          * @param       integer $skinid\r
5384          * @param       string  $handler\r
5385          * @return      void\r
5386          */\r
5387         static private function skinclone($skinid, $handler='')\r
5388         {\r
5389                 global $manager;\r
5390                 \r
5391                 // 1. read skin to clone\r
5392                 $skin =& $manager->getSkin($skinid, $handler);\r
5393                 $name = "{$skin->getName()}_clone";\r
5394                 \r
5395                 // if a skin with that name already exists:\r
5396                 if ( Skin::exists($name) )\r
5397                 {\r
5398                         $i = 1;\r
5399                         while ( Skin::exists($name . $i) )\r
5400                         {\r
5401                                 $i++;\r
5402                         }\r
5403                         $name .= $i;\r
5404                 }\r
5405                 \r
5406                 // 2. create skin desc\r
5407                 $newid = Skin::createNew(\r
5408                         $name,\r
5409                         $skin->getDescription(),\r
5410                         $skin->getContentType(),\r
5411                         $skin->getIncludeMode(),\r
5412                         $skin->getIncludePrefix()\r
5413                 );\r
5414                 \r
5415                 // 3. clone\r
5416                 $query = "SELECT stype FROM %s WHERE sdesc=%d;";\r
5417                 $query = sprintf($query, sql_table('skin'), (integer) $skinid);\r
5418                 \r
5419                 $res = DB::getResult($query);\r
5420                 foreach ( $res as $row )\r
5421                 {\r
5422                         $content = $skin->getContentFromDB($row['stype']);\r
5423                         if ( $content )\r
5424                         {\r
5425                                 $query = "INSERT INTO %s (sdesc, scontent, stype) VALUES (%d, %s, %s)";\r
5426                                 $query = sprintf($query, sql_table('skin'), (integer) $newid, DB::quoteValue($content), DB::quoteValue($row['stype']));\r
5427                                 DB::execute($query);\r
5428                         }\r
5429                 }\r
5430                 return;\r
5431         }\r
5432         \r
5433         /**\r
5434          * Admin::skinieimport()\r
5435          * \r
5436          * @param       string  $mode\r
5437          * @param       string  $skinFileRaw\r
5438          * @return      string  empty or message if failed\r
5439          */\r
5440         static private function skinieimport($mode, $skinFileRaw)\r
5441         {\r
5442                 global $DIR_LIBS, $DIR_SKINS;\r
5443                 \r
5444                 // load skinie class\r
5445                 include_once($DIR_LIBS . 'skinie.php');\r
5446                 \r
5447                 $importer = new SkinImport();\r
5448                 \r
5449                 // get full filename\r
5450                 if ( $mode == 'file' )\r
5451                 {\r
5452                         $skinFile = $DIR_SKINS . $skinFileRaw . '/skinbackup.xml';\r
5453                 }\r
5454                 else\r
5455                 {\r
5456                         $skinFile = $skinFileRaw;\r
5457                 }\r
5458                 \r
5459                 // read only metadata\r
5460                 $error = $importer->readFile($skinFile, 1);\r
5461                 if ( $error )\r
5462                 {\r
5463                         unset($importer);\r
5464                         return $error;\r
5465                 }\r
5466                 \r
5467                 /* TODO: we should consider to use the other way insterad of this */\r
5468                 $_REQUEST['skininfo']   = $importer->getInfo();\r
5469                 $_REQUEST['skinnames']  = $importer->getSkinNames();\r
5470                 $_REQUEST['tpltnames']  = $importer->getTemplateNames();\r
5471                 \r
5472                 // clashes\r
5473                 $skinNameClashes                = $importer->checkSkinNameClashes();\r
5474                 $templateNameClashes    = $importer->checkTemplateNameClashes();\r
5475                 $hasNameClashes                 = (count($skinNameClashes) > 0) || (count($templateNameClashes) > 0);\r
5476                 \r
5477                 /* TODO: we should consider to use the other way insterad of this */\r
5478                 $_REQUEST['skinclashes'] = $skinNameClashes;\r
5479                 $_REQUEST['tpltclashes'] = $templateNameClashes;\r
5480                 $_REQUEST['nameclashes'] = $hasNameClashes ? 1 : 0;\r
5481                 \r
5482                 unset($importer);\r
5483                 return '';\r
5484         }\r
5485         \r
5486         /**\r
5487          * Admin::skinieedoimport()\r
5488          * \r
5489          * @param       string  $mode\r
5490          * @param       string  $skinFileRaw\r
5491          * @param       boolean $allowOverwrite\r
5492          * @return      string  empty   or message if failed\r
5493          */\r
5494         static private function skiniedoimport($mode, $skinFileRaw, $allowOverwrite)\r
5495         {\r
5496                 global $DIR_LIBS, $DIR_SKINS;\r
5497                 \r
5498                 // load skinie class\r
5499                 include_once($DIR_LIBS . 'skinie.php');\r
5500                 \r
5501                 $importer = new SkinImport();\r
5502                 \r
5503                 // get full filename\r
5504                 if ( $mode == 'file' )\r
5505                 {\r
5506                         $skinFile = $DIR_SKINS . $skinFileRaw . '/skinbackup.xml';\r
5507                 }\r
5508                 else\r
5509                 {\r
5510                         $skinFile = $skinFileRaw;\r
5511                 }\r
5512                 \r
5513                 $error = $importer->readFile($skinFile);\r
5514                 if ( $error )\r
5515                 {\r
5516                         unset($importer);\r
5517                         return $error;\r
5518                 }\r
5519                 \r
5520                 $error = $importer->writeToDatabase($allowOverwrite);\r
5521                 if ( $error )\r
5522                 {\r
5523                         unset($importer);\r
5524                         return $error;\r
5525                 }\r
5526                 \r
5527                 /* TODO: we should consider to use the other way insterad of this */\r
5528                 $_REQUEST['skininfo']  = $importer->getInfo();\r
5529                 $_REQUEST['skinnames'] = $importer->getSkinNames();\r
5530                 $_REQUEST['tpltnames'] = $importer->getTemplateNames();\r
5531                 \r
5532                 unset($importer);\r
5533                 return '';\r
5534         }\r
5535         \r
5536         /**\r
5537          * Admin::skinieexport()\r
5538          * \r
5539          * @param       array   $aSkins\r
5540          * @param       array   $aTemplates\r
5541          * @param       string  $info\r
5542          * @return      void\r
5543          */\r
5544         static private function skinieexport($aSkins, $aTemplates, $info)\r
5545         {\r
5546                 global $DIR_LIBS;\r
5547                 \r
5548                 // load skinie class\r
5549                 include_once($DIR_LIBS . 'skinie.php');\r
5550                 \r
5551                 if ( !is_array($aSkins) )\r
5552                 {\r
5553                         $aSkins = array();\r
5554                 }\r
5555                 \r
5556                 if (!is_array($aTemplates))\r
5557                 {\r
5558                         $aTemplates = array();\r
5559                 }\r
5560                 \r
5561                 $skinList = array_keys($aSkins);\r
5562                 $templateList = array_keys($aTemplates);\r
5563                 \r
5564                 $exporter = new SkinExport();\r
5565                 foreach ( $skinList as $skinId )\r
5566                 {\r
5567                         $exporter->addSkin($skinId);\r
5568                 }\r
5569                 foreach ( $templateList as $templateId )\r
5570                 {\r
5571                         $exporter->addTemplate($templateId);\r
5572                 }\r
5573                 $exporter->setInfo($info);\r
5574                 $exporter->export();\r
5575                 \r
5576                 return;\r
5577         }\r
5578         \r
5579         /**\r
5580          * Admin::action_parseSpecialskin()\r
5581          * \r
5582          * @param       void\r
5583          * @return      void\r
5584          */\r
5585         static private function action_parseSpecialskin()\r
5586         {\r
5587                 self::$skin->parse(self::$action);\r
5588                 return;\r
5589         }\r
5590         \r
5591         /**\r
5592          * Admin::getAdminskinIDFromName()\r
5593          * \r
5594          * @param       string  $skinname       name of skin\r
5595          * @return      integer ID for skin\r
5596          */\r
5597         static private function getAdminskinIDFromName($skinname)\r
5598         {\r
5599                 $query          = "SELECT 'sdnumber' as result FROM %s WHERE sdname = %s;";\r
5600                 $query          = sprintf($query, sql_table('skin_desc'), DB::quoteValue($skinname));\r
5601                 $admnSknID      = DB::getValue($query);\r
5602                 return (integer) $adminSkinID;\r
5603         }\r
5604         \r
5605         /**\r
5606          * Admin::getAdminskinNameFromID()\r
5607          * \r
5608          * @param       integer $skinid ID for skin\r
5609          * @return      integer ID for skin\r
5610          */\r
5611         static private function getAdminskinNameFromID($skinid)\r
5612         {\r
5613                 $query          = "SELECT sdname as result FROM %s WHERE sdnumber = %d;";\r
5614                 $query          = sprintf($query, sql_table('skin_desc'), (integer) $skinid);\r
5615                 $admnSknID      = DB::getValue($query);\r
5616                 return (integer) $adminSkinID;\r
5617         }\r
5618         \r
5619         /**\r
5620          * Admin::getAdminextrahead()\r
5621          */\r
5622         static public function getAdminextrahead()\r
5623         {\r
5624                 return self::$extrahead;\r
5625         }\r
5626         \r
5627         /**\r
5628          * Admin::getAdminpassvar()\r
5629          */\r
5630         static public function getAdminpassvar()\r
5631         {\r
5632                 return self::$passvar;\r
5633         }\r
5634         \r
5635         /**\r
5636          * Admin::getAdminAction()\r
5637          */\r
5638         static public function getAdminAction()\r
5639         {\r
5640                 return self::$action;\r
5641         }\r
5642         \r
5643         /**\r
5644          * Admin::getAdminaOption()\r
5645          */\r
5646         static public function getAdminaOption()\r
5647         {\r
5648                 return self::$aOptions;\r
5649         }\r
5650         \r
5651         /**\r
5652          * Admin::action_importAdmin()\r
5653          * \r
5654          * @param       void\r
5655          * @return      void\r
5656          */\r
5657         static private function action_importAdmin()\r
5658         {\r
5659                 global $DIR_ADMINSKINS, $action;\r
5660                 if ( $action == 'adminskinieimport' )\r
5661                 {\r
5662                         self::doAdminskinimport();\r
5663                 }\r
5664                 $skn = array();\r
5665                 if ( $action == 'showlogin' )\r
5666                 {\r
5667                         $skinName = 'showlogin';\r
5668                         $actnName = 'showlogin';\r
5669                 }\r
5670                 else\r
5671                 {\r
5672                         $skinName = 'defaultimporter';\r
5673                         $actnName = 'importAdmin';\r
5674                 }\r
5675                 \r
5676                 /* TODO: why??? */\r
5677                 $contents                               = file_get_contents($DIR_ADMINSKINS . $skinName . '.skn');\r
5678                 $skn['id']                              = 0;\r
5679                 $skn['description']             = $skinName;\r
5680                 $skn['contentType']             = 'importAdmin';\r
5681                 $skn['includeMode']             = 'normal';\r
5682                 $skn['includePrefix']   = '';\r
5683                 $skn['name']                    = 'defaultinporter';\r
5684                 \r
5685                 self::$skin                             = (object) $skn;\r
5686                 $handler = new AdminActions($actnName, self::$skin, $this);\r
5687                 \r
5688                 $parser = new PARSER($handler);\r
5689                 $parser->setSkin(self::$skin);\r
5690                 $parser->parse($contents);\r
5691                 \r
5692                 return;\r
5693         }\r
5694         \r
5695         /**\r
5696          * Admin::doAdminskinimport()\r
5697          * \r
5698          * @param       void\r
5699          * @return      void\r
5700          */\r
5701         static private function doAdminskinimport()\r
5702         {\r
5703                 global $DIR_LIBS, $DIR_ADMINSKINS, $CONF, $member;\r
5704                 \r
5705                 $member->isAdmin() or self::disallow();\r
5706                 \r
5707                 include_once($DIR_LIBS . 'Skinie.php');\r
5708                 $skinFileRaw = postVar('skinfile');\r
5709                 $mode = postVar('mode');\r
5710                 $allowOverwrite = intPostVar('overwrite');\r
5711                 \r
5712                 if ( $mode == 'file' )\r
5713                 {\r
5714                         $skinFile = $DIR_ADMINSKINS . $skinFileRaw . '/skinbackup.xml';\r
5715                 }\r
5716                 else\r
5717                 {\r
5718                         $skinFile = $skinFileRaw;\r
5719                 }\r
5720                 \r
5721                 $importer       = new SKINIMPORT();\r
5722                 $error          = $importer->readFile($skinFile);\r
5723                 if ( $error )\r
5724                 {\r
5725                         self::error($error);\r
5726                         return;\r
5727                 }\r
5728                 $error = $importer->writeToDatabase($allowOverwrite);\r
5729                 if ( $error )\r
5730                 {\r
5731                         self::error($error);\r
5732                         return;\r
5733                 }\r
5734                 \r
5735                 $_REQUEST['skininfo']   = $importer->getInfo();\r
5736                 $_REQUEST['skinnames']  = $importer->getSkinNames();\r
5737                 $_REQUEST['tpltnames']  = $importer->getTemplateNames();\r
5738                 \r
5739                 header('Location: ' . $CONF['AdminURL']);\r
5740                 return;\r
5741         }\r
5742 }\r