<?php

	/**
	 * Dieses Modul ist ein verstecktes System Modul und ist nur in der Lizezierten Version vorhanden
	 * @author Daschmi (daniel@maennchen1.de) 02.10.2015
	 */
	class wpsg_mod_core extends wpsg_mod_basic
	{
		 
		var $id = 1630;
		
		public function __construct()
		{
			
			parent::__construct(); 
			
		} // public function __construct()
		
		/**
		 * Lädt die Module
		 */
		public function loadModule($all)
		{
			 
			$mod_dir = opendir(WPSG_PATH_MOD);
				
			$global = false;
			if ($this->shop->isMultiBlog() && $this->shop->get_option('wpsg_multiblog_standalone', true) != '1') $global = true;
				
			while ($file = readdir($mod_dir))
			{
			
				if (!is_dir(WPSG_PATH_MOD."/".$file) && $file != "." && $file != ".." && preg_match("/(.*)\.class\.php/i", $file) && $file != "wpsg_mod_basic.class.php")
				{
						
					if (file_exists(WPSG_PATH_USERMOD.$file)) require_once(WPSG_PATH_USERMOD.$file);
					else require_once(WPSG_PATH_MOD.$file);
						
					$class_name = preg_replace("/\.class\.php/", "", $file);
						
					$mod = new $class_name();
						
					// Demo oder Modul für Lizenz aktiv
					if ($this->shop->arLizenz['l'] == 0 || $this->shop->arLizenz['l'] >= $mod->lizenz)
					{
							
						if (!isset($mod->version) || $mod->getDemoDays() > 0 || (isset($this->shop->arLizenz) && in_array(get_class($mod), (array)$this->shop->arLizenz['mods'])))
						{
			
							if ($this->shop->get_option($class_name, $global) > 0 || $class_name === 'wpsg_mod_core')
							{
			
								$this->shop->arModule[$class_name] = $mod;
			
							}
			
						}
							
						if ($all)
						{
			
							$this->shop->arAllModule[$class_name] = $mod;
			
						}
			
					}
						
				}
			
			}
				
			uasort($this->shop->arModule, array($this->shop, "cmp_mods"));
				
			if ($all) uasort($this->shop->arAllModule, array($this->shop, "cmp_mods"));
			
			// Module werden hier erst initiiert, da dann alle Module bekannt sind und die Reihenfolge hergestellt ist
			foreach ($this->shop->arModule as $mod_key => $m)
			{
			
				if ($this->shop->get_option(get_class($m), $global) > 0)
				{
			
					$m->init();
						
				}
			
			}
			
		} // public function loadModule($all)
		
		/**
		 * Gibt true zurück wenn eine aktive Lizenz eingebunden ist
		 */
		public function hasActiveLicence()
		{
			
			if (is_array($this->shop->arLizenz) && isset($this->shop->arLizenz['l']))
			{
			
				// Prüfen das in einem Multiblog nur mit der Enterprise Version gearbeitet wird
				if ($this->shop->isMultiBlog() && $this->shop->arLizenz['l'] < 3)
				{
						
					// Die installierte Lizenz kann nicht in einer Multiblog Umgebung eingesetzt werden.
					$this->shop->addBackendError(base64_decode('RGllIGluc3RhbGxpZXJ0ZSBMaXplbnoga2FubiBuaWNodCBpbiBlaW5lciBNdWx0aWJsb2cgVW1nZWJ1bmcgZWluZ2VzZXR6dCB3ZXJkZW4u'));
					
					return false;
						
				}
			
				return true;
			
			}
				
			if ($this->shop->getDemoDays() < 0)
			{
			
				// Ihre Lizenz von wpShopGermany ist abgelaufen
				$this->shop->addBackendError(base64_decode('SWhyZSBMaXplbnogdm9uIHdwU2hvcEdlcm1hbnkgaXN0IGFiZ2VsYXVmZW4='));
			
			}
			
			return false;
			
		}
		
		/**
		 * Gibt die Tage der DemoVersion zurück
		 */
		public function getDemoDays()
		{
			
			$isnt = $this->shop->get_option('wpsg_installed', true);
			$rem = round((($isnt + 14 * 60 * 60 * 24) - time()) / (60 * 60 * 24), 0);
				
			return $rem;
			
		} // public function getDemoDays()
		
		public function admin_registrierung()
		{
			
			if (!class_exists('SoapClient'))
			{
			
				$this->shop->addBackendError(__('nohspc_Ihrem Server fehlt die PHP-Bibliothek für die SOAP-Unterstützung. Eine Registrierung Ihrer Domain ist somit nicht möglich! <br />Weitere Informationen finden Sie in unseren <a target="_blank" href="http://wpshopgermany.maennchen1.de/faqs/wie-pruefe-ich-ob-soap-und-curl-auf-meinem-server-aktiviert-sind/">FAQ</a>.', 'wpsg'));
				$this->shop->view['actionName'] = 'registrierung';
				$this->shop->render(WPSG_PATH_VIEW.'/admin/index.phtml');
			
				return;
			
			}
				
			if (!$this->shop->arLizenz['nr'] > 0 && $_REQUEST['do'] != 'installModul') {
			
				$this->shop->view = array(
					'actionName' => 'registrierung',
					'subTemplate' => WPSG_PATH_VIEW.base64_decode('L21vZHMvbW9kX2NvcmUvYWRtaW5fbGljZW5jZS5waHRtbA==') // /mods/mod_core/admin_licence.phtml
				);
			
			}
			else
			{
			
				if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'remove')
				{
			
					$reg_data = $this->shop->callMod('wpsg_mod_core', 'RegisterCall', array('removeURL', array($_REQUEST['url'])));
						
					if ($reg_data === false) { $this->shop->addBackendError(__('Keine Registrierungsdaten gefunden.', 'wpsg')); }
					else if (is_array($reg_data) && isset($reg_data['error']) && array_key_exists('error', $reg_data)) { $this->shop->addBackendError(wpsg_translate(__('Fehler im Registrierungsserver: #1#', 'wpsg'), $reg_data['error'])); }
					else { $this->shop->addBackendMessage(__('Domainregistrierung erfolgreich entfernt.', 'wpsg')); }
						
					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=domains');
						
				}
				else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'register')
				{
						
					$reg_data = $this->shop->callMod('wpsg_mod_core', 'RegisterCall', array('registerURL', array($this->shop->get_option('siteurl'))));
						
					if ($reg_data === false) { $this->shop->addBackendError(__('Keine Registrierungsdaten gefunden.', 'wpsg')); }
					else if (is_array($reg_data) && isset($reg_data['error']) && array_key_exists('error', $reg_data)) { $this->shop->addBackendError(wpsg_translate(__('Fehler im Registrierungsserver: #1#', 'wpsg'), $reg_data['error'])); }
					else { $this->shop->addBackendMessage(__('Domainregistrierung erfolgreich.', 'wpsg')); }
						
					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=domains');
						
				}
				else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'getCredentials')
				{
						
					$this->getCredentialsAction();
						
					return;
						
				}
				else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'installModul')
				{
											
					if ($this->installModul($_REQUEST['modul']))
					{
			
						$this->shop->addBackendMessage(__('Modul erfolgreich installiert.', 'wpsg'));
			
					}
			
					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module');
						
				}
				else if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'aktivateModul')
				{
						
					$reg_data = $this->shop->callMod('wpsg_mod_core', 'RegisterCall', array('aktivateModul', array($_REQUEST['wpsg_modulkey'])));
						
					if ($reg_data === false) { $this->shop->addBackendError(__('Modul konnte nicht aktiviert werden.', 'wpsg')); }
					else if ($reg_data === -1) { $this->shop->addBackendError(__('Ungültiger Modulcode.', 'wpsg')); }
					else if ($reg_data === -2) { $this->shop->addBackendError(__('Code bereits für einen anderen Schlüssel verwendet.', 'wpsg')); }
					else if ($reg_data === -3) { $this->shop->addBackendError(__('Modul bereits aktiviert.', 'wpsg')); }
					else if (is_array($reg_data) && isset($reg_data['error']) && array_key_exists('error', $reg_data)) { $this->shop->addBackendError(wpsg_translate(__('Fehler im Registrierungsserver: #1#', 'wpsg'), $reg_data['error'])); }
					else {
			
						// Neuen Modulcode speichern
						$this->shop->update_option('wpsg_key', $reg_data, true);
			
						$this->shop->addBackendMessage(__('Modul erfolgreich aktiviert.', 'wpsg'));
							
					}
						
					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&subaction=module');
						
				}
			
				if (isset($_REQUEST['registerdata-submit']))
				{
						
					$reg_data = $this->shop->callMod('wpsg_mod_core', 'RegisterCall', array('setRegisterInfo', array($_REQUEST)));
						
					if ($reg_data === false) { $this->shop->addBackendError(__('Keine Registrierungsdaten gefunden.', 'wpsg')); }
					else if (is_array($reg_data) && isset($reg_data['error']) && array_key_exists('error', $reg_data)) { $this->shop->addBackendError(wpsg_translate(__('Fehler im Registrierungsserver: #1#', 'wpsg'), $reg_data['error'])); }
					else { $this->shop->addBackendMessage(__('Registrierungsdaten erfolgreich übermittelt', 'wpsg')); }
						
					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung');
						
				}
			
				// Daten vom Registrierungsserver laden
				$reg_data = $this->shop->callMod('wpsg_mod_core', 'RegisterCall', array('getRegisterInfo'));
			
				// Aktuelle Domain registriert?
				$reg_data['registred'] = false;
				$arURLs = array();
				foreach ((array)$reg_data['domains'] as $d)
				{
						
					$arURLs[] = preg_replace('/(.*)\/\//', '', $d['url']);
						
					if (preg_match('/((http\:\/\/)|(https\:\/\/)){0,1}'.preg_quote($this->shop->get_option('siteurl'), '/').'\/*/', $d['url']))
					{
						$reg_data['registred'] = true; break;
					}
						
				}
			
				$this->shop->update_option('wpsg_registredURLs', $arURLs);
			
				if ($reg_data === false)
				{
						
					$this->shop->addBackendError(__('Keine Registrierungsdaten gefunden.', 'wpsg'));
						
				}
				else if (is_array($reg_data) && isset($reg_data['error']) && array_key_exists('error', $reg_data))
				{
						
					$this->shop->addBackendError(wpsg_translate(__('Fehler im Registrierungsserver: #1#', 'wpsg'), $reg_data['error']));
			
				}
			
				$this->shop->view = array(
					'data' => $reg_data,
					'actionName' => 'registrierung',
					'subTemplate' => WPSG_PATH_VIEW.base64_decode('L21vZHMvbW9kX2NvcmUvYWRtaW5fcmVnaXN0ZXIucGh0bWw='), // /mods/mod_core/admin_register.phtml
					'mods' => $this->shop->arLizenz['mods']
				);
			
				$this->shop->loadModule(true);
			
				switch ($this->shop->arLizenz['l'])
				{
						
					case '1': $this->shop->view['typ'] = __('Light Version', 'wpsg'); break;
					case '2': $this->shop->view['typ'] = __('Pro Version', 'wpsg'); break;
					case '3': $this->shop->view['typ'] = __('Enterprise Version', 'wpsg'); break;
					default: die();
						
				}
			
			}
			
			$this->shop->render(WPSG_PATH_VIEW.'/admin/index.phtml');
			
		} // public function admin_registrierung()
		
		public function module_index()
		{
			
			if (class_exists('SoapClient'))
			{
		
				$this->shop->view['arOnlineModule'] = $this->RegisterCall('getModulInfo_V2');
		
				foreach ((array)$this->shop->view['arOnlineModule'] as $k => $m)
				{
		
					if (wpsg_isSizedString($m['version_dev']) && wpsg_isSizedInt($this->shop->get_option('wpsg_debugURL'))) $this->shop->view['arOnlineModule'][$k]['version'] = $m['version_dev'];
		
					$this->shop->view['arOnlineModule'][$k]['version_local'] = $this->shop->arAllModule[$m['key']]->version;
		
					$global = false;
					if ($this->shop->isMultiBlog() && $this->shop->get_option('wpsg_multiblog_standalone', true) != '1') $global = true;
		
					if ($this->shop->get_option($m['key'], $global) > 0)
					{
							
						$this->shop->view['arOnlineModule'][$k]['installed'] = true;
							
					}
					else
					{
							
						$this->shop->view['arOnlineModule'][$k]['installed'] = false;
							
					}
		
					if ($this->shop->get_option('wpsg_debugURL') == '1' && isset($this->shop->view['arOnlineModule'][$k]['version_dev']))
					{
		
						$this->shop->view['arOnlineModule'][$k]['version'] = $m['version_dev'];
							
					}
		
				}
						
			}
			else
			{
					
				$this->shop->addBackendError(__('nohspc_Ihrem Server fehlt die PHP-Bibliothek für die SOAP-Unterstützung. Eine Registrierung Ihrer Domain ist somit nicht möglich! <br />Weitere Informationen finden Sie in unseren <a target="_blank" href="http://wpshopgermany.maennchen1.de/faqs/wie-pruefe-ich-ob-soap-und-curl-auf-meinem-server-aktiviert-sind/">FAQ</a>.', 'wpsg'));
					
			}
			
			echo $this->render(WPSG_PATH_VIEW.'/mods/mod_core/module_index.phtml');
			
		} // public function module_index()
		
		/**
		 * Sendet eine Anfrage an den Registrierungs Server und gibt das Ergebnis zurück
		 */
		public function RegisterCall($func_name, $args = array())
		{
				
			$SOAP = new SoapClient(
				null,
				array(
					'location' => base64_decode('aHR0cHM6Ly9zaG9wLm1hZW5uY2hlbjEuZGUvcmVnaXN0cmllcnVuZy8='), // https://shop.maennchen1.de/registrierung/
					'uri' => 'http://shop.maennchen1.de',
					'cache_wsdl' => WSDL_CACHE_NONE
				)
			);
				
			if (!$this->shop->hasActiveLicence())
			{
					
				$args = array_merge(array('No_wpsg'), $args);
		
			}
			else
			{
		
				// Hier kein wpsg_array_merge da die index gleich sind
				$args = array_merge(array($this->shop->get_option('wpsg_key', true)), $args);
		
			}
				
			try {
					
				$result = $SOAP->__soapCall($func_name, $args);
		
			}
			catch (Exception $e)
			{
		
				$this->shop->addBackendError(wpsg_translate(__('SOAP Fehler: #1#', 'wpsg'), $e->getMessage()));
		
			}
				
			return $result;
				
		} // public function RegisterCall($func_name, $args)
	
		public function installModul($modul_key)
		{
			
			global $wp_filesystem;
			
			ob_start();
			$request_creds = request_filesystem_credentials(
				WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=installModul&modul='.$modul_key,
				'',
				false,
				false,
				null
			);
			ob_end_clean();
				
			// 1 gibt es bei Windows Rechnern zurück, da es hier egal ist
			// Ein Array ist es wenn das Formular bereits abgeschickt wurde und die Anfrage vom Formular kommt
			// false ist es wenn kein Zugriff ist dann muss das Formular angezeigt werden
				
			if (false === $request_creds)
			{
			
				// Berechtigungen anfragen
				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&do=getCredentials&modul='.$_REQUEST['modul']);
			
			}
			else if (is_array($request_creds))
			{
			
				if (!WP_Filesystem($request_creds))
				{
			
					// Eingegebene Daten waren falsch
					$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&do=getCredentials&modul='.$_REQUEST['modul']);
			
				}
			
			}
			
			$temp_name = $this->shop->getTempName($modul_key.'.zip');
			@unlink($temp_name);
				
			if ($this->shop->get_option('wpsg_debugURL') === '1' && $this->shop->hasMod('wpsg_mod_core'))
			{
			
				$url = 'http://dl.maennchen1.de/wpsg/'.$modul_key.'/'.$modul_key.'_dev.zip';
			
			}
			else
			{
			
				$url = 'http://dl.maennchen1.de/wpsg/'.$modul_key.'/'.$modul_key.'_latest.zip';
			
			}
			
			$bOK = @copy($url, $temp_name);
			
			if (!$bOK)
			{
			
				$bOK = @file_put_contents($temp_name, $this->shop->get_url_content($url));
			
				if (!$bOK)
				{
						
					// Pfad finden für das Wordpress Filesystem
					if ($GLOBALS['wpsg_sc']->isMultiBlog())
						$ftp_path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_temp/';
						else
							$ftp_path = WP_CONTENT_DIR.'/uploads/wpsg_temp/';
								
							$ftp_path = trailingslashit($wp_filesystem->find_folder($ftp_path)).preg_replace('/(.*)\/wpsg_temp\//', '', $temp_name);
								
							$bOK = $wp_filesystem->put_contents($ftp_path, $this->shop->get_url_content($url), FS_CHMOD_FILE);
								
							if (!$bOK)
							{
									
								$this->shop->addBackendError(wpsg_translate(__('Modul (#1#) konnte nicht kopiert werden!', 'wpsg'), $modul_key));
								return false;
			
							}
								
				}
			
			}
				
			$zip = new ZipArchive();
			
			if ($zip->open($temp_name) === true)
			{
			
				try
				{
						
					$bOK = @$zip->extractTo(WPSG_PATH.'/../');
					$zip->close();
			
					if ($bOK === false)
					{
			
						throw new Exception();
							
					}
					else
					{
			
						return true;
							
					}
			
				}
				catch (Exception $e)
				{
						
					// Es ist ein Fehler aufgetreten, jetzt versuche ich die Datei mit dem Wordpress Filesystem zu entpacken
						
					// Pfad finden für das Wordpress Filesystem
					$ftp_path = trailingslashit($wp_filesystem->find_folder(realpath(WPSG_PATH.'/../')));
						
					$bOK = unzip_file($temp_name, $ftp_path);
						
					if ($bOK !== true)
					{
			
						$strError = '';
			
						// Hier ist immer noch ein Fehler aufgetreten
						foreach ((array)$bOK->errors as $e)
						{
								
							$strError .= $e[0].' ';
			
						}
						 
						$this->shop->addBackendError(wpsg_translate(__('Fehler beim Entpacken: #1#', 'wpsg'), $strError)); return false;
			
					}
					else
					{
			
						return true;
			
					}
						
				}
			
			}
			else
			{
			
				$this->shop->addBackendError(__('Datei konnte nicht übertragen werden.', 'wpsg')); return false;
			
			}
			
			$this->shop->addBackendError(__('Datei konnte nicht entpackt werden.', 'wpsg')); return false;
			
		} // public function installModul($modul_key)
		
		/**
		 * Fragt die Rechte ab und installiert anschließend ein Modul
		 */
		public function getCredentialsAction()
		{
				
			echo request_filesystem_credentials(
				WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=registrierung&noheader=1&do=installModul&modul='.$_REQUEST['modul'],
				'',
				false,
				false,
				null
			);
				
		} // public function getCredentialsAction()
		
	} // class wpsg_mod_core extends wpsg_mod_basic

?>