OSDN Git Service

REMOVE:: Admin::addToAdminTemplate()の削除
[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::skiniedoimport($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::addToTemplate($templateid, 'NORMALSKINLIST_HEAD',                                         postVar('NORMALSKINLIST_HEAD'));\r
3341                 self::addToTemplate($templateid, 'NORMALSKINLIST_BODY',                                         postVar('NORMALSKINLIST_BODY'));\r
3342                 self::addToTemplate($templateid, 'NORMALSKINLIST_FOOT',                                         postVar('NORMALSKINLIST_FOOT'));\r
3343                 self::addToTemplate($templateid, 'ADMIN_CUSTOMHELPLINK_ICON',                           postVar('ADMIN_CUSTOMHELPLINK_ICON'));\r
3344                 self::addToTemplate($templateid, 'ADMIN_CUSTOMHELPLINK_ANCHOR',                         postVar('ADMIN_CUSTOMHELPLINK_ANCHOR'));\r
3345                 self::addToTemplate($templateid, 'ADMIN_BLOGLINK',                                                      postVar('ADMIN_BLOGLINK'));\r
3346                 self::addToTemplate($templateid, 'ADMIN_BATCHLIST',                                                     postVar('ADMIN_BATCHLIST'));\r
3347                 self::addToTemplate($templateid, 'ACTIVATE_FORGOT_TITLE',                                       postVar('ACTIVATE_FORGOT_TITLE'));\r
3348                 self::addToTemplate($templateid, 'ACTIVATE_FORGOT_TEXT',                                        postVar('ACTIVATE_FORGOT_TEXT'));\r
3349                 self::addToTemplate($templateid, 'ACTIVATE_REGISTER_TITLE',                                     postVar('ACTIVATE_REGISTER_TITLE'));\r
3350                 self::addToTemplate($templateid, 'ACTIVATE_REGISTER_TEXT',                                      postVar('ACTIVATE_REGISTER_TEXT'));\r
3351                 self::addToTemplate($templateid, 'ACTIVATE_CHANGE_TITLE',                                       postVar('ACTIVATE_CHANGE_TITLE'));\r
3352                 self::addToTemplate($templateid, 'ACTIVATE_CHANGE_TEXT',                                        postVar('ACTIVATE_CHANGE_TEXT'));\r
3353                 self::addToTemplate($templateid, 'TEMPLATE_EDIT_EXPLUGNAME',                            postVar('TEMPLATE_EDIT_EXPLUGNAME'));\r
3354                 self::addToTemplate($templateid, 'TEMPLATE_EDIT_ROW_HEAD',                                      postVar('TEMPLATE_EDIT_ROW_HEAD'));\r
3355                 self::addToTemplate($templateid, 'TEMPLATE_EDIT_ROW_TAIL',                                      postVar('TEMPLATE_EDIT_ROW_TAIL'));\r
3356                 self::addToTemplate($templateid, 'SPECIALSKINLIST_HEAD',                                        postVar('SPECIALSKINLIST_HEAD'));\r
3357                 self::addToTemplate($templateid, 'SPECIALSKINLIST_BODY',                                        postVar('SPECIALSKINLIST_BODY'));\r
3358                 self::addToTemplate($templateid, 'SPECIALSKINLIST_FOOT',                                        postVar('SPECIALSKINLIST_FOOT'));\r
3359                 self::addToTemplate($templateid, 'SYSTEMINFO_GDSETTINGS',                                       postVar('SYSTEMINFO_GDSETTINGS'));\r
3360                 self::addToTemplate($templateid, 'BANLIST_DELETED_LIST',                                        postVar('BANLIST_DELETED_LIST'));\r
3361                 self::addToTemplate($templateid, 'INSERT_PLUGOPTION_TITLE',                                     postVar('INSERT_PLUGOPTION_TITLE'));\r
3362                 self::addToTemplate($templateid, 'INSERT_PLUGOPTION_BODY',                                      postVar('INSERT_PLUGOPTION_BODY'));\r
3363                 self::addToTemplate($templateid, 'INPUTYESNO_TEMPLATE_ADMIN',                           postVar('INPUTYESNO_TEMPLATE_ADMIN'));\r
3364                 self::addToTemplate($templateid, 'INPUTYESNO_TEMPLATE_NORMAL',                          postVar('INPUTYESNO_TEMPLATE_NORMAL'));\r
3365                 self::addToTemplate($templateid, 'ADMIN_SPECIALSKINLIST_HEAD',                          postVar('ADMIN_SPECIALSKINLIST_HEAD'));\r
3366                 self::addToTemplate($templateid, 'ADMIN_SPECIALSKINLIST_BODY',                          postVar('ADMIN_SPECIALSKINLIST_BODY'));\r
3367                 self::addToTemplate($templateid, 'ADMIN_SPECIALSKINLIST_FOOT',                          postVar('ADMIN_SPECIALSKINLIST_FOOT'));\r
3368                 self::addToTemplate($templateid, 'SKINIE_EXPORT_LIST',                                          postVar('SKINIE_EXPORT_LIST'));\r
3369                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_SELECT_HEAD',                       postVar('SHOWLIST_LISTPLUG_SELECT_HEAD'));\r
3370                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_SELECT_BODY',                       postVar('SHOWLIST_LISTPLUG_SELECT_BODY'));\r
3371                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_SELECT_FOOT',                       postVar('SHOWLIST_LISTPLUG_SELECT_FOOT'));\r
3372                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_HEAD',                        postVar('SHOWLIST_LISTPLUG_TABLE_HEAD'));\r
3373                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BODY',                        postVar('SHOWLIST_LISTPLUG_TABLE_BODY'));\r
3374                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_FOOT',                        postVar('SHOWLIST_LISTPLUG_TABLE_FOOT'));\r
3375                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_MEMBLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_MEMBLIST_HEAD'));\r
3376                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_MEMBLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_MEMBLIST_BODY'));\r
3377                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_MEMBLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_MEMBLIST_FOOT'));\r
3378                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TEAMLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_TEAMLIST_HEAD'));\r
3379                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TEAMLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_TEAMLIST_BODY'));\r
3380                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TEAMLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_TEAMLIST_FOOT'));\r
3381                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_HEAD'));\r
3382                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_BODY'));\r
3383                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_GURL',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_GURL'));\r
3384                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGEVENTLIST',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGEVENTLIST'));\r
3385                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGNEDUPDATE',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGNEDUPDATE'));\r
3386                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGIN_DEPEND',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGIN_DEPEND'));\r
3387                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGIN_DEPREQ',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGIN_DEPREQ'));\r
3388                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLISTFALSE',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLISTFALSE'));\r
3389                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_ACTN',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_ACTN'));\r
3390                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_ADMN',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_ADMN'));\r
3391                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_HELP',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_HELP'));\r
3392                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGOPTSETURL',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGOPTSETURL'));\r
3393                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_FOOT'));\r
3394                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_POPTLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_POPTLIST_HEAD'));\r
3395                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_POPTLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_POPTLIST_BODY'));\r
3396                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OYESNO',       postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OYESNO'));\r
3397                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OPWORD',       postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OPWORD'));\r
3398                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEP',       postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEP'));\r
3399                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEO',       postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEO'));\r
3400                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEC',       postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEC'));\r
3401                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OTAREA',       postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OTAREA'));\r
3402                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OITEXT',       postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OITEXT'));\r
3403                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGOPTN_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGOPTN_FOOT'));\r
3404                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_POPTLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_POPTLIST_FOOT'));\r
3405                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ITEMLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_ITEMLIST_HEAD'));\r
3406                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ITEMLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_ITEMLIST_BODY'));\r
3407                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ITEMLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_ITEMLIST_FOOT'));\r
3408                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CMNTLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_CMNTLIST_HEAD'));\r
3409                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CMNTLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_CMNTLIST_BODY'));\r
3410                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CMNTLIST_ABAN',       postVar('SHOWLIST_LISTPLUG_TABLE_CMNTLIST_ABAN'));\r
3411                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CMNTLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_CMNTLIST_FOOT'));\r
3412                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_BLOGLIST_HEAD'));\r
3413                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_BLOGLIST_BODY'));\r
3414                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLIST_BD_TADM',       postVar('SHOWLIST_LISTPLUG_TABLE_BLIST_BD_TADM'));\r
3415                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLIST_BD_SADM',       postVar('SHOWLIST_LISTPLUG_TABLE_BLIST_BD_SADM'));\r
3416                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_BLOGLIST_FOOT'));\r
3417                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_HEAD'));\r
3418                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_BODY'));\r
3419                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_FOOT'));\r
3420                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SHORTNAM_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_SHORTNAM_HEAD'));\r
3421                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SHORTNAM_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_SHORTNAM_BODY'));\r
3422                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SHORTNAM_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_SHORTNAM_FOOT'));\r
3423                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CATELIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_CATELIST_HEAD'));\r
3424                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CATELIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_CATELIST_BODY'));\r
3425                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CATELIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_CATELIST_FOOT'));\r
3426                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TPLTLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_TPLTLIST_HEAD'));\r
3427                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TPLTLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_TPLTLIST_BODY'));\r
3428                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TPLTLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_TPLTLIST_FOOT'));\r
3429                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SKINLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_SKINLIST_HEAD'));\r
3430                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SKINLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_SKINLIST_BODY'));\r
3431                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SKINLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_SKINLIST_FOOT'));\r
3432                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_DRFTLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_DRFTLIST_HEAD'));\r
3433                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_DRFTLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_DRFTLIST_BODY'));\r
3434                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_DRFTLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_DRFTLIST_FOOT'));\r
3435                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ACTNLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_ACTNLIST_HEAD'));\r
3436                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ACTNLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_ACTNLIST_BODY'));\r
3437                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ACTNLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_ACTNLIST_FOOT'));\r
3438                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_IBANLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_IBANLIST_HEAD'));\r
3439                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_IBANLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_IBANLIST_BODY'));\r
3440                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_IBANLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_IBANLIST_FOOT'));\r
3441                 self::addToTemplate($templateid, 'PLUGIN_QUICKMENU_TITLE',                                      postVar('PLUGIN_QUICKMENU_TITLE'));\r
3442                 self::addToTemplate($templateid, 'PLUGIN_QUICKMENU_HEAD',                                       postVar('PLUGIN_QUICKMENU_HEAD'));\r
3443                 self::addToTemplate($templateid, 'PLUGIN_QUICKMENU_BODY',                                       postVar('PLUGIN_QUICKMENU_BODY'));\r
3444                 self::addToTemplate($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::addToTemplate($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::action_admintemplatedelete()\r
3463          * \r
3464          * @param       void\r
3465          * @return      void\r
3466          */\r
3467         static private function action_admintemplatedelete()\r
3468         {\r
3469                 global $member, $manager;\r
3470                 $member->isAdmin() or self::disallow();\r
3471                 \r
3472                 // TODO: check if template can be deleted\r
3473                 self::$skin->parse('admintemplatedelete');\r
3474                 return;\r
3475         }\r
3476         \r
3477         /**\r
3478          * Admin::action_admintemplatedeleteconfirm()\r
3479          * \r
3480          * @param       void\r
3481          * @return      void\r
3482          */\r
3483         static private function action_admintemplatedeleteconfirm()\r
3484         {\r
3485                 global $member, $manager;\r
3486                 \r
3487                 $templateid = intRequestVar('templateid');\r
3488                 $member->isAdmin() or self::disallow();\r
3489                 \r
3490                 $data = array('templateid' => $templateid);\r
3491                 $manager->notify('PreDeleteAdminTemplate', $data);\r
3492                 \r
3493                 // 1. delete description\r
3494                 $query = "DELETE FROM %s WHERE tdnumber=%s;";\r
3495                 $query = sprintf($query, sql_table('template_desc'), (integer) $templateid);\r
3496                 DB::execute($query);\r
3497                 \r
3498                 // 2. delete parts\r
3499                 $query = "DELETE FROM %s WHERE tdesc=%d;";\r
3500                 $query = sprintf($query, sql_table('template'), (integer) $templateid);\r
3501                 DB::execute($query);\r
3502                 \r
3503                 $data = array('templateid' => $templateid);\r
3504                 $manager->notify('PostDeleteAdminTemplate', $data);\r
3505                 \r
3506                 self::action_admintemplateoverview();\r
3507                 return;\r
3508         }\r
3509         \r
3510         /**\r
3511          * Admin::action_admintemplatenew()\r
3512          * \r
3513          * @param       void\r
3514          * @return      void\r
3515          */\r
3516         static private function action_admintemplatenew()\r
3517         {\r
3518                 global $member;\r
3519                 $member->isAdmin() or self::disallow();\r
3520                 $name = postVar('name');\r
3521                 $desc = postVar('desc');\r
3522                 \r
3523                 if ( !isValidTemplateName($name) )\r
3524                 {\r
3525                         self::error(_ERROR_BADTEMPLATENAME);\r
3526                         return;\r
3527                 }\r
3528                 else if ( !preg_match('#^admin/#', $name) )\r
3529                 {\r
3530                         self::error(_ERROR_BADADMINTEMPLATENAME);\r
3531                         return;\r
3532                 }\r
3533                 else if ( Template::exists($name) )\r
3534                 {\r
3535                         self::error(_ERROR_DUPTEMPLATENAME);\r
3536                         return;\r
3537                 }\r
3538                 \r
3539                 $newTemplateId = Template::createNew($name, $desc);\r
3540                 self::action_admintemplateoverview();\r
3541                 return;\r
3542         }\r
3543         \r
3544         /**\r
3545          * Admin::action_admintemplateclone()\r
3546          * \r
3547          * @param       void\r
3548          * @return      void\r
3549          */\r
3550         static private function action_admintemplateclone()\r
3551         {\r
3552                 global $member;\r
3553                 $templateid = intRequestVar('templateid');\r
3554                 $member->isAdmin() or self::disallow();\r
3555                 \r
3556                 // 1. read old template\r
3557                 $name = Template::getNameFromId($templateid);\r
3558                 $desc = Template::getDesc($templateid);\r
3559                 \r
3560                 // 2. create desc thing\r
3561                 $name = $name . "cloned";\r
3562                 \r
3563                 // if a template with that name already exists:\r
3564                 if ( Template::exists($name) )\r
3565                 {\r
3566                         $i = 1;\r
3567                         while ( Template::exists($name . $i) )\r
3568                         {\r
3569                                 $i++;\r
3570                         }\r
3571                         $name .= $i;\r
3572                 }\r
3573                 \r
3574                 $newid = Template::createNew($name, $desc);\r
3575                 \r
3576                 // 3. create clone\r
3577                 // go through parts of old template and add them to the new one\r
3578                 $query = "SELECT tpartname, tcontent FROM %s WHERE tdesc=%d;";\r
3579                 $query = sprintf($query, sql_table('template'), (integer) $templateid);\r
3580                 \r
3581                 $res = DB::getResult($query);\r
3582                 foreach ( $res as $row )\r
3583                 {\r
3584                         self::addToTemplate($newid, $row['tpartname'], $row['tcontent']);\r
3585                 }\r
3586                 \r
3587                 self::action_admintemplateoverview();\r
3588                 return;\r
3589         }\r
3590 \r
3591         /**\r
3592          * Admin::action_skinoverview()\r
3593          * \r
3594          * @param       void\r
3595          * @return      void\r
3596          */\r
3597         static private function action_skinoverview()\r
3598         {\r
3599                 global $member, $manager;\r
3600                 \r
3601                 $member->isAdmin() or self::disallow();\r
3602                 \r
3603                 self::$skin->parse('skinoverview');\r
3604                 return;\r
3605         }\r
3606         \r
3607         /**\r
3608          * Admin::action_skinnew()\r
3609          * \r
3610          * @param       void\r
3611          * @return      void\r
3612          */\r
3613         static private function action_skinnew()\r
3614         {\r
3615                 global $member;\r
3616                 \r
3617                 $member->isAdmin() or self::disallow();\r
3618                 \r
3619                 $name = trim(postVar('name'));\r
3620                 $desc = trim(postVar('desc'));\r
3621                 \r
3622                 if ( !isValidSkinName($name) )\r
3623                 {\r
3624                         self::error(_ERROR_BADSKINNAME);\r
3625                         return;\r
3626                 }\r
3627                 else if ( SKIN::exists($name) )\r
3628                 {\r
3629                         self::error(_ERROR_DUPSKINNAME);\r
3630                         return;\r
3631                 }\r
3632                 \r
3633                 SKIN::createNew($name, $desc);\r
3634                 \r
3635                 self::action_skinoverview();\r
3636                 return;\r
3637         }\r
3638         \r
3639         /**\r
3640          * Admin::action_skinedit()\r
3641          * \r
3642          * @param       void\r
3643          * @return      void\r
3644          */\r
3645         static private function action_skinedit()\r
3646         {\r
3647                 global $member;\r
3648                 \r
3649                 $member->isAdmin() or self::disallow();\r
3650                 \r
3651                 self::$skin->parse('skinedit');\r
3652                 return;\r
3653         }\r
3654         \r
3655         /**\r
3656          * Admin::action_skineditgeneral()\r
3657          * \r
3658          * @param       void\r
3659          * @return      void\r
3660          */\r
3661         static private function action_skineditgeneral()\r
3662         {\r
3663                 global $member;\r
3664                 \r
3665                 $skinid = intRequestVar('skinid');\r
3666                 \r
3667                 $member->isAdmin() or self::disallow();\r
3668                 \r
3669                 $error = self::skineditgeneral($skinid);\r
3670                 if ( $error )\r
3671                 {\r
3672                         self::error($error);\r
3673                         return;\r
3674                 }\r
3675                 \r
3676                 self::action_skinedit();\r
3677                 return;\r
3678         }\r
3679         \r
3680         static private function action_skinedittype($msg = '')\r
3681         {\r
3682                 global $member;\r
3683                 \r
3684                 $member->isAdmin() or self::disallow();\r
3685                 \r
3686                 if ( $msg )\r
3687                 {\r
3688                         self::$headMess = $msg;\r
3689                 }\r
3690                 \r
3691                 $type = requestVar('type');\r
3692                 $type = trim($type);\r
3693                 $type = strtolower($type);\r
3694                 \r
3695                 if ( !isValidShortName($type) )\r
3696                 {\r
3697                         self::error(_ERROR_SKIN_PARTS_SPECIAL_FORMAT);\r
3698                         return;\r
3699                 }\r
3700                 \r
3701                 self::$skin->parse('skinedittype');\r
3702                 return;\r
3703         }\r
3704         \r
3705         /**\r
3706          * Admin::action_skinupdate()\r
3707          * \r
3708          * @param       void\r
3709          * @return      void\r
3710          */\r
3711         static private function action_skinupdate()\r
3712         {\r
3713                 global $manager, $member;\r
3714                 \r
3715                 $skinid = intRequestVar('skinid');\r
3716                 $content = trim(postVar('content'));\r
3717                 $type = postVar('type');\r
3718                 \r
3719                 $member->isAdmin() or self::disallow();\r
3720                 \r
3721                 $skin =& $manager->getSKIN($skinid);\r
3722                 $skin->update($type, $content);\r
3723                 \r
3724                 self::action_skinedittype(_SKIN_UPDATED);\r
3725                 return;\r
3726         }\r
3727         \r
3728         /**\r
3729          * Admin::action_skindelete()\r
3730          * \r
3731          * @param       void\r
3732          * @return      void\r
3733          */\r
3734         static private function action_skindelete()\r
3735         {\r
3736                 global $CONF, $member;\r
3737                 \r
3738                 $member->isAdmin() or self::disallow();\r
3739                 \r
3740                 $skinid = intRequestVar('skinid');\r
3741                 \r
3742                 // don't allow default skin to be deleted\r
3743                 if ( $skinid == $CONF['BaseSkin'] )\r
3744                 {\r
3745                         self::error(_ERROR_DEFAULTSKIN);\r
3746                         return;\r
3747                 }\r
3748                 \r
3749                 // don't allow deletion of default skins for blogs\r
3750                 $query = "SELECT bname FROM %s WHERE bdefskin=%d";\r
3751                 $query = sprintf($query, sql_table('blog'), (integer) $skinid);\r
3752                 \r
3753                 $name = DB::getValue($query);\r
3754                 if ( $name )\r
3755                 {\r
3756                         self::error(_ERROR_SKINDEFDELETE . Entity::hsc($name));\r
3757                         return;\r
3758                 }\r
3759                 \r
3760                 self::$skin->parse('skindelete');\r
3761                 return;\r
3762         }\r
3763         \r
3764         /**\r
3765          * Admin::action_skindeleteconfirm()\r
3766          * \r
3767          * @param       void\r
3768          * @return      void\r
3769          */\r
3770         static private function action_skindeleteconfirm()\r
3771         {\r
3772                 global $member, $CONF;\r
3773                 \r
3774                 $member->isAdmin() or self::disallow();\r
3775                 \r
3776                 $skinid = intRequestVar('skinid');\r
3777                 \r
3778                 // don't allow default skin to be deleted\r
3779                 if ( $skinid == $CONF['BaseSkin'] )\r
3780                 {\r
3781                         self::error(_ERROR_DEFAULTSKIN);\r
3782                         return;\r
3783                 }\r
3784                 \r
3785                 // don't allow deletion of default skins for blogs\r
3786                 $query = "SELECT bname FROM %s WHERE bdefskin=%d;";\r
3787                 $query = sprintf($query, sql_table('blog'), (integer) $skinid);\r
3788                 \r
3789                 $name = DB::getValue($query);\r
3790                 if ( $name )\r
3791                                 {\r
3792                         self::error(_ERROR_SKINDEFDELETE . Entity::hsc($name));\r
3793                         return;\r
3794                 }\r
3795                 \r
3796                 self::skindeleteconfirm($skinid);\r
3797                 \r
3798                 self::action_skinoverview();\r
3799                 return;\r
3800         }\r
3801         \r
3802         /**\r
3803          * Admin::action_skinremovetype()\r
3804          * \r
3805          * @param       void\r
3806          * @return      void\r
3807          */\r
3808         static private function action_skinremovetype()\r
3809         {\r
3810                 global $member, $CONF;\r
3811                 \r
3812                 $member->isAdmin() or self::disallow();\r
3813                 \r
3814                 $skinid = intRequestVar('skinid');\r
3815                 $skintype = requestVar('type');\r
3816                 \r
3817                 if ( !isValidShortName($skintype) )\r
3818                 {\r
3819                         self::error(_ERROR_SKIN_PARTS_SPECIAL_DELETE);\r
3820                         return;\r
3821                 }\r
3822                 \r
3823                 self::$skin->parse('skinremovetype');\r
3824                 return;\r
3825         }\r
3826         \r
3827         /**\r
3828          * Admin::action_skinremovetypeconfirm()\r
3829          * \r
3830          * @param       void\r
3831          * @return      void\r
3832          */\r
3833         static private function action_skinremovetypeconfirm()\r
3834         {\r
3835                 global $member;\r
3836                 \r
3837                 $member->isAdmin() or self::disallow();\r
3838                 \r
3839                 $skinid = intRequestVar('skinid');\r
3840                 $skintype = requestVar('type');\r
3841                 \r
3842                 $error = self::skinremovetypeconfirm($skinid, $skintype);\r
3843                 if ( $error )\r
3844                 {\r
3845                         self::error($error);\r
3846                         return;\r
3847                 }\r
3848                 \r
3849                 self::action_skinedit();\r
3850                 return;\r
3851         }\r
3852         \r
3853         /**\r
3854          * Admin::action_skinclone()\r
3855          * \r
3856          * @param       void\r
3857          * @return      void\r
3858          */\r
3859         static private function action_skinclone()\r
3860         {\r
3861                 global $member;\r
3862                 \r
3863                 $member->isAdmin() or self::disallow();\r
3864                 \r
3865                 $skinid = intRequestVar('skinid');\r
3866                 \r
3867                 self::skinclone($skinid);\r
3868                 \r
3869                 self::action_skinoverview();\r
3870                 return;\r
3871         }\r
3872         \r
3873         /**\r
3874          * Admin::action_adminskinoverview()\r
3875          * \r
3876          * @param       void\r
3877          * @return      void\r
3878          */\r
3879         static private function action_adminskinoverview()\r
3880         {\r
3881                 global $member;\r
3882                 \r
3883                 $member->isAdmin() or self::disallow();\r
3884                 \r
3885                 self::$skin->parse('adminskinoverview');\r
3886                 return;\r
3887         }\r
3888         \r
3889         /**\r
3890          * Admin::action_adminskinnew()\r
3891          * \r
3892          * @param       void\r
3893          * @return      void\r
3894          */\r
3895         static private function action_adminskinnew()\r
3896         {\r
3897                 global $member;\r
3898                 \r
3899                 $member->isAdmin() or self::disallow();\r
3900                 \r
3901                 $name = trim(postVar('name'));\r
3902                 $desc = trim(postVar('desc'));\r
3903                 \r
3904                 if ( !isValidSkinName($name) )\r
3905                 {\r
3906                         self::error(_ERROR_BADSKINNAME);\r
3907                         return;\r
3908                 }\r
3909                 else if ( !preg_match('#^admin/#', $name) )\r
3910                 {\r
3911                         self::error(_ERROR_BADADMINSKINNAME);\r
3912                         return;\r
3913                 }\r
3914                 else if ( Skin::exists($name) )\r
3915                 {\r
3916                         self::error(_ERROR_DUPSKINNAME);\r
3917                         return;\r
3918                 }\r
3919                 \r
3920                 Skin::createNew($name, $desc);\r
3921                 \r
3922                 self::action_adminskinoverview();\r
3923                 return;\r
3924         }\r
3925         \r
3926         /**\r
3927          * Admin::action_adminskinedit()\r
3928          * \r
3929          * @param       void\r
3930          * @return      void\r
3931          */\r
3932         static private function action_adminskinedit()\r
3933         {\r
3934                 global $member;\r
3935                 \r
3936                 $member->isAdmin() or self::disallow();\r
3937                 \r
3938                 self::$skin->parse('adminskinedit');\r
3939                 \r
3940                 return;\r
3941         }\r
3942         \r
3943         /**\r
3944          * Admin::action_adminskineditgeneral()\r
3945          * \r
3946          * @param       void\r
3947          * @return      void\r
3948          */\r
3949         static private function action_adminskineditgeneral()\r
3950         {\r
3951                 global $member;\r
3952                 \r
3953                 $skinid = intRequestVar('skinid');\r
3954                 \r
3955                 $member->isAdmin() or self::disallow();\r
3956                 \r
3957                 $error = self::skineditgeneral($skinid, 'AdminActions');\r
3958                 if ( $error )\r
3959                 {\r
3960                         self::error($error);\r
3961                         return;\r
3962                 }\r
3963                 \r
3964                 self::action_adminskinedit();\r
3965                 return;\r
3966         }\r
3967         \r
3968         /**\r
3969          * Admin::action_adminskinedittype()\r
3970          * \r
3971          * @param       string  $msg    message for pageheader\r
3972          * @return      void\r
3973          */\r
3974         static private function action_adminskinedittype($msg = '')\r
3975         {\r
3976                 global $member;\r
3977                 \r
3978                 $member->isAdmin() or self::disallow();\r
3979                 \r
3980                 if ( $msg )\r
3981                 {\r
3982                         self::$headMess = $msg;\r
3983                 }\r
3984                 $type = requestVar('type');\r
3985                 $type = trim($type);\r
3986                 $type = strtolower($type);\r
3987                 \r
3988                 if ( !isValidShortName($type) )\r
3989                 {\r
3990                         self::error(_ERROR_SKIN_PARTS_SPECIAL_FORMAT);\r
3991                         return;\r
3992                 }\r
3993                 \r
3994                 self::$skin->parse('adminskinedittype');\r
3995                 return;\r
3996         }\r
3997         \r
3998         /**\r
3999          * Admin::action_adminskinupdate()\r
4000          * \r
4001          * @param       void\r
4002          * @return      void\r
4003          */\r
4004         static private function action_adminskinupdate()\r
4005         {\r
4006                 global $manager, $member;\r
4007                 \r
4008                 $skinid = intRequestVar('skinid');\r
4009                 $content = trim(postVar('content'));\r
4010                 $type = postVar('type');\r
4011                 \r
4012                 $member->isAdmin() or self::disallow();\r
4013                 \r
4014                 $skin =& $manager->getSkin($skinid, 'AdminActions', 'AdminSkin');\r
4015                 $skin->update($type, $content);\r
4016                 \r
4017                 self::action_adminskinedittype(_SKIN_UPDATED);\r
4018                 return;\r
4019         }\r
4020         \r
4021         /**\r
4022          * Admin::action_adminskindelete()\r
4023          * \r
4024          * @param       void\r
4025          * @return      void\r
4026          */\r
4027         static private function action_adminskindelete()\r
4028         {\r
4029                 global $CONF, $member;\r
4030                 \r
4031                 $member->isAdmin() or self::disallow();\r
4032                 \r
4033                 $skinid = intRequestVar('skinid');\r
4034                 \r
4035                 // don't allow default skin to be deleted\r
4036                 if ( $skinid == $CONF['AdminSkin'] || $skinid == $CONF['BookmarkletSkin'] )\r
4037                 {\r
4038                         self::error(_ERROR_DEFAULTSKIN);\r
4039                         return;\r
4040                 }\r
4041                 \r
4042                 /* don't allow if someone use it as a default*/\r
4043                 $query = 'SELECT * FROM %s WHERE madminskin = %d or mbkmklt = %d;';\r
4044                 $res = DB::getResult(sprintf($query, sql_table('member'), $skinid, $skinid));\r
4045                 \r
4046                 $members = array();\r
4047                 while ( $row = $res->fetch() ) {\r
4048                         $members[] = $row['mrealname'];\r
4049                 }\r
4050                 if ( count($members) )\r
4051                 {\r
4052                         self::error(_ERROR_SKINDEFDELETE . implode(' ' . _AND . ' ', $members));\r
4053                         return;\r
4054                 }\r
4055                 \r
4056                 self::$skin->parse('adminskindelete');\r
4057                 return;\r
4058         }\r
4059 \r
4060         /**\r
4061          * Admin::action_adminskindeleteconfirm()\r
4062          * \r
4063          * @param       void\r
4064          * @return      void\r
4065          */\r
4066         static private function action_adminskindeleteconfirm()\r
4067         {\r
4068                 global $member, $CONF;\r
4069                 \r
4070                 $member->isAdmin() or self::disallow();\r
4071                 \r
4072                 $skinid = intRequestVar('skinid');\r
4073                 \r
4074                 // don't allow default skin to be deleted\r
4075                 if ( $skinid == $CONF['AdminSkin'] || $skinid == $CONF['BookmarkletSkin'] )\r
4076                 {\r
4077                         self::error(_ERROR_DEFAULTSKIN);\r
4078                         return;\r
4079                 }\r
4080                 \r
4081                 /* don't allow if someone use it as a default*/\r
4082                 $query = 'SELECT * FROM %s WHERE madminskin = %d or mbkmklt = %d;';\r
4083                 $res = DB::getResult(sprintf($query, sql_table('member'), $skinid, $skinid));\r
4084                 \r
4085                 $members = array();\r
4086                 while ( $row = $res->fetch() ) {\r
4087                         $members[] = $row['mrealname'];\r
4088                 }\r
4089                 if ( count($members) )\r
4090                 {\r
4091                         self::error(_ERROR_SKINDEFDELETE . implode(' ' . _AND . ' ', $members));\r
4092                         return;\r
4093                 }\r
4094                 \r
4095                 self::skindeleteconfirm($skinid);\r
4096                 \r
4097                 self::action_adminskinoverview();\r
4098                 return;\r
4099         }\r
4100         \r
4101         /**\r
4102          * Admin::action_adminskinremovetype()\r
4103          * \r
4104          * @param       void\r
4105          * @return      void\r
4106          */\r
4107         static private function action_adminskinremovetype()\r
4108         {\r
4109                 global $member, $CONF;\r
4110 \r
4111                 $member->isAdmin() or self::disallow();\r
4112                 \r
4113                 $skinid = intRequestVar('skinid');\r
4114                 $skintype = requestVar('type');\r
4115                 \r
4116                 if ( !isValidShortName($skintype) )\r
4117                 {\r
4118                         self::error(_ERROR_SKIN_PARTS_SPECIAL_DELETE);\r
4119                         return;\r
4120                 }\r
4121                 \r
4122                 self::$skin->parse('adminskinremovetype');\r
4123                 return;\r
4124         }\r
4125         \r
4126         /**\r
4127          * Admin::action_adminskinremovetypeconfirm()\r
4128          * \r
4129          * @param       void\r
4130          * @return      void\r
4131          */\r
4132         static private function action_adminskinremovetypeconfirm()\r
4133         {\r
4134                 global $member;\r
4135                 \r
4136                 $member->isAdmin() or self::disallow();\r
4137                 \r
4138                 $skinid = intRequestVar('skinid');\r
4139                 $skintype = requestVar('type');\r
4140                 \r
4141                 $error = self::skinremovetypeconfirm($skinid, $skintype);\r
4142                 if ( $error )\r
4143                 {\r
4144                         self::error($error);\r
4145                         return;\r
4146                 }\r
4147                 \r
4148                 self::action_adminskinedit();\r
4149                 return;\r
4150         }\r
4151 \r
4152         /**\r
4153          * Admin::action_adminskinclone()\r
4154          * \r
4155          * @param       void\r
4156          * @return      void\r
4157          */\r
4158         static private function action_adminskinclone()\r
4159         {\r
4160                 global $member;\r
4161                 \r
4162                 $member->isAdmin() or self::disallow();\r
4163                 \r
4164                 $skinid = intRequestVar('skinid');\r
4165                 \r
4166                 self::skinclone($skinid, 'AdminActions');\r
4167                 \r
4168                 self::action_adminskinoverview();\r
4169                 return;\r
4170         }\r
4171         \r
4172         /**\r
4173          * Admin::action_adminskinieoverview()\r
4174          * \r
4175          * @param       void\r
4176          * @return      void\r
4177          */\r
4178         static private function action_adminskinieoverview()\r
4179         {\r
4180                 global $member;\r
4181                 \r
4182                 $member->isAdmin() or self::disallow();\r
4183                 \r
4184                 self::$skin->parse('adminskinieoverview');\r
4185                 return;\r
4186         }\r
4187 \r
4188         /**\r
4189          * Admin::action_adminskinieimport()\r
4190          * \r
4191          * @param       void\r
4192          * @return      void\r
4193          */\r
4194         static private function action_adminskinieimport()\r
4195         {\r
4196                 global $member;\r
4197                 \r
4198                 $member->isAdmin() or self::disallow();\r
4199                 \r
4200                 $skinFileRaw = postVar('skinfile');\r
4201                 $mode = postVar('mode');\r
4202                 \r
4203                 $error = self::skinieimport($mode, $skinFileRaw);\r
4204                 if ( $error )\r
4205                 {\r
4206                         self::error($error);\r
4207                         return;\r
4208                 }\r
4209                 \r
4210                 if ( !is_object(self::$skin) )\r
4211                 {\r
4212                         self::action_adminskiniedoimport();\r
4213                 }\r
4214                 else\r
4215                 {\r
4216                         self::$skin->parse('adminskinieimport');\r
4217                 }\r
4218                 return;\r
4219         }\r
4220         \r
4221         /**\r
4222          * Admin::action_adminskiniedoimport()\r
4223          * \r
4224          * @param       void\r
4225          * @return      void\r
4226          */\r
4227         static private function action_adminskiniedoimport()\r
4228         {\r
4229                 global $DIR_SKINS, $member;\r
4230                 \r
4231                 $member->isAdmin() or self::disallow();\r
4232                 \r
4233                 $mode = postVar('mode');\r
4234                 $skinFileRaw = postVar('skinfile');\r
4235                 $allowOverwrite = intPostVar('overwrite');\r
4236                 \r
4237                 $error = self::skiniedoimport($mode, $skinFileRaw, $allowOverwrite);\r
4238                 if ( $error )\r
4239                 {\r
4240                         self::error($error);\r
4241                         return;\r
4242                 }\r
4243                 \r
4244                 if ( !is_object(self::$skin) )\r
4245                 {\r
4246                         global $DIR_SKINS;\r
4247                         $query  = "SELECT min(sdnumber) FROM %s WHERE sdname != 'admin/bookmarklet' AND sdname LIKE 'admin/%%'";\r
4248                         $query  = sprintf($query, sql_table('skin_desc'));\r
4249                         $res    = intval(DB::getValue($query));\r
4250                         $query  = "UPDATE %s SET value = %d WHERE name = 'AdminSkin'";\r
4251                         $query  = sprintf($query, sql_table('config'), $res);\r
4252                         DB::execute($query);\r
4253                         $skin   = new Skin(0, 'AdminActions', 'AdminSkin');\r
4254                         $skin->parse('importAdmin', $DIR_SKINS . 'admin/defaultimporter.skn');\r
4255                 }\r
4256                 else\r
4257                 {\r
4258                         self::$skin->parse('adminskiniedoimport');\r
4259                 }\r
4260                 return;\r
4261         }\r
4262 \r
4263         /**\r
4264          * Admin::action_adminskinieexport()\r
4265          * \r
4266          * @param       void\r
4267          * @return      void\r
4268          */\r
4269         static private function action_adminskinieexport()\r
4270         {\r
4271                 global $member;\r
4272                 \r
4273                 $member->isAdmin() or self::disallow();\r
4274                 \r
4275                 // load skinie class\r
4276                 $aSkins = requestIntArray('skin');\r
4277                 $aTemplates = requestIntArray('template');\r
4278                 $info = postVar('info');\r
4279                 \r
4280                 self::skinieexport($aSkins, $aTemplates, $info);\r
4281                 \r
4282                 return;\r
4283         }\r
4284         \r
4285         /**\r
4286          * Admin::action_settingsedit()\r
4287          * \r
4288          * @param       Void\r
4289          * @return      Void\r
4290          */\r
4291         static private function action_settingsedit()\r
4292         {\r
4293                 global $member, $manager, $CONF, $DIR_NUCLEUS, $DIR_MEDIA;\r
4294                 \r
4295                 $member->isAdmin() or self::disallow();\r
4296                 \r
4297                 self::$skin->parse('settingsedit');\r
4298                 return;\r
4299         }\r
4300         \r
4301         /**\r
4302          * Admin::action_settingsupdate()\r
4303          * Update $CONFIG and redirect\r
4304          * \r
4305          * @param       void\r
4306          * @return      void\r
4307          */\r
4308         static private function action_settingsupdate()\r
4309         {\r
4310                 global $member, $CONF;\r
4311                 \r
4312                 $member->isAdmin() or self::disallow();\r
4313                 \r
4314                 // check if email address for admin is valid\r
4315                 if ( !NOTIFICATION::address_validation(postVar('AdminEmail')) )\r
4316                 {\r
4317                         self::error(_ERROR_BADMAILADDRESS);\r
4318                         return;\r
4319                 }\r
4320                 \r
4321                 // save settings\r
4322                 self::updateConfig('DefaultBlog',               postVar('DefaultBlog'));\r
4323                 self::updateConfig('BaseSkin',                  postVar('BaseSkin'));\r
4324                 self::updateConfig('IndexURL',                  postVar('IndexURL'));\r
4325                 self::updateConfig('AdminURL',                  postVar('AdminURL'));\r
4326                 self::updateConfig('PluginURL',                 postVar('PluginURL'));\r
4327                 self::updateConfig('SkinsURL',                  postVar('SkinsURL'));\r
4328                 self::updateConfig('ActionURL',                 postVar('ActionURL'));\r
4329                 self::updateConfig('Locale',                    postVar('Locale'));\r
4330                 self::updateConfig('AdminEmail',                postVar('AdminEmail'));\r
4331                 self::updateConfig('SessionCookie',             postVar('SessionCookie'));\r
4332                 self::updateConfig('AllowMemberCreate', postVar('AllowMemberCreate'));\r
4333                 self::updateConfig('AllowMemberMail',   postVar('AllowMemberMail'));\r
4334                 self::updateConfig('NonmemberMail',             postVar('NonmemberMail'));\r
4335                 self::updateConfig('ProtectMemNames',   postVar('ProtectMemNames'));\r
4336                 self::updateConfig('SiteName',                  postVar('SiteName'));\r
4337                 self::updateConfig('NewMemberCanLogon', postVar('NewMemberCanLogon'));\r
4338                 self::updateConfig('DisableSite',               postVar('DisableSite'));\r
4339                 self::updateConfig('DisableSiteURL',    postVar('DisableSiteURL'));\r
4340                 self::updateConfig('LastVisit',                 postVar('LastVisit'));\r
4341                 self::updateConfig('MediaURL',                  postVar('MediaURL'));\r
4342                 self::updateConfig('AllowedTypes',              postVar('AllowedTypes'));\r
4343                 self::updateConfig('AllowUpload',               postVar('AllowUpload'));\r
4344                 self::updateConfig('MaxUploadSize',             postVar('MaxUploadSize'));\r
4345                 self::updateConfig('MediaPrefix',               postVar('MediaPrefix'));\r
4346                 self::updateConfig('AllowLoginEdit',    postVar('AllowLoginEdit'));\r
4347                 self::updateConfig('DisableJsTools',    postVar('DisableJsTools'));\r
4348                 self::updateConfig('CookieDomain',              postVar('CookieDomain'));\r
4349                 self::updateConfig('CookiePath',                postVar('CookiePath'));\r
4350                 self::updateConfig('CookieSecure',              postVar('CookieSecure'));\r
4351                 self::updateConfig('URLMode',                   postVar('URLMode'));\r
4352                 self::updateConfig('CookiePrefix',              postVar('CookiePrefix'));\r
4353                 self::updateConfig('DebugVars',                 postVar('DebugVars'));\r
4354                 self::updateConfig('DefaultListSize',   postVar('DefaultListSize'));\r
4355                 self::updateConfig('AdminCSS',                  postVar('AdminCSS'));\r
4356                 self::updateConfig('AdminSkin',                 postVar('adminskin'));\r
4357                 self::updateConfig('BookmarkletSkin',   postVar('bookmarklet'));\r
4358 \r
4359                 // load new config and redirect (this way, the new locale will be used is necessary)\r
4360                 // note that when changing cookie settings, this redirect might cause the user\r
4361                 // to have to log in again.\r
4362                 getConfig();\r
4363                 redirect($CONF['AdminURL'] . '?action=manage');\r
4364                 return;\r
4365         }\r
4366         \r
4367         /**\r
4368          * Admin::action_systemoverview()\r
4369          * Output system overview\r
4370          * \r
4371          * @param       void\r
4372          * @return      void\r
4373          */\r
4374         static private function action_systemoverview()\r
4375         {\r
4376                 self::$skin->parse('systemoverview');\r
4377                 return;\r
4378         }\r
4379         \r
4380         /**\r
4381          * Admin::updateConfig()\r
4382          * \r
4383          * @param       string  $name   \r
4384          * @param       string  $val    \r
4385          * @return      integer return the ID in which the latest query posted\r
4386          */\r
4387         static private function updateConfig($name, $val)\r
4388         {\r
4389                 $query = "UPDATE %s SET value=%s WHERE name=%s";\r
4390                 $query = sprintf($query, sql_table('config'), DB::quoteValue($val), DB::quoteValue($name));\r
4391                 if ( DB::execute($query) === FALSE )\r
4392                 {\r
4393                         $err = DB::getError();\r
4394                         die(_ADMIN_SQLDIE_QUERYERROR . $err[2]);\r
4395                 }\r
4396                 return DB::getInsertId();\r
4397         }\r
4398         \r
4399         /**\r
4400          * Admin::error()\r
4401          * Error message\r
4402          * \r
4403          * @param       string  $msg    message that will be shown\r
4404          * @return      void\r
4405          */\r
4406         static public function error($msg)\r
4407         {\r
4408                 self::$headMess = $msg;\r
4409                 self::$skin->parse('adminerrorpage');\r
4410                 return;\r
4411         }\r
4412         \r
4413         /**\r
4414          * Admin::disallow()\r
4415          * add error log and show error page \r
4416          * \r
4417          * @param       void\r
4418          * @return      void\r
4419          */\r
4420         static public function disallow()\r
4421         {\r
4422                 ActionLog::add(WARNING, _ACTIONLOG_DISALLOWED . serverVar('REQUEST_URI'));\r
4423                 self::error(_ERROR_DISALLOWED);\r
4424                 return;\r
4425         }\r
4426 \r
4427         /**\r
4428          * Admin::action_PluginAdmin()\r
4429          * Output pluginadmin\r
4430          *\r
4431          * @param       string  $skinContents\r
4432          * @param       string  $extrahead\r
4433          * @return      void\r
4434          */\r
4435         static public function action_PluginAdmin($skinContents, $extrahead = '')\r
4436         {\r
4437                 self::$extrahead .= $extrahead;\r
4438                 self::$skin->parse('pluginadmin', $skinContents);\r
4439                 return;\r
4440         }\r
4441         \r
4442         /**\r
4443          * Admin::action_bookmarklet()\r
4444          * \r
4445          * @param       void\r
4446          * @return      void\r
4447          */\r
4448         static private function action_bookmarklet()\r
4449         {\r
4450                 global $member, $manager;\r
4451                 \r
4452                 $blogid = intRequestVar('blogid');\r
4453                 $member->teamRights($blogid) or self::disallow();\r
4454                 \r
4455                 self::$skin->parse('bookmarklet');\r
4456                 return;\r
4457         }\r
4458         \r
4459         /**\r
4460          * Admin::action_actionlog()\r
4461          * \r
4462          * @param       void\r
4463          * @return      void\r
4464          */\r
4465         static private function action_actionlog()\r
4466         {\r
4467                 global $member, $manager;\r
4468                 \r
4469                 $member->isAdmin() or self::disallow();\r
4470                 \r
4471                 self::$skin->parse('actionlog');\r
4472                 return;\r
4473         }\r
4474         \r
4475         /**\r
4476          * Admin::action_banlist()\r
4477          * \r
4478          * @param       void\r
4479          * @return      void\r
4480          */\r
4481         static private function action_banlist()\r
4482         {\r
4483                 global $member, $manager;\r
4484                 \r
4485                 $blogid = intRequestVar('blogid');\r
4486                 $member->blogAdminRights($blogid) or self::disallow();\r
4487                 \r
4488                 self::$skin->parse('banlist');\r
4489                 return;\r
4490         }\r
4491         \r
4492         /**\r
4493          * Admin::action_banlistdelete()\r
4494          * \r
4495          * @param       void\r
4496          * @return      void\r
4497          */\r
4498         static private function action_banlistdelete()\r
4499         {\r
4500                 global $member, $manager;\r
4501                 \r
4502                 $blogid = intRequestVar('blogid');\r
4503                 $member->blogAdminRights($blogid) or self::disallow();\r
4504                 \r
4505                 self::$skin->parse('banlistdelete');\r
4506                 return;\r
4507         }\r
4508         \r
4509         /**\r
4510          * Admin::action_banlistdeleteconfirm()\r
4511          * \r
4512          * @param       void\r
4513          * @return      void\r
4514          */\r
4515         static private function action_banlistdeleteconfirm()\r
4516         {\r
4517                 global $member, $manager;\r
4518                 \r
4519                 $blogid         = intPostVar('blogid');\r
4520                 $allblogs       = postVar('allblogs');\r
4521                 $iprange        = postVar('iprange');\r
4522                 \r
4523                 $member->blogAdminRights($blogid) or self::disallow();\r
4524                 \r
4525                 $deleted = array();\r
4526                 \r
4527                 if ( !$allblogs )\r
4528                 {\r
4529                         if ( Ban::removeBan($blogid, $iprange) )\r
4530                         {\r
4531                                 $deleted[] = $blogid;\r
4532                         }\r
4533                 }\r
4534                 else\r
4535                 {\r
4536                         // get blogs fot which member has admin rights\r
4537                         $adminblogs = $member->getAdminBlogs();\r
4538                         foreach ($adminblogs as $blogje)\r
4539                         {\r
4540                                 if ( Ban::removeBan($blogje, $iprange) )\r
4541                                 {\r
4542                                         $deleted[] = $blogje;\r
4543                                 }\r
4544                         }\r
4545                 }\r
4546                 \r
4547                 if ( sizeof($deleted) == 0 )\r
4548                 {\r
4549                         self::error(_ERROR_DELETEBAN);\r
4550                         return;\r
4551                 }\r
4552                 \r
4553                 /* TODO: we should use other ways */\r
4554                 $_REQUEST['delblogs'] = $deleted;\r
4555                 \r
4556                 self::$skin->parse('banlistdeleteconfirm');\r
4557                 return;\r
4558         }\r
4559         \r
4560         /**\r
4561          * Admin::action_banlistnewfromitem()\r
4562          * \r
4563          * @param       void\r
4564          * @return      void\r
4565          */\r
4566         static private function action_banlistnewfromitem()\r
4567         {\r
4568                 global $manager;\r
4569                 \r
4570                 $itemid = intRequestVar('itemid');\r
4571                 $item =& $manager->getItem($itemid, 1, 1);\r
4572                 self::action_banlistnew($item['blogid']);\r
4573                 return;\r
4574         }\r
4575         \r
4576         /**\r
4577          * Admin::action_banlistnew()\r
4578          * \r
4579          * @param       integer $blogid ID for weblog\r
4580          * @return      void\r
4581          */\r
4582         static private function action_banlistnew($blogid = '')\r
4583         {\r
4584                 global $member, $manager;\r
4585                 \r
4586                 if ( $blogid == '' )\r
4587                 {\r
4588                         $blogid = intRequestVar('blogid');\r
4589                 }\r
4590                 \r
4591                 $ip = requestVar('ip');\r
4592                 \r
4593                 $member->blogAdminRights($blogid) or self::disallow();\r
4594                 \r
4595                 /* TODO: we should consider to use the other way instead of this */\r
4596                 $_REQUEST['blogid'] = $blogid;          \r
4597                 \r
4598                 self::$skin->parse('banlistnew');\r
4599                 \r
4600                 return;\r
4601         }\r
4602 \r
4603         /**\r
4604          * Admin::action_banlistadd()\r
4605          * \r
4606          * @param       void\r
4607          * @return      void\r
4608          */\r
4609         static private function action_banlistadd()\r
4610         {\r
4611                 global $member;\r
4612                 \r
4613                 $blogid         = intPostVar('blogid');\r
4614                 $allblogs       = postVar('allblogs');\r
4615                 $iprange        = postVar('iprange');\r
4616                 \r
4617                 if ( $iprange == "custom" )\r
4618                 {\r
4619                         $iprange = postVar('customiprange');\r
4620                 }\r
4621                 $reason   = postVar('reason');\r
4622                 \r
4623                 $member->blogAdminRights($blogid) or self::disallow();\r
4624                 \r
4625                 // TODO: check IP range validity\r
4626                 \r
4627                 if ( !$allblogs )\r
4628                 {\r
4629                         if ( !Ban::addBan($blogid, $iprange, $reason) )\r
4630                         {\r
4631                                 self::error(_ERROR_ADDBAN);\r
4632                                 return;\r
4633                         }\r
4634                 }\r
4635                 else\r
4636                 {\r
4637                         // get blogs fot which member has admin rights\r
4638                         $adminblogs = $member->getAdminBlogs();\r
4639                         $failed = 0;\r
4640                         foreach ($adminblogs as $blogje)\r
4641                         {\r
4642                                 if ( !Ban::addBan($blogje, $iprange, $reason) )\r
4643                                 {\r
4644                                         $failed = 1;\r
4645                                 }\r
4646                         }\r
4647                         if ( $failed )\r
4648                         {\r
4649                                 self::error(_ERROR_ADDBAN);\r
4650                                 return;\r
4651                         }\r
4652                 }\r
4653                 self::action_banlist();\r
4654                 return;\r
4655         }\r
4656         \r
4657         /**\r
4658          * Admin::action_clearactionlog()\r
4659          * \r
4660          * @param       void\r
4661          * @return      void\r
4662          */\r
4663         static private function action_clearactionlog()\r
4664         {\r
4665                 global $member;\r
4666                 \r
4667                 $member->isAdmin() or self::disallow();\r
4668                 \r
4669                 ActionLog::clear();\r
4670                 \r
4671                 self::action_manage(_MSG_ACTIONLOGCLEARED);\r
4672                 return;\r
4673         }\r
4674         \r
4675         /**\r
4676          * Admin::action_backupoverview()\r
4677          * \r
4678          * @param       void\r
4679          * @return      void\r
4680          */\r
4681         static private function action_backupoverview()\r
4682         {\r
4683                 global $member, $manager;\r
4684                 \r
4685                 $member->isAdmin() or self::disallow();\r
4686                 \r
4687                 self::$skin->parse('backupoverview');\r
4688                 return;\r
4689         }\r
4690 \r
4691         /**\r
4692          * Admin::action_backupcreate()\r
4693          * create file for backup\r
4694          * \r
4695          * @param               void\r
4696          * @return      void\r
4697          * \r
4698          */\r
4699         static private function action_backupcreate()\r
4700         {\r
4701                 global $member, $DIR_LIBS;\r
4702                 \r
4703                 $member->isAdmin() or self::disallow();\r
4704                 \r
4705                 // use compression ?\r
4706                 $useGzip = (integer) postVar('gzip');\r
4707                 \r
4708                 include($DIR_LIBS . 'backup.php');\r
4709                 \r
4710                 // try to extend time limit\r
4711                 // (creating/restoring dumps might take a while)\r
4712                 @set_time_limit(1200);\r
4713                 \r
4714                 Backup::do_backup($useGzip);\r
4715                 return;\r
4716         }\r
4717         \r
4718         /**\r
4719          * Admin::action_backuprestore()\r
4720          * restoring from uploaded file\r
4721          * \r
4722          * @param               void\r
4723          * @return      void\r
4724          */\r
4725         static private function action_backuprestore()\r
4726         {\r
4727                 global $member, $DIR_LIBS;\r
4728                 \r
4729                 $member->isAdmin() or self::disallow();\r
4730                 \r
4731                 if ( intPostVar('letsgo') != 1 )\r
4732                 {\r
4733                         self::error(_ERROR_BACKUP_NOTSURE);\r
4734                         return;\r
4735                 }\r
4736                 \r
4737                 include($DIR_LIBS . 'backup.php');\r
4738                 \r
4739                 // try to extend time limit\r
4740                 // (creating/restoring dumps might take a while)\r
4741                 @set_time_limit(1200);\r
4742                 \r
4743                 $message = Backup::do_restore();\r
4744                 if ( $message != '' )\r
4745                 {\r
4746                         self::error($message);\r
4747                         return;\r
4748                 }\r
4749                 self::$skin->parse('backuprestore');\r
4750                 return;\r
4751         }\r
4752         \r
4753         /**\r
4754          * Admin::action_pluginlist()\r
4755          * output the list of installed plugins\r
4756          * \r
4757          * @param       void\r
4758          * @return      void\r
4759          * \r
4760          */\r
4761         static private function action_pluginlist()\r
4762         {\r
4763                 global $DIR_PLUGINS, $member, $manager;\r
4764                 \r
4765                 // check if allowed\r
4766                 $member->isAdmin() or self::disallow();\r
4767                 \r
4768                 self::$skin->parse('pluginlist');\r
4769                 return;\r
4770         }\r
4771         \r
4772         /**\r
4773          * Admin::action_pluginhelp()\r
4774          * \r
4775          * @param       void\r
4776          * @return      void\r
4777          */\r
4778         static private function action_pluginhelp()\r
4779         {\r
4780                 global $member, $manager, $DIR_PLUGINS, $CONF;\r
4781                 \r
4782                 // check if allowed\r
4783                 $member->isAdmin() or self::disallow();\r
4784                 \r
4785                 $plugid = intGetVar('plugid');\r
4786                 \r
4787                 if ( !$manager->pidInstalled($plugid) )\r
4788                 {\r
4789                         self::error(_ERROR_NOSUCHPLUGIN);\r
4790                         return;\r
4791                 }\r
4792                 \r
4793                 self::$skin->parse('pluginhelp');\r
4794                 return;\r
4795         }\r
4796         \r
4797         /**\r
4798          * Admin::action_pluginadd()\r
4799          * \r
4800          * @param       Void\r
4801          * @return      Void\r
4802          * \r
4803          */\r
4804         static private function action_pluginadd()\r
4805         {\r
4806                 global $member, $manager, $DIR_PLUGINS;\r
4807                 \r
4808                 // check if allowed\r
4809                 $member->isAdmin() or self::disallow();\r
4810                 \r
4811                 $name = postVar('filename');\r
4812                 \r
4813                 if ( $manager->pluginInstalled($name) )\r
4814                 {\r
4815                         self::error(_ERROR_DUPPLUGIN);\r
4816                         return;\r
4817                 }\r
4818                 \r
4819                 if ( !checkPlugin($name) )\r
4820                 {\r
4821                         self::error(_ERROR_PLUGFILEERROR . ' (' . Entity::hsc($name) . ')');\r
4822                         return;\r
4823                 }\r
4824                 \r
4825                 // get number of currently installed plugins\r
4826                 $res = DB::getResult('SELECT * FROM ' . sql_table('plugin'));\r
4827                 $numCurrent = $res->rowCount();\r
4828                 \r
4829                 // plugin will be added as last one in the list\r
4830                 $newOrder = $numCurrent + 1;\r
4831                 \r
4832                 $data = array('file' => &$name);\r
4833                 $manager->notify('PreAddPlugin', $data);\r
4834                 \r
4835                 // do this before calling getPlugin (in case the plugin id is used there)\r
4836                 $query = "INSERT INTO %s (porder, pfile) VALUES (%d, %s);";\r
4837                 $query = sprintf($query, sql_table('plugin'), (integer) $newOrder, DB::quoteValue($name));\r
4838                 DB::execute($query);\r
4839                 $iPid = DB::getInsertId();\r
4840                 \r
4841                 $manager->clearCachedInfo('installedPlugins');\r
4842                 \r
4843                 // Load the plugin for condition checking and instalation\r
4844                 $plugin =& $manager->getPlugin($name);\r
4845                 \r
4846                 // check if it got loaded (could have failed)\r
4847                 if ( !$plugin )\r
4848                 {\r
4849                         $query = "DELETE FROM %s WHERE pid=%d;";\r
4850                         $query = sprintf($query, sql_table('plugin'), (integer) $iPid);\r
4851                         \r
4852                         DB::execute($query);\r
4853                         \r
4854                         $manager->clearCachedInfo('installedPlugins');\r
4855                         self::error(_ERROR_PLUGIN_LOAD);\r
4856                         return;\r
4857                 }\r
4858                 \r
4859                 // check if plugin needs a newer Nucleus version\r
4860                 if ( getNucleusVersion() < $plugin->getMinNucleusVersion() )\r
4861                 {\r
4862                         // uninstall plugin again...\r
4863                         self::deleteOnePlugin($plugin->getID());\r
4864                         \r
4865                         // ...and show error\r
4866                         self::error(_ERROR_NUCLEUSVERSIONREQ . Entity::hsc($plugin->getMinNucleusVersion()));\r
4867                         return;\r
4868                 }\r
4869                 \r
4870                 // check if plugin needs a newer Nucleus version\r
4871                 if ( (getNucleusVersion() == $plugin->getMinNucleusVersion()) && (getNucleusPatchLevel() < $plugin->getMinNucleusPatchLevel()) )\r
4872                 {\r
4873                         // uninstall plugin again...\r
4874                         self::deleteOnePlugin($plugin->getID());\r
4875                         \r
4876                         // ...and show error\r
4877                         self::error(_ERROR_NUCLEUSVERSIONREQ . Entity::hsc( $plugin->getMinNucleusVersion() . ' patch ' . $plugin->getMinNucleusPatchLevel() ) );\r
4878                         return;\r
4879                 }\r
4880                 \r
4881                 $pluginList = $plugin->getPluginDep();\r
4882                 foreach ( $pluginList as $pluginName )\r
4883                 {\r
4884                         $res = DB::getResult('SELECT * FROM '.sql_table('plugin') . ' WHERE pfile=' . DB::quoteValue($pluginName));\r
4885                         if ($res->rowCount() == 0)\r
4886                         {\r
4887                                 // uninstall plugin again...\r
4888                                 self::deleteOnePlugin($plugin->getID());\r
4889                                 self::error(sprintf(_ERROR_INSREQPLUGIN, Entity::hsc($pluginName)));\r
4890                                 return;\r
4891                         }\r
4892                 }\r
4893                 \r
4894                 // call the install method of the plugin\r
4895                 $plugin->install();\r
4896                 \r
4897                 $data = array('plugin' => &$plugin);\r
4898                 $manager->notify('PostAddPlugin', $data);\r
4899                 \r
4900                 // update all events\r
4901                 self::action_pluginupdate();\r
4902                 return;\r
4903         }\r
4904         \r
4905         /**\r
4906          * ADMIN:action_pluginupdate():\r
4907          * \r
4908          * @param       Void\r
4909          * @return      Void\r
4910          * \r
4911          */\r
4912         static private function action_pluginupdate()\r
4913         {\r
4914                 global $member, $manager, $CONF;\r
4915                 \r
4916                 // check if allowed\r
4917                 $member->isAdmin() or self::disallow();\r
4918                 \r
4919                 // delete everything from plugin_events\r
4920                 DB::execute('DELETE FROM '.sql_table('plugin_event'));\r
4921                 \r
4922                 // loop over all installed plugins\r
4923                 $res = DB::getResult('SELECT pid, pfile FROM '.sql_table('plugin'));\r
4924                 foreach ( $res as $row )\r
4925                 {\r
4926                         $pid  =  $row['pid'];\r
4927                         $plug =& $manager->getPlugin($row['pfile']);\r
4928                         if ( $plug )\r
4929                         {\r
4930                                 $eventList = $plug->getEventList();\r
4931                                 foreach ( $eventList as $eventName )\r
4932                                 {\r
4933                                         $query = "INSERT INTO %s (pid, event) VALUES (%d, %s)";\r
4934                                         $query = sprintf($query, sql_table('plugin_event'), (integer) $pid, DB::quoteValue($eventName));\r
4935                                         DB::execute($query);\r
4936                                 }\r
4937                         }\r
4938                 }\r
4939                 redirect($CONF['AdminURL'] . '?action=pluginlist');\r
4940                 return;\r
4941         }\r
4942         \r
4943         /**\r
4944          * Admin::action_plugindelete()\r
4945          * \r
4946          * @param       void\r
4947          * @return      void\r
4948          */\r
4949         static private function action_plugindelete()\r
4950         {\r
4951                 global $member, $manager;\r
4952                 \r
4953                 // check if allowed\r
4954                 $member->isAdmin() or self::disallow();\r
4955                 \r
4956                 $pid = intGetVar('plugid');\r
4957                 \r
4958                 if ( !$manager->pidInstalled($pid) )\r
4959                 {\r
4960                         self::error(_ERROR_NOSUCHPLUGIN);\r
4961                         return;\r
4962                 }\r
4963                 \r
4964                 self::$skin->parse('plugindelete');\r
4965                 return;\r
4966         }\r
4967 \r
4968         /**\r
4969          * Admin::action_plugindeleteconfirm()\r
4970          * \r
4971          * @param       void\r
4972          * @return      void\r
4973          */\r
4974         static private function action_plugindeleteconfirm()\r
4975         {\r
4976                 global $member, $manager, $CONF;\r
4977                 \r
4978                 // check if allowed\r
4979                 $member->isAdmin() or self::disallow();\r
4980                 \r
4981                 $pid = intPostVar('plugid');\r
4982                 \r
4983                 $error = self::deleteOnePlugin($pid, 1);\r
4984                 if ( $error )\r
4985                 {\r
4986                         self::error($error);\r
4987                         return;\r
4988                 }\r
4989                 \r
4990                 redirect($CONF['AdminURL'] . '?action=pluginlist');\r
4991                 return;\r
4992         }\r
4993         \r
4994         /**\r
4995          * Admin::\r
4996          * \r
4997          * @param       void\r
4998          * @return      void\r
4999          */\r
5000         static public function deleteOnePlugin($pid, $callUninstall = 0)\r
5001         {\r
5002                 global $manager;\r
5003                 \r
5004                 $pid = intval($pid);\r
5005                 \r
5006                 if ( !$manager->pidInstalled($pid) )\r
5007                 {\r
5008                         return _ERROR_NOSUCHPLUGIN;\r
5009                 }\r
5010                 \r
5011                 $query = "SELECT pfile as result FROM %s WHERE pid=%d;";\r
5012                 $query = sprintf($query, sql_table('plugin'), (integer) $pid);\r
5013                 $name = DB::getValue($query);\r
5014                 \r
5015                 // check dependency before delete\r
5016                 $res = DB::getResult('SELECT pfile FROM ' . sql_table('plugin'));\r
5017                 foreach ( $res as $row )\r
5018                 {\r
5019                         $plug =& $manager->getPlugin($row['pfile']);\r
5020                         if ( $plug )\r
5021                         {\r
5022                                 $depList = $plug->getPluginDep();\r
5023                                 foreach ( $depList as $depName )\r
5024                                 {\r
5025                                         if ( $name == $depName )\r
5026                                         {\r
5027                                                 return sprintf(_ERROR_DELREQPLUGIN, $row['pfile']);\r
5028                                         }\r
5029                                 }\r
5030                         }\r
5031                 }\r
5032                 \r
5033                 $data = array('plugid' => $pid);\r
5034                 $manager->notify('PreDeletePlugin', $data);\r
5035                 \r
5036                 // call the unInstall method of the plugin\r
5037                 if ( $callUninstall )\r
5038                 {\r
5039                         $plugin =& $manager->getPlugin($name);\r
5040                         if ( $plugin )\r
5041                         {\r
5042                                 $plugin->unInstall();\r
5043                         }\r
5044                 }\r
5045                 \r
5046                 // delete all subscriptions\r
5047                 DB::execute('DELETE FROM ' . sql_table('plugin_event') . ' WHERE pid=' . $pid);\r
5048                 \r
5049                 // delete all options\r
5050                 // get OIDs from plugin_option_desc\r
5051                 $res = DB::getResult('SELECT oid FROM ' . sql_table('plugin_option_desc') . ' WHERE opid=' . $pid);\r
5052                 $aOIDs = array();\r
5053                 foreach ( $res as $row )\r
5054                 {\r
5055                         array_push($aOIDs, $row['oid']);\r
5056                 }\r
5057                 \r
5058                 // delete from plugin_option and plugin_option_desc\r
5059                 DB::execute('DELETE FROM ' . sql_table('plugin_option_desc') . ' WHERE opid=' . $pid);\r
5060                 if (count($aOIDs) > 0)\r
5061                 {\r
5062                         DB::execute('DELETE FROM ' . sql_table('plugin_option') . ' WHERE oid in (' . implode(',', $aOIDs) . ')');\r
5063                 }\r
5064                 \r
5065                 // update order numbers\r
5066                 $res = DB::getValue('SELECT porder FROM ' . sql_table('plugin') . ' WHERE pid=' . $pid);\r
5067                 DB::execute('UPDATE ' . sql_table('plugin') . ' SET porder=(porder - 1) WHERE porder>' . $res);\r
5068                 \r
5069                 // delete row\r
5070                 DB::execute('DELETE FROM ' . sql_table('plugin') . ' WHERE pid=' . $pid);\r
5071                 \r
5072                 $manager->clearCachedInfo('installedPlugins');\r
5073                 $data = array('plugid' => $pid);\r
5074                 $manager->notify('PostDeletePlugin', $data);\r
5075                 \r
5076                 return '';\r
5077         }\r
5078         \r
5079         /**\r
5080          * Admin::action_pluginup()\r
5081          * \r
5082          * @param       void\r
5083          * @return      void\r
5084          */\r
5085         static private function action_pluginup()\r
5086         {\r
5087                 global $member, $manager, $CONF;\r
5088                 \r
5089                 // check if allowed\r
5090                 $member->isAdmin() or self::disallow();\r
5091                 \r
5092                 $plugid = intGetVar('plugid');\r
5093                 \r
5094                 if ( !$manager->pidInstalled($plugid) )\r
5095                 {\r
5096                         self::error(_ERROR_NOSUCHPLUGIN);\r
5097                         return;\r
5098                 }\r
5099                 \r
5100                 // 1. get old order number\r
5101                 $oldOrder = DB::getValue('SELECT porder FROM ' . sql_table('plugin') . ' WHERE pid=' . $plugid);\r
5102                 \r
5103                 // 2. calculate new order number\r
5104                 $newOrder = ($oldOrder > 1) ? ($oldOrder - 1) : 1;\r
5105                 \r
5106                 // 3. update plug numbers\r
5107                 DB::execute('UPDATE ' . sql_table('plugin') . ' SET porder=' . $oldOrder . ' WHERE porder=' . $newOrder);\r
5108                 DB::execute('UPDATE ' . sql_table('plugin') . ' SET porder=' . $newOrder . ' WHERE pid=' . $plugid);\r
5109                 \r
5110                 //self::action_pluginlist();\r
5111                 // To avoid showing ticket in the URL, redirect to pluginlist, instead.\r
5112                 redirect($CONF['AdminURL'] . '?action=pluginlist');\r
5113                 return;\r
5114         }\r
5115         \r
5116         /**\r
5117          * Admin::action_plugindown()\r
5118          * \r
5119          * @param       void\r
5120          * @return      void\r
5121          */\r
5122         static private function action_plugindown()\r
5123         {\r
5124                 global $member, $manager, $CONF;\r
5125                 \r
5126                 // check if allowed\r
5127                 $member->isAdmin() or self::disallow();\r
5128                 \r
5129                 $plugid = intGetVar('plugid');\r
5130                 if ( !$manager->pidInstalled($plugid) )\r
5131                 {\r
5132                         self::error(_ERROR_NOSUCHPLUGIN);\r
5133                         return;\r
5134                 }\r
5135                 \r
5136                 // 1. get old order number\r
5137                 $oldOrder = DB::getValue('SELECT porder FROM ' . sql_table('plugin') . ' WHERE pid=' . $plugid);\r
5138                 \r
5139                 $res = DB::getResult('SELECT * FROM ' . sql_table('plugin'));\r
5140                 $maxOrder = $res->rowCount();\r
5141                 \r
5142                 // 2. calculate new order number\r
5143                 $newOrder = ($oldOrder < $maxOrder) ? ($oldOrder + 1) : $maxOrder;\r
5144                 \r
5145                 // 3. update plug numbers\r
5146                 DB::execute('UPDATE ' . sql_table('plugin') . ' SET porder=' . $oldOrder . ' WHERE porder=' . $newOrder);\r
5147                 DB::execute('UPDATE ' . sql_table('plugin') . ' SET porder=' . $newOrder . ' WHERE pid=' . $plugid);\r
5148                 \r
5149                 //self::action_pluginlist();\r
5150                 // To avoid showing ticket in the URL, redirect to pluginlist, instead.\r
5151                 redirect($CONF['AdminURL'] . '?action=pluginlist');\r
5152                 return;\r
5153         }\r
5154         \r
5155         /**\r
5156          * Admin::action_pluginoptions()\r
5157          * \r
5158          * Output Plugin option page\r
5159          * \r
5160          * @access      public\r
5161          * @param       string $message message when fallbacked\r
5162          * @return      void\r
5163          * \r
5164          */\r
5165         static private function action_pluginoptions($message = '')\r
5166         {\r
5167                 global $member, $manager;\r
5168                 \r
5169                 // check if allowed\r
5170                 $member->isAdmin() or self::disallow();\r
5171                 \r
5172                 $pid = intRequestVar('plugid');\r
5173                 if ( !$manager->pidInstalled($pid) )\r
5174                 {\r
5175                         self::error(_ERROR_NOSUCHPLUGIN);\r
5176                         return;\r
5177                 }\r
5178                 \r
5179                 if ( isset($message) )\r
5180                 {\r
5181                         self::$headMess = $message;\r
5182                 }\r
5183                 $plugname       = $manager->getPluginNameFromPid($pid);\r
5184                 $plugin         = $manager->getPlugin($plugname);\r
5185                 Admin::$extrahead .= "<script type=\"text/javascript\" src=\"<%skinfile(/javascripts/numbercheck.js)%>\"></script>\n";\r
5186                 \r
5187                 self::$skin->parse('pluginoptions');\r
5188                 return;\r
5189         }\r
5190         \r
5191         /**\r
5192          * Admin::action_pluginoptionsupdate()\r
5193          * \r
5194          * Update plugin options and fallback to plugin option page\r
5195          * \r
5196          * @access      public\r
5197          * @param       void\r
5198          * @return      void\r
5199          */\r
5200         static private function action_pluginoptionsupdate()\r
5201         {\r
5202                 global $member, $manager;\r
5203                 \r
5204                 // check if allowed\r
5205                 $member->isAdmin() or self::disallow();\r
5206                 \r
5207                 $pid = intRequestVar('plugid');\r
5208                 \r
5209                 if ( !$manager->pidInstalled($pid) )\r
5210                 {\r
5211                         self::error(_ERROR_NOSUCHPLUGIN);\r
5212                         return;\r
5213                 }\r
5214                 \r
5215                 $aOptions = requestArray('plugoption');\r
5216                 NucleusPlugin::apply_plugin_options($aOptions);\r
5217                 \r
5218                 $data = array(\r
5219                         'context'       => 'global',\r
5220                         'plugid'        => $pid\r
5221                 );\r
5222                 $manager->notify('PostPluginOptionsUpdate', $data);\r
5223                 \r
5224                 self::action_pluginoptions(_PLUGS_OPTIONS_UPDATED);\r
5225                 return;\r
5226         }\r
5227         \r
5228         /**\r
5229          * Admin::skineditgeneral()\r
5230          * \r
5231          * @param       integer $skinid\r
5232          * @param       string  $handler\r
5233          * @return      string  empty or message if failed\r
5234          */\r
5235         static private function skineditgeneral($skinid, $handler='')\r
5236         {\r
5237                 global $manager;\r
5238                 \r
5239                 $name = postVar('name');\r
5240                 $desc = postVar('desc');\r
5241                 $type = postVar('type');\r
5242                 $inc_mode = postVar('inc_mode');\r
5243                 $inc_prefix = postVar('inc_prefix');\r
5244                 \r
5245                 $skin =& $manager->getSkin($skinid, $handler);\r
5246                 \r
5247                 // 1. Some checks\r
5248                 if ( !isValidSkinName($name) )\r
5249                 {\r
5250                         return _ERROR_BADSKINNAME;\r
5251                 }\r
5252                 \r
5253                 if ( ($skin->getName() != $name) && SKIN::exists($name) )\r
5254                 {\r
5255                         return _ERROR_DUPSKINNAME;\r
5256                 }\r
5257                 \r
5258                 if ( !$type )\r
5259                 {\r
5260                         $type = 'text/html';\r
5261                 }\r
5262                 \r
5263                 if ( !$inc_mode )\r
5264                 {\r
5265                         $inc_mode = 'normal';\r
5266                 }\r
5267                 \r
5268                 // 2. Update description\r
5269                 $skin->updateGeneralInfo($name, $desc, $type, $inc_mode, $inc_prefix);\r
5270                 \r
5271                 return '';\r
5272         }\r
5273         /**\r
5274          * Admin::skindeleteconfirm()\r
5275          * \r
5276          * @param       integer $skinid\r
5277          * @return      void\r
5278          */\r
5279         static private function skindeleteconfirm($skinid)\r
5280         {\r
5281                 global $manager;\r
5282                 \r
5283                 if ( !preg_match('#^admin/#', self::$action) )\r
5284                 {\r
5285                         $event_identifier = 'Skin';\r
5286                 }\r
5287                 else\r
5288                 {\r
5289                         $event_identifier = 'AdminSkin';\r
5290                 }\r
5291                 \r
5292                 $manager->notify("PreDelete{$event_identifier}", array('skinid' => $skinid));\r
5293                 \r
5294                 // 1. delete description\r
5295                 $query = "DELETE FROM %s WHERE sdnumber=%d;";\r
5296                 $query = sprintf($query, sql_table('skin_desc'), (integer) $skinid);\r
5297                 DB::execute($query);\r
5298                 \r
5299                 // 2. delete parts\r
5300                 $query = "DELETE FROM %s WHERE sdesc=%d;";\r
5301                 $query = sprintf($query, sql_table('skin'), (integer) $skinid);\r
5302                 DB::execute($query);\r
5303                 \r
5304                 $manager->notify("PostDelete{$event_identifier}", array('skinid' => $skinid));\r
5305                 \r
5306                 return;\r
5307         }\r
5308         \r
5309         /**\r
5310          * Admin::skinremovetypeconfirm()\r
5311          * \r
5312          * @param       integer $skinid\r
5313          * @param       string  $skintype\r
5314          * @return      string  empty or message if failed\r
5315          */\r
5316         static private function skinremovetypeconfirm($skinid, $skintype)\r
5317         {\r
5318                 global $manager;\r
5319                 \r
5320                 if ( !preg_match('#^admin/#', self::$action) )\r
5321                 {\r
5322                         $event_identifier = 'Skin';\r
5323                 }\r
5324                 else\r
5325                 {\r
5326                         $event_identifier = 'AdminSkin';\r
5327                 }\r
5328                 \r
5329                 if ( !isValidShortName($skintype) )\r
5330                 {\r
5331                         return _ERROR_SKIN_PARTS_SPECIAL_DELETE;\r
5332                 }\r
5333                 \r
5334                 $data = array(\r
5335                         'skinid'        => $skinid,\r
5336                         'skintype'      => $skintype\r
5337                 );\r
5338                 $manager->notify("PreDelete{$event_identifier}Part", $data);\r
5339                 \r
5340                 // delete part\r
5341                 $query = 'DELETE FROM %s WHERE sdesc = %d AND stype = %s;';\r
5342                 $query = sprintf($query, sql_table('skin'), (integer) $skinid, DB::quoteValue($skintype) );\r
5343                 DB::execute($query);\r
5344                 \r
5345                 $data = array(\r
5346                         'skinid'        => $skinid,\r
5347                         'skintype'      => $skintype\r
5348                 );\r
5349                 $manager->notify("PostDelete{$event_identifier}Part", $data);\r
5350                 \r
5351                 return '';\r
5352         }\r
5353         \r
5354         /**\r
5355          * Admin::skinclone()\r
5356          * \r
5357          * @param       integer $skinid\r
5358          * @param       string  $handler\r
5359          * @return      void\r
5360          */\r
5361         static private function skinclone($skinid, $handler='')\r
5362         {\r
5363                 global $manager;\r
5364                 \r
5365                 // 1. read skin to clone\r
5366                 $skin =& $manager->getSkin($skinid, $handler);\r
5367                 $name = "{$skin->getName()}_clone";\r
5368                 \r
5369                 // if a skin with that name already exists:\r
5370                 if ( Skin::exists($name) )\r
5371                 {\r
5372                         $i = 1;\r
5373                         while ( Skin::exists($name . $i) )\r
5374                         {\r
5375                                 $i++;\r
5376                         }\r
5377                         $name .= $i;\r
5378                 }\r
5379                 \r
5380                 // 2. create skin desc\r
5381                 $newid = Skin::createNew(\r
5382                         $name,\r
5383                         $skin->getDescription(),\r
5384                         $skin->getContentType(),\r
5385                         $skin->getIncludeMode(),\r
5386                         $skin->getIncludePrefix()\r
5387                 );\r
5388                 \r
5389                 // 3. clone\r
5390                 $query = "SELECT stype FROM %s WHERE sdesc=%d;";\r
5391                 $query = sprintf($query, sql_table('skin'), (integer) $skinid);\r
5392                 \r
5393                 $res = DB::getResult($query);\r
5394                 foreach ( $res as $row )\r
5395                 {\r
5396                         $content = $skin->getContentFromDB($row['stype']);\r
5397                         if ( $content )\r
5398                         {\r
5399                                 $query = "INSERT INTO %s (sdesc, scontent, stype) VALUES (%d, %s, %s)";\r
5400                                 $query = sprintf($query, sql_table('skin'), (integer) $newid, DB::quoteValue($content), DB::quoteValue($row['stype']));\r
5401                                 DB::execute($query);\r
5402                         }\r
5403                 }\r
5404                 return;\r
5405         }\r
5406         \r
5407         /**\r
5408          * Admin::skinieimport()\r
5409          * \r
5410          * @param       string  $mode\r
5411          * @param       string  $skinFileRaw\r
5412          * @return      string  empty or message if failed\r
5413          */\r
5414         static private function skinieimport($mode, $skinFileRaw)\r
5415         {\r
5416                 global $DIR_LIBS, $DIR_SKINS;\r
5417                 \r
5418                 // load skinie class\r
5419                 include_once($DIR_LIBS . 'skinie.php');\r
5420                 \r
5421                 $importer = new SkinImport();\r
5422                 \r
5423                 // get full filename\r
5424                 if ( $mode == 'file' )\r
5425                 {\r
5426                         $skinFile = $DIR_SKINS . $skinFileRaw . '/skinbackup.xml';\r
5427                 }\r
5428                 else\r
5429                 {\r
5430                         $skinFile = $skinFileRaw;\r
5431                 }\r
5432                 \r
5433                 // read only metadata\r
5434                 $error = $importer->readFile($skinFile, 1);\r
5435                 if ( $error )\r
5436                 {\r
5437                         unset($importer);\r
5438                         return $error;\r
5439                 }\r
5440                 \r
5441                 /* TODO: we should consider to use the other way insterad of this */\r
5442                 $_REQUEST['skininfo']   = $importer->getInfo();\r
5443                 $_REQUEST['skinnames']  = $importer->getSkinNames();\r
5444                 $_REQUEST['tpltnames']  = $importer->getTemplateNames();\r
5445                 \r
5446                 // clashes\r
5447                 $skinNameClashes                = $importer->checkSkinNameClashes();\r
5448                 $templateNameClashes    = $importer->checkTemplateNameClashes();\r
5449                 $hasNameClashes                 = (count($skinNameClashes) > 0) || (count($templateNameClashes) > 0);\r
5450                 \r
5451                 /* TODO: we should consider to use the other way insterad of this */\r
5452                 $_REQUEST['skinclashes'] = $skinNameClashes;\r
5453                 $_REQUEST['tpltclashes'] = $templateNameClashes;\r
5454                 $_REQUEST['nameclashes'] = $hasNameClashes ? 1 : 0;\r
5455                 \r
5456                 unset($importer);\r
5457                 return '';\r
5458         }\r
5459         \r
5460         /**\r
5461          * Admin::skinieedoimport()\r
5462          * \r
5463          * @param       string  $mode\r
5464          * @param       string  $skinFileRaw\r
5465          * @param       boolean $allowOverwrite\r
5466          * @return      string  empty   or message if failed\r
5467          */\r
5468         static private function skiniedoimport($mode, $skinFileRaw, $allowOverwrite)\r
5469         {\r
5470                 global $DIR_LIBS, $DIR_SKINS;\r
5471                 \r
5472                 // load skinie class\r
5473                 include_once($DIR_LIBS . 'skinie.php');\r
5474                 \r
5475                 $importer = new SkinImport();\r
5476                 \r
5477                 // get full filename\r
5478                 if ( $mode == 'file' )\r
5479                 {\r
5480                         $skinFile = $DIR_SKINS . $skinFileRaw . '/skinbackup.xml';\r
5481                 }\r
5482                 else\r
5483                 {\r
5484                         $skinFile = $skinFileRaw;\r
5485                 }\r
5486                 \r
5487                 $error = $importer->readFile($skinFile);\r
5488                 if ( $error )\r
5489                 {\r
5490                         unset($importer);\r
5491                         return $error;\r
5492                 }\r
5493                 \r
5494                 $error = $importer->writeToDatabase($allowOverwrite);\r
5495                 if ( $error )\r
5496                 {\r
5497                         unset($importer);\r
5498                         return $error;\r
5499                 }\r
5500                 \r
5501                 /* TODO: we should consider to use the other way insterad of this */\r
5502                 $_REQUEST['skininfo']  = $importer->getInfo();\r
5503                 $_REQUEST['skinnames'] = $importer->getSkinNames();\r
5504                 $_REQUEST['tpltnames'] = $importer->getTemplateNames();\r
5505                 \r
5506                 unset($importer);\r
5507                 return '';\r
5508         }\r
5509         \r
5510         /**\r
5511          * Admin::skinieexport()\r
5512          * \r
5513          * @param       array   $aSkins\r
5514          * @param       array   $aTemplates\r
5515          * @param       string  $info\r
5516          * @return      void\r
5517          */\r
5518         static private function skinieexport($aSkins, $aTemplates, $info)\r
5519         {\r
5520                 global $DIR_LIBS;\r
5521                 \r
5522                 // load skinie class\r
5523                 include_once($DIR_LIBS . 'skinie.php');\r
5524                 \r
5525                 if ( !is_array($aSkins) )\r
5526                 {\r
5527                         $aSkins = array();\r
5528                 }\r
5529                 \r
5530                 if (!is_array($aTemplates))\r
5531                 {\r
5532                         $aTemplates = array();\r
5533                 }\r
5534                 \r
5535                 $skinList = array_keys($aSkins);\r
5536                 $templateList = array_keys($aTemplates);\r
5537                 \r
5538                 $exporter = new SkinExport();\r
5539                 foreach ( $skinList as $skinId )\r
5540                 {\r
5541                         $exporter->addSkin($skinId);\r
5542                 }\r
5543                 foreach ( $templateList as $templateId )\r
5544                 {\r
5545                         $exporter->addTemplate($templateId);\r
5546                 }\r
5547                 $exporter->setInfo($info);\r
5548                 $exporter->export();\r
5549                 \r
5550                 return;\r
5551         }\r
5552         \r
5553         /**\r
5554          * Admin::action_parseSpecialskin()\r
5555          * \r
5556          * @param       void\r
5557          * @return      void\r
5558          */\r
5559         static private function action_parseSpecialskin()\r
5560         {\r
5561                 self::$skin->parse(self::$action);\r
5562                 return;\r
5563         }\r
5564         \r
5565         /**\r
5566          * Admin::getAdminskinIDFromName()\r
5567          * \r
5568          * @param       string  $skinname       name of skin\r
5569          * @return      integer ID for skin\r
5570          */\r
5571         static private function getAdminskinIDFromName($skinname)\r
5572         {\r
5573                 $query          = "SELECT 'sdnumber' as result FROM %s WHERE sdname = %s;";\r
5574                 $query          = sprintf($query, sql_table('skin_desc'), DB::quoteValue($skinname));\r
5575                 $admnSknID      = DB::getValue($query);\r
5576                 return (integer) $adminSkinID;\r
5577         }\r
5578         \r
5579         /**\r
5580          * Admin::getAdminskinNameFromID()\r
5581          * \r
5582          * @param       integer $skinid ID for skin\r
5583          * @return      integer ID for skin\r
5584          */\r
5585         static private function getAdminskinNameFromID($skinid)\r
5586         {\r
5587                 $query          = "SELECT sdname as result FROM %s WHERE sdnumber = %d;";\r
5588                 $query          = sprintf($query, sql_table('skin_desc'), (integer) $skinid);\r
5589                 $admnSknID      = DB::getValue($query);\r
5590                 return (integer) $adminSkinID;\r
5591         }\r
5592         \r
5593         /**\r
5594          * Admin::getAdminextrahead()\r
5595          */\r
5596         static public function getAdminextrahead()\r
5597         {\r
5598                 return self::$extrahead;\r
5599         }\r
5600         \r
5601         /**\r
5602          * Admin::getAdminpassvar()\r
5603          */\r
5604         static public function getAdminpassvar()\r
5605         {\r
5606                 return self::$passvar;\r
5607         }\r
5608         \r
5609         /**\r
5610          * Admin::getAdminAction()\r
5611          */\r
5612         static public function getAdminAction()\r
5613         {\r
5614                 return self::$action;\r
5615         }\r
5616         \r
5617         /**\r
5618          * Admin::getAdminaOption()\r
5619          */\r
5620         static public function getAdminaOption()\r
5621         {\r
5622                 return self::$aOptions;\r
5623         }\r
5624         \r
5625         /**\r
5626          * Admin::action_importAdmin()\r
5627          * \r
5628          * @param       void\r
5629          * @return      void\r
5630          */\r
5631         static private function action_importAdmin()\r
5632         {\r
5633                 global $DIR_ADMINSKINS, $action;\r
5634                 if ( $action == 'adminskinieimport' )\r
5635                 {\r
5636                         self::doAdminskinimport();\r
5637                 }\r
5638                 $skn = array();\r
5639                 if ( $action == 'showlogin' )\r
5640                 {\r
5641                         $skinName = 'showlogin';\r
5642                         $actnName = 'showlogin';\r
5643                 }\r
5644                 else\r
5645                 {\r
5646                         $skinName = 'defaultimporter';\r
5647                         $actnName = 'importAdmin';\r
5648                 }\r
5649                 \r
5650                 /* TODO: why??? */\r
5651                 $contents                               = file_get_contents($DIR_ADMINSKINS . $skinName . '.skn');\r
5652                 $skn['id']                              = 0;\r
5653                 $skn['description']             = $skinName;\r
5654                 $skn['contentType']             = 'importAdmin';\r
5655                 $skn['includeMode']             = 'normal';\r
5656                 $skn['includePrefix']   = '';\r
5657                 $skn['name']                    = 'defaultinporter';\r
5658                 \r
5659                 self::$skin                             = (object) $skn;\r
5660                 $handler = new AdminActions($actnName, self::$skin, $this);\r
5661                 \r
5662                 $parser = new PARSER($handler);\r
5663                 $parser->setSkin(self::$skin);\r
5664                 $parser->parse($contents);\r
5665                 \r
5666                 return;\r
5667         }\r
5668         \r
5669         /**\r
5670          * Admin::doAdminskinimport()\r
5671          * \r
5672          * @param       void\r
5673          * @return      void\r
5674          */\r
5675         static private function doAdminskinimport()\r
5676         {\r
5677                 global $DIR_LIBS, $DIR_ADMINSKINS, $CONF, $member;\r
5678                 \r
5679                 $member->isAdmin() or self::disallow();\r
5680                 \r
5681                 include_once($DIR_LIBS . 'Skinie.php');\r
5682                 $skinFileRaw = postVar('skinfile');\r
5683                 $mode = postVar('mode');\r
5684                 $allowOverwrite = intPostVar('overwrite');\r
5685                 \r
5686                 if ( $mode == 'file' )\r
5687                 {\r
5688                         $skinFile = $DIR_ADMINSKINS . $skinFileRaw . '/skinbackup.xml';\r
5689                 }\r
5690                 else\r
5691                 {\r
5692                         $skinFile = $skinFileRaw;\r
5693                 }\r
5694                 \r
5695                 $importer       = new SKINIMPORT();\r
5696                 $error          = $importer->readFile($skinFile);\r
5697                 if ( $error )\r
5698                 {\r
5699                         self::error($error);\r
5700                         return;\r
5701                 }\r
5702                 $error = $importer->writeToDatabase($allowOverwrite);\r
5703                 if ( $error )\r
5704                 {\r
5705                         self::error($error);\r
5706                         return;\r
5707                 }\r
5708                 \r
5709                 $_REQUEST['skininfo']   = $importer->getInfo();\r
5710                 $_REQUEST['skinnames']  = $importer->getSkinNames();\r
5711                 $_REQUEST['tpltnames']  = $importer->getTemplateNames();\r
5712                 \r
5713                 header('Location: ' . $CONF['AdminURL']);\r
5714                 return;\r
5715         }\r
5716 }\r