ACC SHELL

Path : /srv/www/vhosts/agroing/web/controllers/
File Upload :
Current File : /srv/www/vhosts/agroing/web/controllers/admin.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Admin extends MY_Controller {
	public $data;
	public $default_view = true;

	public function __construct(){
		parent::__construct();
		Form::$escape_quotes = true;
		if(!$this->users->is_admin() && $this->data['action'] != "login"){
			// bezpečnostní riziko: všechno je přes cookies, a pokud má uživatel přístup na jeden web, na jiný to má celkem jednoduché
			$this->uri->redirect("admin/login");
		}
	}

	public function export ($root_rel = array()) {
		$this->export->export();
	}

	public function def ($edit_id = 0) {
		$this->load->model($model="def_model");
		$this->def = $this->$model;
		$f = new Form($model);
		if($edit_id){
			if(!($this->data['item'] = $this->def->get_one($edit_id))){
				Tools::flash("Zadana stranka nebyla nalezena...");
				$this->uri->redirect("admin");
			}
			$f->load_data($this->data['item']);
		}
		if($f->ready()){
			$data = $f->get_data();
			if ($this->def->save($data,$edit_id)){
				Tools::flash ("uloženo...","succ");
				$this->uri->redirect("admin/links");
			}else{
				Tools::flash ("Nelze vlozit data, Admin::action().","critical");
				$this->uri->back();
			}
		}
		$this->data['items'] = $this->def->get_all();
		$this->data['f'] = $f;
		$this->load->view('_default/admin',$this->data);
	}

	public function index ($edit_id = 0) {
		if(empty($this->data['settings'])){
			Tools::debug("set this domain first");
			$this->uri->redirect("admin/settings");
		}
		$this->load->model("sites_model");
		$this->sites->idr = Settings_model::$root_relation['id'];
		$this->data["sites"] = $this->sites->set_offset(0)->tree(); // tag("homepage")
		if($this->default_view){
			$this->load->view('_default/admin',$this->data);
		}
	}

	public function site($idr = null){
		if($idr && !is_numeric($idr)) $this->uri->redirect(404); // sanitize
		if(!$idr && empty($_GET['parent_id'])) $this->uri->redirect(404); // again
		$f = new Form("site");
//		Form::$ajax=false;
		if($f->ready()){
			$data = $f->get_data();

			// chyceni dedicnosti
			$data['state_inherit']=(isset($_POST['state_inherit']) ? 1 : 0);
			$state_inherit_once=(isset($_POST['state_inherit_once']) ? 1 : 0);
//			var_dump($data);
//			exit('<br>'.__FILE__.'; '.__LINE__);

			$data["updated"] = date("c", time());
			$rel = $this->sites->get_relation($idr); // set id and idr for save
			if(!empty($rel['list'])) $data['list'] = $rel['list']; // set right list
			if(!empty($_GET['parent_id'])) $data['parent_id'] = $_GET['parent_id'];
			// takes $_POST, bx $data['parts'] is undesirable sanitized
			$_POST['parts'] = str_replace("\n\n","\n",$_POST['parts']);
			$data['parts'] = $_POST['parts'];
			//die(var_dump(str_replace("\n","-",$_POST['parts'])));
			if ($this->sites->save_site($data)){

				// jednorazova dedicnost
				if($state_inherit_once){
					$count_of_inherited=$this->sites->state_inherit($idr);
					if($count_of_inherited===false){
						Tools::flash("Nepodařilo se podědit potomky stavem.","warn");
					}
					elseif($count_of_inherited){
						Tools::flash("Stav byl předán potomkům. (".$count_of_inherited.")","succ");
					}
					else{
						Tools::flash("Stav nebylo třeba dědit.","succ");
					}
				}

				Tools::flash ("Podstránka byla úspěšně uložena.","succ");
				$this->files = new Files_model();
				foreach($data['del_files'] as $id=>$df){
					if($df==1) $this->files->del_files($id);
				}
				if(!empty($_POST['save_continue'])) $this->uri->redirect("admin/site/".$this->sites->idr);
				$this->uri->redirect("admin");
			}
		}
		if($idr){
			$this->sites->get_one($idr);
			$this->data['parent'] = $this->sites->new_one()->parent();
			if(empty($this->sites->id)) $this->uri->redirect("admin/sites"); // IE can have unreasonable behavior caused background requests
			$f->load_data($this->sites->a);
		}elseif($_GET['parent_id']){
			$this->sites->a['parent_id'] = $_GET['parent_id'];
			// vychozi stav je "publikovano"
			$id_sites_states=1;
			// vychozi dedicnost je "bez dedicnosti"
			$state_inherit=0;

			/**
			 * @todo Vlahovic, 16.3.12 16:30 - dopsat dedeni stavu...
			 */
			$inherited_state=$this->sites->inherited_state($_GET['parent_id']);
			$id_sites_states=($inherited_state ? $inherited_state : $id_sites_states);

			// proste prirazeni do potencialne pouzivanych promennych
			@$this->data['sites']->a['id_sites_states']=$id_sites_states1;
			@$this->data['sites']->a['state_inherit']=$state_inherit;
			@$this->sites->a['id_sites_states']=$id_sites_states;
			@$this->sites->a['state_inherit']=$state_inherit;

			// stary zpusob
			$this->sites->parent();
			$sitemap = ($this->sites->a['parent']->has_tag('no_sitemap',1) ? 0 : 1);
			$f->load_data(array('sitemap'=>$sitemap));
		}

		// states
		$raw_sates=$this->db->query("SELECT `id`,`state` FROM sites_states ORDER BY `id`")->result_array();
		foreach($raw_sates as $item){
			$states[$item['id']]=$item['state'];
		}
		$this->data['states']=$states;

		$this->data['site'] = $this->sites;

		// default id_sites_states is 1
		$this->data['site']->a['id_sites_states']=(is_null($this->data['site']->a['id_sites_states']) ? 1 : $this->data['site']->a['id_sites_states']);

		// by default there is allways some text. Can be unset in some condition.
		// the rest is in your_admin.php
		if(empty($this->data['site']->a['parts']['text'])){
			$this->data['site']->a['parts']['text'] = true;
		}
		$this->data['hidden_parts'] = array("title","h1_title","meta_title","meta_description","meta_keywords");
		if(!empty($_GET['parent_id'])){
			$f->load_data(array('parent_id'=>$_GET['parent_id']));
		}
		$this->data["f"] = $f;

		if($this->default_view){
			$this->load->view('_default/admin',$this->data);
		}
	}

	/**
	 * @param int $idr relation of hp site
	 */
	function settings ($idr=null,$parent_idr=null) {
		
		if(!$idr) $idr = @Settings_model::$root_relation['id'];
		$settings = false;
		if(!empty($_GET['del_alias'])){
			$this->db->query("delete from settings where name='alias' && value='".$_GET['del_alias']."'");
			$this->uri->back();
		}
		if($idr){
			$settings = $this->settings->get_all($idr,false);
		}
		if(!$settings && !Ses::user("programator")){
			Tools::alert("Nebylo nalezeno potřebné nastavení");
			$this->uri->redirect("admin");
		}

		$f = new Form("settings",array("data"=>array("values"=>$settings)));
		//$f->load_data(array("values"=>$settings));
		if($f->ready()){
			$data = $f->get_data();
			// CREATE NEW WEB
			if(empty($idr)){
				if(!$parent_idr) $parent_idr = $this->sites->idr;
				if(!$parent_idr){
					$p = $this->db->query("select relations.id from relations join sites on sites.id=relations.id_sites where tags like '%#root#%'")->row_array();
					$parent_idr = $p['id'];
				}
				Sites_model::$repair_on_insert = false;
				$res = $this->sites->new_one()
					->save_site(array("parts"=>array("title"=>$data['values']['name']),"tags"=>"hp","parent_id"=>$parent_idr,"sitemap"=>"1"));
				Settings_model::$root_relation['id'] = $res->idr;
				$this->settings->set_root_relation($res->idr);
				// sites
				$podstranky = $this->sites->new_one()
					->save_site(array("parts"=>array("title"=>"PODSTRÁNKY"),"tags"=>"sites","parent_id"=>Settings_model::$root_relation['id']));
				$this->sites->new_one()
					->save_site(array("parts"=>array("title"=>"Kontakt","text"=>"<p>adresa...</p>"),"tags"=>"mail_form","parent_id"=>$podstranky->idr));
				// search
				$this->sites->new_one()
					->save_site(array("parts"=>array("title"=>"Vyhledávání"),"tags"=>"search","parent_id"=>Settings_model::$root_relation['id']));
				// design
				$design = $this->sites->new_one()
					->save_site(array("parts"=>array("title"=>"Design"),"tags"=>"design","parent_id"=>Settings_model::$root_relation['id']));
				$this->sites->new_one()
					->save_site(array("parts"=>array("title"=>"styles.css","text"=>file_get_contents("./views/_default/www/css/styles.css")),"tags"=>"css","parent_id"=>$design->idr));
				// 404
				$this->sites->new_one()
					->save_site(array("parts"=>array("title"=>"Stránka nenalezena [404]","text"=>"Stránka neexistuje"),"tags"=>"error_404","parent_id"=>Settings_model::$root_relation['id']));
				$this->sites->repair_tree();
				Sites_model::$repair_on_insert = false; // back to normal
			}

			// save values
			foreach($data['values'] as $name=>$val){
				$this->settings->save_row($name,$val);
			}
			// save aliases
			$a_lang = $data['aliases']['value']['lang'];
			foreach($data['aliases']['value'] as $i=>$val){
				$this->settings->save_row('alias',$val,$a_lang[$i],true);
			}
			$view = APPPATH . "views/" . $data['values']['name'];
			$w = APPPATH . "w/" . $data['values']['name'];
			if(!is_dir($view)){
				mkdir($view);
			}
			if(!is_dir($w)){
				mkdir($w);
				mkdir($w . "/cache");
				mkdir($w . "/files");
			}
			Tools::flash("uloženo...","succ");
			$this->uri->redirect("admin");
		}

		if(!empty($_POST['import_submit'])){
			if(empty($_FILES['import_file']['tmp_name']) || !strpos($_FILES['import_file']['name'],".zip")){
				Tools::alert("musíte vložit zip soubor pro import");
				$this->uri->redirect("admin/settings");
			}else{
				$files_folder = "views/" . $_POST['settings_name'] . '/www/i_files/';
				foreach($this->sites->new_one()->tag("hp")->childrens() as $ch){
					$ch->del_sites();
				}
				$this->export->import($_FILES['import_file']['tmp_name'], $files_folder, Settings_model::$root_relation['id']);
				$this->sites->repair_tree();
			}
		}

		$this->data['settings'] = $settings;
		$this->data['f'] = $f;
		$this->load->view('_default/admin',$this->data);
	}

	public function site_serialize(){
		$list = 1;
		if(!empty($_POST['i'])){
			foreach($_POST['i'] as $id=>$parent_id){
				$this->db->query("update relations set parent_id='$parent_id', list='$list' where id='$id'");
				$list++;
			}
		}
		$this->sites->repair_tree(false,Settings_model::$root_relation['id']);
		//$this->sites->repair_tree(false,false);
	}
	public function file_serialize(){
		foreach($_POST['f'] as $list=>$id){
			$this->db->query("update files set list='".($list+1)."' where id='$id'");
		}
	}

	function users(){
		/**
		 * kdyz se na tom shodneme, tak se to presune v nejake forme do modelu...
		 *
		 * @since 6.2.12 10:15
		 * @author Vlahovic
		 */
		$users = $this->users->get_all();
		foreach($users as $index => $user){
			$query="# zjisti nazev root domeny
				SELECT p.`content` AS `domain`
				FROM relations AS r
				LEFT JOIN `sites_parts` AS p ON p.id_sites=r.id_sites
				WHERE r.`id`=".$user['access_root']." AND p.`part`='title' LIMIT 1";
			$item = $this->db->query($query)->row_array();
			$users[$index]['domain']=(!empty($item['domain']) ? $item['domain'] : false);
		}
		$this->data['users']=$users;

//		$this->data['users'] = $this->users->get_all();
		$this->load->view('_default/admin',$this->data);
	}

	function user($id=0){
		// todo: vychytat bezpečnostní rizika:
		//			- uživatelé nesmí lézt do editace uživatelů nad nima
		//			- uživatel nesmí nastavit sobě ani jnému vyšší root_access než je jeho (bezpeč.chybka)
		//			- to samé s přidělením programátorského práva

		/**
		 * mozne root uzly
		 * pokud se shodneme na tomto reseni tak se asi presune do modelu
		 *
		 * @since 6.2.12 13:50
		 * @author Vlahovic
		 */

		$query = "# zjisti id rootu a ostatni potencialni domeny
			SELECT r.`id`, p.`content` AS `value`
			FROM sites AS s
			LEFT JOIN relations AS r ON r.id_sites=s.id
			LEFT JOIN sites_parts AS p ON p.id_sites=s.id AND p.`part`='title'
			WHERE s.tags LIKE '%#root#%' OR s.tags LIKE '%#hp#%'
			ORDER BY s.tags DESC, p.`content` ASC
			";
		$this->data['domains']=$this->db->query($query)->result_array();


		$f = new Form("user");
		// novy uzivatel
		if($id=='add'){
			// defaultni pro nove vytvareneho je aktualni domena
			$f->load_data(array('access_root'=>$this->sites->new_one()->tag('hp')->a['id'],'admin'=>1));
		}
		elseif($id){
			$this->data['user'] = $this->users->get_one($id);
			if(empty($this->data['user'])){
				Tools::flash("Tento uživatel (id: ".$id.") již neexistuje");
				$this->uri->redirect("admin/users");
			}
			$f->load_data($this->data['user']);
		}
		if($f->ready()){
			$data = $f->get_data();
			if($this->users->save_user($data,$id)){
				Tools::flash("Údaje o uživateli uloženy...","succ");
				header('location:/admin/users');
				exit();
			}else{
				Tools::flash("chyba při ukládání","critical");
				$this->uri->back();
			}
		}

		$this->data['f'] = $f;
		$this->load->view('_default/admin',$this->data);
	}

	function del($table,$id,$p3="",$p4=""){
		$redirect = "";  // redirect after deleting on succes which can depend on $table
		if($table == 'sites'){ // SITES
			$this->load->model("sites_model");
			$res = $this->sites->del_relations($id); // $id is id of relation // returns array
			if(empty($res)){ // idr
				$fail = true;
			}else{
				Tools::flash("stránka (včetně podstránek) byla úspěšně smazána","succ");
				if($res['diff']) Tools::flash("poznámka: ".$res['diff']." stránek nebylo smazáno. Pravděpodobně se nacházejí i v jiné větvi","warn");
				$this->uri->redirect("/admin");
			}
		}elseif($table == 'files'){ // FILES
			//$redirect = "admin/files";
			$this->load->model("files_model");
			if(!$this->files_model->del_files($id)) $fail = true;
		}
		elseif($table=='user'){
			$this->load->model("users_model");
			if(!$this->users_model->del($id)){
				$fail = true;
				Tools::flash("Uživatelský účet se nepodařilo odstraněn.","warn");
			}
			else{
				Tools::flash("Uživatelský účet byl odstraněn.","succ");
			}
			header('location:/admin/users');
			exit();
		}
		else{ // OTHER
			$model = $table."_model";
			if (file_exists(APPPATH.'models/'.$model.EXT)){
				$this->load->model($model);
				if(!$this->$model->del($id,$p3,$p4)) $fail = true;
			}else{
				$this->base->load(NULL,$id,$table);
				if(!$this->base->del()) $fail = true;
			}
		}
		// if there
		if(!empty($fail)){
			//Tools::flash("maybe bad model '".$table."' was specified or id is wrong [admin->del()]","critical");
		}else{
			Tools::flash("smazáno...","succ");
		}
		// option to specific redirect dependent on table-case
		if(!empty($redirect)){
			$this->uri->redirect($redirect);
		}else{
			$this->uri->back();
		}
	}

	function manual(){
		$this->load->view('_default/admin',$this->data);
	}

	function login (){
		if($this->users->is_admin()){
			$this->uri->redirect("admin");
		}
		$f = new Form("login");
		if($f->ready()){
			$data = $f->get_data();
			if($this->users->login($data)){
				$sql = "select parent_id from relations where id='".$this->users->data['access_root']."'";
				$rel_parent_id = $this->db->query($sql)->row()->parent_id; // is this root?
				// is admin of this web or is this root admin?
				if($this->users->data['access_root'] == @Settings_model::$root_relation['id'] || !$rel_parent_id){ 
					Ses::user($this->users->data);
					Tools::succ("přístup do administrace povolen");
					$this->uri->redirect("admin");
				}else{ // not exist settings and you havent root access
					Tools::alert("Neexistující nastavení webu, nebo nemáte root práva pro jeho nastavení");
				}
			}else{
				Tools::alert("Zadal jste špatný login nebo heslo");
			}
		}
		$this->data['f'] = $f;
		$this->load->view('_default/layout/blank',$this->data);
	}

	function logout (){
		Ses::user_destroy();
		Tools::flash("byl jste úspěšně odhlášen","succ");
		$this->uri->redirect("");
	}

	////   DEPRECATED

	public function files ($edit_id = 0) {
		$this->load->model("files_model");
		$this->def = $this->files_model;
		if(!empty($_GET["duplicate"])){
			$duplic = $this->def->get_one($edit_id);
			$sql = "INSERT INTO files (file, file_title, file_url) VALUES ('".$duplic["file"]."', '".$duplic["file_title"]."', '".$duplic["file_url"]."')";
			$this->db->query($sql);
			$edit_id = $this->db->insert_id();
			Tools::flash ("Kopie vytvořena (<a href='/admin/del/files/".$edit_id."' style='font-size: 90%;  color: red;'>smazat</a>)","succ");
			$this->uri->redirect("admin/files/".$edit_id);
		}
		$f = new Form("files");
		if($f->ready()){
			$data = $f->get_data();
			if ($edit_id) unset($data['file_url']);
			if ($this->def->save_file($data,$edit_id)){
				Tools::flash ("uloženo...","succ");
				$this->uri->redirect("admin/files");
			}
		}
		if($edit_id){
			$this->def->get_one($edit_id);
			$this->def->a["file_url"] = "/www/files/".$this->def->a["file_url"];
			$f->load_data($this->def->a);
		}
		$this->data['file'] = $this->def;
		$this->data['files'] = $this->def->get_all();
		$this->data['f'] = $f;
		$this->data["sites_id"] = $this->get_sites_for_select();
		$this->load->view('_default/admin',$this->data);
	}


	/**
	 * import dat z jinych databazi/systemu
	 */
	public function import(){
		// importuje...
		$this->load->model('import_model');

		// dostupne databaze
		$databases=array(''=>'-- vyber --');
		$query="SHOW DATABASES;";
		$s=$this->db->query($query)->result_array();
		foreach($s as $db){
			if($db['Database']!='information_schema' && $db['Database']!='mysql' && $db['Database']!=DB_DB){
				$databases[$db['Database']]=$db['Database'];
			}
		}

		// dostupne typy importu
		$systems=array_merge(array(''=>'-- vyber --'),$this->import_model->get_import_posible_systems());

		// zpracovani formulare
		$f=new Form('import');
		if($f->ready()){
			$data = $f->get_data();
			if($this->import_model->do_import($data['database'],$data['system'],$data['server'])){
				Tools::succ('Byla importována data ze systému "'.$data['system'].'" z databáze "'.$data['database'].'"');
			}
			else{
				Tools::critical('Nepodařilo se importovat data ze systému "'.$data['system'].'" z databáze "'.$data['database'].'"');
			}
		}

		// vystup
		$this->data['f'] = $f;
		$this->data['databases']=$databases;
		$this->data['systems']=$systems;
		$this->load->view('_default/admin',$this->data);
	}

}

?>

ACC SHELL 2018