diff options
Diffstat (limited to 'Application/Controllers/HistoryController.php')
-rw-r--r-- | Application/Controllers/HistoryController.php | 650 |
1 files changed, 650 insertions, 0 deletions
diff --git a/Application/Controllers/HistoryController.php b/Application/Controllers/HistoryController.php new file mode 100644 index 0000000..e50b7e1 --- /dev/null +++ b/Application/Controllers/HistoryController.php @@ -0,0 +1,650 @@ +<?php + +// h-source, a web software to build a community of people that want to share their hardware information. +// Copyright (C) 2010 Antonio Gallo (h-source-copyright.txt) +// +// This file is part of h-source +// +// h-source is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// h-source is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with h-source. If not, see <http://www.gnu.org/licenses/>. + +if (!defined('EG')) die('Direct access not allowed!'); + +class HistoryController extends BaseController +{ + + public static $typeTable = array( + 'message' => 'message', + 'talk' => 'talk', + 'user' => 'user', + 'issue' => 'issue', + 'wiki_talk' => 'wiki talk', + 'page' => 'wiki page', + 'page_del' => 'wiki page', + 'device' => 'device page', + 'device_app' => 'device page', + 'device_cl' => 'device page', + 'issue_del' => 'issue', //registered + 'issue_ins' => 'issue', //registered + 'message_ins' => 'message', //registered + 'talk_ins' => 'talk', //registered + 'wiki_talk_ins' => 'wiki talk',//registered + 'hardware' => 'hardware', //registered + 'wiki' => 'wiki', //registered + ); + + public static $actionTable = array( + 'hide' => 'hide', + 'show' => 'show', + 'block' => 'block', + 'unblock' => 'unblock', + 'open' => 'open', + 'close' => 'close', + 'pageblock' => 'block', + 'pageunblock' => 'unblock', + 'pagehide' => 'hide', + 'pageshow' => 'show', + 'devicehide' => 'hide', + 'deviceshow' => 'show', + 'deviceapprove' => 'approve', + 'deviceclear' => 'perm deleted', + 'issuehide' => 'hide', + 'issueshow' => 'show', + 'insert' => 'insert', //registered + 'update' => 'update', //registered + ); + + protected $strings = array( + + 'hide' => array( + + 'action' => 'hide', + 'check_status' => 'no', + 'to_status' => 'yes', + 'exec_string' => 'The message has been hidden. Just reload the page', + 'error_string' => 'Error: the message is already hidden', + + ), + + 'show' => array( + + 'action' => 'show', + 'check_status' => 'yes', + 'to_status' => 'no', + 'exec_string' => 'The message is no more hidden. Just reload the page', + 'error_string' => 'Error: the message is already visible', + + ), + + 'block' => array( + + 'action' => 'block', + 'check_status' => 'no', + 'to_status' => 'yes', + 'exec_string' => 'The user has been blocked. Just reload the page', + 'error_string' => 'Error: the user is already blocked', + + ), + + 'unblock' => array( + + 'action' => 'unblock', + 'check_status' => 'yes', + 'to_status' => 'no', + 'exec_string' => 'The user is no more blocked. Just reload the page', + 'error_string' => 'Error: the user is already un-blocked', + + ), + + 'open' => array( + + 'action' => 'open', + 'check_status' => 'closed', + 'to_status' => 'opened', + 'exec_string' => 'The issue has been opened. Just reload the page', + 'error_string' => 'Error: the issue is already opened', + + ), + + 'close' => array( + + 'action' => 'close', + 'check_status' => 'opened', + 'to_status' => 'closed', + 'exec_string' => 'The issue has been closed. Just reload the page', + 'error_string' => 'Error: the issue is already closed', + + ), + + 'pageblock' => array( + + 'action' => 'pageblock', + 'check_status' => 'no', + 'to_status' => 'yes', + 'exec_string' => 'The wiki page has been blocked. Just reload the page', + 'error_string' => 'Error: the wiki page is already blocked', + + ), + + 'pageunblock' => array( + + 'action' => 'pageunblock', + 'check_status' => 'yes', + 'to_status' => 'no', + 'exec_string' => 'The wiki page is no more blocked. Just reload the page', + 'error_string' => 'Error: the wiki page is already un-blocked', + + ), + + 'pagehide' => array( + + 'action' => 'pagehide', + 'check_status' => 'no', + 'to_status' => 'yes', + 'exec_string' => 'The wiki page has been hidden. Just reload the page', + 'error_string' => 'Error: the wiki page is already hidden', + + ), + + 'pageshow' => array( + + 'action' => 'pageshow', + 'check_status' => 'yes', + 'to_status' => 'no', + 'exec_string' => 'The wiki page is no more hidden. Just reload the page', + 'error_string' => 'Error: the wiki page is already visible', + + ), + + 'issuehide' => array( + + 'action' => 'issuehide', + 'check_status' => 'no', + 'to_status' => 'yes', + 'exec_string' => 'The issue has been hidden. Just reload the page', + 'error_string' => 'Error: the issue is already hidden', + + ), + + 'issueshow' => array( + + 'action' => 'issueshow', + 'check_status' => 'yes', + 'to_status' => 'no', + 'exec_string' => 'The issue is no more hidden. Just reload the page', + 'error_string' => 'Error: the issue is already visible', + + ), + + 'devicehide' => array( + + 'action' => 'devicehide', + 'check_status' => 'no', + 'to_status' => 'yes', + 'exec_string' => 'The device page has been hidden. Just reload the page', + 'error_string' => 'Error: the device page is already hidden', + 'allowed_only_if' => array('cleared'=>'no'), + + ), + + 'deviceshow' => array( + + 'action' => 'deviceshow', + 'check_status' => 'yes', + 'to_status' => 'no', + 'exec_string' => 'The device page is no more hidden. Just reload the page', + 'error_string' => 'Error: the device page is already visible', + 'allowed_only_if' => array('cleared'=>'no'), + + ), + + 'deviceapprove' => array( + + 'action' => 'deviceapprove', + 'check_status' => 'no', + 'to_status' => 'yes', + 'exec_string' => 'The device page has been approved. Just reload the page', + 'error_string' => 'Error: the device page is already approved', + 'allowed_only_if' => array('cleared'=>'no'), + + ), + + 'deviceclear' => array( + + 'action' => 'deviceclear', + 'check_status' => 'no', + 'to_status' => 'yes', + 'exec_string' => 'The device page has been permanently deleted. Just reload the page', + 'error_string' => 'Error: the device page has already been permanently deleted', + 'method' => 'permanentlyDelete', + + ), + ); + + protected $types = array( + + 'message' => array( + + 'clean_type' => 'message', + 'model_name' => 'MessagesModel', + 'id_name' => 'id_mes', + 'field_name' => 'deleted', + 'actions' => array('hide','show'), + 'group' => 'moderator', + + ), + + 'talk' => array( + + 'clean_type' => 'talk', + 'model_name' => 'TalkModel', + 'id_name' => 'id_talk', + 'field_name' => 'deleted', + 'actions' => array('hide','show'), + 'group' => 'moderator', + + ), + + 'user' => array( + + 'clean_type' => 'user', + 'model_name' => 'UsersModel', + 'id_name' => 'id_user', + 'field_name' => 'blocked', + 'actions' => array('block','unblock'), + 'group' => 'admin', + + ), + + 'issue' => array( + + 'clean_type' => 'issue', + 'model_name' => 'IssuesModel', + 'id_name' => 'id_issue', + 'field_name' => 'status', + 'actions' => array('open','close'), + 'group' => 'moderator', + 'types_to_show' => 'issue,issue_del', + + ), + + 'wiki_talk' => array( + + 'clean_type' => 'wiki_talk', + 'model_name' => 'WikitalkModel', + 'id_name' => 'id_talk', + 'field_name' => 'deleted', + 'actions' => array('hide','show'), + 'group' => 'moderator', + + ), + + //page blocked or not + 'page' => array( + + 'clean_type' => 'page', + 'model_name' => 'WikiModel', + 'id_name' => 'id_wiki', + 'field_name' => 'blocked', + 'actions' => array('pageblock','pageunblock'), + 'group' => 'admin', + 'types_to_show' => 'page,page_del', + + ), + + //page hidden or not + 'page_del' => array( + + 'clean_type' => 'page_del', + 'model_name' => 'WikiModel', + 'id_name' => 'id_wiki', + 'field_name' => '-deleted', + 'actions' => array('pagehide','pageshow'), + 'group' => 'admin', + + ), + + //issue hidden or not + 'issue_del' => array( + + 'clean_type' => 'issue_del', + 'model_name' => 'IssuesModel', + 'id_name' => 'id_issue', + 'field_name' => 'deleted', + 'actions' => array('issuehide','issueshow'), + 'group' => 'moderator', + + ), + + //device page blocked or not + 'device' => array( + + 'clean_type' => 'device', + 'model_name' => 'HardwareModel', + 'id_name' => 'id_hard', + 'field_name' => '-deleted', + 'actions' => array('devicehide','deviceshow'), + 'group' => 'admin', + 'types_to_show' => 'device_app,device,device_cl', + + ), + + //device page approved + 'device_app' => array( + + 'clean_type' => 'device_app', + 'model_name' => 'HardwareModel', + 'id_name' => 'id_hard', + 'field_name' => 'approved', + 'actions' => array('deviceapprove'), + 'group' => 'admin', + + ), + + //device page cleared + 'device_cl' => array( + + 'clean_type' => 'device_cl', + 'model_name' => 'HardwareModel', + 'id_name' => 'id_hard', + 'field_name' => 'cleared', + 'actions' => array('deviceclear'), + 'group' => 'admin', + + ), + ); + + public function __construct($model, $controller, $queryString) + { + parent::__construct($model, $controller, $queryString); + + $this->model('HistoryModel'); + $this->model('UsersModel'); + + } + + public function hide($lang = 'en', $token = '') + { + $this->generic($lang, $token, 'hide'); + } + + public function show($lang = 'en', $token = '') + { + $this->generic($lang, $token, 'show'); + } + + public function block($lang = 'en', $token = '') + { + $this->generic($lang, $token, 'block'); + } + + public function unblock($lang = 'en', $token = '') + { + $this->generic($lang, $token, 'unblock'); + } + + public function open($lang = 'en', $token = '') + { + $this->generic($lang, $token, 'open'); + } + + public function close($lang = 'en', $token = '') + { + $this->generic($lang, $token, 'close'); + } + + public function pageblock($lang = 'en', $token = '') + { + $this->generic($lang, $token, 'pageblock'); + } + + public function pageunblock($lang = 'en', $token = '') + { + $this->generic($lang, $token, 'pageunblock'); + } + + public function pagehide($lang = 'en', $token = '') + { + $this->generic($lang, $token, 'pagehide'); + } + + public function pageshow($lang = 'en', $token = '') + { + $this->generic($lang, $token, 'pageshow'); + } + + public function devicehide($lang = 'en', $token = '') + { + $this->generic($lang, $token, 'devicehide'); + } + + public function deviceshow($lang = 'en', $token = '') + { + $this->generic($lang, $token, 'deviceshow'); + } + + public function deviceapprove($lang = 'en', $token = '') + { + $this->generic($lang, $token, 'deviceapprove'); + } + + public function deviceclear($lang = 'en', $token = '') + { + $this->generic($lang, $token, 'deviceclear'); + } + + public function issuehide($lang = 'en', $token = '') + { + $this->generic($lang, $token, 'issuehide'); + } + + public function issueshow($lang = 'en', $token = '') + { + $this->generic($lang, $token, 'issueshow'); + } + + protected function generic($lang = 'en', $token = '', $action = 'hide') + { + header('Content-type: text/html; charset=UTF-8'); + + $this->shift(2); + + $this->clean(); + + $clean['token'] = sanitizeAlphanum($token); + + if ($this->s['registered']->status['status'] === 'logged') + { + if (!$this->s['registered']->checkCsrf($clean['token'])) die("wrong token"); + + if ($this->m['UsersModel']->isBlocked($this->s['registered']->status['id_user'])) die("your account has been blocked"); + + $clean['id_user'] = (int)$this->s['registered']->status['id_user']; + $clean['id'] = $this->request->post('id',0,'forceInt'); + $type = $this->request->post('type','','sanitizeAll'); + $message = $this->request->post('message',''); + + $modelName = 'error'; + + if (array_key_exists($type,$this->types)) + { + if (in_array($action,$this->types[$type]['actions'])) + { + $clean['group'] = $this->types[$type]['group']; + if (in_array($clean['group'],$this->s['registered']->status['groups'])) + { + $modelName = $this->types[$type]['model_name']; + $clean['type'] = $this->types[$type]['clean_type']; + $clean['id_name'] = $this->types[$type]['id_name']; + $clean['field_name'] = $this->types[$type]['field_name']; + + //load the right model + $this->model($modelName); + $model = $this->m[$modelName]; + + $model->select()->where(array($clean['id_name'] => $clean['id'],$clean['field_name'] => $this->strings[$action]['check_status'])); + + if (isset($this->strings[$action]['allowed_only_if']) and is_array($this->strings[$action]['allowed_only_if'])) + { + $model->aWhere($this->strings[$action]['allowed_only_if']); + } + + $count = $model->rowNumber(); + + if ($count > 0) + { + if (eg_strlen($message) < 500) + { + //drop the - char if present + $clean['field_name'] = str_replace('-',null,$clean['field_name']); + + //hide the message + $model->values = array($clean['field_name'] => $this->strings[$action]['to_status']); + + if (isset($this->strings[$action]['method'])) + { + call_user_func(array($model, $this->strings[$action]['method']),$clean['id']); + } + else + { + $model->pUpdate($clean['id']); + } + + if ($model->queryResult) + { + $this->m['HistoryModel']->setFields('id:forceInt,type,message','sanitizeAll'); + $this->m['HistoryModel']->values['created_by'] = $clean['id_user']; + $this->m['HistoryModel']->values['gr'] = $clean['group']; + $this->m['HistoryModel']->values['action'] = $this->strings[$action]['action']; + $this->m['HistoryModel']->updateTable('insert'); + + echo $this->strings[$action]['exec_string']; + } + else + { + echo "error: one error occurred, please retry later"; + } + } + else + { + echo "error: the message has too many characters or wrong type"; + } + } + else + { + echo $this->strings[$action]['error_string']; + } + } + } + } + } + } + + public function viewall($lang = 'en', $type = 'message', $id = 0) + { + header('Content-type: text/html; charset=UTF-8'); + + $this->shift(3); + + $this->clean(); + + if ($this->s['registered']->status['status'] === 'logged') + { + if (!$this->m['UsersModel']->isBlocked($this->s['registered']->status['id_user'])) + { + $clean['id'] = (int)$id; + if (array_key_exists($type,$this->types)) + { + $clean['group'] = $this->types[$type]['group']; + if (in_array($clean['group'],$this->s['registered']->status['groups'])) + { + $clean['type'] = $this->types[$type]['clean_type']; + $clean['typeInWhereClause'] = "'".$clean['type']."'"; + + if (array_key_exists('types_to_show',$this->types[$type])) + { + $clean['typeInWhereClause'] = "'".implode("','",explode(',',$this->types[$type]['types_to_show']))."'"; + } + + switch ($clean['type']) + { + case 'user': + $data['object'] = 'user'; + $data['box_class'] = 'details_of_actions_inner_user'; + break; + case 'page': + $data['object'] = 'wiki page'; + $data['box_class'] = 'details_of_actions_inner_user'; + break; + case 'device': + $data['object'] = 'device page'; + $data['box_class'] = 'details_of_actions_inner_user'; + break; + case 'device_app': + $data['object'] = 'device page'; + $data['box_class'] = 'details_of_actions_inner_user'; + break; + case 'page_del': + $data['object'] = 'wiki page'; + $data['box_class'] = 'details_of_actions_inner_user'; + break; + case 'issue': + $data['object'] = 'issue'; + $data['box_class'] = 'details_of_actions_inner_user'; + break; + default: + $data['object'] = 'message'; + $data['box_class'] = 'details_of_actions_inner'; + break; + } + + $data['res'] = $this->m['HistoryModel'] + ->select() + ->where( + array + ( + 'id'=>$clean['id'], + 'type'=>"in(".$clean['typeInWhereClause'].")", + 'gr'=>$clean['group']) + ) + ->send(); +// echo $this->m['HistoryModel']->getQuery(); + + $data['md_action'] = array( + 'hide' => 'hidden', + 'show' => 'restored', + 'block' => 'blocked', + 'unblock' => 'un-blocked', + 'open' => 'opened again', + 'close' => 'closed', + 'pageblock' => 'blocked', + 'pageunblock' => 'un-blocked', + 'pagehide' => 'hidden', + 'pageshow' => 'restored', + 'devicehide' => 'hidden', + 'deviceshow' => 'restored', + 'deviceapprove' => 'approved', + 'deviceclear' => 'permanently deleted', + 'issuehide' => 'hidden', + 'issueshow' => 'restored', + ); + + $this->append($data); + $this->load('viewall'); + } + } + } + } + } + +}
\ No newline at end of file |