array( 'controller' => 'banlist_ui', 'path' => null, 'ui' => 'banlist_form_ui', 'uipath' => null ), 'white' => array( 'controller' => 'banlist_ui', 'path' => null, 'ui' => 'banlist_form_ui', 'uipath' => null ), 'failed' => array( 'controller' => 'failed_ui', 'path' => null, 'ui' => 'failed_form_ui', 'uipath' => null ), ); protected $adminMenu = array( 'main/list' => array('caption'=> BANLAN_122, 'perm' => '4'), 'main/create' => array('caption'=> BANLAN_123, 'perm' => '4'), 'other' => array('divider'=>true), // Use FILTER to view whitelist instead. 'white/list' => array('caption'=> BANLAN_52, 'perm' => '4'), 'white/create' => array('caption'=> BANLAN_53, 'perm' => '4'), 'other1' => array('divider'=>true), 'failed/list' => array('caption'=> ADLAN_146, 'perm'=>'4'), 'other2' => array('divider'=>true), 'main/transfer' => array('caption'=> BANLAN_35, 'perm' => '4'), 'main/times' => array('caption'=> BANLAN_15, 'perm' => '0'), 'main/options' => array('caption'=> LAN_OPTIONS, 'perm' => '0'), // 'main/banlog' => array('caption'=> BANLAN_81, 'perm' => '0'), ); protected $adminMenuAliases = array( 'main/edit' => 'main/list' ); protected $menuTitle = BANLAN_16; protected $adminMenuIcon = 'e-banlist-24'; } class banlist_ui extends e_admin_ui { protected $pluginTitle = BANLAN_16; protected $eventName = 'ban'; protected $table = 'banlist'; protected $pid = 'banlist_id'; protected $perPage = 10; protected $listQry = "SELECT * FROM `#banlist` WHERE banlist_bantype != 100 "; protected $listOrder = 'banlist_datestamp DESC'; protected $fields = array ( 'checkboxes' => array ( 'title' => '', 'type' => null, 'data' => null, 'width' => '5%', 'thclass' => 'center', 'forced' => '1', 'class' => 'center', 'toggle' => 'e-multiselect', ), 'banlist_id' => array ( 'title' => LAN_ID, 'data' => 'int', 'width' => '5%', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', ), 'banlist_ip' => array ( 'title' => BANLAN_126, 'type' => 'method', 'data' => 'str', 'width' => 'auto', 'help' => '', 'readParms' => '', 'writeParms' => array(), 'class' => 'left', 'thclass' => 'left', ), 'banlist_bantype' => array ( 'title' => LAN_TYPE, 'type' => 'method', 'data' => 'str', 'width' => 'auto', 'filter'=>true, 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', ), 'banlist_datestamp' => array ( 'title' => LAN_DATESTAMP, 'type' => 'datestamp', 'data' => 'int', 'width' => 'auto', 'filter' => true, 'help' => '', 'readParms' => '', 'writeParms' => 'auto=1&hidden=1&readonly=1', 'class' => 'left', 'thclass' => 'left', ), 'banlist_banexpires' => array ( 'title' => BANLAN_124, 'type' => 'method', 'data' => 'int', 'inline'=>true, 'width' => 'auto', 'batch' => true, 'filter' => true, 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', ), 'banlist_admin' => array ( 'title' => 'Admin', 'type' => 'text', 'data' => 'int', 'noedit'=>true, 'width' => 'auto', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'center', 'thclass' => 'center', ), 'banlist_reason' => array ( 'title' => BANLAN_7, 'type' => 'text', 'data' => 'str', 'inline'=>true, 'width' => 'auto', 'help' => '', 'readParms' => 'constant=1', 'writeParms' => array('size'=>'xxlarge'), 'class' => 'left', 'thclass' => 'left', ), 'banlist_notes' => array ( 'title' => BANLAN_19, 'type' => 'text', 'data' => 'str', 'inline'=>true, 'width' => 'auto', 'help' => '', 'readParms' => '', 'writeParms' => array('size'=>'xxlarge'), 'class' => 'left', 'thclass' => 'left', ), 'options' => array ( 'title' => LAN_OPTIONS, 'type' => '', 'data' => '', 'width' => '10%', 'thclass' => 'center last', 'class' => 'center last', 'forced' => '1', ), ); protected $fieldpref = array('checkboxes', 'banlist_ip', 'banlist_bantype', 'banlist_datestamp', 'banlist_banexpires', 'banlist_reason', 'banlist_notes', 'options'); // protected $pref = array( // 'pref_type' => array('title'=> 'type', 'type'=>'text', 'data' => 'string', 'validate' => true), // 'pref_folder' => array('title'=> 'folder', 'type' => 'boolean', 'data' => 'integer'), // 'pref_name' => array('title'=> 'name', 'type' => 'text', 'data' => 'string', 'validate' => 'regex', 'rule' => '#^[\w]+$#i', 'help' => 'allowed characters are a-zA-Z and underscore') // ); function CreateObserver() { parent::CreateObserver(); $this->fields['banlist_ip']['title']= BANLAN_5; } function EditObserver() { parent::EditObserver(); $this->fields['banlist_ip']['title']= BANLAN_5; } // /** * Custom search field handling for banlist_ip. * @param string $srch */ function handleListBanlistIpSearch($srch) { $ret = array( "banlist_ip = '".$srch."'" ); if($ip6 = e107::getIPHandler()->ipEncode($srch,true)) { $ip = str_replace('x', '', $ip6); $ret[] = "banlist_ip LIKE '%".$ip."%'"; } return implode(" OR ",$ret); } // optional public function init() { if($this->getMode() == 'white') { if($this->getAction() == 'list') { $this->listQry = "SELECT * FROM `#banlist` WHERE banlist_bantype = 100 "; } if($this->getAction() == 'create') { $myip = e107::getIPHandler()->getIP(true); $this->fields['banlist_ip']['writeParms']['tdClassRight'] = 'form-inline'; $this->fields['banlist_ip']['writeParms']['pre'] = "
"; $this->fields['banlist_ip']['writeParms']['post'] = "
"; // USERIP; } } if (isset($_POST['update_ban_prefs'])) // Update ban messages { $this->timesPageSave(); } } public function beforeCreate($new_data, $old_data) { $new_data['banlist_admin'] = ADMINID; if(filter_var($new_data['banlist_ip'], FILTER_VALIDATE_IP)) // check it's an IP { $new_data['banlist_ip'] = e107::getIPHandler()->ipEncode($new_data['banlist_ip']); } return $new_data; } public function beforeUpdate($new_data, $old_data, $id) { $new_data['banlist_admin'] = ADMINID; if(filter_var($new_data['banlist_ip'], FILTER_VALIDATE_IP)) // check it's an IP { $new_data['banlist_ip'] = e107::getIPHandler()->ipEncode($new_data['banlist_ip']); } return $new_data; } public function afterCreate($new_data, $old_data, $id) { e107::getIPHandler()->regenerateFiles(); } public function afterUpdate($new_data, $old_data, $id) { e107::getIPHandler()->regenerateFiles(); } public function afterDelete($deleted_data, $id, $deleted_check) { e107::getIPHandler()->regenerateFiles(); } public function addPage() { //$ns = e107::getRender(); //$text = 'Hello World!'; //$ns->tablerender('Hello',$text); } /** * Create dropdown with options for ban time - uses internal fixed list of reasonable values */ private static function ban_time_dropdown($click_js = '', $zero_text = LAN_NEVER, $curval = -1, $drop_name = 'ban_time') { $frm = e107::getForm(); $intervals = array(0, 1, 2, 3, 6, 8, 12, 24, 36, 48, 72, 96, 120, 168, 336, 672); $ret = $frm->select_open($drop_name, array('other' => $click_js, 'id' => false)); $ret .= $frm->option(' ', ''); foreach ($intervals as $i) { if ($i == 0) { $words = $zero_text ? $zero_text : LAN_NEVER; } elseif (($i % 24) == 0) { $words = floor($i / 24) . ' ' . BANLAN_23; } else { $words = $i . ' ' . BANLAN_24; } $ret .= $frm->option($words, $i, ($curval == $i)); } $ret .= ''; return $ret; } protected function transferPage() { $ipAdministrator = new banlistManager; // Character options for import & export $separator_char = array(1 => ',', 2 => '|'); $quote_char = array(1 => '(none)', 2 => "'", 3 => '"'); $frm = e107::getForm(); $mes = e107::getMessage(); $error = false; if(isset($_POST['ban_import'])) // Got a file to import { require_once(e_HANDLER . 'upload_handler.php'); if(($files = process_uploaded_files(e_UPLOAD, false, array('overwrite' => true, 'max_file_count' => 1, 'file_mask' => 'csv'))) === false) { // Invalid file $error = true; $mes->addError(BANLAN_47); } if(empty($files) || vartrue($files[0]['error'])) { $error = true; if(varset($files[0]['message'])) { $mes->addError($files[0]['message']); } } if(!$error) // Got a file of some sort { $message = process_csv(e_UPLOAD . $files[0]['name'], intval(varset($_POST['ban_over_import'], 0)), intval(varset($_POST['ban_over_expiry'], 0)), $separator_char[intval(varset($_POST['ban_separator'], 1))], $quote_char[intval(varset($_POST['ban_quote'], 3))]); banlist_adminlog('07', 'File: ' . e_UPLOAD . $files[0]['name'] . '
' . $message); } } $text = "
" . BANLAN_40 . " "; foreach($ipAdministrator->getValidReasonList() as $i) //FIXME $frm->label() { $text .= " "; } $text .= ""; $text .= "
" . BANLAN_36 . "  
" . $frm->checkbox("ban_types[{$i}]", $i) . $frm->label($ipAdministrator->getBanTypeString($i, false), "ban_types[{$i}]", $i) . " (" . $ipAdministrator->getBanTypeString($i, true) . ")
" . BANLAN_79 . " " . $frm->select('ban_separator', $separator_char) . ' ' . BANLAN_37 . " " . $frm->select('ban_quote', $quote_char) . ' ' . BANLAN_38 . "
" . $frm->admin_button('ban_export', LAN_UI_BATCH_EXPORT, 'export', LAN_UI_BATCH_EXPORT) . "
"; // Now do the import options $text .= "
" . BANLAN_41 . "
" . BANLAN_42 . "  
" . $frm->checkbox('ban_over_import', 1, '', array('label' => BANLAN_43)) . "
" . $frm->checkbox('ban_over_expiry', 1, '', array('label' => BANLAN_44)) . "
" . BANLAN_46 . " " . $frm->file('file_userfile[]', array('size' => '40')) . "
" . BANLAN_80 . " " . $frm->select('ban_separator', $separator_char) . ' ' . BANLAN_37 . " " . $frm->select('ban_quote', $quote_char) . ' ' . BANLAN_38 . "
" . $frm->admin_button('ban_import', LAN_IMPORT , 'import') . $frm->token(). "
"; return $mes->render() . $text; } private function timesPageSave() { $ipAdministrator = new banlistManager; $tp = e107::getParser(); $changed = false; $pref = array(); $reasonList = $ipAdministrator->getValidReasonList(); foreach ($ipAdministrator->getValidReasonList() as $bt) { $i = abs($bt) + 1; // Forces a single-digit positive number for part of field name $t1 = $tp->toDB(varset($_POST['ban_text_'.($i)],'')); $t2 = intval(varset($_POST['ban_time_'.($i)],0)); if (!isset($pref['ban_messages'][$bt]) || ($pref['ban_messages'][$bt] != $t1)) { $pref['ban_messages'][$bt] = $t1; $changed = TRUE; } if (!isset($pref['ban_durations'][$bt]) || ($pref['ban_durations'][$bt] != $t2)) { $pref['ban_durations'][$bt] = $t2; $changed = TRUE; } } if ($changed && !empty($pref)) { // @todo write actual prefs changes to log file (different methods for prefs?) e107::getConfig()->setPref($pref)->save(); // save_prefs(); /***************************************** Write messages and times to disc file *****************************************/ $ipAdministrator->writeBanMessageFile(); banlist_adminlog('08',''); } } protected function timesPage() { if (!getperms('0')) { return; } $pref = e107::getPref(); $tp = e107::getParser(); $frm = e107::getForm(); $mes = e107::getMessage(); $ipAdministrator = new banlistManager; $text = ''; if ((!isset($pref['ban_messages'])) || !is_array($pref['ban_messages'])) { foreach ($ipAdministrator->getValidReasonList() as $bt) { $pref['ban_messages'][$bt] = ''; } } if ((!isset($pref['ban_durations'])) || !is_array($pref['ban_durations'])) { foreach ($ipAdministrator->getValidReasonList() as $bt) { $pref['ban_durations'][$bt] = 0; } } $text .= "
".BANLAN_77." "; foreach ($ipAdministrator->getValidReasonList() as $bt) { $i = abs($bt) + 1; // Forces a single-digit positive number $helpTip = $ipAdministrator->getBanTypeString($bt, TRUE); $text .= " "; } $text .= "
".BANLAN_28." ".BANLAN_29."
".BANLAN_31."
".BANLAN_30."
".$ipAdministrator->getBanTypeString($bt, FALSE)." ".$frm->help($helpTip)." ".$frm->textarea('ban_text_'.($i), $pref['ban_messages'][$bt], 4, 120, array('size'=>'xxlarge'))." ". self::ban_time_dropdown('', BANLAN_32, $pref['ban_durations'][$bt], 'ban_time_' . ($i)) ."
".$frm->admin_button('update_ban_prefs', LAN_UPDATE, 'update')."
"; echo $mes->render().$text; } private function drop_box($box_name, $curval) { $frm = e107::getForm(); $opts = array(50, 100, 150, 200, 250, 300, 400, 500); $ret = $frm->select_open($box_name, array('class' => 'tbox')); foreach ($opts as $o) { $ret .= $frm->option($o, $o, ($curval == $o)); } $ret .= "\n"; return $ret; } protected function optionsPage() { if (!getperms('0')) { exit(); } $mes = e107::getMessage(); $tp = e107::getParser(); $sql = e107::getDb(); $frm = e107::getForm(); $pref = e107::getPref(); if (isset($_POST['update_ban_options'])) { $pref['enable_rdns'] = intval($_POST['ban_rdns_on_access']); $pref['enable_rdns_on_ban'] = intval($_POST['ban_rdns_on_ban']); $pref['ban_max_online_access'] = intval($_POST['ban_access_guest']).','.intval($_POST['ban_access_member']); $pref['ban_retrigger'] = intval($_POST['ban_retrigger']); $pref['ban_date_format'] = $tp->toDB($_POST['ban_date_format']); e107::getConfig()->setPref($pref)->save(true,true,true); } if (isset($_POST['remove_expired_bans'])) { $result = $sql->delete('banlist',"`banlist_bantype` < ".eIPHandler::BAN_TYPE_WHITELIST." AND `banlist_banexpires` > 0 AND `banlist_banexpires` < ".time()); banlist_adminlog('12', $result); $mes->addSuccess(str_replace('[y]', $result, BANLAN_48)); } list($ban_access_guest, $ban_access_member) = explode(',', varset($pref['ban_max_online_access'], '100,200')); $ban_access_member = max($ban_access_guest, $ban_access_member); $text = "
".BANLAN_72."
".BANLAN_63."".$frm->help(BANLAN_65)."
".$frm->checkbox('ban_rdns_on_access', 1, $pref['enable_rdns'] == 1)."
".BANLAN_64.$frm->help(BANLAN_66)."
".$frm->checkbox('ban_rdns_on_ban', 1, $pref['enable_rdns_on_ban'] == 1)."
".BANLAN_67.$frm->help(BANLAN_68)."
".$this->drop_box('ban_access_guest', $ban_access_guest).BANLAN_70."
".$this->drop_box('ban_access_member', $ban_access_member).BANLAN_69."
".BANLAN_71.$frm->help(BANLAN_73)."
".$frm->checkbox('ban_retrigger', 1, $pref['ban_retrigger'] == 1)."
".BANLAN_91.$frm->help(BANLAN_92)." ".$frm->text('ban_date_format', varset($pref['ban_date_format'], '%H:%M %d-%m-%y'), 40)." ".$frm->help(BANLAN_92, 'after')."
".$frm->admin_button('update_ban_options', LAN_UPDATE, 'update')."
".BANLAN_74."
".BANLAN_75." ".$frm->admin_button('remove_expired_bans', BANLAN_76, 'delete')."
"; return $text; } protected function banlogPage() { //FIXME Put LogPage code in here. } } class banlist_form_ui extends e_admin_form_ui { // Custom Method/Function function banlist_reason($curVal,$mode) //TODO { switch($mode) { case 'read': // List Page break; case 'write': // Edit Page return $this->renderElement('banlist_reason', $curVal, array()); break; case 'filter': case 'batch': break; } } // Custom Method/Function function banlist_ip($curVal,$mode) //TODO { if(!empty($curVal)) { $tmp = explode(":",$curVal); if(count($tmp) === 8) { $curVal = e107::getIPHandler()->ipDecode($curVal); } } switch($mode) { case 'read': // List Page return $curVal; break; case 'write': // Edit Page return $this->text('banlist_ip', $curVal, array()); break; case 'filter': case 'batch': break; } } // Custom Method/Function function banlist_bantype($curVal,$mode) { $ipAdministrator = new banlistManager; // print_a($ipAdministrator->banTypes); switch($mode) { case 'read': // List Page return "
".$ipAdministrator->getBanTypeString($curVal, FALSE)."
"; break; case 'write': // Edit Page if ($this->getController()->getMode() == 'white') { return $this->hidden('banlist_bantype',eIPHandler::BAN_TYPE_WHITELIST)."".BANLAN_120.""; } elseif($this->getController()->getAction() == 'create') { return $this->hidden('banlist_bantype',eIPHandler::BAN_TYPE_MANUAL)."".BANLAN_121.""; } return $this->select('banlist_bantype',$ipAdministrator->banTypes, $curVal); break; case 'filter': case 'batch': return $ipAdministrator->banTypes; break; } } // Custom Method/Function function banlist_banexpires($curVal,$mode) { $pref = e107::getPref(); $date = e107::getDate(); $opts = $this->banexpires(); switch($mode) { case 'read': // List Page $id = $this->getController()->getListModel()->get('banlist_ip'); // $val = ($curVal ? strftime($pref['ban_date_format'], $curVal).(($curVal < time()) ? ' ('.BANLAN_34.')' : '') : LAN_NEVER); // ."
".$this->banexpires(); // $val .= " (".$curVal.")"; // $mod = preg_replace('/[^\w]/', '', vartrue($_GET['mode'], '')); $val = vartrue($curVal) ? $date->computeLapse(time(), $curVal) : LAN_NEVER; $val = str_replace("ago", "", $val); // quick fix for the 'ago'. if(vartrue($curVal) && $curVal < time()) { $val = BANLAN_34; } $source = str_replace('"',"'",json_encode($opts)); return "".$val.""; break; case 'write': // Edit Page if(!empty($curVal)) { $opts[$curVal] = e107::getParser()->toDate($curVal, 'short'); } return $this->select('banlist_banexpires',$opts, $curVal); // return $frm->text('banlist_banexpires',$curVal); break; case 'filter': case 'batch': return false; break; } } function banexpires() { $intervals = array(0, 1, 2, 3, 6, 8, 12, 24, 36, 48, 72, 96, 120, 168, 336, 672); $opts = array(); foreach ($intervals as $i) { $words = ""; if ($i == 0) { $opts[$i] = LAN_NEVER; continue; } elseif (($i % 24) == 0 && $i !== 24) { $words = floor($i / 24).' '.BANLAN_23; } else { $words = $i.' '.BANLAN_24; } $calc = time() + ($i * 60 * 60); $opts[$calc] = $words; } // print_a($opts); return $opts; } } class failed_ui extends e_admin_ui { protected $pluginTitle = BANLAN_16; protected $pluginName = 'failed_login'; protected $table = 'generic'; protected $pid = 'gen_id'; protected $perPage = 10; protected $listQry = "SELECT * FROM `#generic` WHERE gen_type='failed_login' "; protected $listOrder = "gen_datestamp DESC"; protected $fields = array ( 'checkboxes' => array ( 'title' => '', 'type' => null, 'data' => null, 'width' => '5%', 'thclass' => 'center', 'forced' => '1', 'class' => 'center', 'toggle' => 'e-multiselect', ), 'gen_id' => array ( 'title' => LAN_ID, 'nolist'=>true, 'data' => 'int', 'width' => '5%', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', ), // 'gen_type' => array ( 'title' => LAN_BAN, 'type' => 'method', 'data' => 'str', 'width' => 'auto', 'batch' => true, 'filter' => true, 'inline' => true, 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', ), 'gen_datestamp' => array ( 'title' => LAN_DATESTAMP, 'type' => 'datestamp', 'data' => 'int', 'width' => 'auto', 'filter' => true, 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', ), 'gen_chardata' => array ( 'title' => LAN_DESCRIPTION, 'type' => 'method', 'data' => 'str', 'width' => '40%', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', 'filter'=>true ), // 'gen_user_id' => array ( 'title' => LAN_BAN, 'type' => 'method', 'batch'=>true, 'data' => 'int', 'width' => '5%', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', ), 'gen_ip' => array ( 'title' => LAN_IP, 'type' => 'ip', 'data' => 'str', 'width' => 'auto', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', ), // 'gen_intdata' => array ( 'title' => LAN_BAN, 'type' => 'method', 'batch'=>true, 'data' => 'int', 'width' => 'auto', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'center', 'thclass' => 'center', ), 'options' => array ( 'title' => LAN_OPTIONS, 'type' => null, 'data' => null, 'width' => '10%', 'thclass' => 'center last', 'class' => 'center last', 'forced' => '1', 'readParms'=>'edit=0' ), ); protected $fieldpref = array('gen_datestamp', 'gen_ip', 'gen_chardata'); protected $batchOptions = array(); // optional public function init() { if(varset($_POST['etrigger_batch']) == 'gen_intdata__1' && count($_POST['e-multiselect'])) // Do we need BAN here? { $dels = implode(',',$_POST['e-multiselect']); //$e107::getDb()->insert('banlist', } $allFailedTotal = e107::getDB()->count('generic', '(*)', "gen_type='failed_login'"); $this->batchOptions = array('delete-all'=>str_replace('[x]', $allFailedTotal, BANLAN_127)); if(!empty($_POST['etrigger_batch']) && $_POST['etrigger_batch'] == "delete-all") { $this->deleteAllFailed(); } } private function deleteAllFailed() { if(e107::getDB()->delete('generic', "gen_type='failed_login'")) { e107::getMessage()->addSuccess(LAN_DELETED); } } public function afterDelete($deleted_data, $id, $deleted_check) { // $sql2->db_Delete('banlist', "banlist_ip='{$banIP}'"); } } class failed_form_ui extends e_admin_form_ui { // Custom Method/Function function gen_intdata($curVal,$mode) { $frm = e107::getForm(); switch($mode) { case 'read': // List Page return $curVal; break; case 'write': // Edit Page return $frm->text('gen_type',$curVal); break; case 'filter': case 'batch': return array(1=>LAN_BAN); break; } } // Custom Method/Function function gen_chardata($curVal,$mode) { $frm = e107::getForm(); switch($mode) { case 'read': // List Page return str_replace(":::","
",$curVal); break; case 'write': // Edit Page return $frm->text('gen_chardata',$curVal); break; case 'filter': case 'batch': // return $array; break; } } } new banlist_admin(); require_once(e_ADMIN."auth.php"); e107::getAdminUI()->runPage(); require_once(e_ADMIN.'footer.php');