diff --git a/includes/config.plugin.php b/includes/config.plugin.php new file mode 100644 index 0000000..43c4f93 --- /dev/null +++ b/includes/config.plugin.php @@ -0,0 +1,47 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release 4.8.7 + * + * {@internal + * created 2007-08-08 + * modified 2007-12-13, 2008-05-15 + * + * $Id: config.plugin.php 128 2019-07-03 11:58:28Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$plugin_name = "linkchecker"; +$cfg['plugins']['linkchecker'] = $cfg['path']['contenido'] . "plugins/" . $plugin_name . "/"; +$cfg['tab']['whitelist'] = $cfg['sql']['sqlprefix'] . '_pi_linkwhitelist'; + +// Templates +$cfg['templates']['linkchecker_test'] = $cfg['plugins']['linkchecker'] . "templates/standard/template.linkchecker_test.html"; +$cfg['templates']['linkchecker_test_errors'] = $cfg['plugins']['linkchecker'] . "templates/standard/template.linkchecker_test_errors.html"; +$cfg['templates']['linkchecker_test_errors_cat'] = $cfg['plugins']['linkchecker'] . "templates/standard/template.linkchecker_test_errors_cat.html"; +$cfg['templates']['linkchecker_test_nothing'] = $cfg['plugins']['linkchecker'] . "templates/standard/template.linkchecker_test_nothing.html"; +$cfg['templates']['linkchecker_noerrors'] = $cfg['plugins']['linkchecker'] . "templates/standard/template.linkchecker_noerrors.html"; +$cfg['templates']['linkchecker_whitelist'] = $cfg['plugins']['linkchecker'] . "templates/standard/template.linkchecker_whitelist.html"; +$cfg['templates']['linkchecker_whitelist_urls'] = $cfg['plugins']['linkchecker'] . "templates/standard/template.linkchecker_whitelist_urls.html"; +?> \ No newline at end of file diff --git a/includes/include.checkperms.php b/includes/include.checkperms.php new file mode 100644 index 0000000..18488ab --- /dev/null +++ b/includes/include.checkperms.php @@ -0,0 +1,89 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release 4.8.7 + * + * {@internal + * created 2006-06-08 + * modified 2007-11-07, Frederic Schneider, Linkchecker-Edition + * modified 2008-02-08, Andreas Lindner, Performance enhancements + * modified 2008-07-02, Frederic Schneider, add security fix + * + * $Id: include.checkperms.php 128 2019-07-03 11:58:28Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +function cCatPerm($widcat, $db = null) +{ + global $cfg, $sess, $auth, $group_id, $_arrCatIDs_cCP; + + if (strpos($auth->auth['perm'], 'admin') !== FALSE) { + return true; + } + + if (is_null($db) || !is_object($db)) { + $db = new DB_ConLite; + } + + $group_ids = getGroupIDs($db); + $group_ids[] = Contenido_Security::escapeDB($auth->auth['uid'], $db); + + if (!is_array($_arrCatIDs_cCP)) { + $_arrCatIDs_cCP = array(); + + $sql_inc = " user_id='"; + $sql_inc .= implode("' OR user_id='", $group_ids) . "' "; + $sql = "SELECT idcat FROM ".$cfg['tab']['rights']." + WHERE idarea=6 AND idaction=359 AND ($sql_inc)"; + + $db->query($sql); + + while ($db->next_record()) { + $_arrCatIDs_cCP[$db->f('idcat')] = ''; + } + } + + return array_key_exists($widcat, $_arrCatIDs_cCP); +} + +function getGroupIDs(&$db) +{ + global $cfg, $sess, $auth, $group_id, $_arrGroupIDs_gGI; + + if (is_array($_arrGroupIDs_gGI)) { + return $_arrGroupIDs_gGI; + } + + $sql = "SELECT group_id FROM ".$cfg["tab"]["groupmembers"]." WHERE user_id='".Contenido_Security::escapeDB($auth->auth["uid"], $db)."'"; + $db->query($sql); + + $_arrGroupIDs_gGI = array(); + + while ($db->next_record()) + $_arrGroupIDs_gGI[] = $db->f('group_id'); + + return $_arrGroupIDs_gGI; +} + +?> \ No newline at end of file diff --git a/includes/include.linkchecker.php b/includes/include.linkchecker.php new file mode 100644 index 0000000..95ea6b6 --- /dev/null +++ b/includes/include.linkchecker.php @@ -0,0 +1,413 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release 4.8.7 + * + * {@internal + * created 2007-08-08 + * modified 2008-02-08, Andread Lindner, performance enhancements + * modified 2008-04-05, Holger Librenz, fixed wrong include-path for + * PEAR cache module + * modified 2008-05-14, Frederic Schneider, new version + * modified 2008-06-21, Frederic Schneider, array initalization + * modified 2008-07-02, Frederic Schneider, add security fix + * modified 2008-07-07, Frederic Schneider, fixed wrong language var + * + * $Id: include.linkchecker.php 128 2019-07-03 11:58:28Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$plugin_name = "linkchecker"; +global $cfg; + +if(!$perm->have_perm_area_action($plugin_name, $plugin_name) && $cronjob != true) { + exit; +} + +if((int) $client == 0 && $cronjob != true) { + $notification->displayNotification("error", i18n("No Client selected")); + exit; +} + +// If no mode defined, use mode three +if(empty($_GET['mode'])) { + $_GET['mode'] = 3; +} + +// If no action definied +if(empty($_GET['action'])) { + $_GET['action'] = 'linkchecker'; + $action = "linkchecker"; +} + +plugin_include('linkchecker', 'includes/config.plugin.php'); +plugin_include('linkchecker', 'includes/include.checkperms.php'); +plugin_include('linkchecker', 'includes/include.linkchecker_tests.php'); +cInclude('pear', 'PEAR.php'); +cInclude('pear', 'Cache/Lite.php'); + + +// Initialization +$actionID = 500; +$aCats = array(); +$aSearchIDInfosArt = array(); +$aSearchIDInfosCatArt = array(); +$aSearchIDInfosNonID = array(); +$iWhitelist_timeout = 2592000; // 30 days + +// Var initialization +$aUrl = array('cms' => $cfgClient[$client]['path']['htmlpath'], 'contenido' => $cfg['path']['contenido_fullhtml']); + +// Template- and languagevars +if($cronjob != true) { + $tpl->set('s', 'FULLHTML', $aUrl['contenido']); + $tpl->set('s', 'MODE', intval($_GET['mode'])); + $tpl->set('s', 'URL', $aUrl['contenido']); + $tpl->set('s', 'SID', $sess->id); +} + +// Fill Subnav I +$sLink = $sess->url("main.php?area=linkchecker&frame=4&action=linkchecker") . '&mode='; + +// Fill Subnav II +$tpl->set('s', 'INTERNS_HREF', $sLink . '1'); +$tpl->set('s', 'INTERNS_LABEL', i18n("Interns")); +$tpl->set('s', 'EXTERNS_HREF', $sLink . '2'); +$tpl->set('s', 'EXTERNS_LABEL', i18n("Externs")); +$tpl->set('s', 'INTERNS_EXTERNS_HREF', $sLink . '3'); +$tpl->set('s', 'INTERNS_EXTERNS_LABEL', i18n("Intern/extern Links")); + +// Fill Subnav III +$tpl->set('s', 'UPDATE_HREF', $sLink . intval($_GET['mode']) . '&live=1'); + +// Cache options +$aCacheName = array('errors' => $sess->id, 'errorscount' => $aCacheName['errors'] . "ErrorsCountChecked"); +$oCache = new Cache_Lite(array('cacheDir' => $cfgClient[$client]['path']['frontend'] . "cache/", 'caching' => true, 'lifeTime' => 1209600, 'automaticCleaningFactor' => 1)); + +/* ********* +Program code +********* */ + +/* function linksort */ +function linksort($sErrors) { + + if($_GET['sort'] == "nameart") { + + foreach($sErrors as $key => $aRow) { + $aNameart[$key] = $aRow['nameart']; + } + + array_multisort($sErrors, SORT_ASC, SORT_STRING, $aNameart); + + } elseif($_GET['sort'] == "namecat") { + + foreach($sErrors as $key => $aRow) { + $aNamecat[$key] = $aRow['namecat']; + } + + array_multisort($sErrors, SORT_ASC, SORT_STRING, $aNamecat); + + } elseif($_GET['sort'] == "wronglink") { + + foreach($sErrors as $key => $aRow) { + $aWronglink[$key] = $aRow['url']; + } + + array_multisort($sErrors, SORT_ASC, SORT_STRING, $aWronglink); + + } elseif($_GET['sort'] == "error_type") { + + foreach($sErrors as $key => $aRow) { + $aError_type[$key] = $aRow['error_type']; + } + + array_multisort($sErrors, SORT_ASC, SORT_STRING, $aError_type); + + } + + return $sErrors; + +} + +// function url_is_image +function url_is_image($sUrl) { + + if(substr($sUrl, -3, 3) == "gif" + || substr($sUrl, -3, 3) == "jpg" + || substr($sUrl, -4, 4) == "jpeg" + || substr($sUrl, -3, 3) == "png" + || substr($sUrl, -3, 3) == "tif" + || substr($sUrl, -3, 3) == "psd" + || substr($sUrl, -3, 3) == "bmp") { + return true; + } else { + return false; + } + +} + +// function url_is_uri +function url_is_uri($sUrl) { + + if(substr($sUrl, 0, 4) == "file" + || substr($sUrl, 0, 3) == "ftp" + || substr($sUrl, 0, 4) == "http" + || substr($sUrl, 0, 2) == "ww") { + return true; + } else { + return false; + } + +} + +/* Check: Changes after last check? */ +$sql = "SELECT lastmodified FROM " . $cfg['tab']['content'] . " content + LEFT JOIN " . $cfg['tab']['art_lang'] . " art ON (art.idartlang = content.idartlang) + WHERE art.online = '1'"; + +/* Whitelist: Add */ +if(!empty($_GET['whitelist'])) { + $sql = "INSERT INTO " . $cfg['tab']['whitelist'] . " VALUES ('" . Contenido_Security::escapeDB(base64_decode($_GET['whitelist']), $db) . "', '" . time() . "')"; + $db->query($sql); +} + +/* Whitelist: Get */ +$sql = "SELECT url FROM " . $cfg['tab']['whitelist'] . " WHERE lastview < " . (time() + $iWhitelist_timeout) . " + AND lastview > " . (time() - $iWhitelist_timeout); +$db->query($sql); + +$aWhitelist = array(); +while($db->next_record()) { + $aWhitelist[] = $db->f("url"); +} + +/* Get all links */ +// Cache errors +$sCache_errors = $oCache->get($aCacheName['errors'], intval($_GET['mode'])); + +// Search if cache doesn't exist or we're in live mode +if($sCache_errors && $_GET['live'] != 1) { + $aErrors = unserialize($sCache_errors); +} else { // If no cache exists + + // Select all categorys + $sql = "SELECT idcat FROM " . $cfg['tab']['cat'] . " GROUP BY idcat"; + $db->query($sql); + + while($db->next_record()) { + + if($cronjob != true) { // Check userrights, if no cronjob + + $iCheck = cCatPerm($db->f("idcat"), $db2); + + if($iCheck == true) { + $aCats[] = Contenido_Security::toInteger($db->f("idcat")); + } + + } else { + $aCats[] = Contenido_Security::toInteger($db->f("idcat")); + } + + } + + // Use SQL-WHERE if lang is not zero + if($langart != 0) { + $sLang_where = "AND art.idlang = '" . Contenido_Security::toInteger($langart) . "' AND catName.idlang = '" . Contenido_Security::toInteger($langart) . "'"; + } elseif(!isset($langart)) { + $sLang_where = "AND art.idlang = '" . Contenido_Security::toInteger($lang) . "' AND catName.idlang = '" . Contenido_Security::toInteger($lang) . "'"; + } +if(!empty($aCats)) { + // How many articles exists? [Text] + $sql = "SELECT art.title, art.idlang, cat.idart, cat.idcat, catName.name AS namecat, con.value FROM " . $cfg['tab']['cat_art'] . " cat + LEFT JOIN " . $cfg['tab']['art_lang'] . " art ON (art.idart = cat.idart) + LEFT JOIN " . $cfg['tab']['cat_lang'] . " catName ON (catName.idcat = cat.idcat) + LEFT JOIN " . $cfg['tab']['content'] . " con ON (con.idartlang = art.idartlang) + WHERE (con.value LIKE '%action%' OR con.value LIKE '%data%' OR con.value LIKE '%href%' OR con.value LIKE '%src%') + AND cat.idcat IN (0, " . join(", ", $aCats) . ") AND cat.idcat != '0' " . $sLang_where . " + AND art.online = '1' AND art.redirect = '0'"; + $db->query($sql); + + while($db->next_record()) { + + // Text decode + $value = urldecode($db->f("value")); + + // Search the text + searchLinks($value, $db->f("idart"), $db->f("title"), $db->f("idcat"), $db->f("namecat"), $db->f("idlang")); + + // Search front_content.php-links + if($_GET['mode'] != 2) { + searchFrontContentLinks($value, $db->f("idart"), $db->f("title"), $db->f("idcat"), $db->f("namecat")); + } + + } + + // How many articles exists? [Redirects] + $sql = "SELECT art.title, art.redirect_url, art.idlang, cat.idart, cat.idcat, catName.name AS namecat FROM " . $cfg['tab']['cat_art'] . " cat + LEFT JOIN " . $cfg['tab']['art_lang'] . " art ON (art.idart = cat.idart) + LEFT JOIN " . $cfg['tab']['cat_lang'] . " catName ON (catName.idcat = cat.idcat) + WHERE cat.idcat IN (0, " . join(", ", $aCats) . ") AND cat.idcat != '0' " . $sLang_where . " + AND art.online = '1' AND art.redirect = '1'"; + $db->query($sql); + + while($db->next_record()) { + + // Search links + searchLinks($db->f("redirect_url"), $db->f("idart"), $db->f("title"), $db->f("idcat"), $db->f("namecat"), $db->f("idlang"), "Redirect"); + + // Search front_content.php-links + if($_GET['mode'] != 2) { + searchFrontContentLinks($db->f("redirect_url"), $db->f("idart"), $db->f("title"), $db->f("idcat"), $db->f("namecat")); + } + + } + + // Check the links + checkLinks(); + } +} + +/* Analysis of the errors */ +// Templateset +if($cronjob != true) { + $tpl->set('s', 'TITLE', i18n('Link analysis from ', $plugin_name) . strftime(i18n('%Y-%m-%d', $plugin_name), time())); +} + +// If no errors found, say that +if(empty($aErrors) && $cronjob != true) { + $tpl->set('s', 'NO_ERRORS', i18n("No errors were found.", $plugin_name)); + $tpl->generate($cfg['templates']['linkchecker_noerrors']); +} elseif(!empty($aErrors) && $cronjob != true) { + + $tpl->set('s', 'ERRORS_HEADLINE', i18n("Total checked links", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_ARTID', i18n("idart", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_ARTICLE', i18n("Article", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_CATID', i18n("idcat", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_CATNAME', i18n("Category", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_DESCRIPTION', i18n("Description", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_LINK', i18n("Linkerror", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_LINKS_ARTICLES', i18n("Links to articles", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_LINKS_CATEGORYS', i18n("Links to categories", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_LINKS_DOCIMAGES', i18n("Links to documents and images", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_OTHERS', i18n("Links to extern sites and not defined links", $plugin_name)); + $tpl->set('s', 'ERRORS_HEADLINE_WHITELIST', "Whitelist"); + $tpl->set('s', 'ERRORS_HELP_ERRORS', i18n("Wrong links", $plugin_name)); + + // error_output initialization + $aError_output = array('art' => '', 'cat' => '', 'docimages' => '', 'others' => ''); + + foreach($aErrors as $sKey => $aRow) { + + $aRow = linksort($aRow); + + for($i = 0; $i < count($aRow); $i++) { + + $tpl2 = new Template; + $tpl2->reset(); + + $tpl2->set('s', 'ERRORS_ERROR_TYPE', $aRow[$i]['error_type']); + $tpl2->set('s', 'ERRORS_ARTID', $aRow[$i]['idart']); + $tpl2->set('s', 'ERRORS_ARTICLE', $aRow[$i]['nameart']); + $tpl2->set('s', 'ERRORS_ARTICLE_SHORT', substr($aRow[$i]['nameart'], 0, 20) . ((strlen($aRow[$i]['nameart']) > 20) ? ' ...' : '')); + $tpl2->set('s', 'ERRORS_CATID', $aRow[$i]['idcat']); + $tpl2->set('s', 'ERRORS_LINK', $aRow[$i]['url']); + $tpl2->set('s', 'ERRORS_LINK_ENCODE', base64_encode($aRow[$i]['url'])); + $tpl2->set('s', 'ERRORS_LINK_SHORT', substr($aRow[$i]['url'], 0, 55) . ((strlen($aRow[$i]['url']) > 55) ? ' ...' : '')); + $tpl2->set('s', 'ERRORS_CATNAME', $aRow[$i]['namecat']); + $tpl2->set('s', 'ERRORS_CATNAME_SHORT', substr($aRow[$i]['namecat'], 0, 20) . ((strlen($aRow[$i]['namecat']) > 20) ? ' ...' : '')); + $tpl2->set('s', 'MODE', $_GET['mode']); + $tpl2->set('s', 'URL', $aUrl['contenido']); + $tpl2->set('s', 'SID', $sess->id); + + if($aRow[$i]['error_type'] == "unknown") { + $tpl2->set('s', 'ERRORS_ERROR_TYPE_HELP', i18n("Unknown: articles, documents etc. do not exist.", $plugin_name)); + } elseif($aRow[$i]['error_type'] == "offline") { + $tpl2->set('s', 'ERRORS_ERROR_TYPE_HELP', i18n("Offline: article or category is offline.", $plugin_name)); + } elseif($aRow[$i]['error_type'] == "startart") { + $tpl2->set('s', 'ERRORS_ERROR_TYPE_HELP', i18n("Offline: article or category is offline.", $plugin_name)); + } elseif($aRow[$i]['error_type'] == "dbfs") { + $tpl2->set('s', 'ERRORS_ERROR_TYPE_HELP', i18n("dbfs: no matches found in the dbfs database.", $plugin_name)); + } + + if($sKey != "cat") { + $aError_output[$sKey] .= $tpl2->generate($cfg['templates']['linkchecker_test_errors'], 1); + } else { + $aError_output[$sKey] .= $tpl2->generate($cfg['templates']['linkchecker_test_errors_cat'], 1); // special template for idcats + } + + } + + } + + /* Counter */ + if($iCounter = $oCache->get($aCacheName['errorscount'], intval($_GET['mode']))) { // Cache exists? + $iErrors_count_checked = $iCounter; + } else { // Count searched links: idarts + idcats + idcatarts + others + $iErrors_count_checked = count($aSearchIDInfosArt) + count($aSearchIDInfosCat) + count($aSearchIDInfosCatArt) + count($aSearchIDInfosNonID); + } + + // Count errors + foreach($aErrors as $sKey => $aRow) { + $iErrors_counted += count($aErrors[$sKey]); + } + + $tpl->set('s', 'ERRORS_COUNT_CHECKED', $iErrors_count_checked); + $tpl->set('s', 'ERRORS_COUNT_ERRORS', $iErrors_counted); + $tpl->set('s', 'ERRORS_COUNT_ERRORS_PERCENT', round(($iErrors_counted * 100) / $iErrors_count_checked, 2)); + + /* Template output */ + foreach($aError_output as $sKey => $sValue) { + + if(empty($aError_output[$sKey])) { // Errors for this type? + $tpl2->set('s', 'ERRORS_NOTHING', i18n("No errors for this type.", $plugin_name)); + $aError_output[$sKey] = $tpl2->generate($cfg['templates']['linkchecker_test_nothing'], 1); + } + + $tpl->set('s', 'ERRORS_SHOW_' . strtoupper($sKey), $aError_output[$sKey]); + + if(count($aErrors[$sKey]) > 0) { + $tpl->set('s', 'ERRORS_COUNT_ERRORS_' . strtoupper($sKey), '' . count($aErrors[$sKey]) . ''); + } else { + $tpl->set('s', 'ERRORS_COUNT_ERRORS_' . strtoupper($sKey), count($aErrors[$key])); + } + + } + + $tpl->generate($cfg['templates']['linkchecker_test']); + + /* Cache */ + // Remove older cache + $oCache->remove($aCacheName['errors'], intval($_GET['mode'])); + + // Build new cache + $oCache->save(serialize($aErrors), $aCacheName['errors'], intval($_GET['mode'])); + $oCache->save($iErrors_count_checked, $aCacheName['errorscount'], intval($_GET['mode'])); + +} + +// Log +if($cronjob != true) { + $backend->log(0, 0, $client, $lang, $action); +} +?> \ No newline at end of file diff --git a/includes/include.linkchecker_tests.php b/includes/include.linkchecker_tests.php new file mode 100644 index 0000000..459ecff --- /dev/null +++ b/includes/include.linkchecker_tests.php @@ -0,0 +1,316 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release 4.8.7 + * + * {@internal + * created 2008-02-28 + * modified 2008-06-05, Frederic Schneider + * modified 2008-06-26, Frederic Schneider, add security fix + * modified 2009-11-06, Murat Purc, replaced deprecated functions (PHP 5.3 ready) + * modified 2010-01-07, Murat Purc, fixed usage of wrong variable, see [#CON-292] + * modified 2010-11-26, Dominik Ziegler, resetten array with redefinition of empty array instead of unsetting the variable [#CON-369] + * + * $Id: include.linkchecker_tests.php 131 2019-07-07 18:14:22Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +// Checks all links without front_content.php +function checkLinks() { + global $auth, $cfgClient, $client, $cfg, $cronjob, $db, $aErrors, $lang, $langart, $whitelist; + global $aSearchIDInfosArt, $aSearchIDInfosCat, $aSearchIDInfosCatArt, $aSearchIDInfosNonID; + + if(count($aSearchIDInfosArt) > 0) { // Checks idarts + + for($i = 0; $i < count($aSearchIDInfosArt); $i++) { + + if($i == 0) { + $sSearch = Contenido_Security::toInteger($aSearchIDInfosArt[$i]['id']); + } else { + $sSearch .= ", " . Contenido_Security::toInteger($aSearchIDInfosArt[$i]['id']); + } + + } + + // Check articles + $aFind = array(); + $sql = "SELECT idart, online FROM " . $cfg['tab']['art_lang'] . " WHERE idart IN (" . $sSearch . ")"; + $db->query($sql); + + while($db->next_record()) { + $aFind[$db->f("idart")] = array("online" => $db->f("online")); + } + + for($i = 0; $i < count($aSearchIDInfosArt); $i++) { + + if(isset($aFind[$aSearchIDInfosArt[$i]['id']]) && $aFind[$aSearchIDInfosArt[$i]['id']]['online'] == 0) { + $aErrors['art'][] = array_merge($aSearchIDInfosArt[$i], array("error_type" => "offline")); + } elseif(!isset($aFind[$aSearchIDInfosArt[$i]['id']])) { + $aErrors['art'][] = array_merge($aSearchIDInfosArt[$i], array("error_type" => "unknown")); + } + + } + + } + + $int_cnt_aSearchIDInfosCat = 0; + + if(is_countable($aSearchIDInfosCat)) { + $int_cnt_aSearchIDInfosCat = count($aSearchIDInfosCat); + } + + if($int_cnt_aSearchIDInfosCat > 0) { // Checks idcats + + for($i = 0; $i < $int_cnt_aSearchIDInfosCat; $i++) { + + if($i == 0) { + $sSearch = $aSearchIDInfosCat[$i]['id']; + } else { + $sSearch .= ", " . $aSearchIDInfosCat[$i]['id']; + } + + } + + // Check categorys + $aFind = array(); + $sql = "SELECT idcat, startidartlang, visible FROM " . $cfg['tab']['cat_lang'] . " WHERE idcat IN (" . $sSearch . ") AND idlang = '" . Contenido_Security::toInteger($lang) . "'"; + $db->query($sql); + + while($db->next_record()) { + $aFind[$db->f("idcat")] = array("online" => $db->f("visible"), "startidart" => $db->f("startidartlang")); + } + + for($i = 0; $i < count($aSearchIDInfosCat); $i++) { + + if(is_array($aFind[$aSearchIDInfosCat[$i]['id']]) && $aFind[$aSearchIDInfosCat[$i]['id']]['startidart'] == 0) { + $aErrors['cat'][] = array_merge($aSearchIDInfosCat[$i], array("error_type" => "startart")); + } elseif(is_array($aFind[$aSearchIDInfosCat[$i]['id']]) && $aFind[$aSearchIDInfosCat[$i]['id']]['online'] == 0) { + $aErrors['cat'][] = array_merge($aSearchIDInfosCat[$i], array("error_type" => "offline")); + } elseif(!is_array($aFind[$aSearchIDInfosCat[$i]['id']])) { + $aErrors['cat'][] = array_merge($aSearchIDInfosCat[$i], array("error_type" => "unknown")); + } + + if(is_array($aFind[$aSearchIDInfosCat[$i]['id']]) && $aFind[$aSearchIDInfosCat[$i]['id']]['startidart'] != 0) { + + $sql = "SELECT idart FROM " . $cfg['tab']['art_lang'] . " WHERE idartlang = '" . $aFind[$aSearchIDInfosCat[$i]['id']]['startidart'] . "' AND online = '1'"; + $db->query($sql); + + if($db->num_rows() == 0) { + $aErrors['cat'][] = array_merge($aSearchIDInfosCat[$i], array("error_type" => "startart")); + } + + } + + } + + } + + if(count($aSearchIDInfosCatArt) > 0) { // Checks idcatarts + + for($i = 0; $i < count($aSearchIDInfosCatArt); $i++) { + + if($i == 0) { + $sSearch = Contenido_Security::toInteger($aSearchIDInfosCatArt[$i]['id']); + } else { + $sSearch .= ", " . Contenido_Security::toInteger($aSearchIDInfosCatArt[$i]['id']); + } + + } + + // Check articles + $aFind = array(); + $sql = "SELECT idcatart FROM " . $cfg['tab']['cat_art'] . " WHERE idcatart IN (" . $sSearch . ")"; + $db->query($sql); + + while($db->next_record()) { + $aFind[] = $db->f("idcatart"); + } + + for($i = 0; $i < count($aSearchIDInfosCatArt); $i++) { + + if(!in_array($aSearchIDInfosCatArt[$i]['id'], $aFind)) { + $aErrors['art'][] = array_merge($aSearchIDInfosCatArt[$i], array("error_type" => "unknown")); + } + + } + + } + + if(count($aSearchIDInfosNonID) != 0) { // Checks other links (e. g. http, www, dfbs) + + // Select userrights (is the user admin or sysadmin?) + $sql = "SELECT username FROM " . $cfg['tab']['phplib_auth_user_md5'] . " WHERE user_id='" . Contenido_Security::escapeDB($auth->auth['uid'], $db) . "' AND perms LIKE '%admin%'"; + $db->query($sql); + + if($db->num_rows() > 0 || $cronjob == true) { // User is admin when he is or when he run the cronjob + $iAdmin = true; + } + + for($i = 0; $i < count($aSearchIDInfosNonID); $i++) { + + if(url_is_uri($aSearchIDInfosNonID[$i]['url'])) { + + if(substr($aSearchIDInfosNonID[$i]['url'], 0, strlen($aSearchIDInfosNonID[$i]['url'])) == $cfgClient[$client]['path']['htmlpath']) { + $iPing = @file_exists(str_replace($cfgClient[$client]['path']['htmlpath'], $cfgClient[$client]['path']['frontend'], $aSearchIDInfosNonID[$i]['url'])); + } else { + $iPing = @fopen($aSearchIDInfosNonID[$i]['url'], 'r'); + } + + if(!$iPing) { + + if(url_is_image($aSearchIDInfosNonID[$i]['url'])) { + $aErrors['docimages'][] = array_merge($aSearchIDInfosNonID[$i], array("error_type" => "unknown")); + } else { + $aErrors['others'][] = array_merge($aSearchIDInfosNonID[$i], array("error_type" => "unknown")); + } + + } + + } elseif(substr($aSearchIDInfosNonID[$i]['url'], strlen($aSearchIDInfosNonID[$i]['url'])-5, 5) == ".html") { + + $iPing = @file_exists($cfgClient[$client]['path']['htmlpath'] . $aSearchIDInfosNonID[$i]['url']); + + if(!$iPing) { + $aErrors['art'][] = array_merge($aSearchIDInfosNonID[$i], array("error_type" => "unknown")); + } + + } elseif(substr($aSearchIDInfosNonID[$i]['url'], 0, 20) == "dbfs.php?file=dbfs:/") { + + $sDBurl = substr($aSearchIDInfosNonID[$i]['url'], 20, strlen($aSearchIDInfosNonID[$i]['url'])); + + $iPos = strrpos($sDBurl, '/'); + $sDirname = substr($sDBurl, 0, $iPos); + $sFilename = substr($sDBurl, $iPos + 1); + + // Check categorys + $sql = "SELECT iddbfs FROM " . $cfg['tab']['dbfs'] . " WHERE dirname IN('" . $sDirname . "', '" . clHtmlEntityDecode($sDirname) . "', '" . urldecode($sDirname) . "') AND filename = '" . $sFilename . "'"; + $db->query($sql); + + if($db->num_rows() == 0) { + $aErrors['docimages'][] = array_merge($aSearchIDInfosNonID[$i], array("error_type" => "dbfs")); + } + + } else { + + if(!file_exists($cfgClient[$client]['path']['frontend'] . $aSearchIDInfosNonID[$i]['url'])) { + + if(url_is_image($aSearchIDInfosNonID[$i]['url'])) { + $aErrors['docimages'][] = array_merge($aSearchIDInfosNonID[$i], array("error_type" => "unknown")); + } else { + $aErrors['others'][] = array_merge($aSearchIDInfosNonID[$i], array("error_type" => "unknown")); + } + + } + + } + + } + + } + + return $aErrors; + +} + +// Searchs front_content.php-links +function searchFrontContentLinks($sValue, $iArt, $sArt, $iCat, $sCat) { + global $aSearchIDInfosArt, $aSearchIDInfosCat, $aSearchIDInfosCatArt, $aWhitelist; + + // detect urls with parameter idart + $matches = array(); + if (preg_match_all('/(?!file|ftp|http|ww)front_content.php\?idart=([0-9]*)/i', $sValue, $matches)) { + for ($i = 0; $i < count($matches[0]); $i++) { + if (!in_array($matches[0][$i], $aWhitelist)) { + $aSearchIDInfosArt[] = array( + "id" => $matches[1][$i], "url" => $matches[0][$i], "idart" => $iArt, "nameart" => $sArt, "idcat" => $iCat, "namecat" => $sCat, "urltype" => "intern" + ); + } + } + } + + // detect urls with parameter idcat + $matches = array(); + if (preg_match_all('/(?!file|ftp|http|ww)front_content.php\?idcat=([0-9]*)/i', $sValue, $matches)) { + for ($i = 0; $i < count($matches[0]); $i++) { + if (!in_array($matches[0][$i], $aWhitelist)) { + $aSearchIDInfosCat[] = array( + "id" => $matches[1][$i], "url" => $matches[0][$i], "idart" => $iArt, "nameart" => $sArt, "idcat" => $iCat, "namecat" => $sCat, "urltype" => "intern" + ); + } + } + } + + // detect urls with parameter idcatart + $matches = array(); + if (preg_match_all('/(?!file|ftp|http|ww)front_content.php\?idcatart=([0-9]*)/i', $sValue, $matches)) { // idcatart + for ($i = 0; $i < count($matches[0]); $i++) { + if (!in_array($matches[0][$i], $aWhitelist)) { + $aSearchIDInfosCatArt[] = array( + "id" => $matches[1][$i], "url" => $matches[0][$i], "idart" => $iArt, "nameart" => $sArt, "idcat" => $iCat, "namecat" => $sCat, "urltype" => "intern" + ); + } + } + } +} + +// Searchs extern and intern links +function searchLinks($sValue, $iArt, $sArt, $iCat, $sCat, $iLang, $sFromtype = "") { + global $aUrl, $aSearchIDInfosNonID, $aWhitelist; + + // Extern URL + if(preg_match_all('~(?:(?:action|data|href|src)=["\']((?:file|ftp|http|ww)[^\s]*)["\'])~i', $sValue, $aMatches) && $_GET['mode'] != 1) { + + for($i = 0; $i < count($aMatches[1]); $i++) { + + if(!in_array($aMatches[1][$i], $aWhitelist)) { + $aSearchIDInfosNonID[] = array("url" => $aMatches[1][$i], "idart" => $iArt, "nameart" => $sArt, "idcat" => $iCat, "namecat" => $sCat, "lang" => $iLang, "urltype" => "extern"); + } + + } + + } + + // Redirect + if($sFromtype == "Redirect" && (preg_match('!(' . preg_quote($aUrl['cms']) . '[^\s]*)!i', $sValue, $aMatches) + || (preg_match('~(?:file|ftp|http|ww)[^\s]*~i', $sValue, $aMatches) && $_GET['mode'] != 1)) + && (stripos($sValue, 'front_content.php') === false) + && !in_array($aMatches[0], $aWhitelist)) { + $aSearchIDInfosNonID[] = array("url" => $aMatches[0], "idart" => $iArt, "nameart" => $sArt, "idcat" => $iCat, "namecat" => $sCat, "lang" => $iLang, "urltype" => "unknown"); + } + + // Intern URL + if(preg_match_all('~(?:(?:action|data|href|src)=["\'])(?!file://)(?!ftp://)(?!http://)(?!https://)(?!ww)(?!mailto)(?!\#)(?!/\#)([^"\']+)(?:["\'])~i', $sValue, $aMatches) && $_GET['mode'] != 2) { + + for($i = 0; $i < count($aMatches[1]); $i++) { + + if(strpos($aMatches[1][$i], "front_content.php") === false && !in_array($aMatches[1][$i], $aWhitelist)) { + $aSearchIDInfosNonID[] = array("url" => $aMatches[1][$i], "idart" => $iArt, "nameart" => $sArt, "idcat" => $iCat, "namecat" => $sCat, "lang" => $iLang, "urltype" => "intern"); + } + + } + + } + +} +?> \ No newline at end of file diff --git a/includes/include.linkchecker_whitelist.php b/includes/include.linkchecker_whitelist.php new file mode 100644 index 0000000..0a10d5d --- /dev/null +++ b/includes/include.linkchecker_whitelist.php @@ -0,0 +1,85 @@ + + * @license http://www.contenido.org/license/LIZENZ.txt + * @link http://www.4fb.de + * @link http://www.contenido.org + * @since file available since contenido release 4.8.7 + * + * {@internal + * created 2007-11-02 + * modified 2007-12-13, 2008-05-09, 2008-05-15, Frederic Schneider + * modified 2008-06-02, Frederic Schneider, add security fix + * + * $Id: include.linkchecker_whitelist.php 128 2019-07-03 11:58:28Z oldperl $: + * }} + * + */ + +if(!defined('CON_FRAMEWORK')) { + die('Illegal call'); +} + +$plugin_name = "linkchecker"; +$iWhitelist_timeout = 2592000; // 30 days +global $perm; + +if(!$perm->have_perm_area_action($plugin_name, $plugin_name)) { + exit; +} + +// Template-definition +$tpl->set('s', 'CONTENIDO_URL', $cfg['path']['contenido_fullhtml']); +$tpl->set('s', 'SID', $sess->id); + +/* Whitelist: Delete */ +if(!empty($_GET['url_to_delete'])) { + $sql = "DELETE FROM " . $cfg['tab']['whitelist'] . " WHERE url = '" . Contenido_Security::escapeDB(base64_decode($_GET['url_to_delete']), $db) . "'"; + $db->query($sql); +} + +// Get whitelist +$sql = "SELECT url, lastview FROM " . $cfg['tab']['whitelist'] . " WHERE lastview < " . (time() + $iWhitelist_timeout) . " + AND lastview > " . (time() - $iWhitelist_timeout) . " ORDER BY lastview DESC"; +$db->query($sql); + +while($db->next_record()) { + + $tpl2 = new Template; + $tpl2->reset(); + + $tpl2->set('s', 'CONTENIDO_URL', $cfg['path']['contenido_fullhtml']); + $tpl2->set('s', 'SID', $sess->id); + $tpl2->set('s', 'URL', $db->f("url")); + $tpl2->set('s', 'URL_ENCODE', base64_encode($db->f("url"))); + $tpl2->set('s', 'ENTRY', strftime(i18n('%Y-%m-%d, %I:%M%S %p', $plugin_name), $db->f("lastview"))); + + $aWhitelist .= $tpl2->generate($cfg['templates']['linkchecker_whitelist_urls'], 1); + +} + +// Template- and languagevars +$tpl->set('s', 'HEADLINE', i18n("Links at whitelist", $plugin_name)); +$tpl->set('s', 'HEADLINE_DELETE', i18n("Delete", $plugin_name)); +$tpl->set('s', 'HEADLINE_ENTRY', i18n("Entry", $plugin_name)); +$tpl->set('s', 'HEADLINE_URLS', i18n("URLs", $plugin_name)); +$tpl->set('s', 'HELP', i18n("This links are on the whitelist. Whitelist-links won't be check at linkchecker.", $plugin_name)); +$tpl->set('s', 'TITLE', "Whitelist"); +$tpl->set('s', 'WHITELIST', $aWhitelist); +$tpl->set('s', 'WHITELIST_COUNT', $db->num_rows()); + +$tpl->generate($cfg['templates']['linkchecker_whitelist']); +?> \ No newline at end of file diff --git a/locale/de_DE/LC_MESSAGES/linkchecker.mo b/locale/de_DE/LC_MESSAGES/linkchecker.mo new file mode 100644 index 0000000..de8ef81 Binary files /dev/null and b/locale/de_DE/LC_MESSAGES/linkchecker.mo differ diff --git a/locale/de_DE/LC_MESSAGES/linkchecker.po b/locale/de_DE/LC_MESSAGES/linkchecker.po new file mode 100644 index 0000000..93aaaaf --- /dev/null +++ b/locale/de_DE/LC_MESSAGES/linkchecker.po @@ -0,0 +1,122 @@ +msgid "" +msgstr "" +"Project-Id-Version: Contenido Linkchecker\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2008-02-27 10:16+0100\n" +"Last-Translator: Frederic Schneider \n" +"Language-Team: Frederic Schneider \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-Basepath: H:\\frederic.schneider\\\n" +"X-Poedit-KeywordsList: i18n\n" +"X-Poedit-SearchPath-0: H:\\frederic.schneider\\contenido\\plugins\\linkchecker\\includes\n" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:196 +#, fuzzy +msgid "Link analysis from " +msgstr "Link-Analyse vom " + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:196 +msgid "%Y-%m-%d" +msgstr "%d.%m.%Y" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_tests.php:42 +msgid "No errors were found." +msgstr "Es wurden keine Fehler gefunden." + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:227 +#, fuzzy +msgid "Total checked links" +msgstr "Insgesamt geprüfte Links" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_tests.php:24 +msgid "idart" +msgstr "idart" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_tests.php:30 +msgid "Article" +msgstr "Artikel" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_tests.php:26 +msgid "idcat" +msgstr "idcat" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_tests.php:31 +msgid "Category" +msgstr "Kategorie" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:47 +msgid "Description" +msgstr "Beschreibung" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_tests.php:31 +msgid "Linkerror" +msgstr "Linkfehler" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_whitelist.php:40 +msgid "Links to articles" +msgstr "Links auf Artikel" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_whitelist.php:40 +msgid "Links to categories" +msgstr "Links auf Kategorien" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:51 +msgid "Links to documents and images" +msgstr "Links auf Bilder und Dokumente" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:237 +#, fuzzy +msgid "Links to extern sites and not defined links" +msgstr "Links auf externe Quellen und nicht zugewiesene Links" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_tests.php:46 +msgid "Wrong links" +msgstr "Fehlerhafte Links" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:271 +msgid "Unknown: articles, documents etc. do not exist." +msgstr "Unknown: Artikel, Dokumente et cetera existieren nicht." + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:273 +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:275 +msgid "Offline: article or category is offline." +msgstr "Offline: Artikel oder Kategorie ist offline." + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:277 +msgid "dbfs: no matches found in the dbfs database." +msgstr "dbfs: In der dbfs-Datenbank ist die gesuchte Datei nicht vorhanden." + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_tests.php:67 +msgid "No errors for this type." +msgstr "Es wurden für diesen Linktyp keine Fehler gefunden." + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker.php:196 +msgid "%Y-%m-%d, %I:%M%S %p" +msgstr "%d.%m.%Y, %H:%M:%S" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_whitelist.php:40 +msgid "Links at whitelist" +msgstr "Links auf der weißen Liste" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_whitelist.php:41 +msgid "Delete" +msgstr "Entfernen" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_whitelist.php:42 +msgid "Entry" +msgstr "Eintragung" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_whitelist.php:43 +msgid "URLs" +msgstr "Links" + +# H:\frederic.schneider\contenido\plugins\linkchecker\includes/include.linkchecker_whitelist.php:45 +msgid "This links are on the whitelist. Whitelist-links won't be check at linkchecker." +msgstr "Diese Links befinden sich auf der weißen Liste und werden nicht vom Linkchecker überprüft." + +msgid "View whitelist" +msgstr "Whitelist anzeigen" \ No newline at end of file diff --git a/locale/linkchecker.pot b/locale/linkchecker.pot new file mode 100644 index 0000000..e32cbd6 --- /dev/null +++ b/locale/linkchecker.pot @@ -0,0 +1,135 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-05-18 10:59+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: includes/include.linkchecker.php:49 +msgid "No Client selected" +msgstr "" + +#: includes/include.linkchecker.php:95 +msgid "Interns" +msgstr "" + +#: includes/include.linkchecker.php:97 +msgid "Externs" +msgstr "" + +#: includes/include.linkchecker.php:99 +msgid "Intern/extern Links" +msgstr "" + +#: includes/include.linkchecker.php:294 +msgid "Link analysis from " +msgstr "" + +#: includes/include.linkchecker.php:294 +msgid "%Y-%m-%d" +msgstr "" + +#: includes/include.linkchecker.php:299 +msgid "No errors were found." +msgstr "" + +#: includes/include.linkchecker.php:303 +msgid "Total checked links" +msgstr "" + +#: includes/include.linkchecker.php:304 +msgid "idart" +msgstr "" + +#: includes/include.linkchecker.php:305 +msgid "Article" +msgstr "" + +#: includes/include.linkchecker.php:306 +msgid "idcat" +msgstr "" + +#: includes/include.linkchecker.php:307 +msgid "Category" +msgstr "" + +#: includes/include.linkchecker.php:308 +msgid "Description" +msgstr "" + +#: includes/include.linkchecker.php:309 +msgid "Linkerror" +msgstr "" + +#: includes/include.linkchecker.php:310 +msgid "Links to articles" +msgstr "" + +#: includes/include.linkchecker.php:311 +msgid "Links to categories" +msgstr "" + +#: includes/include.linkchecker.php:312 +msgid "Links to documents and images" +msgstr "" + +#: includes/include.linkchecker.php:313 +msgid "Links to extern sites and not defined links" +msgstr "" + +#: includes/include.linkchecker.php:315 +msgid "Wrong links" +msgstr "" + +#: includes/include.linkchecker.php:344 +msgid "Unknown: articles, documents etc. do not exist." +msgstr "" + +#: includes/include.linkchecker.php:346 includes/include.linkchecker.php:348 +msgid "Offline: article or category is offline." +msgstr "" + +#: includes/include.linkchecker.php:350 +msgid "dbfs: no matches found in the dbfs database." +msgstr "" + +#: includes/include.linkchecker.php:383 +msgid "No errors for this type." +msgstr "" + +#: includes/include.linkchecker_whitelist.php:68 +msgid "%Y-%m-%d, %I:%M%S %p" +msgstr "" + +#: includes/include.linkchecker_whitelist.php:75 +msgid "Links at whitelist" +msgstr "" + +#: includes/include.linkchecker_whitelist.php:76 +msgid "Delete" +msgstr "" + +#: includes/include.linkchecker_whitelist.php:77 +msgid "Entry" +msgstr "" + +#: includes/include.linkchecker_whitelist.php:78 +msgid "URLs" +msgstr "" + +#: includes/include.linkchecker_whitelist.php:79 +msgid "" +"This links are on the whitelist. Whitelist-links won't be check at " +"linkchecker." +msgstr "" diff --git a/locale/potfiles.txt b/locale/potfiles.txt new file mode 100644 index 0000000..cc38e42 --- /dev/null +++ b/locale/potfiles.txt @@ -0,0 +1,12 @@ +./includes/include.checkperms.php +./includes/include.linkchecker.php +./includes/config.plugin.php +./includes/include.linkchecker_tests.php +./includes/include.linkchecker_whitelist.php +./templates/standard/template.linkchecker_test_errors_cat.html +./templates/standard/template.linkchecker_whitelist.html +./templates/standard/template.linkchecker_noerrors.html +./templates/standard/template.linkchecker_test_errors.html +./templates/standard/template.linkchecker_test.html +./templates/standard/template.linkchecker_test_nothing.html +./templates/standard/template.linkchecker_whitelist_urls.html diff --git a/templates/standard/template.linkchecker_noerrors.html b/templates/standard/template.linkchecker_noerrors.html new file mode 100644 index 0000000..82f29dc --- /dev/null +++ b/templates/standard/template.linkchecker_noerrors.html @@ -0,0 +1,36 @@ + + + +Linkchecker + + + + + + + + + +
+ {INTERNS_LABEL} + {EXTERNS_LABEL} + {INTERNS_EXTERNS_LABEL} +
+ +
+ + + + + + + + + + + +

{TITLE}

+ i18n('Refresh') + i18n('Refresh') +
{NO_ERRORS}
+ \ No newline at end of file diff --git a/templates/standard/template.linkchecker_test.html b/templates/standard/template.linkchecker_test.html new file mode 100644 index 0000000..c34d0d8 --- /dev/null +++ b/templates/standard/template.linkchecker_test.html @@ -0,0 +1,202 @@ + + + + Linkchecker + + + + + + + + + + + + + + + + + + + + + + +
+ {INTERNS_LABEL} + {EXTERNS_LABEL} + {INTERNS_EXTERNS_LABEL} +
+ +
+ + + + + + + + +

{TITLE}

+ i18n('Refresh') + i18n('Refresh') +
+ + + + + + +
{ERRORS_HEADLINE}:{ERRORS_COUNT_CHECKED} + {ERRORS_HELP_ERRORS}: {ERRORS_COUNT_ERRORS} ({ERRORS_COUNT_ERRORS_PERCENT} %)
+ + +
+ + + + + + + + + + +
{ERRORS_HEADLINE_ARTICLE} (ID){ERRORS_HEADLINE_CATNAME} (ID){ERRORS_HEADLINE_LINK}{ERRORS_HEADLINE_DESCRIPTION}{ERRORS_HEADLINE_WHITELIST}
+ + +
+ + + + + +
+ + + + + + +
+ {ERRORS_HEADLINE_LINKS_ARTICLES} ({ERRORS_COUNT_ERRORS_ART}) + + +
+ + +
+ + + + + +
+ + + + + + +
+ {ERRORS_HEADLINE_LINKS_DOCIMAGES} ({ERRORS_COUNT_ERRORS_DOCIMAGES}) + + +
+ + +
+ + + + + +
+ + + + + + +
+ {ERRORS_HEADLINE_OTHERS} ({ERRORS_COUNT_ERRORS_OTHERS}) + + +
+ + +
+ + + + + + + + + + +
{ERRORS_HEADLINE_CATNAME} (ID){ERRORS_HEADLINE_ARTICLE} (ID){ERRORS_HEADLINE_LINK}{ERRORS_HEADLINE_DESCRIPTION}{ERRORS_HEADLINE_WHITELIST}
+ + + + + +
+ + + + + + +
+ {ERRORS_HEADLINE_LINKS_CATEGORYS} ({ERRORS_COUNT_ERRORS_CAT}) + + +
+ + +
+ + + + + \ No newline at end of file diff --git a/templates/standard/template.linkchecker_test_errors.html b/templates/standard/template.linkchecker_test_errors.html new file mode 100644 index 0000000..68ba173 --- /dev/null +++ b/templates/standard/template.linkchecker_test_errors.html @@ -0,0 +1,7 @@ + + {ERRORS_ARTICLE_SHORT} ({ERRORS_ARTID}) + {ERRORS_CATNAME_SHORT} ({ERRORS_CATID}) + {ERRORS_LINK_SHORT} + {ERRORS_ERROR_TYPE} + + \ No newline at end of file diff --git a/templates/standard/template.linkchecker_test_errors_cat.html b/templates/standard/template.linkchecker_test_errors_cat.html new file mode 100644 index 0000000..1053ab0 --- /dev/null +++ b/templates/standard/template.linkchecker_test_errors_cat.html @@ -0,0 +1,7 @@ + + {ERRORS_CATNAME_SHORT} ({ERRORS_CATID}) + {ERRORS_ARTICLE_SHORT} ({ERRORS_ARTID}) + {ERRORS_LINK_SHORT} + {ERRORS_ERROR_TYPE} + + \ No newline at end of file diff --git a/templates/standard/template.linkchecker_test_nothing.html b/templates/standard/template.linkchecker_test_nothing.html new file mode 100644 index 0000000..d04af58 --- /dev/null +++ b/templates/standard/template.linkchecker_test_nothing.html @@ -0,0 +1,3 @@ + + {ERRORS_NOTHING} + \ No newline at end of file diff --git a/templates/standard/template.linkchecker_whitelist.html b/templates/standard/template.linkchecker_whitelist.html new file mode 100644 index 0000000..5709541 --- /dev/null +++ b/templates/standard/template.linkchecker_whitelist.html @@ -0,0 +1,51 @@ + + + + Linkchecker + + + + + + + + + + + + + + + + +

{TITLE}

{HELP}
+ +
+ + + + + + + + + +
{HEADLINE_URLS} ({WHITELIST_COUNT}){HEADLINE_ENTRY}{HEADLINE_DELETE}
+ +
+ + + + {WHITELIST} + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/templates/standard/template.linkchecker_whitelist_urls.html b/templates/standard/template.linkchecker_whitelist_urls.html new file mode 100644 index 0000000..03b2aec --- /dev/null +++ b/templates/standard/template.linkchecker_whitelist_urls.html @@ -0,0 +1,5 @@ + + {URL} + {ENTRY} + + \ No newline at end of file diff --git a/xml/lang_de_DE.xml b/xml/lang_de_DE.xml new file mode 100644 index 0000000..6ccba5f --- /dev/null +++ b/xml/lang_de_DE.xml @@ -0,0 +1,14 @@ + + + + + + +
Linkchecker
+ Linkanalyse + Whitelist + Übersicht +
+
+
+
\ No newline at end of file diff --git a/xml/lang_en_EN.xml b/xml/lang_en_EN.xml new file mode 100644 index 0000000..ff33301 --- /dev/null +++ b/xml/lang_en_EN.xml @@ -0,0 +1,14 @@ + + + + + + +
Linkchecker
+ Link Analysis + Whitelist + Overview +
+
+
+
\ No newline at end of file diff --git a/xml/lang_en_US.xml b/xml/lang_en_US.xml new file mode 100644 index 0000000..ff33301 --- /dev/null +++ b/xml/lang_en_US.xml @@ -0,0 +1,14 @@ + + + + + + +
Linkchecker
+ Link Analysis + Whitelist + Overview +
+
+
+
\ No newline at end of file