- Feeds and Search modules are working again

- renamed some files
- cleaned up some functions and removed duplicated code
- many bug fixes and minor enhancements
parent c652c0ab
......@@ -8,7 +8,7 @@
namespace ACP3;
class CMS {
class Application {
/**
* Führt alle nötigen Schritte aus, um die Seite anzuzeigen
......
......@@ -16,7 +16,7 @@ namespace ACP3\Core;
* @package ACP3
* @subpackage Core
*/
class ACL
abstract class ACL
{
/**
* Array mit den jeweiligen Rollen zugewiesenen Berechtigungen
......
......@@ -16,7 +16,7 @@ namespace ACP3\Core;
* @package ACP3
* @subpackage Core
*/
class Cache
abstract class Cache
{
/**
*
......
......@@ -17,7 +17,7 @@ use \ACP3\Core\Cache;
* @package ACP3
* @subpackage Core
*/
class Config
abstract class Config
{
/**
* Gibt die Systemeinstellungen aus
......
......@@ -283,7 +283,7 @@ class Date {
* @param string $current_value
* @return array
*/
public function getTimeZones($current_value = '')
public static function getTimeZones($current_value = '')
{
$timeZones = array(
'Africa' => \DateTimeZone::listIdentifiers(\DateTimeZone::AFRICA),
......
......@@ -10,7 +10,7 @@
namespace ACP3\Core;
class Functions {
abstract class Functions {
/**
* Ermittelt die Dateigröße gemäß IEC 60027-2
......
......@@ -17,7 +17,7 @@ namespace ACP3\Core;
* @package ACP3
* @subpackage Core
*/
class Modules {
abstract class Modules {
/**
* Überpüft, ob ein Modul überhaupt existiert,
......
......@@ -16,7 +16,7 @@ namespace ACP3\Core;
* @package ACP3
* @subpackage Core
*/
class SEO
abstract class SEO
{
/**
* Caching Variable für die URI-Aliases
......
......@@ -32,6 +32,8 @@ class URI
*/
public $query = '';
const PATTERN = '=^acp/=';
/**
* Zerlegt u.a. die übergebenen Parameter in der URI in ihre Bestandteile
*/
......@@ -90,7 +92,7 @@ class URI
$this->query = substr(str_replace(PHP_SELF, '', htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES)), 1);
$this->query.= !preg_match('/\/$/', $this->query) ? '/' : '';
if (preg_match('/^(acp\/)/', $this->query)) {
if (preg_match(self::PATTERN, $this->query)) {
// Definieren, dass man sich im Administrationsbereich befindet
define('IN_ADM', true);
// "acp/" entfernen
......@@ -257,16 +259,16 @@ class URI
{
$path = $path . (!preg_match('/\/$/', $path) ? '/' : '');
if (!preg_match('/^acp\//', $path)) {
if (CONFIG_SEO_ALIASES === true && !preg_match(self::PATTERN, $path)) {
if (count(preg_split('=/=', $path, -1, PREG_SPLIT_NO_EMPTY)) === 1)
$path.= 'list/';
// Überprüfen, ob Alias vorhanden ist und diesen als URI verwenden
if ((bool) (bool) CONFIG_SEO_ALIASES === true && $alias === 1) {
if ($alias === 1) {
$alias = SEO::getUriAlias($path);
$path = $alias . (!preg_match('/\/$/', $alias) ? '/' : '');
}
}
$prefix = (bool) CONFIG_SEO_MOD_REWRITE === false || preg_match('/^acp\//', $path) || defined('IN_UPDATER') === true ? PHP_SELF . '/' : ROOT_DIR;
$prefix = (bool) CONFIG_SEO_MOD_REWRITE === false || preg_match(self::PATTERN, $path) ? PHP_SELF . '/' : ROOT_DIR;
return $prefix . $path;
}
}
\ No newline at end of file
<?php
/**
* Validate
*
......@@ -16,18 +17,17 @@ namespace ACP3\Core;
* @package ACP3
* @subpackage Core
*/
class Validate
{
abstract class Validate {
/**
* Überprüft, ob die übergebenen Privilegien existieren und
* plausible Werte enthalten
*
* @param array $privileges
* Array mit den IDs der zu überprüfenden Privilegien mit ihren Berechtigungen
* Array mit den IDs der zu überprüfenden Privilegien mit ihren Berechtigungen
* @return boolean
*/
public static function aclPrivilegesExist(array $privileges)
{
public static function aclPrivilegesExist(array $privileges) {
$all_privs = ACP3_ACL::getAllPrivileges();
$c_all_privs = count($all_privs);
for ($i = 0; $i < $c_all_privs; ++$i) {
......@@ -41,15 +41,15 @@ class Validate
}
return $valid;
}
/**
* Überprüft, ob die selektierten Rollen existieren
*
* @param array $roles
* Die zu überprüfenden Rollen
* Die zu überprüfenden Rollen
* @return boolean
*/
public static function aclRolesExist(array $roles)
{
public static function aclRolesExist(array $roles) {
$all_roles = ACP3_ACL::getAllRoles();
$good = array();
foreach ($all_roles as $row) {
......@@ -62,6 +62,7 @@ class Validate
}
return true;
}
/**
* Überprüft einen Geburtstag auf seine Gültigkeit
*
......@@ -69,8 +70,7 @@ class Validate
* Das zu überprüfende Datum
* @return boolean
*/
public static function birthday($var)
{
public static function birthday($var) {
$regex = '/^(\d{4})-(\d{2})-(\d{2})$/';
$matches = array();
if (preg_match($regex, $var, $matches)) {
......@@ -80,16 +80,17 @@ class Validate
}
return false;
}
/**
* Überpürft, ob das eingegebene Captcha mit dem generierten übereinstimmt
*
* @param string $input
* @return boolean
*/
public static function captcha($input)
{
public static function captcha($input) {
return preg_match('/^[a-zA-Z0-9]+$/', $input) && isset($_SESSION['captcha']) && strtolower($input) === strtolower($_SESSION['captcha']) ? true : false;
}
/**
* Überprüft, ob alle Daten ein sinnvolles Datum ergeben
*
......@@ -97,21 +98,20 @@ class Validate
* Startdatum
* @param string $end
* Enddatum
* @return boolean
* @return boolean
*/
public static function date($start, $end = null)
{
public static function date($start, $end = null) {
$matches_start = $matches_end = array();
$regex = '/^(\d{4})-(\d{2})-(\d{2})( ([01][0-9]|2[0-3])(:([0-5][0-9])){1,2}){0,1}$/';
if (preg_match($regex, $start, $matches_start)) {
// Wenn ein Enddatum festgelegt wurde, dieses ebenfalls mit überprüfen
if ($end != null && preg_match($regex, $end, $matches_end)) {
if (checkdate($matches_start[2], $matches_start[3], $matches_start[1]) &&
checkdate($matches_end[2], $matches_end[3], $matches_end[1]) &&
strtotime($start) <= strtotime($end)) {
checkdate($matches_end[2], $matches_end[3], $matches_end[1]) &&
strtotime($start) <= strtotime($end)) {
return true;
}
// Nur Startdatum überprüfen
// Nur Startdatum überprüfen
} else {
if (checkdate($matches_start[2], $matches_start[3], $matches_start[1])) {
return true;
......@@ -120,10 +120,11 @@ class Validate
}
return false;
}
public static function deleteEntries($entries)
{
public static function deleteEntries($entries) {
return (bool) preg_match('/^((\d+)\|)*(\d+)$/', $entries);
}
/**
* Überprüft, ob eine Standardkonforme E-Mail-Adresse übergeben wurde
*
......@@ -133,8 +134,7 @@ class Validate
* Zu überprüfende E-Mail-Adresse
* @return boolean
*/
public static function email($var)
{
public static function email($var) {
if (function_exists('filter_var')) {
return (bool) filter_var($var, FILTER_VALIDATE_EMAIL);
} else {
......@@ -142,14 +142,14 @@ class Validate
return (bool) preg_match($pattern, $var);
}
}
/**
* Überprüft, ob die zusätzlich zu ladenden Stylesheets überhaupt existieren
*
* @param string $var
* @return boolean
*/
public static function extraCSS($var)
{
public static function extraCSS($var) {
if ((bool) preg_match('=/=', $var) === false) {
$var_ary = explode(',', $var);
foreach ($var_ary as $stylesheet) {
......@@ -162,14 +162,14 @@ class Validate
}
return false;
}
/**
* Überprüft, ob die zusätzlich zu ladenden JavaScript Dateien überhaupt existieren
*
* @param string $var
* @return boolean
*/
public static function extraJS($var)
{
public static function extraJS($var) {
if ((bool) preg_match('=/=', $var) === false) {
$var_ary = explode(',', $var);
foreach ($var_ary as $js) {
......@@ -182,19 +182,20 @@ class Validate
}
return false;
}
/**
* Validiert das Formtoken auf seine Gültigkeit
*
* @return boolean
*/
public static function formToken()
{
public static function formToken() {
if (isset($_POST[\ACP3\Core\Session::XSRF_TOKEN_NAME]) && isset($_SESSION[\ACP3\Core\Session::XSRF_TOKEN_NAME][Registry::get('URI')->query]) &&
$_POST[\ACP3\Core\Session::XSRF_TOKEN_NAME] === $_SESSION[\ACP3\Core\Session::XSRF_TOKEN_NAME][Registry::get('URI')->query]) {
$_POST[\ACP3\Core\Session::XSRF_TOKEN_NAME] === $_SESSION[\ACP3\Core\Session::XSRF_TOKEN_NAME][Registry::get('URI')->query]) {
return true;
}
return false;
}
/**
* Bestimmung des Geschlechts
* 1 = Keine Angabe
......@@ -205,50 +206,50 @@ class Validate
* Die zu überprüfende Variable
* @return boolean
*/
public static function gender($var)
{
public static function gender($var) {
return $var == 1 || $var == 2 || $var == 3 ? true : false;
}
/**
* Überprüft, ob eine gültige ICQ-Nummer eingegeben wurde
*
* @param integer $var
* @return boolean
*/
public static function icq($var)
{
public static function icq($var) {
return (bool) preg_match('/^(\d{6,9})$/', $var);
}
/**
* Überprüft, ob die übergebene URI dem Format des ACP3 entspricht
*
* @param mixed $var
* @return boolean
*/
public static function isInternalURI($var)
{
public static function isInternalURI($var) {
return (bool) preg_match('/^([a-z\d_\-]+\/){2,}$/', $var);
}
/**
* Überprüft, ob ein gültiger MD5-Hash übergeben wurde
*
* @param string $string
* @return boolean
*/
public static function isMD5($string)
{
public static function isMD5($string) {
return is_string($string) === true && preg_match('/^[a-f\d]+$/', $string) && strlen($string) === 32 ? true : false;
}
}
/**
* Überprüft eine Variable, ob diese nur aus Ziffern besteht
*
* @param mixed $var
* @return boolean
*/
public static function isNumber($var)
{
public static function isNumber($var) {
return (bool) preg_match('/^(\d+)$/', $var);
}
/**
* Überprüfen, ob es ein unterstütztes Bildformat ist
*
......@@ -256,8 +257,7 @@ class Validate
* Zu überprüfendes Bild
* @return boolean
*/
public static function isPicture($file, $width = '', $height = '', $filesize = '')
{
public static function isPicture($file, $width = '', $height = '', $filesize = '') {
$info = getimagesize($file);
$isPicture = $info[2] >= 1 && $info[2] <= 3 ? true : false;
......@@ -275,17 +275,18 @@ class Validate
}
return false;
}
/**
* Überprüft, ob der eingegebene URI-Alias sicher ist, d.h. es dürfen nur
* die Kleinbuchstaben von a-z, Zahlen, der Bindestrich und das Slash eingegeben werden
* Überprüft, ob der eingegebene URI-Alias sicher ist, d.h. es dürfen nur
* die Kleinbuchstaben von a-z, Zahlen, der Bindestrich und das Slash eingegeben werden
*
* @param string $var
* @return boolean
*/
public static function isUriSafe($var)
{
public static function isUriSafe($var) {
return (bool) preg_match('/^([a-z]{1}[a-z\d\-]*(\/[a-z\d\-]+)*)$/', $var);
}
/**
* Gibt in Abhängigkeit des Parameters $mimetype entweder
* den gefundenen MIMETYPE aus oder ob der gefundene MIMETYPE
......@@ -313,15 +314,15 @@ class Validate
}
}
}
/**
* Überprüft, ob eine gültige Zeitzone gewählt wurde
*
* @param string $var
* Die zu überprüfende Variable
* Die zu überprüfende Variable
* @return boolean
*/
public static function timeZone($var)
{
public static function timeZone($var) {
$bool = true;
try {
new \DateTimeZone($var);
......@@ -330,6 +331,7 @@ class Validate
}
return $bool;
}
/**
* Überprüft, ob ein URI-Alias bereits existiert
*
......@@ -337,13 +339,12 @@ class Validate
* @param string $path
* @return boolean
*/
public static function uriAliasExists($alias, $path = '')
{
public static function uriAliasExists($alias, $path = '') {
if (self::isUriSafe($alias)) {
if (is_dir(MODULES_DIR . $alias) === true) {
return true;
} else {
$path.= !preg_match('=/$=', $path) ? '/' : '';
$path.=!preg_match('=/$=', $path) ? '/' : '';
if ($path !== '/' && self::isInternalURI($path) === true) {
return Registry::get('Db')->fetchColumn('SELECT COUNT(*) FROM ' . DB_PRE . 'seo WHERE alias = ? AND uri != ?', array($alias, $path)) > 0 ? true : false;
} elseif (Registry::get('Db')->fetchColumn('SELECT COUNT(*) FROM ' . DB_PRE . 'seo WHERE alias = ?', array($alias)) > 0) {
......@@ -353,4 +354,5 @@ class Validate
}
return false;
}
}
\ No newline at end of file
......@@ -36,7 +36,7 @@ class FeedGenerator extends AbstractRenderer {
$this->renderer->setTitle($this->config['feed_title']);
$this->renderer->setLink($link);
if ($this->config['feed_type'] !== 'ATOM') {
$this->renderer->setDescription(Registry::getClass('Lang')->t($this->config['module'], $this->config['module']));
$this->renderer->setDescription(\ACP3\Core\Registry::get('Lang')->t($this->config['module'], $this->config['module']));
} else {
$this->renderer->setChannelElement('updated', date(DATE_ATOM , time()));
$this->renderer->setChannelElement('author', array('name' => $this->config['feed_title']));
......
<?php
/**
* XML Parser
*
......@@ -16,8 +17,15 @@ namespace ACP3\Core;
* @package ACP3
* @subpackage Core
*/
class XML
{
abstract class XML {
/**
* Cache für bereits ausgelesene XML-Dateien
*
* @var array
*/
private static $info = array();
/**
* Parst die angeforderte XML Datei
*
......@@ -25,12 +33,9 @@ class XML
* @param string $xpath
* @return mixed
*/
public static function parseXmlFile($path, $xpath)
{
static $info = array();
if (!empty($info[$path][$xpath])) {
return $info[$path][$xpath];
public static function parseXmlFile($path, $xpath) {
if (!empty(self::$info[$path][$xpath])) {
return self::$info[$path][$xpath];
} elseif (is_file($path) === true) {
$xml = simplexml_load_file($path);
$data = $xml->xpath($xpath);
......@@ -41,28 +46,29 @@ class XML
if ($value->attributes()) {
foreach ($value->attributes() as $attr_key => $attr_val) {
if ($key === 'version' && $attr_key === 'core' && (string) $attr_val === 'true') {
$info[$path][$xpath]['version'] = CONFIG_VERSION;
self::$info[$path][$xpath]['version'] = CONFIG_VERSION;
} else {
$info[$path][$xpath][(string) $key][(string) $attr_key] = (string) $attr_val;
self::$info[$path][$xpath][(string) $key][(string) $attr_key] = (string) $attr_val;
}
}
} elseif (isset($info[$path][$xpath][(string) $key]) && is_array($info[$path][$xpath][(string) $key])) {
$info[$path][$xpath][(string) $key][] = (string) $value;
} elseif (isset($info[$path][$xpath][(string) $key])) {
$tmp = $info[$path][$xpath][(string) $key];
$info[$path][$xpath][(string) $key] = array();
$info[$path][$xpath][(string) $key][] = $tmp;
$info[$path][$xpath][(string) $key][] = (string) $value;
} elseif (isset(self::$info[$path][$xpath][(string) $key]) && is_array(self::$info[$path][$xpath][(string) $key])) {
self::$info[$path][$xpath][(string) $key][] = (string) $value;
} elseif (isset(self::$info[$path][$xpath][(string) $key])) {
$tmp = self::$info[$path][$xpath][(string) $key];
self::$info[$path][$xpath][(string) $key] = array();
self::$info[$path][$xpath][(string) $key][] = $tmp;
self::$info[$path][$xpath][(string) $key][] = (string) $value;
} else {
$info[$path][$xpath][(string) $key] = (string) $value;
self::$info[$path][$xpath][(string) $key] = (string) $value;
}
}
}
return $info[$path][$xpath];
return self::$info[$path][$xpath];
}
}
return array();
}
/**
* Schreibt Änderungen in die angegebene XML Datei
*
......@@ -71,8 +77,7 @@ class XML
* @param array $data
* @return boolean
*/
public static function writeToXml($path, $xpath, $data)
{
public static function writeToXml($path, $xpath, $data) {
if (is_file($path) === true && is_writable($path) === true && is_array($data) === true) {
$xml = new DOMDocument();
$xml->load($path);
......@@ -86,9 +91,9 @@ class XML
if (array_key_exists($item->nodeName, $data) === true) {
$newitem = $xml->createElement($item->nodeName);
if (empty($data[$item->nodeName]) ||
Validate::isNumber($data[$item->nodeName]) ||
Validate::email($data[$item->nodeName]) ||
preg_match('/^(\w+)$/', $data[$item->nodeName])) {
Validate::isNumber($data[$item->nodeName]) ||
Validate::email($data[$item->nodeName]) ||
preg_match('/^(\w+)$/', $data[$item->nodeName])) {
$newitem_content = $xml->createTextNode($data[$item->nodeName]);
} else {
$newitem_content = $xml->createCDATASection($data[$item->nodeName]);
......@@ -104,4 +109,5 @@ class XML
}
return false;
}
}
\ No newline at end of file
......@@ -8,7 +8,7 @@
namespace ACP3\Installer;
class Installer {
class Application {
/**
* Führt alle nötigen Schritte aus, um die Seite anzuzeigen
......
......@@ -9,7 +9,7 @@ use ACP3\Core;
* @author Tino Goratsch
* @package ACP3 Installer
*/
class Functions {
abstract class Functions {
/**
* Gibt eine Box mit den aufgetretenen Fehlern aus
......@@ -53,50 +53,6 @@ class Functions {
return $result;
}
/**
* Generiert ein gesalzenes Passwort
*
* @param string $salt
* @param string $plaintext
* @param string $algorithm
* @return string
*/
public static function generateSaltedPassword($salt, $plaintext, $algorithm = 'sha1') {
return hash($algorithm, $salt . hash($algorithm, $plaintext));
}
/**
* Liefert ein Array mit allen Zeitzonen dieser Welt aus
*
* @param string $current_value
* @return array
*/
public static function getTimeZones($current_value = '') {
$timeZones = array(
'Africa' => \DateTimeZone::listIdentifiers(\DateTimeZone::AFRICA),
'America' => \DateTimeZone::listIdentifiers(\DateTimeZone::AMERICA),
'Antarctica' => \DateTimeZone::listIdentifiers(\DateTimeZone::ANTARCTICA),
'Arctic' => \DateTimeZone::listIdentifiers(\DateTimeZone::ARCTIC),
'Asia' => \DateTimeZone::listIdentifiers(\DateTimeZone::ASIA),
'Atlantic' => \DateTimeZone::listIdentifiers(\DateTimeZone::ATLANTIC),
'Australia' => \DateTimeZone::listIdentifiers(\DateTimeZone::AUSTRALIA),
'Europe' => \DateTimeZone::listIdentifiers(\DateTimeZone::EUROPE),
'Indian' => \DateTimeZone::listIdentifiers(\DateTimeZone::INDIAN),
'Pacitic' => \DateTimeZone::listIdentifiers(\DateTimeZone::PACIFIC),
'UTC' => \DateTimeZone::listIdentifiers(\DateTimeZone::UTC),
);
foreach ($timeZones as $key => $values) {
$i = 0;
foreach ($values as $row) {
unset($timeZones[$key][$i]);
$timeZones[$key][$row]['selected'] = Core\Functions::selectEntry('date_time_zone', $row, $current_value);
++$i;
}
}
return $timeZones;
}
/**
* Führt die Installationsanweisungen des jeweiligen Moduls durch
*
......@@ -110,7 +66,7 @@ class Functions {
$path = MODULES_DIR . $module . '/' . $module . 'Installer.php';
if (is_file($path) === true) {
$className = Core\ModuleInstaller::buildClassName($module);
$install = new $className(\ACP3\Installer\Installer::$injector);
$install = new $className();
if ($install instanceof \ACP3\Core\ModuleInstaller) {
$bool = $install->install();
}
......@@ -145,30 +101,11 @@ class Functions {
return $languages;
}
/**
* Liefert ein Array zur Ausgabe als Dropdown-Menü
* für die Anzahl der anzuzeigenden Datensätze je Seite
*
* @param integer $current_value
* @param integer $steps
* @param integer $max_value
* @return array
*/
public static function recordsPerPage($current_value, $steps = 5, $max_value = 50) {
// Einträge pro Seite
$records = array();
for ($i = 0, $j = $steps; $j <= $max_value; $i++, $j+= $steps) {
$records[$i]['value'] = $j;
$records[$i]['selected'] = Core\Functions::selectEntry('entries', $j, $current_value);
}
return $records;
}
/**
* Setzt die Ressourcen-Tabelle auf die Standardwerte zurück
*/
public static function resetResources($mode = 1) {
\ACP3\Installer\Installer::$injector['Db']->executeUpdate('TRUNCATE TABLE ' . DB_PRE . 'acl_resources');
\ACP3\Core\Registry::get('Db')->executeUpdate('TRUNCATE TABLE ' . DB_PRE . 'acl_resources');
// Moduldaten in die ACL schreiben
$modules = scandir(MODULES_DIR);
......@@ -176,33 +113,12 @@ class Functions {
$path = MODULES_DIR . $module . '/' . $module . 'Installer.php';
if ($module !== '.' && $module !== '..' && is_file($path) === true) {
$className = \ACP3\Core\ModuleInstaller::buildClassName($module);
$install = new $className(\ACP3\Installer\Installer::$injector);
$install = new $className();
$install->addResources($mode);
}
}
}
/**
* Generiert einen Zufallsstring beliebiger Länge
*
* @param integer $str_length
* Länge des zufälligen Strings
* @return string
*/
public static function salt($str_length) {
$salt = '';
$chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
$c_chars = strlen($chars) - 1;
while (strlen($salt) < $str_length) {
$char = $chars[mt_rand(0, $c_chars)];
// Zeichen nur hinzufügen, wenn sich dieses nicht bereits im Salz befindet
if (strpos($salt, $char) === false) {
$salt.= $char;
}
}
return $salt;
}
/**
* Führt die Updateanweisungen eines Moduls aus
*
......@@ -257,24 +173,4 @@ class Functions {
}
return false;
}
/**
* Erstellt/Verändert die Konfigurationsdateien für die Module
*
* @param string $module
* @param array $data
* @return boolean
*/
public static function writeSettingsToDb($module, $data)
{
$bool = false;
$mod_id = Core\Registry::get('Db')->fetchColumn('SELECT id FROM ' . DB_PRE . 'modules WHERE name = ?', array($module));