seek_quarry
[ class tree: seek_quarry ] [ index: seek_quarry ] [ all elements ]

Source for file admin_controller.php

Documentation is available at admin_controller.php

  1. <?php
  2. /**
  3.  *  SeekQuarry/Yioop --
  4.  *  Open Source Pure PHP Search Engine, Crawler, and Indexer
  5.  *
  6.  *  Copyright (C) 2009 - 2013  Chris Pollett chris@pollett.org
  7.  *
  8.  *  LICENSE:
  9.  *
  10.  *  This program is free software: you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation, either version 3 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  22.  *
  23.  *  END LICENSE
  24.  *
  25.  * @author Chris Pollett chris@pollett.org
  26.  * @package seek_quarry
  27.  * @subpackage controller
  28.  * @license http://www.gnu.org/licenses/ GPL3
  29.  * @link http://www.seekquarry.com/
  30.  * @copyright 2009 - 2013
  31.  * @filesource
  32.  */
  33.  
  34. if(!defined('BASE_DIR')) {echo "BAD REQUEST"exit();}
  35.  
  36. /** Load base controller class if needed */
  37. require_once BASE_DIR."/controllers/controller.php";
  38. /** Loads common constants for web crawling */
  39. require_once BASE_DIR."/lib/crawl_constants.php";
  40. /** Need get host for search filter admin */
  41. require_once BASE_DIR."/lib/url_parser.php";
  42. /** Used in rule parser test in page options */
  43. require_once BASE_DIR."/lib/page_rule_parser.php";
  44. /** Loads crawl_daemon to manage news_updater */
  45. require_once BASE_DIR."/lib/crawl_daemon.php";
  46. /** get processors for different file types */
  47. foreach(glob(BASE_DIR."/lib/processors/*_processor.php"as $filename{
  48.     require_once $filename;
  49. }
  50. /**
  51.  * Controller used to handle admin functionalities such as
  52.  * modify login and password, CREATE, UPDATE,DELETE operations
  53.  * for users, roles, locale, and crawls
  54.  *
  55.  * @author Chris Pollett
  56.  * @package seek_quarry
  57.  * @subpackage controller
  58.  */
  59.  
  60. class AdminController extends Controller implements CrawlConstants
  61. {
  62.     /**
  63.      * Says which views to load for this controller
  64.      * admin is the main one, signin has the login screen crawlstatus
  65.      * is used to see how many pages crawled by the current crawl
  66.      * @var array 
  67.      */
  68.     var $views = array("admin""signin""crawlstatus""machinestatus");
  69.     /**
  70.      * Says which models to load for this controller.
  71.      * @var array 
  72.      */
  73.     var $models = array(
  74.         "signin""user""activity""crawl""role""locale""profile",
  75.         "searchfilters""source""machine""cron");
  76.     /**
  77.      * Says which activities (roughly methods invoke from the web) this
  78.      * controller will respond to
  79.      * @var array 
  80.      */
  81.     var $activities = array("signin""manageAccount""manageUsers",
  82.         "manageRoles""manageCrawls""pageOptions""resultsEditor",
  83.         "manageMachines""manageLocales""crawlStatus""mixCrawls",
  84.         "machineStatus""searchSources""configure");
  85.     /**
  86.      * An array of activities which are periodically updated within other
  87.      * activities that they live. For example, within manage crawl,
  88.      * the current crawl status is updated every 20 or so seconds.
  89.      * @var array 
  90.      */
  91.     var $status_activities = array("crawlStatus""machineStatus");
  92.  
  93.  
  94.  
  95.     /**
  96.      * This is the main entry point for handling requests to administer the
  97.      * Yioop/SeekQuarry site
  98.      *
  99.      * ProcessRequest determines the type of request (signin , manageAccount,
  100.      * etc) is being made.  It then calls the appropriate method to handle the
  101.      * given activity. Finally, it draws the relevant admin screen
  102.      */
  103.     function processRequest()
  104.     {
  105.         $data array();
  106.  
  107.         if(!PROFILE{
  108.             return $this->configureRequest();
  109.         }
  110.         $view "signin";
  111.  
  112.         if(isset($_SESSION['USER_ID'])) {
  113.             $user $_SESSION['USER_ID'];
  114.         else {
  115.             $user $_SERVER['REMOTE_ADDR'];
  116.         }
  117.         $data[CSRF_TOKEN$this->generateCSRFToken($user);
  118.         $token_okay $this->checkCSRFToken(CSRF_TOKEN$user);
  119.         if($token_okay{
  120.             if(isset($_SESSION['USER_ID']&& !isset($_REQUEST['u'])) {
  121.                 $data array_merge($data$this->processSession());
  122.                 if(!isset($data['REFRESH'])) {
  123.                     $view "admin";
  124.                 else {
  125.                     $view $data['REFRESH'];
  126.                 }
  127.             else if ($this->checkSignin()){
  128.                 $user_id $this->signinModel->getUserId(
  129.                     $this->clean($_REQUEST['u']"string"));
  130.                 $session $this->userModel->getUserSession($user_id);
  131.                 if(is_array($session)) {
  132.                     $_SESSION $session;
  133.                 }
  134.                 $_SESSION['USER_ID'$user_id;
  135.                 $data[CSRF_TOKEN$this->generateCSRFToken(
  136.                     $_SESSION['USER_ID']);
  137.                 // now don't want to use remote address anymore
  138.                 $data['SCRIPT'"doMessage('<h1 class=\"red\" >".
  139.                     tl('admin_controller_login_successful')."</h1>')";
  140.                 $data array_merge($data$this->processSession());
  141.                 $view "admin";
  142.             else {
  143.                 $data['SCRIPT'"doMessage('<h1 class=\"red\" >".
  144.                     tl('admin_controller_login_failed')."</h1>')";
  145.                 unset($_SESSION['USER_ID']);
  146.             }
  147.         else if($this->checkCSRFToken(CSRF_TOKEN"config")) {
  148.             $data['SCRIPT'"doMessage('<h1 class=\"red\" >".
  149.                 tl('admin_controller_login_to_config')."</h1>')";
  150.         else if(isset($_REQUEST['a']&&
  151.             in_array($_REQUEST['a']$this->status_activities)) {
  152.             e("<p class='red'>".
  153.                 tl('admin_controller_status_updates_stopped')."</p>");
  154.             exit();
  155.         }
  156.         if($token_okay && isset($_SESSION["USER_ID"])) {
  157.             $data["ADMIN"true;
  158.         else {
  159.             $data["ADMIN"false;
  160.         }
  161.         if($view == 'signin'{
  162.             unset($_SESSION['USER_ID']);
  163.             $data['SCRIPT'"var u; if ((u = elt('username')) && u.focus) ".
  164.                "u.focus();";
  165.         }
  166.         $this->displayView($view$data);
  167.     }
  168.  
  169.     /**
  170.      * If there is no profile/work directory set up then this method
  171.      * get called to by pass any login and go to the configure screen.
  172.      * The configure screen is only displayed if the user is connected
  173.      * from localhost in this case
  174.      */
  175.     function configureRequest()
  176.     {
  177.         $data $this->processSession();
  178.         $data[CSRF_TOKEN$this->generateCSRFToken("config");
  179.         $this->displayView("admin"$data);
  180.     }
  181.  
  182.     /**
  183.      * Checks whether the user name and password sent presumably by the signin
  184.      * form match a user in the database
  185.      *
  186.      * @return bool whether they do or not
  187.      */
  188.     function checkSignin()
  189.     {
  190.         $result $this->signinModel->checkValidSignin(
  191.         $this->clean($_REQUEST['u']"string"),
  192.         $this->clean($_REQUEST['p']"string") );
  193.         return $result;
  194.     }
  195.  
  196.     /**
  197.      * Determines the user's current allowed activities and current activity,
  198.      * then calls the method for the latter.
  199.      *
  200.      * This is called from {@link processRequest()} once a user is logged in.
  201.      *
  202.      * @return array $data the results of doing the activity for display in the
  203.      *       view
  204.      */
  205.     function processSession()
  206.     {
  207.         if(!PROFILE || (defined("FIX_NAME_SERVER"&& FIX_NAME_SERVER)) {
  208.             $activity "configure";
  209.         else if(isset($_REQUEST['a']&&
  210.             in_array($_REQUEST['a']$this->activities)) {
  211.             $activity $_REQUEST['a'];
  212.         else {
  213.             $activity "manageAccount";
  214.         }
  215.         $allowed false;
  216.         if(!PROFILE{
  217.             $allowed_activities arrayarray(
  218.                 "ACTIVITY_NAME" =>
  219.                 $this->activityModel->getActivityNameFromMethodName($activity),
  220.                 'METHOD_NAME' => $activity));
  221.             $allowed true;
  222.         else {
  223.             $allowed_activities =
  224.                  $this->userModel->getUserActivities($_SESSION['USER_ID']);
  225.         }
  226.         foreach($allowed_activities as $allowed_activity{
  227.             if($activity == $allowed_activity['METHOD_NAME']{
  228.                  $allowed true;
  229.             }
  230.             if($allowed_activity['METHOD_NAME'== "manageCrawls" &&
  231.                 $activity == "crawlStatus"{
  232.                 $allowed true;
  233.             }
  234.             if($allowed_activity['METHOD_NAME'== "manageMachines" &&
  235.                 $activity == "machineStatus"{
  236.                 $allowed true;
  237.             }
  238.         }
  239.  
  240.         //for now we allow anyone to get crawlStatus
  241.         if($allowed{
  242.             $data $this->$activity();
  243.             $data['ACTIVITIES'$allowed_activities;
  244.         }
  245.         if(!in_array($activity$this->status_activities)) {
  246.             $data['CURRENT_ACTIVITY'=
  247.                 $this->activityModel->getActivityNameFromMethodName($activity);
  248.         }
  249.         return $data;
  250.     }
  251.  
  252.     /**
  253.      * This method is data to signin a user and initialize the data to be
  254.      * display in a view
  255.      *
  256.      * @return array empty array of data to show so far in view
  257.      */
  258.     function signin()
  259.     {
  260.         $data array();
  261.         $_SESSION['USER_ID'=
  262.             $this->signinModel->getUserId($_REQUEST['username']);
  263.         return $data;
  264.     }
  265.  
  266.     /**
  267.      * Used to handle crawlStatus REST activities requesting the status of the
  268.      * current web crawl
  269.      *
  270.      * @return array $data contains crawl status of current crawl as well as
  271.      *       info about prior crawls and which crawl is being used for default
  272.      *       search results
  273.      */
  274.     function crawlStatus()
  275.     {
  276.         $data array();
  277.         $data['REFRESH'"crawlstatus";
  278.  
  279.         $crawl_time $this->crawlModel->getCurrentIndexDatabaseName();
  280.         if(isset($crawl_time) ) {
  281.             $data['CURRENT_INDEX'= (int)$crawl_time;
  282.         else {
  283.             $data['CURRENT_INDEX'= -1;
  284.         }
  285.  
  286.         $machine_urls $this->machineModel->getQueueServerUrls();
  287.         list($stalled$status$data['RECENT_CRAWLS']=
  288.             $this->crawlModel->combinedCrawlInfo($machine_urls);
  289.  
  290.         if($stalled{
  291.             $this->crawlModel->sendStopCrawlMessage($machine_urls);
  292.         }
  293.  
  294.         $data array_merge($data$status);
  295.  
  296.         $data["CRAWL_RUNNING"false;
  297.         if(isset($data['CRAWL_TIME']&& $data["CRAWL_TIME"!= 0{
  298.             //erase from previous crawl list any active crawl
  299.             $num_crawls count($data['RECENT_CRAWLS']);
  300.             for($i 0$i $num_crawls$i++{
  301.                 if($data['RECENT_CRAWLS'][$i]['CRAWL_TIME'==
  302.                     $data['CRAWL_TIME']{
  303.                     $data['RECENT_CRAWLS'][$ifalse;
  304.                 }
  305.             }
  306.             $data["CRAWL_RUNNING"true;
  307.             $data['RECENT_CRAWLS']array_filter($data['RECENT_CRAWLS']);
  308.         }
  309.         if(isset($data['RECENT_CRAWLS'][0])) {
  310.             rorderCallback($data['RECENT_CRAWLS'][0]$data['RECENT_CRAWLS'][0],
  311.                 'CRAWL_TIME');
  312.             usort($data['RECENT_CRAWLS']"rorderCallback");
  313.         }
  314.  
  315.         return $data;
  316.     }
  317.  
  318.     /**
  319.      * Gets data from the machineModel concerning the on/off states
  320.      * of the machines managed by this Yioop instance and then passes
  321.      * this data the the machinestatus view.
  322.      * @return array $data MACHINES field has information about each
  323.      *       machine managed by this Yioop instance as well the on off
  324.      *       status of its queue_servers and fetchers.
  325.      *       The REFRESH field is used to tell the controller that the
  326.      *       view shouldn't have its own sidemenu.
  327.      */
  328.     function machineStatus()
  329.     {
  330.         $data array();
  331.         $data['REFRESH'"machinestatus";
  332.         $data['MACHINES'$this->machineModel->getMachineStatuses();
  333.         $data['NEWS_MODES'array(
  334.             "news_off" => tl('admin_controller_news_off'),
  335.             "news_web" => tl('admin_controller_news_update_web'),
  336.             "news_process" => tl('admin_controller_news_process'),
  337.         );
  338.         $profile =  $this->profileModel->getProfile(WORK_DIRECTORY);
  339.         $data['NEWS_MODE'= isset($profile['NEWS_MODE']
  340.             $profile['NEWS_MODE']"";
  341.         return $data;
  342.     }
  343.  
  344.     /**
  345.      * Used to handle the change current user password admin activity
  346.      *
  347.      * @return array $data SCRIPT field contains success or failure message
  348.      */
  349.     function manageAccount()
  350.     {
  351.         $possible_arguments array("changepassword");
  352.  
  353.         $data["ELEMENT""manageaccountElement";
  354.         $data['SCRIPT'"";
  355.  
  356.         if(isset($_REQUEST['arg']&&
  357.             in_array($_REQUEST['arg']$possible_arguments)) {
  358.             switch($_REQUEST['arg'])
  359.             {
  360.                 case "changepassword":
  361.                     if($_REQUEST['retypepassword'!= $_REQUEST['newpassword']){
  362.                         $data["MESSAGE"=
  363.                             tl('admin_controller_passwords_dont_match');
  364.                         $data['SCRIPT'.=
  365.                             "doMessage('<h1 class=\"red\" >"$data["MESSAGE"].
  366.                             "</h1>')";
  367.                         return $data;
  368.                     }
  369.                     $username =
  370.                         $this->signinModel->getUserName($_SESSION['USER_ID']);
  371.                     $result $this->signinModel->checkValidSignin($username,
  372.                     $this->clean($_REQUEST['oldpassword']"string") );
  373.                     if(!$result{
  374.                         $data["MESSAGE"=
  375.                             tl('admin_controller_invalid_old_password');
  376.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  377.                             $data["MESSAGE"]."</h1>')";
  378.                         return $data;
  379.                     }
  380.                     $this->signinModel->changePassword($username,
  381.                         $this->clean($_REQUEST['newpassword']"string"));
  382.                     $data["MESSAGE"tl('admin_controller_change_password');
  383.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  384.                         $data["MESSAGE"]."</h1>')";
  385.                 break;
  386.                 }
  387.         }
  388.  
  389.         return $data;
  390.     }
  391.  
  392.     /**
  393.      * Used to handle the manage user activity.
  394.      *
  395.      * This activity allows new users to be added, old users to be
  396.      * deleted and allows roles to be added to/deleted from a user
  397.      *
  398.      * @return array $data infomation about users of the system, roles, etc.
  399.      *       as well as status messages on performing a given sub activity
  400.      */
  401.     function manageUsers()
  402.     {
  403.         $possible_arguments array("adduser",
  404.             "deleteuser""adduserrole""deleteuserrole");
  405.  
  406.         $data["ELEMENT""manageusersElement";
  407.         $data['SCRIPT'=
  408.             "selectUser = elt('select-user'); ".
  409.             "selectUser.onchange = submitViewUserRole;";
  410.  
  411.         $usernames $this->userModel->getUserList();
  412.         if(isset($_REQUEST['username'])) {
  413.             $username $this->clean($_REQUEST['username']"string" );
  414.         }
  415.         $base_option tl('admin_controller_select_username');
  416.         $data['USER_NAMES'array();
  417.         $data['USER_NAMES'][""$base_option;
  418.  
  419.         foreach($usernames as $name{
  420.             $data['USER_NAMES'][$name]$name;
  421.         }
  422.  
  423.         if(isset($_REQUEST['selectuser'])) {
  424.             $select_user $this->clean($_REQUEST['selectuser']"string" );
  425.         else {
  426.             $select_user "";
  427.         }
  428.         if($select_user != "" {
  429.             $userid $this->signinModel->getUserId($select_user);
  430.             $data['SELECT_USER'$select_user;
  431.             $data['SELECT_ROLES'$this->userModel->getUserRoles($userid);
  432.             $all_roles $this->roleModel->getRoleList();
  433.             $role_ids array();
  434.             if(isset($_REQUEST['selectrole'])) {
  435.                 $select_role $this->clean($_REQUEST['selectrole']"string" );
  436.             else {
  437.                 $select_role "";
  438.             }
  439.  
  440.             foreach($all_roles as $role{
  441.                 $role_ids[$role['ROLE_ID'];
  442.                 if($select_role == $role['ROLE_ID']{
  443.                     $select_rolename $role['ROLE_NAME'];
  444.                 }
  445.             }
  446.  
  447.             $available_roles array_diff_assoc(
  448.                 $all_roles$data['SELECT_ROLES']);
  449.  
  450.  
  451.             $data['AVAILABLE_ROLES'][-1=
  452.                 tl('admin_controller_select_rolename');
  453.  
  454.             foreach($available_roles as $role{
  455.                 $data['AVAILABLE_ROLES'][$role['ROLE_ID']]$role['ROLE_NAME'];
  456.             }
  457.  
  458.             if($select_role != ""{
  459.                 $data['SELECT_ROLE'$select_role;
  460.             else {
  461.                 $data['SELECT_ROLE'= -1;
  462.             }
  463.         else {
  464.             $data['SELECT_USER'= -1;
  465.         }
  466.  
  467.         if(isset($_REQUEST['arg']&&
  468.             in_array($_REQUEST['arg']$possible_arguments)) {
  469.  
  470.             switch($_REQUEST['arg'])
  471.             {
  472.                 case "adduser":
  473.                     $data['SELECT_ROLE'= -1;
  474.                     unset($data['AVAILABLE_ROLES']);
  475.                     unset($data['SELECT_ROLES']);
  476.                     if($_REQUEST['retypepassword'!= $_REQUEST['password']{
  477.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  478.                             tl('admin_controller_passwords_dont_match').
  479.                             "</h1>')";
  480.                         return $data;
  481.                     }
  482.  
  483.                     if($this->signinModel->getUserId($username0{
  484.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  485.                             tl('admin_controller_username_exists')."</h1>')";
  486.                         return $data;
  487.                     }
  488.                     $this->userModel->addUser($username,
  489.                         $this->clean($_REQUEST['password']"string"));
  490.                     $data['USER_NAMES'][$username$username;
  491.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  492.                         tl('admin_controller_username_added')."</h1>')";
  493.                 break;
  494.  
  495.                 case "deleteuser":
  496.                     $data['SELECT_ROLE'= -1;
  497.                     unset($data['AVAILABLE_ROLES']);
  498.                     unset($data['SELECT_ROLES']);
  499.                     if(!($this->signinModel->getUserId($username0)) {
  500.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  501.                             tl('admin_controller_username_doesnt_exists').
  502.                             "</h1>')";
  503.                         return $data;
  504.                     }
  505.                     $this->userModel->deleteUser($username);
  506.                     unset($data['USER_NAMES'][$username]);
  507.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  508.                         tl('admin_controller_username_deleted')."</h1>')";
  509.  
  510.                 break;
  511.  
  512.                 case "adduserrole":
  513.                     if$userid <= {
  514.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  515.                             tl('admin_controller_username_doesnt_exists').
  516.                             "</h1>')";
  517.                         return $data;
  518.                     }
  519.                     if(!in_array($select_role$role_ids)) {
  520.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  521.                             tl('admin_controller_rolename_doesnt_exists').
  522.                             "</h1>')";
  523.                         return $data;
  524.                     }
  525.                     $this->userModel->addUserRole($userid$select_role);
  526.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  527.                         tl('admin_controller_rolename_added').
  528.                         "</h1>')";
  529.                     unset($data['AVAILABLE_ROLES'][$select_role]);
  530.                     $data['SELECT_ROLE'= -1;
  531.                     $data['SELECT_ROLES'=
  532.                         $this->userModel->getUserRoles($userid);
  533.                 break;
  534.  
  535.                 case "deleteuserrole":
  536.                     if($userid <= 0{
  537.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  538.                             tl('admin_controller_username_doesnt_exists').
  539.                             "</h1>')";
  540.                         return $data;
  541.                     }
  542.                     if(!in_array($select_role$role_ids)) {
  543.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  544.                             tl('admin_controller_rolename_doesnt_exists').
  545.                             "</h1>')";
  546.                         return $data;
  547.                     }
  548.                     $this->userModel->deleteUserRole($userid$select_role);
  549.                     $data['SELECT_ROLES'=
  550.                         $this->userModel->getUserRoles($userid);
  551.                     $data['AVAILABLE_ROLES'][$select_role$select_rolename;
  552.                     $data['SELECT_ROLE'= -1;
  553.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  554.                         tl('admin_controller_rolename_deleted')."</h1>')";
  555.                 break;
  556.             }
  557.         }
  558.  
  559.         return $data;
  560.     }
  561.  
  562.     /**
  563.      * Used to handle the manage role activity.
  564.      *
  565.      * This activity allows new roles to be added, old roles to be
  566.      * deleted and allows activities to be added to/deleted from a role
  567.      *
  568.      * @return array $data infomation about roles in the system, activities,etc.
  569.      *       as well as status messages on performing a given sub activity
  570.      *
  571.      */
  572.     function manageRoles()
  573.     {
  574.         $possible_arguments =
  575.             array("addrole""deleterole""addactivity""deleteactivity");
  576.  
  577.         $data["ELEMENT""managerolesElement";
  578.         $data['SCRIPT'=
  579.             "selectRole = elt('select-role'); selectRole.onchange =".
  580.             " submitViewRoleActivities;";
  581.  
  582.         $roles $this->roleModel->getRoleList();
  583.         $role_ids array();
  584.         $base_option tl('admin_controller_select_rolename');
  585.         $data['ROLE_NAMES'array();
  586.         $data['ROLE_NAMES'][-1$base_option;
  587.         if(isset($_REQUEST['rolename'])) {
  588.             $rolename $this->clean($_REQUEST['rolename']"string" );
  589.         }
  590.         foreach($roles as $role{
  591.             $data['ROLE_NAMES'][$role['ROLE_ID']]$role['ROLE_NAME'];
  592.             $role_ids[$role['ROLE_ID'];
  593.         }
  594.         $data['SELECT_ROLE'= -1;
  595.  
  596.  
  597.         if(isset($_REQUEST['selectrole'])) {
  598.             $select_role $this->clean($_REQUEST['selectrole']"string" );
  599.         else {
  600.             $select_role "";
  601.         }
  602.  
  603.         if($select_role != "" {
  604.             $data['SELECT_ROLE'$select_role;
  605.             $data['ROLE_ACTIVITIES'=
  606.                 $this->roleModel->getRoleActivities($select_role);
  607.             $all_activities $this->activityModel->getActivityList();
  608.             $activity_ids array();
  609.             $activity_names array();
  610.             foreach($all_activities as $activity{
  611.                 $activity_ids[$activity['ACTIVITY_ID'];
  612.                 $activity_names[$activity['ACTIVITY_ID']] =
  613.                     $activity['ACTIVITY_NAME'];
  614.             }
  615.  
  616.             $available_activities =
  617.                 array_diff_assoc($all_activities$data['ROLE_ACTIVITIES']);
  618.             $data['AVAILABLE_ACTIVITIES'][-1=
  619.                 tl('admin_controller_select_activityname');
  620.  
  621.  
  622.             foreach($available_activities as $activity{
  623.                 $data['AVAILABLE_ACTIVITIES'][$activity['ACTIVITY_ID']] =
  624.                     $activity['ACTIVITY_NAME'];
  625.             }
  626.  
  627.             if(isset($_REQUEST['selectactivity'])) {
  628.                 $select_activity =
  629.                     $this->clean($_REQUEST['selectactivity']"int" );
  630.  
  631.             else {
  632.                 $select_activity "";
  633.             }
  634.             if($select_activity != ""{
  635.                 $data['SELECT_ACTIVITY'$select_activity;
  636.             else {
  637.                 $data['SELECT_ACTIVITY'= -1;
  638.             }
  639.  
  640.         }
  641.         if(isset($_REQUEST['arg']&&
  642.             in_array($_REQUEST['arg']$possible_arguments)) {
  643.  
  644.             switch($_REQUEST['arg'])
  645.             {
  646.                 case "addrole":
  647.                     unset($data['ROLE_ACTIVITIES']);
  648.                     unset($data['AVAILABLE_ACTIVITIES']);
  649.                     $data['SELECT_ROLE'= -1;
  650.                     if($this->roleModel->getRoleId($rolename0{
  651.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  652.                             tl('admin_controller_rolename_exists').
  653.                             "</h1>')";
  654.                         return $data;
  655.                     }
  656.  
  657.                     $this->roleModel->addRole($rolename);
  658.                     $roleid $this->roleModel->getRoleId($rolename);
  659.                     $data['ROLE_NAMES'][$roleid$rolename;
  660.  
  661.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  662.                         tl('admin_controller_rolename_added').
  663.                         "</h1>')";
  664.                 break;
  665.  
  666.                 case "deleterole":
  667.                     $data['SELECT_ROLE'= -1;
  668.                     unset($data['ROLE_ACTIVITIES']);
  669.                     unset($data['AVAILABLE_ACTIVITIES']);
  670.  
  671.                     if(!in_array($select_role$role_ids)) {
  672.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  673.                             tl('admin_controller_rolename_doesnt_exists').
  674.                             "</h1>')";
  675.                         return $data;
  676.                     }
  677.                     $this->roleModel->deleteRole($select_role);
  678.                     unset($data['ROLE_NAMES'][$select_role]);
  679.  
  680.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  681.                         tl('admin_controller_rolename_deleted')."</h1>')";
  682.                 break;
  683.  
  684.                 case "addactivity":
  685.                     if(!in_array($select_role$role_ids)) {
  686.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  687.                             tl('admin_controller_rolename_doesnt_exists').
  688.                             "</h1>')";
  689.                         return $data;
  690.                     }
  691.                     if(!in_array($select_activity$activity_ids)) {
  692.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  693.                             tl('admin_controller_activityname_doesnt_exists').
  694.                             "</h1>')";
  695.                         return $data;
  696.                     }
  697.                     $this->roleModel->addActivityRole(
  698.                         $select_role$select_activity);
  699.                     unset($data['AVAILABLE_ACTIVITIES'][$select_activity]);
  700.                     $data['ROLE_ACTIVITIES'=
  701.                         $this->roleModel->getRoleActivities($select_role);
  702.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  703.                         tl('admin_controller_activity_added')."</h1>')";
  704.                 break;
  705.  
  706.                 case "deleteactivity":
  707.                     if(!in_array($select_role$role_ids)) {
  708.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  709.                             tl('admin_controller_rolename_doesnt_exists').
  710.                             "</h1>')";
  711.                         return $data;
  712.                     }
  713.  
  714.                     if(!in_array($select_activity$activity_ids)) {
  715.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  716.                             tl('admin_controller_activityname_doesnt_exists').
  717.                             "</h1>')";
  718.                         return $data;
  719.                     }
  720.                     $this->roleModel->deleteActivityRole(
  721.                         $select_role$select_activity);
  722.                     $data['ROLE_ACTIVITIES'=
  723.                         $this->roleModel->getRoleActivities($select_role);
  724.                     $data['AVAILABLE_ACTIVITIES'][$select_activity=
  725.                         $activity_names[$select_activity];
  726.                     $data['SELECT_ACTIVITY'= -1;
  727.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  728.                         tl('admin_controller_activity_deleted')."</h1>')";
  729.                 break;
  730.             }
  731.         }
  732.  
  733.         return $data;
  734.     }
  735.  
  736.     /**
  737.      * Used to handle the manage crawl activity.
  738.      *
  739.      * This activity allows new crawls to be started, statistics about old
  740.      * crawls to be seen. It allows a user to stop the current crawl or
  741.      * restart an old crawl. It also allows a user to configure the options
  742.      * by which a crawl is conducted
  743.      *
  744.      * @return array $data information and statistics about crawls in the system
  745.      *       as well as status messages on performing a given sub activity
  746.  
  747.      */
  748.     function manageCrawls()
  749.     {
  750.         $possible_arguments =
  751.             array("start""resume""delete""stop""index""options");
  752.  
  753.         $data["ELEMENT""managecrawlsElement";
  754.         $data['SCRIPT'"doUpdate();";
  755.  
  756.         if(isset($_REQUEST['arg']&&
  757.             in_array($_REQUEST['arg']$possible_arguments)) {
  758.  
  759.             $machine_urls $this->machineModel->getQueueServerUrls();
  760.             $num_machines count($machine_urls);
  761.             if($num_machines <  || ($num_machines ==  &&
  762.                 UrlParser::isLocalhostUrl($machine_urls[0]))) {
  763.                 $machine_urls NULL;
  764.             }
  765.  
  766.             switch($_REQUEST['arg'])
  767.             {
  768.                 case "start":
  769.                     $this->startCrawl($data$machine_urls);
  770.                 break;
  771.  
  772.                 case "stop":
  773.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  774.                         tl('admin_controller_stop_crawl')."</h1>')";
  775.                     @unlink(CRAWL_DIR."/schedules/crawl_params.txt");
  776.  
  777.                     $info array();
  778.                     $info[self::STATUS"STOP_CRAWL";
  779.                     $filename CRAWL_DIR.
  780.                         "/schedules/name_server_messages.txt";
  781.                     file_put_contents($filenameserialize($info));
  782.  
  783.                     $this->crawlModel->sendStopCrawlMessage($machine_urls);
  784.                 break;
  785.  
  786.                 case "resume":
  787.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  788.                         tl('admin_controller_resume_crawl')."</h1>')";
  789.                     $crawl_params array();
  790.                     $crawl_params[self::STATUS"RESUME_CRAWL";
  791.                     $crawl_params[self::CRAWL_TIME=
  792.                         $this->clean($_REQUEST['timestamp']"int");
  793.                     $seed_info $this->crawlModel->getCrawlSeedInfo(
  794.                         $crawl_params[self::CRAWL_TIME]$machine_urls);
  795.                     $this->getCrawlParametersFromSeedInfo($crawl_params,
  796.                         $seed_info);
  797.                    /*
  798.                        Write the new crawl parameters to the name server, so
  799.                        that it can pass them along in the case of a new archive
  800.                        crawl.
  801.                     */
  802.                     $filename CRAWL_DIR.
  803.                         "/schedules/name_server_messages.txt";
  804.                     file_put_contents($filenameserialize($crawl_params));
  805.                     chmod($filename0777);
  806.                     $this->crawlModel->sendStartCrawlMessage($crawl_params,
  807.                         NULL$machine_urls);
  808.                 break;
  809.  
  810.                 case "delete":
  811.                     if(isset($_REQUEST['timestamp'])) {
  812.                          $timestamp =
  813.                             $this->clean($_REQUEST['timestamp']"int");
  814.                          $this->crawlModel->deleteCrawl($timestamp,
  815.                             $machine_urls);
  816.  
  817.                          $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  818.                             tl('admin_controller_delete_crawl_success').
  819.                             "</h1>'); crawlStatusUpdate(); ";
  820.                      else {
  821.                         $data['SCRIPT'.= "crawlStatusUpdate(); ".
  822.                             "doMessage('<h1 class=\"red\" >".
  823.                             tl('admin_controller_delete_crawl_fail').
  824.                             "</h1>')";
  825.                      }
  826.                 break;
  827.  
  828.                 case "index":
  829.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  830.                         tl('admin_controller_set_index')."</h1>')";
  831.  
  832.                     $timestamp $this->clean($_REQUEST['timestamp']"int");
  833.                     $this->crawlModel->setCurrentIndexDatabaseName($timestamp);
  834.                 break;
  835.  
  836.                 case "options":
  837.                     $this->editCrawlOption($data$machine_urls);
  838.                 break;
  839.             }
  840.         }
  841.         return $data;
  842.     }
  843.  
  844.     /**
  845.      * Called from @see manageCrawls to start a new crawl on the machines
  846.      * $machine_urls. Updates $data array with crawl start message
  847.      *
  848.      * @param array &$data an array of info to supply to AdminView
  849.      * @param array $machine_urls string urls of machines managed by this
  850.      *   Yioop name server on which to perform the crawl
  851.      */
  852.     function startCrawl(&$data$machine_urls$seed_info NULL)
  853.     {
  854.         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  855.             tl('admin_controller_starting_new_crawl')."</h1>')";
  856.  
  857.         $crawl_params array();
  858.         $crawl_params[self::STATUS"NEW_CRAWL";
  859.         $crawl_params[self::CRAWL_TIMEtime();
  860.         $seed_info $this->crawlModel->getSeedInfo();
  861.         $this->getCrawlParametersFromSeedInfo($crawl_params$seed_info);
  862.         if(isset($_REQUEST['description'])) {
  863.             $description $this->clean($_REQUEST['description']"string");
  864.         else {
  865.             $description tl('admin_controller_no_description');
  866.         }
  867.         $crawl_params['DESCRIPTION'$description;
  868.         $crawl_params[self::VIDEO_SOURCESarray();
  869.         $sources =
  870.             $this->sourceModel->getMediaSources('video');
  871.         foreach($sources as $source{
  872.             $url $source['SOURCE_URL'];
  873.             $url_parts explode("{}"$url);
  874.             $crawl_params[self::VIDEO_SOURCES][$url_parts[0];
  875.         }
  876.  
  877.         /*
  878.            Write the new crawl parameters to the name server, so
  879.            that it can pass them along in the case of a new archive
  880.            crawl.
  881.         */
  882.         $filename CRAWL_DIR.
  883.             "/schedules/name_server_messages.txt";
  884.         file_put_contents($filenameserialize($crawl_params));
  885.         chmod($filename0777);
  886.  
  887.         $this->crawlModel->sendStartCrawlMessage($crawl_params,
  888.             $seed_info$machine_urls);
  889.     }
  890.  
  891.     /**
  892.      * Reads the parameters for a crawl from an array gotten from a crawl.ini
  893.      * file
  894.      *
  895.      * @param array &$crawl_params parameters to write to queue_server
  896.      * @param array $seed_info data from crawl.ini file
  897.      */
  898.     function getCrawlParametersFromSeedInfo(&$crawl_params$seed_info)
  899.     {
  900.         $crawl_params[self::CRAWL_TYPE$seed_info['general']['crawl_type'];
  901.         $crawl_params[self::CRAWL_INDEX=
  902.             (isset($seed_info['general']['crawl_index'])) ?
  903.             $seed_info['general']['crawl_index''';
  904.         $crawl_params[self::ARC_DIR]=(isset($seed_info['general']['arc_dir'])) ?
  905.             $seed_info['general']['arc_dir''';
  906.         $crawl_params[self::ARC_TYPE=
  907.             (isset($seed_info['general']['arc_type'])) ?
  908.             $seed_info['general']['arc_type''';
  909.         $crawl_params[self::CACHE_PAGES=
  910.             (isset($seed_info['general']['cache_pages'])) ?
  911.             intval($seed_info['general']['cache_pages']:
  912.             true;
  913.         $crawl_params[self::PAGE_RANGE_REQUEST=
  914.             (isset($seed_info['general']['page_range_request'])) ?
  915.             intval($seed_info['general']['page_range_request']:
  916.             PAGE_RANGE_REQUEST;
  917.         $crawl_params[self::PAGE_RECRAWL_FREQUENCY=
  918.             (isset($seed_info['general']['page_recrawl_frequency'])) ?
  919.             intval($seed_info['general']['page_recrawl_frequency']:
  920.             PAGE_RECRAWL_FREQUENCY;
  921.         $crawl_params[self::TO_CRAWL$seed_info['seed_sites']['url'];
  922.         $crawl_params[self::CRAWL_ORDER$seed_info['general']['crawl_order'];
  923.         $crawl_params[self::RESTRICT_SITES_BY_URL=
  924.             $seed_info['general']['restrict_sites_by_url'];
  925.         $crawl_params[self::ALLOWED_SITES=
  926.             isset($seed_info['allowed_sites']['url']?
  927.             $seed_info['allowed_sites']['url'array();
  928.         $crawl_params[self::DISALLOWED_SITES=
  929.             isset($seed_info['disallowed_sites']['url']?
  930.             $seed_info['disallowed_sites']['url'array();
  931.         $crawl_params[self::PAGE_RULES
  932.             isset($seed_info['page_rules']['rule']?
  933.             $seed_info['page_rules']['rule'array();
  934.  
  935.         if(isset($seed_info['indexing_plugins']['plugins'])) {
  936.             $crawl_params[self::INDEXING_PLUGINS=
  937.                 $seed_info['indexing_plugins']['plugins'];
  938.         }
  939.         if(isset($seed_info['indexed_file_types']['extensions'])) {
  940.             $crawl_params[self::INDEXED_FILE_TYPES=
  941.                 $seed_info['indexed_file_types']['extensions'];
  942.         }
  943.     }
  944.  
  945.     /**
  946.      * Called from @see manageCrawls to edit the parameters for the next
  947.      * crawl (or current crawl) to be carried out by the machines
  948.      * $machine_urls. Updates $data array to be supplied to AdminView
  949.      *
  950.      * @param array &$data an array of info to supply to AdminView
  951.      * @param array $machine_urls string urls of machines managed by this
  952.      *   Yioop name server on which to perform the crawl
  953.      */
  954.     function editCrawlOption(&$data$machine_urls)
  955.     {
  956.         $data["leftorright"(getLocaleDirection(== 'ltr'?
  957.             "right""left";
  958.         $data["ELEMENT""crawloptionsElement";
  959.         $crawls $this->crawlModel->getCrawlList(falsefalse$machine_urls);
  960.         $indexes $this->crawlModel->getCrawlList(truetrue$machine_urls);
  961.         $mixes $this->crawlModel->getMixList(false);
  962.         foreach($mixes as $mix{
  963.             $tmp array();
  964.             $tmp["DESCRIPTION""MIX::".$mix["MIX_NAME"];
  965.             $tmp["CRAWL_TIME"$mix["MIX_TIMESTAMP"];
  966.             $tmp["ARC_DIR""MIX";
  967.             $tmp["ARC_TYPE""MixArchiveBundle";
  968.             $indexes[$tmp;
  969.         }
  970.  
  971.         $indexes_by_crawl_time array();
  972.         $update_flag false;
  973.         $data['available_options'array(
  974.             tl('admin_controller_use_below'),
  975.             tl('admin_controller_use_defaults'));
  976.         $data['available_crawl_indexes'array();
  977.         $data['options_default'tl('admin_controller_use_below');
  978.         foreach($crawls as $crawl{
  979.             if(strlen($crawl['DESCRIPTION']{
  980.                 $data['available_options'][$crawl['CRAWL_TIME']] =
  981.                     tl('admin_controller_previous_crawl')." ".
  982.                     $crawl['DESCRIPTION'];
  983.             }
  984.         }
  985.         foreach($indexes as $i => $crawl{
  986.             $data['available_crawl_indexes'][$crawl['CRAWL_TIME']]
  987.                 = $crawl['DESCRIPTION'];
  988.             $indexes_by_crawl_time[$crawl['CRAWL_TIME']] =$indexes[$i];
  989.         }
  990.         $no_further_changes false;
  991.         $seed_current $this->crawlModel->getSeedInfo();
  992.         if(isset($_REQUEST['load_option']&&
  993.             $_REQUEST['load_option'== 1{
  994.             $seed_info $this->crawlModel->getSeedInfo(true);
  995.             if(isset(
  996.                 $seed_current['general']['page_range_request'])) {
  997.                 $seed_info['general']['page_range_request'=
  998.                     $seed_current['general']['page_range_request'];
  999.             }
  1000.             if(isset(
  1001.                 $seed_current['general']['page_recrawl_frequency'])
  1002.                 ){
  1003.                 $seed_info['general']['page_recrawl_frequency'=
  1004.                 $seed_current['general']['page_recrawl_frequency'];
  1005.             }
  1006.             $update_flag true;
  1007.             $no_further_changes true;
  1008.         else if (isset($_REQUEST['load_option']&&
  1009.             $_REQUEST['load_option'{
  1010.             $timestamp =
  1011.                 $this->clean($_REQUEST['load_option']"int");
  1012.             $seed_info $this->crawlModel->getCrawlSeedInfo(
  1013.                 $timestamp$machine_urls);
  1014.             $update_flag true;
  1015.             $no_further_changes true;
  1016.         else if(isset($_REQUEST['ts'])) {
  1017.             $timestamp =
  1018.                 $this->clean($_REQUEST['ts']"int");
  1019.             $seed_info $this->crawlModel->getCrawlSeedInfo(
  1020.                 $timestamp$machine_urls);
  1021.             $data['ts'$timestamp;
  1022.         else {
  1023.             $seed_info $this->crawlModel->getSeedInfo();
  1024.         }
  1025.         $page_options_properties array('indexed_file_types',
  1026.             'page_rules''indexing_plugins');
  1027.         //these properties should be changed under page_options not here
  1028.         foreach($page_options_properties as $property{
  1029.             if(isset($seed_current[$property])) {
  1030.                 $seed_info[$property$seed_current[$property];
  1031.             }
  1032.         }
  1033.         if(!$no_further_changes && isset($_REQUEST['crawl_indexes'])
  1034.             && in_array($_REQUEST['crawl_indexes'],
  1035.             array_keys($data['available_crawl_indexes']))) {
  1036.             $seed_info['general']['crawl_index'$_REQUEST['crawl_indexes'];
  1037.             $index_data $indexes_by_crawl_time[$_REQUEST['crawl_indexes']];
  1038.             if(isset($index_data['ARC_DIR'])) {
  1039.                 $seed_info['general']['arc_dir'$index_data['ARC_DIR'];
  1040.                 $seed_info['general']['arc_type'$index_data['ARC_TYPE'];
  1041.             else {
  1042.                 $seed_info['general']['arc_dir''';
  1043.                 $seed_info['general']['arc_type''';
  1044.             }
  1045.             $update_flag true;
  1046.         }
  1047.         $data['crawl_index'=  (isset($seed_info['general']['crawl_index'])) ?
  1048.             $seed_info['general']['crawl_index''';
  1049.         $data['available_crawl_types'array(self::WEB_CRAWL,
  1050.             self::ARCHIVE_CRAWL);
  1051.         if(!$no_further_changes && isset($_REQUEST['crawl_type']&&
  1052.             in_array($_REQUEST['crawl_type']$data['available_crawl_types'])) {
  1053.             $seed_info['general']['crawl_type'=
  1054.                 $_REQUEST['crawl_type'];
  1055.             $update_flag true;
  1056.         }
  1057.         $data['crawl_type'$seed_info['general']['crawl_type'];
  1058.         if($data['crawl_type'== self::WEB_CRAWL{
  1059.             $data['web_crawl_active'"active";
  1060.             $data['archive_crawl_active'"";
  1061.         else {
  1062.             $data['archive_crawl_active'"active";
  1063.             $data['web_crawl_active'"";
  1064.         }
  1065.  
  1066.         $data['available_crawl_orders'array(
  1067.             self::BREADTH_FIRST =>
  1068.                 tl('admin_controller_breadth_first'),
  1069.             self::PAGE_IMPORTANCE =>
  1070.                 tl('admin_controller_page_importance'));
  1071.  
  1072.         if(!$no_further_changes && isset($_REQUEST['crawl_order'])
  1073.             &&  in_array($_REQUEST['crawl_order'],
  1074.                 array_keys($data['available_crawl_orders']))) {
  1075.             $seed_info['general']['crawl_order'=
  1076.                 $_REQUEST['crawl_order'];
  1077.             $update_flag true;
  1078.         }
  1079.         $data['crawl_order'$seed_info['general']['crawl_order'];
  1080.  
  1081.         if(!$no_further_changes && isset($_REQUEST['posted'])) {
  1082.             $seed_info['general']['restrict_sites_by_url'=
  1083.                 (isset($_REQUEST['restrict_sites_by_url'])) ?
  1084.                 true false;
  1085.             $update_flag true;
  1086.         }
  1087.         $data['restrict_sites_by_url'=
  1088.             $seed_info['general']['restrict_sites_by_url'];
  1089.         $site_types =
  1090.             array('allowed_sites' => 'url''disallowed_sites' => 'url',
  1091.                 'seed_sites' => 'url');
  1092.         foreach($site_types as $type => $field{
  1093.             if(!$no_further_changes && isset($_REQUEST[$type])) {
  1094.                 $seed_info[$type][$field=
  1095.                     $this->convertStringCleanArray(
  1096.                     $_REQUEST[$type]$field);
  1097.                     $update_flag true;
  1098.             }
  1099.             if(isset($seed_info[$type][$field])) {
  1100.                 $data[$type$this->convertArrayLines(
  1101.                     $seed_info[$type][$field]);
  1102.             else {
  1103.                 $data[$type"";
  1104.             }
  1105.         }
  1106.         $data['TOGGLE_STATE'=
  1107.             ($data['restrict_sites_by_url']?
  1108.             "checked='checked'" "";
  1109.  
  1110.         $data['SCRIPT'"setDisplay('toggle', ".
  1111.             "'{$data['restrict_sites_by_url']}');";
  1112.         if(!isset($_REQUEST['ts'])) {
  1113.             $data['SCRIPT'.=
  1114.             " elt('load-options').onchange = ".
  1115.             "function() { if(elt('load-options').selectedIndex !=".
  1116.             " 0) { elt('crawloptionsForm').submit();  }};";
  1117.         }
  1118.         if($data['crawl_type'== CrawlConstants::WEB_CRAWL{
  1119.             $data['SCRIPT'.=
  1120.                 "switchTab('webcrawltab', 'archivetab');";
  1121.         else {
  1122.             $data['SCRIPT'.=
  1123.                 "switchTab('archivetab', 'webcrawltab');";
  1124.         }
  1125.         $add_message "";
  1126.         if(isset($_REQUEST['ts']&&
  1127.             isset($_REQUEST['inject_sites'])) {
  1128.                 $timestamp $this->clean($_REQUEST['ts'],
  1129.                     "string");
  1130.                 $inject_urls =
  1131.                     $this->convertStringCleanArray(
  1132.                     $_REQUEST['inject_sites']);
  1133.                 if($this->crawlModel->injectUrlsCurrentCrawl(
  1134.                     $timestamp$inject_urls$machine_urls)) {
  1135.                     $add_message "<br />".
  1136.                         tl('admin_controller_urls_injected');
  1137.                 }
  1138.         }
  1139.         if($update_flag{
  1140.             if(isset($_REQUEST['ts'])) {
  1141.                 $this->crawlModel->setCrawlSeedInfo($timestamp,
  1142.                     $seed_info$machine_urls);
  1143.             else {
  1144.                 $this->crawlModel->setSeedInfo($seed_info);
  1145.             }
  1146.             $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  1147.                 tl('admin_controller_update_seed_info').
  1148.                 "$add_message</h1>');";
  1149.         }
  1150.         return $data;
  1151.     }
  1152.  
  1153.     /**
  1154.      * Converts an array of lines of strings into a single string with
  1155.      * proper newlines, each line having been trimmed and potentially
  1156.      * cleaned
  1157.      *
  1158.      * @param array $arr the array of lines to be process
  1159.      * @param string $endline_string what string should be used to indicate
  1160.      *       the end of a line
  1161.      * @param bool $clean whether to clean each line
  1162.      * @return string a concatenated string of cleaned lines
  1163.      */
  1164.     function convertArrayLines($arr$endline_string="\n"$clean false)
  1165.     {
  1166.         $output "";
  1167.         $eol "";
  1168.         foreach($arr as $line{
  1169.             $output .= $eol;
  1170.             $out_line trim($line);
  1171.             if($clean{
  1172.                 $out_line $this->clean($out_line"string");
  1173.             }
  1174.             $output .= trim($out_line);
  1175.             $eol $endline_string;
  1176.         }
  1177.         return $output;
  1178.     }
  1179.     /**
  1180.      * Cleans a string consisting of lines, typically of urls into an array of
  1181.      * clean lines. This is used in handling data from the crawl options
  1182.      * text areas.
  1183.      *
  1184.      * @param string $str contains the url data
  1185.      * @param string $line_type does additional cleaning depending on the type
  1186.      *       of the lines. For instance, if is "url" then a line not beginning
  1187.      *       with a url scheme will have http:// prepended.
  1188.      * @return $lines an array of clean lines
  1189.      */
  1190.     function convertStringCleanArray($str$line_type="url")
  1191.     {
  1192.         if($line_type == "url"{
  1193.             $pre_lines preg_split("/(\s)+/"$str);
  1194.         else {
  1195.             $pre_lines preg_split('/\n+/'$str);
  1196.         }
  1197.         $lines array();
  1198.         foreach($pre_lines as $line{
  1199.             $pre_line trim($this->clean($line"string"));
  1200.             if(strlen($pre_line0{
  1201.                 if($line_type == "url"{
  1202.                     $start_line substr($pre_line06);
  1203.                     if(!in_array($start_line,
  1204.                         array("file:/""http:/""domain""https:"))) {
  1205.                         $pre_line "http://"$pre_line;
  1206.                     }
  1207.                 }
  1208.                 $lines[$pre_line;
  1209.             }
  1210.         }
  1211.         return $lines;
  1212.     }
  1213.  
  1214.     /**
  1215.      * Handles admin request related to the crawl mix activity
  1216.      *
  1217.      * The crawl mix activity allows a user to create/edit crawl mixes:
  1218.      * weighted combinations of search indexes
  1219.      *
  1220.      * @return array $data info about available crawl mixes and changes to them
  1221.      *       as well as any messages about the success or failure of a
  1222.      *       sub activity.
  1223.      */
  1224.     function mixCrawls()
  1225.     {
  1226.         $possible_arguments array(
  1227.             "createmix""deletemix""editmix""index");
  1228.  
  1229.         $data["ELEMENT""mixcrawlsElement";
  1230.  
  1231.         $data['mix_default'0;
  1232.         $machine_urls $this->machineModel->getQueueServerUrls();
  1233.         $num_machines count($machine_urls);
  1234.         if($num_machines <  || ($num_machines ==  &&
  1235.             UrlParser::isLocalhostUrl($machine_urls[0]))) {
  1236.             $machine_urls NULL;
  1237.         }
  1238.         $crawls $this->crawlModel->getCrawlList(falsetrue$machine_urls);
  1239.         $data['available_crawls'][0tl('admin_controller_select_crawl');
  1240.         $data['available_crawls'][1tl('admin_controller_default_crawl');
  1241.         $data['SCRIPT'"c = [];c[0]='".
  1242.             tl('admin_controller_select_crawl')."';";
  1243.         $data['SCRIPT'.= "c[1]='".
  1244.             tl('admin_controller_default_crawl')."';";
  1245.         foreach($crawls as $crawl{
  1246.             $data['available_crawls'][$crawl['CRAWL_TIME']] =
  1247.                 $crawl['DESCRIPTION'];
  1248.             $data['SCRIPT'.= 'c['.$crawl['CRAWL_TIME'].']="'.
  1249.                 $crawl['DESCRIPTION'].'";';
  1250.         }
  1251.         $mixes $this->crawlModel->getMixList(true);
  1252.         if(count($mixes{
  1253.             $data['available_mixes']$mixes;
  1254.             $mix_ids array();
  1255.             foreach($mixes as $mix{
  1256.                 $mix_ids[$mix['MIX_TIMESTAMP'];
  1257.             }
  1258.         }
  1259.  
  1260.         $mix array();
  1261.         if(isset($_REQUEST['arg']&&
  1262.             in_array($_REQUEST['arg']$possible_arguments)) {
  1263.             switch($_REQUEST['arg'])
  1264.             {
  1265.                 case "createmix":
  1266.                     $mix['MIX_TIMESTAMP'time();
  1267.                     if(isset($_REQUEST['MIX_NAME'])) {
  1268.                         $mix['MIX_NAME'$this->clean($_REQUEST['MIX_NAME'],
  1269.                             'string');
  1270.                     else {
  1271.                         $mix['MIX_NAME'tl('admin_controller_unnamed');
  1272.                     }
  1273.                     $mix['GROUPS'array();
  1274.                     $this->crawlModel->setCrawlMix($mix);
  1275.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  1276.                         tl('admin_controller_mix_created')."</h1>');";
  1277.  
  1278.                 case "editmix":
  1279.                     //$data passed by reference
  1280.                     $this->editMix($data$mix_ids$mix);
  1281.                 break;
  1282.  
  1283.                 case "index":
  1284.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  1285.                         tl('admin_controller_set_index')."</h1>')";
  1286.  
  1287.                     $timestamp $this->clean($_REQUEST['timestamp']"int");
  1288.                     $this->crawlModel->setCurrentIndexDatabaseName($timestamp);
  1289.                 break;
  1290.  
  1291.                 case "deletemix":
  1292.                     if(!isset($_REQUEST['timestamp'])|| !isset($mix_ids||
  1293.                         !in_array($_REQUEST['timestamp']$mix_ids)) {
  1294.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  1295.                             tl('admin_controller_mix_doesnt_exists').
  1296.                             "</h1>')";
  1297.                         return $data;
  1298.                     }
  1299.                     $this->crawlModel->deleteCrawlMix($_REQUEST['timestamp']);
  1300.                     $data['available_mixes'=
  1301.                         $this->crawlModel->getMixList(true);
  1302.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  1303.                         tl('admin_controller_mix_deleted')."</h1>')";
  1304.                 break;
  1305.             }
  1306.         }
  1307.  
  1308.         $crawl_time $this->crawlModel->getCurrentIndexDatabaseName();
  1309.         if(isset($crawl_time) ) {
  1310.             $data['CURRENT_INDEX'= (int)$crawl_time;
  1311.         else {
  1312.             $data['CURRENT_INDEX'= -1;
  1313.         }
  1314.  
  1315.         return $data;
  1316.     }
  1317.  
  1318.     /**
  1319.      * Handles admin request related to the editing a crawl mix activity
  1320.      *
  1321.      * @return array $data info about the groups and their contents for a
  1322.      *       particular crawl mix
  1323.      */
  1324.     function editMix(&$data&$mix_ids$mix)
  1325.     {
  1326.         $data["leftorright"=
  1327.             (getLocaleDirection(== 'ltr'"right""left";
  1328.         $data["ELEMENT""editmixElement";
  1329.  
  1330.         if(isset($_REQUEST['timestamp'])) {
  1331.             $mix $this->crawlModel->getCrawlMix(
  1332.                 $_REQUEST['timestamp']);
  1333.         }
  1334.         $data['MIX'$mix;
  1335.         $data['INCLUDE_SCRIPTS'array("mix");
  1336.  
  1337.         //set up an array of translation for javascript-land
  1338.         $data['SCRIPT'.= "tl = {".
  1339.             'editmix_element_add_crawls:"'tl('editmix_element_add_crawls'.
  1340.             '",' 'editmix_element_num_results:"'.
  1341.                 tl('editmix_element_num_results').'",'.
  1342.             'editmix_element_del_grp:"'.tl('editmix_element_del_grp').'",'.
  1343.             'editmix_element_weight:"'.tl('editmix_element_weight').'",'.
  1344.             'editmix_element_name:"'.tl('editmix_element_name').'",'.
  1345.             'editmix_add_keywords:"'.tl('editmix_add_keywords').'",'.
  1346.             'editmix_element_actions:"'.tl('editmix_element_actions').'",'.
  1347.             'editmix_add_query:"'.tl('editmix_add_query').'",'.
  1348.             'editmix_element_delete:"'.tl('editmix_element_delete').'"'.
  1349.             '};';
  1350.         //clean and save the crawl mix sent from the browser
  1351.         if(isset($_REQUEST['update']&& $_REQUEST['update'==
  1352.             "update"{
  1353.             $mix $_REQUEST['mix'];
  1354.             $mix['MIX_TIMESTAMP'=
  1355.                 $this->clean($mix['MIX_TIMESTAMP']"int");
  1356.             $mix['MIX_NAME'=$this->clean($mix['MIX_NAME'],
  1357.                 "string");
  1358.             $comp array();
  1359.             if(isset($mix['GROUPS'])) {
  1360.  
  1361.                 if($mix['GROUPS'!= NULL{
  1362.                     foreach($mix['GROUPS'as $group_id => $group_data{
  1363.                         if(isset($group_data['RESULT_BOUND'])) {
  1364.                             $mix['GROUPS'][$group_id]['RESULT_BOUND'=
  1365.                                 $this->clean($group_data['RESULT_BOUND'],
  1366.                                     "int");
  1367.                         else {
  1368.                             $mix['GROUPS']['RESULT_BOUND'0;
  1369.                         }
  1370.                         if(isset($group_data['COMPONENTS'])) {
  1371.                             $comp array();
  1372.                             foreach($group_data['COMPONENTS'as $component{
  1373.                                 $row array();
  1374.                                 $row['CRAWL_TIMESTAMP'=
  1375.                                     $this->clean($component['CRAWL_TIMESTAMP'],
  1376.                                     "int");
  1377.                                 $row['WEIGHT'$this->clean(
  1378.                                     $component['WEIGHT']"float");
  1379.                                 $row['KEYWORDS'$this->clean(
  1380.                                     $component['KEYWORDS'],
  1381.                                     "string");
  1382.                                 $comp[=$row;
  1383.                             }
  1384.                             $mix['GROUPS'][$group_id]['COMPONENTS'$comp;
  1385.                         else {
  1386.                             $mix['GROUPS'][$group_id]['COMPONENTS'array();
  1387.                         }
  1388.                     }
  1389.                 else {
  1390.                     $mix['COMPONENTS'array();
  1391.                 }
  1392.  
  1393.             else {
  1394.                 $mix['GROUPS'$data['MIX']['GROUPS'];
  1395.             }
  1396.  
  1397.             $data['MIX'$mix;
  1398.             $this->crawlModel->setCrawlMix($mix);
  1399.             $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  1400.                 tl('admin_controller_mix_saved')."</h1>');";
  1401.         }
  1402.  
  1403.         $data['SCRIPT'.= 'groups = [';
  1404.         $not_first "";
  1405.         foreach($mix['GROUPS'as $group_id => $group_data{
  1406.             $data['SCRIPT'.= $not_first.'{';
  1407.             $not_first",";
  1408.             if(isset($group_data['RESULT_BOUND'])) {
  1409.                 $data['SCRIPT'.= "num_results:".$group_data['RESULT_BOUND'];
  1410.             else {
  1411.                 $data['SCRIPT'.= "num_results:1 ";
  1412.             }
  1413.             $data['SCRIPT'.= ", components:[";
  1414.             if(isset($group_data['COMPONENTS'])) {
  1415.                 $comma "";
  1416.                 foreach($group_data['COMPONENTS'as $component{
  1417.                     $crawl_ts $component['CRAWL_TIMESTAMP'];
  1418.                     $crawl_name $data['available_crawls'][$crawl_ts];
  1419.                     $data['SCRIPT'.= $comma." [$crawl_ts, '$crawl_name', ".
  1420.                         $component['WEIGHT'].", ";
  1421.                     $comma ",";
  1422.                     $keywords (isset($component['KEYWORDS'])) ?
  1423.                         $component['KEYWORDS'"";
  1424.                     $data['SCRIPT'.= "'$keywords'] ";
  1425.                 }
  1426.             }
  1427.             $data['SCRIPT'.= "] }";
  1428.         }
  1429.         $data['SCRIPT'.= ']; drawGroups();';
  1430.     }
  1431.  
  1432.     /**
  1433.      * Handles admin request related to controlling file options to be used
  1434.      * in a crawl
  1435.      *
  1436.      * This activity allows a user to specify the page range size to be
  1437.      * be used during a crawl as well as which file types can be downloaded
  1438.      *
  1439.      * @return array $data info about the groups and their contents for a
  1440.      *       particular crawl mix
  1441.      */
  1442.     function pageOptions()
  1443.     {
  1444.         global $INDEXED_FILE_TYPES;
  1445.         $data["ELEMENT""pageoptionsElement";
  1446.         $data['SCRIPT'"";
  1447.         $machine_urls $this->machineModel->getQueueServerUrls();
  1448.         $num_machines count($machine_urls);
  1449.         if($num_machines <  || ($num_machines ==  &&
  1450.             UrlParser::isLocalhostUrl($machine_urls[0]))) {
  1451.             $machine_urls NULL;
  1452.         }
  1453.         $data['available_options'array(
  1454.             tl('admin_controller_use_below'),
  1455.             tl('admin_controller_use_defaults'));
  1456.         $crawls $this->crawlModel->getCrawlList(falsetrue$machine_urls);
  1457.         $data['options_default'tl('admin_controller_use_below');
  1458.         foreach($crawls as $crawl{
  1459.             if(strlen($crawl['DESCRIPTION']{
  1460.                 $data['available_options'][$crawl['CRAWL_TIME']] =
  1461.                     tl('admin_controller_previous_crawl')." ".
  1462.                     $crawl['DESCRIPTION'];
  1463.             }
  1464.         }
  1465.         $seed_info $this->crawlModel->getSeedInfo();
  1466.         $data['RECRAWL_FREQS'array(-1=>tl('admin_controller_recrawl_never'),
  1467.             1=>tl('admin_controller_recrawl_1day'),
  1468.             2=>tl('admin_controller_recrawl_2day'),
  1469.             3=>tl('admin_controller_recrawl_3day'),
  1470.             7=>tl('admin_controller_recrawl_7day'),
  1471.             14=>tl('admin_controller_recrawl_14day'));
  1472.         $data['SIZE_VALUES'array(10000=>1000050000=>50000,
  1473.             100000=>100000500000=>5000001000000=>1000000,
  1474.             5000000=>500000010000000=>10000000);
  1475.  
  1476.         if(!isset($seed_info["indexed_file_types"]["extensions"])) {
  1477.             $seed_info["indexed_file_types"]["extensions"=
  1478.                 $INDEXED_FILE_TYPES;
  1479.         }
  1480.         $loaded false;
  1481.         if(isset($_REQUEST['load_option']&&
  1482.             $_REQUEST['load_option'0{
  1483.             if($_REQUEST['load_option'== 1{
  1484.                 $seed_loaded $this->crawlModel->getSeedInfo(true);
  1485.             else {
  1486.                 $timestamp $this->clean($_REQUEST['load_option']"int");
  1487.                 $seed_loaded $this->crawlModel->getCrawlSeedInfo(
  1488.                     $timestamp$machine_urls);
  1489.             }
  1490.             $copy_options array("general" => array("page_recrawl_frequency",
  1491.                 "page_range_request""cache_pages"),
  1492.                 "indexed_file_types" => array("extensions"),
  1493.                 "indexing_plugins" => array("plugins"));
  1494.             foreach($copy_options as $main_option => $sub_options{
  1495.                 foreach($sub_options as $sub_option{
  1496.                     if(isset($seed_loaded[$main_option][$sub_option])) {
  1497.                         $seed_info[$main_option][$sub_option
  1498.                             $seed_loaded[$main_option][$sub_option];
  1499.                     }
  1500.                 }
  1501.             }
  1502.             if(isset($seed_loaded['page_rules'])) {
  1503.                 $seed_info['page_rules'
  1504.                     $seed_loaded['page_rules'];
  1505.             }
  1506.             $update_flag true;
  1507.             $loaded true;
  1508.         else {
  1509.             $seed_info $this->crawlModel->getSeedInfo();
  1510.             if(isset($_REQUEST["page_recrawl_frequency"]&&
  1511.                 in_array($_REQUEST["page_recrawl_frequency"],
  1512.                     array_keys($data['RECRAWL_FREQS']))) {
  1513.                 $seed_info["general"]["page_recrawl_frequency"=
  1514.                     $_REQUEST["page_recrawl_frequency"];
  1515.             }
  1516.             if(isset($_REQUEST["page_range_request"]&&
  1517.                 in_array($_REQUEST["page_range_request"],$data['SIZE_VALUES'])){
  1518.                 $seed_info["general"]["page_range_request"=
  1519.                     $_REQUEST["page_range_request"];
  1520.             }
  1521.            if(isset($_REQUEST["cache_pages"]) ) {
  1522.                 $seed_info["general"]["cache_pages"true;
  1523.            else if(isset($_REQUEST['posted'])) {
  1524.                 //form sent but check box unchecked
  1525.                 $seed_info["general"]["cache_pages"false;
  1526.            }
  1527.  
  1528.            if(isset($_REQUEST['page_rules'])) {
  1529.                 $seed_info['page_rules']['rule'=
  1530.                     $this->convertStringCleanArray(
  1531.                     $_REQUEST['page_rules']'rule');
  1532.                     $update_flag true;
  1533.             }
  1534.         }
  1535.         if(!isset($seed_info["general"]["page_recrawl_frequency"])) {
  1536.             $seed_info["general"]["page_recrawl_frequency"=
  1537.                 PAGE_RECRAWL_FREQUENCY;
  1538.         }
  1539.         $data['PAGE_RECRAWL_FREQUENCY'=
  1540.             $seed_info["general"]["page_recrawl_frequency"];
  1541.         if(!isset($seed_info["general"]["cache_pages"])) {
  1542.             $seed_info["general"]["cache_pages"false;
  1543.         }
  1544.         $data["CACHE_PAGES"$seed_info["general"]["cache_pages"];
  1545.         if(!isset($seed_info["general"]["page_range_request"])) {
  1546.             $seed_info["general"]["page_range_request"PAGE_RANGE_REQUEST;
  1547.         }
  1548.         $data['PAGE_SIZE'$seed_info["general"]["page_range_request"];
  1549.  
  1550.         $data['INDEXING_PLUGINS'array();
  1551.         $included_plugins array();
  1552.         if(isset($_REQUEST["posted"])) {
  1553.             $seed_info['indexing_plugins']['plugins'=
  1554.                 (isset($_REQUEST["INDEXING_PLUGINS"])) ?
  1555.                 $_REQUEST["INDEXING_PLUGINS"array();
  1556.         }
  1557.         $included_plugins =
  1558.             (isset($seed_info['indexing_plugins']['plugins'])) ?
  1559.                 $seed_info['indexing_plugins']['plugins']
  1560.                 : array();
  1561.  
  1562.         foreach($this->indexing_plugins as $plugin{
  1563.             $plugin_name ucfirst($plugin);
  1564.             $data['INDEXING_PLUGINS'][$plugin_name=
  1565.                 (in_array($plugin_name$included_plugins)) ?
  1566.                 "checked='checked'" "";
  1567.         }
  1568.  
  1569.         $profile =  $this->profileModel->getProfile(WORK_DIRECTORY);
  1570.         if(!isset($_REQUEST['load_option'])) {
  1571.             $data array_merge($data$profile);
  1572.         else {
  1573.             
  1574.             $this->updateProfileFields($data$profile,
  1575.                 array('IP_LINK','CACHE_LINK''SIMILAR_LINK''IN_LINK',
  1576.                     'SIGNIN_LINK''SUBSEARCH_LINK','WORD_SUGGEST'));
  1577.         }
  1578.         $weights array('TITLE_WEIGHT' => 4,
  1579.             'DESCRIPTION_WEIGHT' => 1'LINK_WEIGHT' => 2,
  1580.             'MIN_RESULTS_TO_GROUP' => 200'SERVER_ALPHA' => 1.6);
  1581.         $change false;
  1582.         foreach($weights as $weight => $value{
  1583.             if(isset($_REQUEST[$weight])) {
  1584.                 $data[$weight$this->clean($_REQUEST[$weight]'float'1
  1585.                     );
  1586.                 $profile[$weight$data[$weight];
  1587.                 $change true;
  1588.             else if(isset($profile[$weight]&& $profile[$weight!= ""){
  1589.                 $data[$weight$profile[$weight];
  1590.             else {
  1591.                 $data[$weight$value;
  1592.                 $profile[$weight$data[$weight];
  1593.                 $change true;
  1594.             }
  1595.         }
  1596.         if($change == true{
  1597.             $this->profileModel->updateProfile(WORK_DIRECTORYarray(),
  1598.                 $profile);
  1599.         }
  1600.         $data['INDEXED_FILE_TYPES'array();
  1601.  
  1602.         $filetypes array();
  1603.         foreach($INDEXED_FILE_TYPES as $filetype{
  1604.             $ison =false;
  1605.             if(isset($_REQUEST["filetype"]&& !$loaded{
  1606.                 if(isset($_REQUEST["filetype"][$filetype])) {
  1607.                     $filetypes[$filetype;
  1608.                     $ison true;
  1609.                     $change true;
  1610.                 }
  1611.             else {
  1612.                 if(in_array($filetype,
  1613.                     $seed_info["indexed_file_types"]["extensions"])) {
  1614.                     $filetypes[$filetype;
  1615.                     $ison true;
  1616.                 }
  1617.             }
  1618.             $data['INDEXED_FILE_TYPES'][$filetype($ison?
  1619.                 "checked='checked'" :'';
  1620.         }
  1621.         $seed_info["indexed_file_types"]["extensions"$filetypes;
  1622.  
  1623.         if(isset($seed_info['page_rules']['rule'])) {
  1624.             $data['page_rules'$this->convertArrayLines(
  1625.                 $seed_info['page_rules']['rule']);
  1626.         else {
  1627.             $data['page_rules'"";
  1628.         }
  1629.         $allowed_options array('crawl_time''search_time''test_options');
  1630.         if(isset($_REQUEST['option_type']&&
  1631.             in_array($_REQUEST['option_type']$allowed_options)) {
  1632.             $data['option_type'$_REQUEST['option_type'];
  1633.         else {
  1634.             $data['option_type''crawl_time';
  1635.         }
  1636.         if($data['option_type'== 'crawl_time'{
  1637.             $data['crawl_time_active'"active";
  1638.             $data['search_time_active'"";
  1639.             $data['test_options_active'"";
  1640.             $data['SCRIPT'.= "\nswitchTab('crawltimetab',".
  1641.                 "'searchtimetab', 'testoptionstab')\n";
  1642.         else if($data['option_type'== 'search_time'{
  1643.             $data['search_time_active'"active";
  1644.             $data['crawl_time_active'"";
  1645.             $data['test_options_active'"";
  1646.             $data['SCRIPT'.= "\nswitchTab('searchtimetab',".
  1647.                 "'crawltimetab', 'testoptionstab')\n";
  1648.         else {
  1649.             $data['search_time_active'"";
  1650.             $data['crawl_time_active'"";
  1651.             $data['test_options_active'"active";
  1652.             $data['SCRIPT'.= "\nswitchTab('testoptionstab',".
  1653.                 "'crawltimetab', 'searchtimetab');\n";
  1654.         }
  1655.         
  1656.         $this->crawlModel->setSeedInfo($seed_info);
  1657.         if($change == true && $data['option_type'!= 'test_options'{
  1658.             $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  1659.                 tl('admin_controller_page_options_updated')."</h1>')";
  1660.         }
  1661.         $test_processors array(
  1662.             "text/html" => "HtmlProcessor",
  1663.             "text/asp" => "HtmlProcessor",
  1664.             "text/xml" => "XmlProcessor",
  1665.             "text/robot" => "RobotProcessor",
  1666.             "application/xml" => "XmlProcessor",
  1667.             "application/xhtml+xml" => "HtmlProcessor",
  1668.             "application/rss+xml" => "RssProcessor",
  1669.             "application/atom+xml" => "RssProcessor",
  1670.             "text/rtf" => "RtfProcessor",
  1671.             "text/plain" => "TextProcessor",
  1672.             "text/csv" => "TextProcessor",
  1673.             "text/tab-separated-values" => "TextProcessor",
  1674.         );
  1675.         $data['MIME_TYPES'array_keys($test_processors);
  1676.         $data['page_type'"text/html";
  1677.         if(isset($_REQUEST['page_type']&& in_array($_REQUEST['page_type'],
  1678.             $data['MIME_TYPES'])) {
  1679.             $data['page_type'$_REQUEST['page_type'];
  1680.         }
  1681.         $data['TESTPAGE'(isset($_REQUEST['TESTPAGE'])) ?
  1682.             $this->clean($_REQUEST['TESTPAGE']'string'"";
  1683.         if($data['option_type'== 'test_options' && $data['TESTPAGE'!=""{
  1684.             $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  1685.                 tl('admin_controller_page_options_running_tests')."</h1>')";
  1686.             $site array();
  1687.             $site[self::ENCODING"UTF-8";
  1688.             $site[self::URL"http://test-site.yioop.com/";
  1689.             $site[self::IP_ADDRESSESarray("1.1.1.1");
  1690.             $site[self::HTTP_CODE200;
  1691.             $site[self::MODIFIEDdate("U"time());
  1692.             $site[self::TIMESTAMPtime();
  1693.             $site[self::TYPE"text/html";
  1694.             $site[self::HEADER"page options test extractor";
  1695.             $site[self::SERVER"unknown";
  1696.             $site[self::SERVER_VERSION"unknown";
  1697.             $site[self::OPERATING_SYSTEM"unknown";
  1698.             $site[self::LANG'en';
  1699.             $site[self::JUST_METASfalse;
  1700.             if(isset($_REQUEST['page_type']&& 
  1701.                 in_array($_REQUEST['page_type']$data['MIME_TYPES'])) {
  1702.                 $site[self::TYPE$_REQUEST['page_type'];
  1703.             }
  1704.             $processor_name $test_processors[$site[self::TYPE]];
  1705.             $page_processor new $processor_name();
  1706.             $doc_info $page_processor->handle($_REQUEST['TESTPAGE'],
  1707.                 $site[self::URL]);
  1708.             foreach($doc_info as $key => $value{
  1709.                 $site[$key$value;
  1710.             }
  1711.             if(isset($site[self::PAGE])) {
  1712.                 unset($site[self::PAGE]);
  1713.             }
  1714.             if(isset($site[self::ROBOT_PATHS])) {
  1715.                 $site[self::JUST_METAStrue;
  1716.             }
  1717.             $reflect new ReflectionClass("CrawlConstants");
  1718.             $crawl_constants $reflect->getConstants();
  1719.             $crawl_keys array_keys($crawl_constants);
  1720.             $crawl_values array_values($crawl_constants);
  1721.             $inverse_constants array_combine($crawl_values$crawl_keys);
  1722.             $after_process array();
  1723.             foreach($site as $key => $value{
  1724.                 $out_key (isset($inverse_constants[$key])) ?
  1725.                     $inverse_constants[$key$key;
  1726.                 $after_process[$out_key$value;
  1727.             }
  1728.             $data["AFTER_PAGE_PROCESS"wordwrap($this->clean(
  1729.                 print_r($after_processtrue)"string")75"\n"true);
  1730.             $rule_string implode("\n"$seed_info['page_rules']['rule']);
  1731.             $rule_string html_entity_decode($rule_stringENT_QUOTES);
  1732.             $page_rule_parser 
  1733.                 new PageRuleParser($rule_string);
  1734.             $page_rule_parser->executeRuleTrees($site);
  1735.             $after_process array();
  1736.             foreach($site as $key => $value{
  1737.                 $out_key (isset($inverse_constants[$key])) ?
  1738.                     $inverse_constants[$key$key;
  1739.                 $after_process[$out_key$value;
  1740.             }
  1741.             $data["AFTER_RULE_PROCESS"wordwrap($this->clean(
  1742.                 print_r($after_processtrue)"string")75"\n"true);
  1743.             $lang NULL;
  1744.             if(isset($site[self::LANG])) {
  1745.                 $lang $site[self::LANG];
  1746.             }
  1747.             $meta_ids PhraseParser::calculateMetas($site);
  1748.             if(!$site[self::JUST_METAS]{
  1749.                 $host_words UrlParser::getWordsIfHostUrl($site[self::URL]);
  1750.                 $path_words UrlParser::getWordsLastPathPartUrl(
  1751.                     $site[self::URL]);
  1752.                 $phrase_string $host_words." ".$site[self::TITLE.
  1753.                     " "$path_words " "$site[self::DESCRIPTION];
  1754.                 $word_lists =
  1755.                     PhraseParser::extractPhrasesInLists($phrase_string,
  1756.                         $langtrue);
  1757.                 $len strlen($phrase_string);
  1758.                 if(PhraseParser::computeSafeSearchScore($word_lists$len<
  1759.                     0.012{
  1760.                     $meta_ids["safe:true";
  1761.                     $safe true;
  1762.                 else {
  1763.                     $meta_ids["safe:false";
  1764.                     $safe false;
  1765.                 }
  1766.             }
  1767.             $data["EXTRACTED_WORDS"wordwrap($this->clean(
  1768.                 print_r($word_liststrue)"string")75"\n"true);;
  1769.             $data["EXTRACTED_META_WORDS"wordwrap($this->clean(
  1770.                 print_r($meta_idstrue)"string")75"\n"true);
  1771.         }
  1772.         return $data;
  1773.     }
  1774.  
  1775.     /**
  1776.      * Handles admin request related to the search filter activity
  1777.      *
  1778.      * This activity allows a user to specify hosts whose web pages are to be
  1779.      * filtered out the search results
  1780.      *
  1781.      * @return array $data info about the groups and their contents for a
  1782.      *       particular crawl mix
  1783.      */
  1784.     function resultsEditor()
  1785.     {
  1786.         $data["ELEMENT""resultseditorElement";
  1787.         $data['SCRIPT'"";
  1788.  
  1789.         if(isset($_REQUEST['disallowed_sites'])) {
  1790.             $sites $this->convertStringCleanArray(
  1791.                 $_REQUEST['disallowed_sites']);
  1792.             $disallowed_sites array();
  1793.             foreach($sites as $site{
  1794.                 $site UrlParser::getHost($site);
  1795.                 if(strlen($site0{
  1796.                     $disallowed_sites[$site."/";
  1797.                 }
  1798.             }
  1799.             $data['disallowed_sites'implode("\n"$disallowed_sites);
  1800.             $this->searchfiltersModel->set($disallowed_sites);
  1801.             $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  1802.                 tl('admin_controller_results_editor_update')."</h1>')";
  1803.         }
  1804.         if(!isset($data['disallowed_sites'])) {
  1805.             $data['disallowed_sites'=
  1806.                 implode("\n"$this->searchfiltersModel->getUrls());
  1807.         }
  1808.         foreach (array("URL""TITLE""DESCRIPTION"as $field{
  1809.             $data[$field(isset($_REQUEST[$field])) ?
  1810.                 $this->clean($_REQUEST[$field]"string":
  1811.                  ((isset($data[$field]) ) $data[$field"");
  1812.         }
  1813.         if($data["URL"!= ""{
  1814.             $data["URL"UrlParser::canonicalLink($data["URL"],"");
  1815.         }
  1816.         $tmp tl('admin_controller_edited_pages');
  1817.         $data["URL_LIST"array ($tmp => $tmp);
  1818.         $summaries $this->searchfiltersModel->getEditedPageSummaries();
  1819.         foreach($summaries as $hash => $summary{
  1820.             $data["URL_LIST"][$summary[self::URL]] $summary[self::URL];
  1821.         }
  1822.         if(isset($_REQUEST['arg']) ) {
  1823.             switch($_REQUEST['arg'])
  1824.             {
  1825.                 case "save_page":
  1826.                     $missing_page_field ($data["URL"== ""truefalse;
  1827.                     if($missing_page_field{
  1828.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  1829.                             tl('admin_controller_results_editor_need_url').
  1830.                             "</h1>')";
  1831.                     else {
  1832.                         $this->searchfiltersModel->updateResultPage(
  1833.                             $data["URL"]$data["TITLE"]$data["DESCRIPTION"]);
  1834.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  1835.                             tl('admin_controller_results_editor_page_updated').
  1836.                             "</h1>')";
  1837.                     }
  1838.                 break;
  1839.                 case "load_url":
  1840.                     $hash_url crawlHash($_REQUEST['LOAD_URL']true);
  1841.                     if(isset($summaries[$hash_url])) {
  1842.                         $data["URL"$this->clean($_REQUEST['LOAD_URL'],
  1843.                             "string");
  1844.                         $data["TITLE"$summaries[$hash_url][self::TITLE];
  1845.                         $data["DESCRIPTION"$summaries[$hash_url][
  1846.                             self::DESCRIPTION];
  1847.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  1848.                             tl('admin_controller_results_editor_page_loaded').
  1849.                             "</h1>')";
  1850.                     }
  1851.                 break;
  1852.             }
  1853.         }
  1854.  
  1855.         return $data;
  1856.     }
  1857.  
  1858.  
  1859.     /**
  1860.      * Handles admin request related to the managing the machines which perform
  1861.      *  crawls
  1862.      *
  1863.      * With this activity an admin can add/delete machines to manage. For each
  1864.      * managed machine, the admin can stop and start fetchers/queue_servers
  1865.      * as well as look at their log files
  1866.      *
  1867.      * @return array $data MACHINES, their MACHINE_NAMES, data for
  1868.      *       FETCHER_NUMBERS drop-down
  1869.      */
  1870.     function manageMachines()
  1871.     {
  1872.         $data["ELEMENT""managemachinesElement";
  1873.         $possible_arguments array("addmachine""deletemachine",
  1874.             "newsmode""log""update");
  1875.         $data['SCRIPT'"doUpdate();";
  1876.         $data["leftorright"]=(getLocaleDirection(== 'ltr'"right""left";
  1877.         $data['MACHINES'array();
  1878.         $data['MACHINE_NAMES'array();
  1879.         $urls array();
  1880.         $data['FETCHER_NUMBERS'array(
  1881.             => 0,
  1882.             => 1,
  1883.             => 2,
  1884.             => 3,
  1885.             => 4,
  1886.             => 5,
  1887.             => 6,
  1888.             => 7,
  1889.             => 8,
  1890.             16 => 16
  1891.         );
  1892.         $machines $this->machineModel->getMachineList();
  1893.         $tmp tl('admin_controller_select_machine');
  1894.         $data['DELETABLE_MACHINES'array(
  1895.             $tmp => $tmp
  1896.         );
  1897.         $data['REPLICATABLE_MACHINES'array(
  1898.             $tmp => $tmp
  1899.         );
  1900.         foreach($machines as $machine{
  1901.             $data['MACHINE_NAMES'][$machine["NAME"];
  1902.             $urls[$machine["URL"];
  1903.             $data['DELETABLE_MACHINES'][$machine["NAME"]] $machine["NAME"];
  1904.             if(!isset($machine["PARENT"]|| $machine["PARENT"== ""{
  1905.                 $data['REPLICATABLE_MACHINES'][$machine["NAME"]]
  1906.                     = $machine["NAME"];
  1907.             }
  1908.         }
  1909.  
  1910.         if(!isset($_REQUEST["has_queue_server"]||
  1911.             isset($_REQUEST['is_replica'])) {
  1912.             $_REQUEST["has_queue_server"false;
  1913.         }
  1914.         if(isset($_REQUEST['is_replica'])) {
  1915.             $_REQUEST['num_fetchers'0;
  1916.         else {
  1917.             $_REQUEST['parent'"";
  1918.         }
  1919.         $request_fields array(
  1920.             "name" => "string",
  1921.             "url" => "string",
  1922.             "has_queue_server" => "bool",
  1923.             "num_fetchers" => "int",
  1924.             "parent" => "string"
  1925.         );
  1926.         $r array();
  1927.  
  1928.         $allset true;
  1929.         foreach($request_fields as $field => $type{
  1930.             if(isset($_REQUEST[$field])) {
  1931.                 $r[$field$this->clean($_REQUEST[$field]$type);
  1932.                 if($field == "url" && $r[$field][strlen($r[$field])-1]
  1933.                     != "/"{
  1934.                     $r[$field.= "/";
  1935.                 }
  1936.             else {
  1937.                 $allset false;
  1938.             }
  1939.         }
  1940.         if(isset($r["num_fetchers"]&&
  1941.             in_array($r["num_fetchers"]$data['FETCHER_NUMBERS'])) {
  1942.             $data['FETCHER_NUMBER'$r["num_fetchers"];
  1943.         else {
  1944.             $data['FETCHER_NUMBER'0;
  1945.             if(isset($r["num_fetchers"])) {
  1946.                 $r["num_fetchers"0;
  1947.             }
  1948.         }
  1949.         $machine_exists (isset($r["name"]&& in_array($r["name"],
  1950.             $data['MACHINE_NAMES']) ) || (isset($r["url"]&&
  1951.             in_array($r["url"]$urls));
  1952.  
  1953.         if(isset($_REQUEST['arg']&&
  1954.             in_array($_REQUEST['arg']$possible_arguments)) {
  1955.             switch($_REQUEST['arg'])
  1956.             {
  1957.                 case "addmachine":
  1958.                     if($allset == true && !$machine_exists{
  1959.                         $this->machineModel->addMachine(
  1960.                             $r["name"]$r["url"]$r["has_queue_server"],
  1961.                             $r["num_fetchers"]$r["parent"]);
  1962.  
  1963.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  1964.                             tl('admin_controller_machine_added').
  1965.                             "</h1>');";
  1966.                         $data['MACHINE_NAMES'][$r["name"];
  1967.                         $data['DELETABLE_MACHINES'][$r["name"]] $r["name"];
  1968.                         sort($data['MACHINE_NAMES']);
  1969.                     else if ($allset && $machine_exists {
  1970.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  1971.                             tl('admin_controller_machine_exists').
  1972.                             "</h1>');";
  1973.                     else {
  1974.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  1975.                             tl('admin_controller_machine_incomplete').
  1976.                             "</h1>');";
  1977.                     }
  1978.                 break;
  1979.  
  1980.                 case "deletemachine":
  1981.                     if(!isset($r["name"]||
  1982.                         !in_array($r["name"]$data['MACHINE_NAMES'])) {
  1983.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  1984.                             tl('admin_controller_machine_doesnt_exists').
  1985.                             "</h1>');";
  1986.                     else {
  1987.                         $machines $this->machineModel->getMachineStatuses();
  1988.                         $service_in_use false;
  1989.                         foreach($machines as $machine{
  1990.                             if($machine['NAME'== $r["name"]{
  1991.                                 if($machine['STATUSES'!= array()) {
  1992.                                     $service_in_use true;
  1993.                                     break;
  1994.                                 else {
  1995.                                     break;
  1996.                                 }
  1997.                             }
  1998.                         }
  1999.                         if($service_in_use{
  2000.                             $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2001.                            tl('admin_controller_stop_service_first')."</h1>');";
  2002.                             break;
  2003.                         }
  2004.                         $this->machineModel->deleteMachine($r["name"]);
  2005.                         $tmp_array array($r["name"]);
  2006.                         $diff =
  2007.                             array_diff($data['MACHINE_NAMES'],  $tmp_array);
  2008.                         $data['MACHINE_NAMES'array_merge($diff);
  2009.                         $tmp_array array($r["name"=> $r["name"]);
  2010.                         $diff =
  2011.                             array_diff($data['DELETABLE_MACHINES']$tmp_array);
  2012.                         $data['DELETABLE_MACHINES'array_merge($diff);
  2013.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2014.                             tl('admin_controller_machine_deleted')."</h1>');";
  2015.                     }
  2016.                 break;
  2017.  
  2018.                 case "newsmode":
  2019.                     $profile =  $this->profileModel->getProfile(WORK_DIRECTORY);
  2020.                     $news_modes array("news_off""news_web""news_process");
  2021.                     if(isset($_REQUEST['news_mode']&& in_array(
  2022.                         $_REQUEST['news_mode']$news_modes)) {
  2023.                         $profile["NEWS_MODE"$_REQUEST['news_mode'];
  2024.                         if($profile["NEWS_MODE"!= "news_process"{
  2025.                             CrawlDaemon::stop("news_updater"""false);
  2026.                         else {
  2027.                             $cron_time $this->cronModel->getCronTime(
  2028.                                 "news_process");
  2029.                             $delta time($cron_time;
  2030.                             if($delta 60{
  2031.                                 CrawlDaemon::start("news_updater"'none'"",
  2032.                                     -1);
  2033.                             else {
  2034.                             $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2035.                                 tl('admin_controller_news_process_running').
  2036.                                 "</h1>');";
  2037.                                 $profile["NEWS_MODE""news_off";
  2038.                             }
  2039.                         }
  2040.                         $this->profileModel->updateProfile(
  2041.                             WORK_DIRECTORYarray()$profile);
  2042.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2043.                             tl('admin_controller_news_mode_updated').
  2044.                             "</h1>');";
  2045.                     else {
  2046.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2047.                             tl('admin_controller_news_update_failed').
  2048.                             "</h1>');";
  2049.                     }
  2050.                 break;
  2051.  
  2052.                 case "log":
  2053.                     if(isset($_REQUEST["fetcher_num"])) {
  2054.                         $r["fetcher_num"=
  2055.                             $this->clean($_REQUEST["fetcher_num"]"int");
  2056.                     }
  2057.                     if(isset($_REQUEST["mirror_name"])) {
  2058.                         $r["mirror_name"=
  2059.                             $this->clean($_REQUEST["mirror_name"]"string");
  2060.                     }
  2061.                     if(isset($_REQUEST["time"])) {
  2062.                         $data["time"=
  2063.                             $this->clean($_REQUEST["time"]"int"30;
  2064.                     else {
  2065.                         $data["time"30;
  2066.                     }
  2067.                     if(isset($_REQUEST["NO_REFRESH"])) {
  2068.                         $data["NO_REFRESH"$this->clean(
  2069.                             $_REQUEST["NO_REFRESH"]"bool");
  2070.                     else {
  2071.                         $data["NO_REFRESH"false;
  2072.                     }
  2073.                     $data["ELEMENT""machinelogElement";
  2074.                     $filter"";
  2075.                     if(isset($_REQUEST['f'])) {
  2076.                         $filter 
  2077.                             $this->clean($_REQUEST['f']"string");
  2078.                     
  2079.                     $data['filter'$filter;
  2080.                     $data["REFRESH_LOG""&time="$data["time"];
  2081.                     $data["LOG_TYPE""";
  2082.                     if(isset($r['fetcher_num']&& isset($r['name'])) {
  2083.                         $data["LOG_FILE_DATA"$this->machineModel->getLog(
  2084.                             $r["name"]$r["fetcher_num"]$filter);
  2085.                         $data["LOG_TYPE"$r['name'].
  2086.                             " fetcher ".$r["fetcher_num"];
  2087.                         $data["REFRESH_LOG".= "&arg=log&name=".$r['name'].
  2088.                             "&fetcher_num=".$r['fetcher_num'];
  2089.                     else if(isset($r["mirror_name"])) {
  2090.                         $data["LOG_TYPE"$r['mirror_name']." mirror";
  2091.                         $data["LOG_FILE_DATA"$this->machineModel->getLog(
  2092.                             $r["mirror_name"]NULL$filter,  true);
  2093.                     else if(isset($r['name'])) {
  2094.                         $data["LOG_TYPE"$r['name']." queue_server";
  2095.                         if($r['name'== "news"{
  2096.                             $data["LOG_TYPE""Name Server News Updater";
  2097.                         }
  2098.                         $data["LOG_FILE_DATA"$this->machineModel->getLog(
  2099.                             $r["name"]NULL$filter);
  2100.                         $data["REFRESH_LOG".= 
  2101.                             "&arg=log&name=".$r['name'];
  2102.                     }
  2103.                     if($data["time">= 1200{
  2104.                         $data["REFRESH_LOG""";
  2105.                     }
  2106.  
  2107.                     if(!isset($data["LOG_FILE_DATA"])
  2108.                         || $data["LOG_FILE_DATA"== ""){
  2109.                         $data["LOG_FILE_DATA"=
  2110.                             tl('admin_controller_no_machine_log');
  2111.                     }
  2112.                     $lines =array_reverse(explode("\n",$data["LOG_FILE_DATA"]));
  2113.                     $data["LOG_FILE_DATA"implode("\n"$lines);
  2114.                 break;
  2115.  
  2116.                 case "update":
  2117.                     if(isset($_REQUEST["fetcher_num"])) {
  2118.                         $r["fetcher_num"=
  2119.                             $this->clean($_REQUEST["fetcher_num"]"int");
  2120.                     else {
  2121.                         $r["fetcher_num"NULL;
  2122.                     }
  2123.                     $available_actions array("start""stop",
  2124.                         "mirror_start""mirror_stop");
  2125.                     if(isset($r["name"]&& isset($_REQUEST["action"]&&
  2126.                         in_array($_REQUEST["action"]$available_actions)) {
  2127.                         $action $_REQUEST["action"];
  2128.                         $is_mirror false;
  2129.                         if($action == "mirror_start"{
  2130.                             $action "start";
  2131.                             $is_mirror true;
  2132.                         else if ($action == "mirror_stop"{
  2133.                             $action "stop";
  2134.                             $is_mirror true;
  2135.                         }
  2136.                         $this->machineModel->update($r["name"],
  2137.                             $action$r["fetcher_num"]$is_mirror);
  2138.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2139.                             tl('admin_controller_machine_servers_updated').
  2140.                             "</h1>');";
  2141.                     else {
  2142.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2143.                             tl('admin_controller_machine_no_action').
  2144.                             "</h1>');";
  2145.                     }
  2146.  
  2147.                 break;
  2148.  
  2149.             }
  2150.         }
  2151.         if(!isset($_REQUEST['arg']|| $_REQUEST['arg'!= 'log'{
  2152.             $data['SCRIPT'.= "toggleReplica(false);";
  2153.         }
  2154.         return $data;
  2155.     }
  2156.  
  2157.     /**
  2158.      * Handles admin request related to the manage locale activity
  2159.      *
  2160.      * The manage locale activity allows a user to add/delete locales, view
  2161.      * statistics about a locale as well as edit the string for that locale
  2162.      *
  2163.      * @return array $data info about current locales, statistics for each
  2164.      *       locale as well as potentially the currently set string of a
  2165.      *       locale and any messages about the success or failure of a
  2166.      *       sub activity.
  2167.      */
  2168.     function manageLocales()
  2169.     {
  2170.         $possible_arguments array("addlocale""deletelocale""editlocale");
  2171.  
  2172.         $data['SCRIPT'"";
  2173.         $data["ELEMENT""managelocalesElement";
  2174.  
  2175.         $data["LOCALES"$this->localeModel->getLocaleList();
  2176.         $data['LOCALE_NAMES'][-1tl('admin_controller_select_localename');
  2177.  
  2178.         $locale_ids array();
  2179.  
  2180.         foreach ($data["LOCALES"as $locale{
  2181.             $data["LOCALE_NAMES"][$locale["LOCALE_TAG"]] =
  2182.                 $locale["LOCALE_NAME"];
  2183.             $locale_ids[$locale["LOCALE_TAG"];
  2184.         }
  2185.  
  2186.         if(isset($_REQUEST['arg']&&
  2187.             in_array($_REQUEST['arg']$possible_arguments)) {
  2188.             if(isset($_REQUEST['localename'])) {
  2189.                 $localename $this->clean($_REQUEST['localename']"string" );
  2190.             else {
  2191.                 $localename "";
  2192.             }
  2193.             if(isset($_REQUEST['localetag'])) {
  2194.                 $localetag $this->clean($_REQUEST['localetag']"string" );
  2195.             else {
  2196.                 $localetag "";
  2197.             }
  2198.             if(isset($_REQUEST['writingmode'])) {
  2199.                 $writingmode =
  2200.                     $this->clean($_REQUEST['writingmode']"string" );
  2201.             else {
  2202.                 $writingmode "";
  2203.             }
  2204.             if(isset($_REQUEST['selectlocale'])) {
  2205.                 $select_locale =
  2206.                     $this->clean($_REQUEST['selectlocale']"string" );
  2207.             else {
  2208.                 $select_locale "";
  2209.             }
  2210.  
  2211.             switch($_REQUEST['arg'])
  2212.             {
  2213.                 case "addlocale":
  2214.                     $this->localeModel->addLocale(
  2215.                         $localename$localetag$writingmode);
  2216.                     $this->localeModel->extractMergeLocales();
  2217.                     $data["LOCALES"$this->localeModel->getLocaleList();
  2218.                     $data['LOCALE_NAMES'][$localetag$localename;
  2219.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2220.                         tl('admin_controller_locale_added')."</h1>')";
  2221.                 break;
  2222.  
  2223.                 case "deletelocale":
  2224.  
  2225.                     if(!in_array($select_locale$locale_ids)) {
  2226.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2227.                             tl('admin_controller_localename_doesnt_exists').
  2228.                             "</h1>')";
  2229.                         return $data;
  2230.                     }
  2231.                     $this->localeModel->deleteLocale($select_locale);
  2232.                     $data["LOCALES"$this->localeModel->getLocaleList();
  2233.                     unset($data['LOCALE_NAMES'][$select_locale]);
  2234.  
  2235.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2236.                         tl('admin_controller_localename_deleted')."</h1>')";
  2237.                 break;
  2238.  
  2239.                 case "editlocale":
  2240.                     if(!isset($select_locale)) break;
  2241.                     $data["leftorright"=
  2242.                         (getLocaleDirection(== 'ltr'"right""left";
  2243.                     $data["ELEMENT""editlocalesElement";
  2244.                     $data['STATIC_PAGES'][-1]=
  2245.                         tl('admin_controller_select_staticpages');
  2246.                     $data['STATIC_PAGES'+=
  2247.                         $this->localeModel->getStaticPageList($select_locale);
  2248.                     $data['CURRENT_LOCALE_NAME'=
  2249.                         $data['LOCALE_NAMES'][$select_locale];
  2250.                     $data['CURRENT_LOCALE_TAG'$select_locale;
  2251.                     $tmp_pages $data['STATIC_PAGES'];
  2252.                     array_shift($tmp_pages);
  2253.                     $page_keys array_keys($tmp_pages);
  2254.                     if(isset($_REQUEST['static_page']&&
  2255.                         in_array($_REQUEST['static_page']$page_keys)) {
  2256.                         $data["ELEMENT""editstaticElement";
  2257.                         $data['STATIC_PAGE'$_REQUEST['static_page'];
  2258.                         if(isset($_REQUEST['PAGE_DATA'])) {
  2259.                             $this->localeModel->setStaticPage(
  2260.                                 $_REQUEST['static_page'],
  2261.                                 $data['CURRENT_LOCALE_TAG'],
  2262.                                 $_REQUEST['PAGE_DATA']);
  2263.                             $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2264.                                 tl('admin_controller_staticpage_updated').
  2265.                                 "</h1>')";
  2266.                         }
  2267.                         $data['PAGE_NAME'=
  2268.                             $data['STATIC_PAGES'][$data['STATIC_PAGE']];
  2269.                         $data['PAGE_DATA'=
  2270.                             $this->localeModel->getStaticPage(
  2271.                                 $_REQUEST['static_page'],
  2272.                                 $data['CURRENT_LOCALE_TAG']);
  2273.                         /*since page data can contain tags we clean it
  2274.                           htmlentities it just before displaying*/
  2275.                         $data['PAGE_DATA'$this->clean($data['PAGE_DATA'],
  2276.                             "string");
  2277.                         break;
  2278.                     }
  2279.                     $data['SCRIPT'.= "selectPage = elt('static-pages');".
  2280.                         "selectPage.onchange = submitStaticPageForm;";
  2281.                     if(isset($_REQUEST['STRINGS'])) {
  2282.                         $safe_strings array();
  2283.                         foreach($_REQUEST['STRINGS'as $key => $value{
  2284.                             $clean_key $this->clean($key"string" );
  2285.                             $clean_value $this->clean($value"string" );
  2286.                             $safe_strings[$clean_key$clean_value;
  2287.                         }
  2288.                         $this->localeModel->updateStringData(
  2289.                             $select_locale$safe_strings);
  2290.                         $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2291.                             tl('admin_controller_localestrings_updated').
  2292.                             "</h1>')";
  2293.                     else {
  2294.                         $this->localeModel->extractMergeLocales();
  2295.                     }
  2296.                     $data['STRINGS'=
  2297.                         $this->localeModel->getStringData($select_locale);
  2298.                     $data['DEFAULT_STRINGS'=
  2299.                         $this->localeModel->getStringData(DEFAULT_LOCALE);
  2300.                 break;
  2301.             }
  2302.         }
  2303.         return $data;
  2304.     }
  2305.  
  2306.     /**
  2307.      * Checks to see if the current machine has php configured in a way
  2308.      * Yioop! can run.
  2309.      *
  2310.      * @return string a message indicatign which required and optional
  2311.      *       components are missing; or "Passed" if nothing missing.
  2312.      */
  2313.      function systemCheck()
  2314.      {
  2315.         $required_items array(
  2316.             array("name" => "Multi-Curl",
  2317.                 "check"=>"curl_multi_init""type"=>"function"),
  2318.             array("name" => "GD Graphics Library",
  2319.                 "check"=>"imagecreate""type"=>"function"),
  2320.             array("name" => "SQLite3 Library",
  2321.                 "check"=>"SQLite3|PDO""type"=>"class"),
  2322.             array("name" => "Multibyte Character Library",
  2323.                 "check"=>"mb_internal_encoding""type"=>"function"),
  2324.         );
  2325.         $optional_items array(
  2326.          /* as an example of what this array could contain...
  2327.             array("name" => "Memcache", "check" => "Memcache",
  2328.                 "type"=> "class"), */
  2329.         );
  2330.  
  2331.         $missing_required "";
  2332.         $comma "";
  2333.         foreach($required_items as $item{
  2334.             $check_function $item["type"]."_exists";
  2335.             $check_parts explode("|"$item["check"]);
  2336.             $check_flag true;
  2337.             foreach($check_parts as $check{
  2338.                 if($check_function($check)) {
  2339.                     $check_flag false;
  2340.                 }
  2341.             }
  2342.             if($check_flag{
  2343.                 $missing_required .= $comma.$item["name"];
  2344.                 $comma ", ";
  2345.             }
  2346.         }
  2347.         if(!defined('PHP_VERSION_ID'|| PHP_VERSION_ID 50300{
  2348.             $missing_required .= $comma.tl("admin_controller_php_version");
  2349.             $comma ", ";
  2350.         }
  2351.  
  2352.         $out "";
  2353.         $br "";
  2354.  
  2355.         if(!is_writable(BASE_DIR."/configs/config.php")) {
  2356.             $out .= tl('admin_controller_no_write_config_php');
  2357.             $br "<br />";
  2358.         }
  2359.  
  2360.         if(defined(WORK_DIRECTORY&& !is_writable(WORK_DIRECTORY)) {
  2361.             $out .= $brtl('admin_controller_no_write_work_dir');
  2362.             $br "<br />";
  2363.         }
  2364.  
  2365.         if(intval(ini_get("post_max_size")) 2{
  2366.             $out .= $brtl('admin_controller_post_size_small');
  2367.             $br "<br />";
  2368.         }
  2369.  
  2370.         if($missing_required != ""{
  2371.             $out .= $br.
  2372.                 tl('admin_controller_missing_required'$missing_required);
  2373.             $br "<br />";
  2374.         }
  2375.  
  2376.         $missing_optional "";
  2377.         $comma "";
  2378.         foreach($optional_items as $item{
  2379.             $check_function $item["type"]."_exists";
  2380.             $check_parts explode("|"$item["check"]);
  2381.             $check_flag true;
  2382.             foreach($check_parts as $check{
  2383.                 if($check_function($check)) {
  2384.                     $check_flag false;
  2385.                 }
  2386.             }
  2387.             if($check_flag{
  2388.                 $missing_optional .= $comma.$item["name"];
  2389.                 $comma ", ";
  2390.             }
  2391.         }
  2392.  
  2393.         if($missing_optional != ""{
  2394.             $out .= $br.
  2395.                 tl('admin_controller_missing_optional'$missing_optional);
  2396.             $br "<br />";
  2397.         }
  2398.  
  2399.         if($out == ""{
  2400.             $out tl('admin_controller_check_passed');
  2401.         else {
  2402.             $out "<span class='red'>$out</span>";
  2403.         }
  2404.         if(file_exists(BASE_DIR."/configs/local_config.php")) {
  2405.             $out .= "<br />".tl('admin_controller_using_local_config');
  2406.         }
  2407.  
  2408.         return $out;
  2409.  
  2410.      }
  2411.  
  2412.     /**
  2413.      * Handles admin request related to the search sources activity
  2414.       *
  2415.      * The search sources activity allows a user to add/delete search sources
  2416.      * for video and news, it also allows a user to control which subsearches
  2417.      * appear on the SearchView page
  2418.      *
  2419.      * @return array $data info about current search sources, and current
  2420.      *       sub-searches
  2421.      */
  2422.     function searchSources()
  2423.     {
  2424.         $possible_arguments array("addsource""deletesource",
  2425.             "addsubsearch""deletesubsearch");
  2426.  
  2427.         $data array();
  2428.         $data["ELEMENT""searchsourcesElement";
  2429.         $data['SCRIPT'"";
  2430.         $data['SOURCE_TYPES'array(-=> tl('admin_controller_media_kind'),
  2431.             "video" => tl('admin_controller_video'),
  2432.             "rss" => tl('admin_controller_rss_feed'));
  2433.         $source_type_flag false;
  2434.         if(isset($_REQUEST['sourcetype']&&
  2435.             in_array($_REQUEST['sourcetype'],
  2436.             array_keys($data['SOURCE_TYPES']))) {
  2437.             $data['SOURCE_TYPE'$_REQUEST['sourcetype'];
  2438.             $source_type_flag true;
  2439.         else {
  2440.             $data['SOURCE_TYPE'= -1;
  2441.         }
  2442.         $machine_urls $this->machineModel->getQueueServerUrls();
  2443.         $search_lists $this->crawlModel->getCrawlList(falsetrue,
  2444.             $machine_urls);
  2445.         $data["SEARCH_LISTS"array(-=>
  2446.             tl('admin_controller_sources_indexes'));
  2447.         foreach($search_lists as $item{
  2448.             $data["SEARCH_LISTS"]["i:".$item["CRAWL_TIME"]] =
  2449.                 $item["DESCRIPTION"];
  2450.         }
  2451.         $search_lists=  $this->crawlModel->getMixList();
  2452.         foreach($search_lists as $item{
  2453.             $data["SEARCH_LISTS"]["m:".$item["MIX_TIMESTAMP"]] =
  2454.                 $item["MIX_NAME"];
  2455.         }
  2456.         $n NUM_RESULTS_PER_PAGE;
  2457.         $data['PER_PAGE'=
  2458.             array($n => $n2*$n => 2*$n5*$n=> 5*$n10*$n=>10*$n);
  2459.         if(isset($_REQUEST['perpage']&&
  2460.             in_array($_REQUEST['perpage']array_keys($data['PER_PAGE']))) {
  2461.             $data['PER_PAGE_SELECTED'$_REQUEST['perpage'];
  2462.         else {
  2463.             $data['PER_PAGE_SELECTED'NUM_RESULTS_PER_PAGE;
  2464.         }
  2465.         $locales $this->localeModel->getLocaleList();
  2466.         $data["LANGUAGES"array();
  2467.         foreach($locales as $locale{
  2468.             $data["LANGUAGES"][$locale['LOCALE_TAG']] $locale['LOCALE_NAME'];
  2469.         }
  2470.         if(isset($_REQUEST['sourcelocaletag']&&
  2471.             in_array($_REQUEST['sourcelocaletag'],
  2472.                 array_keys($data["LANGUAGES"]))) {
  2473.             $data['SOURCE_LOCALE_TAG'=
  2474.                 $_REQUEST['sourcelocaletag'];
  2475.         else {
  2476.             $data['SOURCE_LOCALE_TAG'DEFAULT_LOCALE;
  2477.         }
  2478.  
  2479.         if(isset($_REQUEST['arg']&&
  2480.             in_array($_REQUEST['arg']$possible_arguments)) {
  2481.             switch($_REQUEST['arg'])
  2482.             {
  2483.                 case "addsource":
  2484.                     if(!$source_type_flagbreak;
  2485.                     $must_have array("sourcename""sourcetype",
  2486.                         'sourceurl');
  2487.                     $to_clean array_merge($must_have,
  2488.                         array('sourcethumbnail','sourcelocaletag'));
  2489.                     foreach ($to_clean as $clean_me{
  2490.                         $r[$clean_me(isset($_REQUEST[$clean_me])) ?
  2491.                             $this->clean($_REQUEST[$clean_me]"string" "";
  2492.                         if(in_array($clean_me$must_have&&
  2493.                             $r[$clean_me== "" break 2;
  2494.                     }
  2495.                     $this->sourceModel->addMediaSource(
  2496.                         $r['sourcename']$r['sourcetype']$r['sourceurl'],
  2497.                         $r['sourcethumbnail']$r['sourcelocaletag']);
  2498.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2499.                         tl('admin_controller_media_source_added').
  2500.                         "</h1>');";
  2501.                 break;
  2502.                 case "deletesource":
  2503.                     if(!isset($_REQUEST['ts'])) break;
  2504.                     $timestamp $this->clean($_REQUEST['ts']"string");
  2505.                     $this->sourceModel->deleteMediaSource($timestamp);
  2506.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2507.                         tl('admin_controller_media_source_deleted').
  2508.                         "</h1>');";
  2509.                 break;
  2510.                 case "addsubsearch":
  2511.                     $to_clean array("foldername"'indexsource');
  2512.                     $must_have $to_clean;
  2513.                     foreach ($to_clean as $clean_me{
  2514.                         $r[$clean_me(isset($_REQUEST[$clean_me])) ?
  2515.                             $this->clean($_REQUEST[$clean_me]"string" "";
  2516.                         if(in_array($clean_me$must_have&&
  2517.                             $r[$clean_me== "" break 2;
  2518.                     }
  2519.                     $this->sourceModel->addSubsearch(
  2520.                         $r['foldername']$r['indexsource'],
  2521.                         $data['PER_PAGE_SELECTED']);
  2522.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2523.                         tl('admin_controller_subsearch_added').
  2524.                         "</h1>');";
  2525.                 break;
  2526.                 case "deletesubsearch":
  2527.                     if(!isset($_REQUEST['fn'])) break;
  2528.                     $folder_name $this->clean($_REQUEST['fn']"string");
  2529.                     $this->sourceModel->deleteSubsearch($folder_name);
  2530.                     $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2531.                         tl('admin_controller_subsearch_deleted').
  2532.                         "</h1>');";
  2533.                 break;
  2534.             }
  2535.         }
  2536.         $data["MEDIA_SOURCES"$this->sourceModel->getMediaSources();
  2537.         $subsearches $this->sourceModel->getSubsearches();
  2538.         $data["SUBSEARCHES"array();
  2539.         foreach($subsearches as $search{
  2540.             if(isset($data["SEARCH_LISTS"][$search['INDEX_IDENTIFIER']])) {
  2541.                 $data["SUBSEARCHES"][$search;
  2542.             else {
  2543.                 $this->sourceModel->deleteSubsearch($search["FOLDER_NAME"]);
  2544.             }
  2545.         }
  2546.         $data['SCRIPT'.= "source_type = elt('source-type');".
  2547.             "source_type.onchange = switchSourceType;".
  2548.             "switchSourceType()";
  2549.         return $data;
  2550.     }
  2551.  
  2552.     /**
  2553.      * Responsible for handling admin request related to the configure activity
  2554.      *
  2555.      * The configure activity allows a user to set the work directory for
  2556.      * storing data local to this SeekQuarry/Yioop instance. It also allows one
  2557.      * to set the default language of the installation, dbms info, robot info,
  2558.      * test info, as well as which machine acts as the queue server.
  2559.      *
  2560.      * @return array $data fields for available language, dbms, etc as well as
  2561.      *       results of processing sub activity if any
  2562.      */
  2563.     function configure()
  2564.     {
  2565.         $data array();
  2566.         $profile array();
  2567.  
  2568.         $data['SYSTEM_CHECK'$this->systemCheck();
  2569.         $languages $this->localeModel->getLocaleList();
  2570.         foreach($languages as $language{
  2571.             $data['LANGUAGES'][$language['LOCALE_TAG']] =
  2572.                 $language['LOCALE_NAME'];
  2573.         }
  2574.         if(isset($_REQUEST['lang'])) {
  2575.             $data['lang'$this->clean($_REQUEST['lang']"string");
  2576.             $profile['DEFAULT_LOCALE'$data['lang'];
  2577.             setLocaleObject($data['lang']);
  2578.         }
  2579.  
  2580.         $data["ELEMENT""configureElement";
  2581.         $data['SCRIPT'"";
  2582.  
  2583.         $data['PROFILE'false;
  2584.         if(isset($_REQUEST['WORK_DIRECTORY']|| (defined('WORK_DIRECTORY'&& 
  2585.             defined('FIX_NAME_SERVER'&& FIX_NAME_SERVER) ) {
  2586.             if(defined('WORK_DIRECTORY'&& defined('FIX_NAME_SERVER'
  2587.                 && FIX_NAME_SERVER && !isset($_REQUEST['WORK_DIRECTORY'])) {
  2588.                 $_REQUEST['WORK_DIRECTORY'WORK_DIRECTORY;
  2589.                 $_REQUEST['arg'"directory";
  2590.                 @unlink($_REQUEST['WORK_DIRECTORY']."/profile.php");
  2591.             }
  2592.             $dir =
  2593.                 $this->clean($_REQUEST['WORK_DIRECTORY']"string");
  2594.             $data['PROFILE'true;
  2595.             if(strstr(PHP_OS"WIN")) {
  2596.                 //convert to forward slashes so consistent with rest of code
  2597.                 $dir str_replace("\\""/"$dir);
  2598.                 if($dir[0!= "/" && $dir[1!= ":"{
  2599.                     $data['PROFILE'false;
  2600.                 }
  2601.             else if($dir[0!= "/"{
  2602.                     $data['PROFILE'false;
  2603.             }
  2604.             if($data['PROFILE'== false{
  2605.                 $data["MESSAGE"=
  2606.                     tl('admin_controller_configure_use_absolute_path');
  2607.                 $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2608.                     $data["MESSAGE"]"</h1>');" .
  2609.                     "setTimeout('window.location.href= ".
  2610.                     "window.location.href', 3000);";
  2611.                 $data['WORK_DIRECTORY'$dir;
  2612.                 return $data;
  2613.             }
  2614.  
  2615.             if(strstr($dir."/"BASE_DIR."/")) {
  2616.                 $data['PROFILE'false;
  2617.                 $data["MESSAGE"=
  2618.                     tl('admin_controller_configure_diff_base_dir');
  2619.                 $data['SCRIPT'.= "doMessage('<h1 class=\"red\" >".
  2620.                     $data["MESSAGE"]"</h1>');" .
  2621.                     "setTimeout('window.location.href= ".
  2622.                     "window.location.href', 3000);";
  2623.                 $data['WORK_DIRECTORY'$dir;
  2624.                 return $data;
  2625.             }
  2626.             $data['WORK_DIRECTORY'$dir;
  2627.  
  2628.         else if (defined("WORK_DIRECTORY"&&  strlen(WORK_DIRECTORY&&
  2629.             strcmp(realpath(WORK_DIRECTORY)realpath(BASE_DIR)) != &&
  2630.             (is_dir(WORK_DIRECTORY|| is_dir(WORK_DIRECTORY."../"))) {
  2631.             $data['WORK_DIRECTORY'WORK_DIRECTORY;
  2632.             $data['PROFILE'true;
  2633.         }
  2634.  
  2635.         $arg "";
  2636.         if(isset($_REQUEST['arg'])) {
  2637.             $arg $_REQUEST['arg'];
  2638.         }
  2639.         switch($arg)
  2640.         {
  2641.             case "directory":
  2642.                 if(!isset($data['WORK_DIRECTORY'])) {break;}
  2643.                 if($data['PROFILE'&&
  2644.                     file_exists($data['WORK_DIRECTORY']."/profile.php")) {
  2645.                     $data array_merge($data,
  2646.                         $this->profileModel->getProfile(
  2647.                             $data['WORK_DIRECTORY']));
  2648.                     $this->profileModel->setWorkDirectoryConfigFile(
  2649.                         $data['WORK_DIRECTORY']);
  2650.                     $data["MESSAGE"=
  2651.                         tl('admin_controller_configure_work_dir_set');
  2652.                     $data['SCRIPT'.=
  2653.                         "doMessage('<h1 class=\"red\" >".
  2654.                         $data["MESSAGE"]"</h1>');setTimeout(".
  2655.                         "'window.location.href=window.location.href', 3000);";
  2656.                 else if ($data['PROFILE'&&
  2657.                     strlen($data['WORK_DIRECTORY']0{
  2658.                     if($this->profileModel->makeWorkDirectory(
  2659.                         $data['WORK_DIRECTORY'])) {
  2660.                         $profile['DBMS''sqlite3';
  2661.                         $data['DBMS''sqlite3';
  2662.                         $profile['DB_NAME''default';
  2663.                         $data['DB_NAME''default';
  2664.                         $profile['USER_AGENT_SHORT'=
  2665.                             tl('admin_controller_name_your_bot');
  2666.                         $data['USER_AGENT_SHORT'=
  2667.                             $profile['USER_AGENT_SHORT'];
  2668.                         $uri UrlParser::getPath($_SERVER['REQUEST_URI']);
  2669.                         $http (isset($_SERVER['HTTPS'])) "https://" :
  2670.                             "http://";
  2671.                         $profile['NAME_SERVER'
  2672.                             $http $_SERVER['SERVER_NAME'$uri;
  2673.                         $data['NAME_SERVER'$profile['NAME_SERVER'];
  2674.                         $profile['AUTH_KEY'crawlHash(
  2675.                             $data['WORK_DIRECTORY'].time());
  2676.                         $data['AUTH_KEY'$profile['AUTH_KEY'];
  2677.                         $robot_instance str_replace(".""_",
  2678.                             $_SERVER['SERVER_NAME'])."-".time();
  2679.                         $profile['ROBOT_INSTANCE'$robot_instance;
  2680.                         $data['ROBOT_INSTANCE'$profile['ROBOT_INSTANCE'];
  2681.                         if($this->profileModel->updateProfile(
  2682.                             $data['WORK_DIRECTORY']array()$profile)) {
  2683.                             if((defined('WORK_DIRECTORY'&& 
  2684.                                 $data['WORK_DIRECTORY'== WORK_DIRECTORY||
  2685.                                 $this->profileModel->setWorkDirectoryConfigFile(
  2686.                                 $data['WORK_DIRECTORY'])) {
  2687.                                 $data["MESSAGE"=
  2688.                             tl('admin_controller_configure_work_profile_made');
  2689.                                 $data['SCRIPT'.=
  2690.                                     "doMessage('<h1 class=\"red\" >".
  2691.                                     $data["MESSAGE"]"</h1>');" .
  2692.                                     "setTimeout('window.location.href= ".
  2693.                                     "window.location.href', 3000);";
  2694.                                 $data array_merge($data,
  2695.                                     $this->profileModel->getProfile(
  2696.                                         $data['WORK_DIRECTORY']));
  2697.                                 $data['PROFILE'true;
  2698.                             else {
  2699.                                 $data['PROFILE'false;
  2700.                         $data["MESSAGE"=
  2701.                             tl('admin_controller_configure_no_set_config');
  2702.                                 $data['SCRIPT'.=
  2703.                                     "doMessage('<h1 class=\"red\" >".
  2704.                                     $data["MESSAGE""</h1>');" .
  2705.                                     "setTimeout('window.location.href= ".
  2706.                                     "window.location.href', 3000);";
  2707.                             }
  2708.                         else {
  2709.                             $this->profileModel->setWorkDirectoryConfigFile(
  2710.                                 $data['WORK_DIRECTORY']);
  2711.                             $data['PROFILE'false;
  2712.                         $data["MESSAGE"=
  2713.                             tl('admin_controller_configure_no_create_profile');
  2714.                             $data['SCRIPT'.=
  2715.                                 "doMessage('<h1 class=\"red\" >".
  2716.                                 $data["MESSAGE"].
  2717.                                 "</h1>'); setTimeout('window.location.href=".
  2718.                                 "window.location.href', 3000);";
  2719.                         }
  2720.                     else {
  2721.                         $this->profileModel->setWorkDirectoryConfigFile(
  2722.                             $data['WORK_DIRECTORY']);
  2723.                         $data["MESSAGE"=
  2724.                             tl('admin_controller_configure_work_dir_invalid');
  2725.                         $data['SCRIPT'.=
  2726.                             "doMessage('<h1 class=\"red\" >"$data["MESSAGE"].
  2727.                                 "</h1>');".
  2728.                             "setTimeout('window.location.href=".
  2729.                             "window.location.href', 3000);";
  2730.                         $data['PROFILE'false;
  2731.                     }
  2732.                 else {
  2733.                     $this->profileModel->setWorkDirectoryConfigFile(
  2734.                         $data['WORK_DIRECTORY']);
  2735.                     $data["MESSAGE"=
  2736.                         tl('admin_controller_configure_work_dir_invalid');
  2737.                     $data['SCRIPT'.=
  2738.                         "doMessage('<h1 class=\"red\" >"$data["MESSAGE".
  2739.                             "</h1>');" .
  2740.                         "setTimeout('window.location.href=".
  2741.                         "window.location.href', 3000);";
  2742.                     $data['PROFILE'false;
  2743.                 }
  2744.             break;
  2745.             case "profile":
  2746.                 $this->updateProfileFields($data$profile
  2747.                     array('USE_FILECACHE''USE_MEMCACHE'"WEB_ACCESS",
  2748.                         'RSS_ACCESS''API_ACCESS'));
  2749.                 $data['DEBUG_LEVEL'0;
  2750.                 $data['DEBUG_LEVEL'|=
  2751.                     (isset($_REQUEST["ERROR_INFO"])) ERROR_INFO 0;
  2752.                 $data['DEBUG_LEVEL'|=
  2753.                     (isset($_REQUEST["QUERY_INFO"])) QUERY_INFO 0;
  2754.                 $data['DEBUG_LEVEL'|=
  2755.                     (isset($_REQUEST["TEST_INFO"])) TEST_INFO 0;
  2756.                 $profile['DEBUG_LEVEL'$data['DEBUG_LEVEL'];
  2757.  
  2758.                 $old_profile =
  2759.                     $this->profileModel->getProfile($data['WORK_DIRECTORY']);
  2760.  
  2761.                 $db_problem false;
  2762.                 if((isset($profile['DBMS']&&
  2763.                     $profile['DBMS'!= $old_profile['DBMS']||
  2764.                     (isset($profile['DB_NAME']&&
  2765.                     $profile['DB_NAME'!= $old_profile['DB_NAME']||
  2766.                     (isset($profile['DB_HOST']&&
  2767.                     $profile['DB_HOST'!= $old_profile['DB_HOST'])) {
  2768.                     if(!$this->profileModel->migrateDatabaseIfNecessary(
  2769.                         $profile)) {
  2770.                         $db_problem true;
  2771.                     }
  2772.                 else if ((isset($profile['DB_USER']&&
  2773.                     $profile['DB_USER'!= $old_profile['DB_USER']||
  2774.                     (isset($profile['DB_PASSWORD']&&
  2775.                     $profile['DB_PASSWORD'!= $old_profile['DB_PASSWORD'])) {
  2776.  
  2777.                     if($this->profileModel->testDatabaseManager(
  2778.                         $profile!== true{
  2779.                         $db_problem true;
  2780.                     }
  2781.                 }
  2782.                 if($db_problem{
  2783.                     $data['MESSAGE'=
  2784.                         tl('admin_controller_configure_no_change_db');
  2785.                     $data['SCRIPT'.=
  2786.                         "doMessage('<h1 class=\"red\" >"$data['MESSAGE'].
  2787.                         "</h1>');";
  2788.                     $data['DBMS'$old_profile['DBMS'];
  2789.                     $data['DB_NAME'$old_profile['DB_NAME'];
  2790.                     $data['DB_HOST'$old_profile['DB_HOST'];
  2791.                     $data['DB_USER'$old_profile['DB_USER'];
  2792.                     $data['DB_PASSWORD'$old_profile['DB_PASSWORD'];
  2793.                     break;
  2794.                 }
  2795.  
  2796.                 if($this->profileModel->updateProfile(
  2797.                     $data['WORK_DIRECTORY']$profile$old_profile)) {
  2798.                     $data['MESSAGE'=
  2799.                         tl('admin_controller_configure_profile_change');
  2800.                     $data['SCRIPT'=
  2801.                         "doMessage('<h1 class=\"red\" >"$data['MESSAGE'].
  2802.                         "</h1>');";
  2803.  
  2804.                         if($old_profile['DEBUG_LEVEL'!=
  2805.                             $profile['DEBUG_LEVEL']{
  2806.                             $data['SCRIPT'.=
  2807.                                 "setTimeout('window.location.href=\"".
  2808.                                 "?c=admin&amp;a=configure&amp;".CSRF_TOKEN."=".
  2809.                                 $_REQUEST[CSRF_TOKEN]."\"', 3*sec);";
  2810.                         }
  2811.                 else {
  2812.                     $data['PROFILE'false;
  2813.                     $data["MESSAGE"=
  2814.                         tl('admin_controller_configure_no_change_profile');
  2815.                     $data['SCRIPT'.=
  2816.                         "doMessage('<h1 class=\"red\" >"$data["MESSAGE"].
  2817.                         "</h1>');";
  2818.                     break;
  2819.                 }
  2820.  
  2821.             break;
  2822.  
  2823.             default:
  2824.                 if(isset($data['WORK_DIRECTORY']&&
  2825.                     file_exists($data['WORK_DIRECTORY']."/profile.php")) {
  2826.                     $data array_merge($data,
  2827.                         $this->profileModel->getProfile(
  2828.                             $data['WORK_DIRECTORY']));
  2829.                     $data['MEMCACHE_SERVERS'str_replace(
  2830.                         "|Z|","\n"$data['MEMCACHE_SERVERS']);
  2831.                 else {
  2832.                     $data['WORK_DIRECTORY'"";
  2833.                     $data['PROFILE'false;
  2834.                 }
  2835.         }
  2836.         $data['advanced'"false";
  2837.         if($data['PROFILE']{
  2838.             $data['DBMSS'array();
  2839.             $data['SCRIPT'.= "logindbms = Array();\n";
  2840.             foreach($this->profileModel->getDbmsList(as $dbms{
  2841.                 $data['DBMSS'][$dbms$dbms;
  2842.                 if($this->profileModel->loginDbms($dbms)) {
  2843.                     $data['SCRIPT'.= "logindbms['$dbms'] = true;\n";
  2844.                 else {
  2845.                     $data['SCRIPT'.= "logindbms['$dbms'] = false;\n";
  2846.                 }
  2847.             }
  2848.  
  2849.             if(!isset($data['ROBOT_DESCRIPTION']||
  2850.                 strlen($data['ROBOT_DESCRIPTION']== 0{
  2851.                 $data['ROBOT_DESCRIPTION'=
  2852.                     tl('admin_controller_describe_robot');
  2853.             else {
  2854.                 //since the description might contain tags we apply htmlentities
  2855.                 $data['ROBOT_DESCRIPTION'=
  2856.                     $this->clean($data['ROBOT_DESCRIPTION']"string");
  2857.             }
  2858.             if(!isset($data['MEMCACHE_SERVERS']||
  2859.                 strlen($data['MEMCACHE_SERVERS']== 0{
  2860.                 $data['MEMCACHE_SERVERS'=
  2861.                     "localhost";
  2862.             }
  2863.  
  2864.             if(isset($_REQUEST['advanced']&& $_REQUEST['advanced']{
  2865.                 $data['advanced'"true";
  2866.             }
  2867.             $data['SCRIPT'.= <<< EOD
  2868.     elt('database-system').onchange = function () {
  2869.         setDisplay('login-dbms', self.logindbms[elt('database-system').value]);
  2870.     };
  2871.     setDisplay('login-dbms', logindbms[elt('database-system').value]);
  2872.     setDisplay('advance-configure', {$data['advanced']});
  2873.     setDisplay('advance-robot', {$data['advanced']});
  2874.     function toggleAdvance() {
  2875.         var advanced = elt('a-settings');
  2876.         advanced.value = (advanced.value =='true') 
  2877.             ? 'false' : 'true';
  2878.         var value = (advanced.value == 'true') ? true : false;
  2879.         setDisplay('advance-configure', value);
  2880.         setDisplay('advance-robot', value);
  2881.     }
  2882. EOD;
  2883.             if(class_exists("Memcache")) {
  2884.                 $data['SCRIPT'.= <<< EOD
  2885.     elt('use-memcache').onchange = function () {
  2886.         setDisplay('filecache', (elt('use-memcache').checked) ? false: true);
  2887.         setDisplay('memcache', (elt('use-memcache').checked) ? true : false);
  2888.     };
  2889.     setDisplay('filecache', (elt('use-memcache').checked) ? false : true);
  2890.     setDisplay('memcache', (elt('use-memcache').checked) ? true : false);
  2891. EOD;
  2892.             }
  2893.         }
  2894.         $data['SCRIPT'.=
  2895.             "elt('locale').onchange = ".
  2896.             "function () { elt('configureProfileForm').submit();};\n";
  2897.         
  2898.         return $data;
  2899.     }
  2900.  
  2901.     function updateProfileFields(&$data&$profile$check_box_fields array())
  2902.     {
  2903.         foreach($this->profileModel->profile_fields as $field{
  2904.             if(isset($_REQUEST[$field])) {
  2905.                 if($field != "ROBOT_DESCRIPTION" &&
  2906.                     $field != "MEMCACHE_SERVERS"{
  2907.                     $clean_field =
  2908.                         $this->clean($_REQUEST[$field]"string");
  2909.                 else {
  2910.                     $clean_field $_REQUEST[$field];
  2911.                 }
  2912.                 if($field == "NAME_SERVER" &&
  2913.                     $clean_field[strlen($clean_field-1!= "/"{
  2914.                     $clean_field .= "/";
  2915.                 }
  2916.                 $data[$field$clean_field;
  2917.                 $profile[$field$data[$field];
  2918.                 if($field == "MEMCACHE_SERVERS"{
  2919.                     $mem_array preg_split("/(\s)+/"$clean_field);
  2920.                     $profile[$field=
  2921.                         $this->convertArrayLines(
  2922.                             $mem_array"|Z|"true);
  2923.                 }
  2924.             }
  2925.             if(!isset($data[$field])) {
  2926.                 $data[$field"";
  2927.                 if(in_array($field$check_box_fields)) {
  2928.                     $profile[$fieldfalse;
  2929.                 }
  2930.             }
  2931.         }
  2932.     }
  2933. }
  2934. ?>

Documentation generated by phpDocumentor 1.4.3