2017-05-22 20:28:26 +02:00
|
|
|
|
<?php
|
2011-12-13 12:29:05 +01:00
|
|
|
|
|
|
|
|
|
if (IN_serendipity !== true) {
|
|
|
|
|
die ("Don't hack!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Probe for a language include with constants. Still include defines later on, if some constants were missing
|
|
|
|
|
$probelang = dirname(__FILE__) . '/' . $serendipity['charset'] . 'lang_' . $serendipity['lang'] . '.inc.php';
|
|
|
|
|
if (file_exists($probelang)) {
|
|
|
|
|
include $probelang;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
include dirname(__FILE__) . '/lang_en.inc.php';
|
|
|
|
|
|
2018-03-30 12:01:41 +02:00
|
|
|
|
define('DJO_VERSION', '1.8.3');
|
2017-05-22 20:28:26 +02:00
|
|
|
|
define('CACHE_VORHALT', 4); # (Tage) Wann ein vernetzter Text aus dem Cache entfernt und neu vernetzt werden soll
|
|
|
|
|
|
2011-12-13 12:29:05 +01:00
|
|
|
|
class serendipity_event_dejure extends serendipity_event
|
|
|
|
|
{
|
|
|
|
|
function introspect(&$propbag) {
|
|
|
|
|
global $serendipity;
|
|
|
|
|
|
|
|
|
|
$propbag->add('name', DEJURE_TITLE);
|
|
|
|
|
$propbag->add('description', DEJURE_DESCRIPTION);
|
2018-03-26 23:18:31 +02:00
|
|
|
|
$propbag->add('author', 'Garvin Hicking, dejure.org, Thomas Hochstein');
|
2017-05-27 19:51:08 +02:00
|
|
|
|
$propbag->add('version', DJO_VERSION);
|
2011-12-13 12:29:05 +01:00
|
|
|
|
$propbag->add('stackable', false);
|
|
|
|
|
$propbag->add('groups', array('FRONTEND_EXTERNAL_SERVICES'));
|
|
|
|
|
|
|
|
|
|
$propbag->add('event_hooks',
|
|
|
|
|
array(
|
|
|
|
|
'frontend_display' => true,
|
|
|
|
|
'genpage' => true,
|
|
|
|
|
'frontend_footer' => true
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$propbag->add('requirements',
|
|
|
|
|
array(
|
|
|
|
|
'serendipity' => '0.8',
|
|
|
|
|
'smarty' => '2.6.7',
|
2018-03-30 12:15:49 +02:00
|
|
|
|
'php' => '4.3.0'
|
2011-12-13 12:29:05 +01:00
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$propbag->add('configuration',
|
|
|
|
|
array(
|
|
|
|
|
'mail',
|
|
|
|
|
'newsletter',
|
|
|
|
|
'target',
|
|
|
|
|
'css',
|
2017-05-22 20:28:26 +02:00
|
|
|
|
'linkstyle',
|
2017-05-30 11:05:35 +02:00
|
|
|
|
'noheadings',
|
|
|
|
|
'buzer',
|
2017-05-22 20:28:26 +02:00
|
|
|
|
'cache'
|
2011-12-13 12:29:05 +01:00
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function introspect_config_item($name, &$propbag) {
|
|
|
|
|
global $serendipity;
|
|
|
|
|
|
|
|
|
|
switch ($name) {
|
|
|
|
|
case 'mail':
|
|
|
|
|
$propbag->add('type', 'string');
|
|
|
|
|
$propbag->add('name', DEJURE_MAIL);
|
|
|
|
|
$propbag->add('description', DEJURE_MAIL_DESC);
|
|
|
|
|
$propbag->add('default', $serendipity['serendipityEmail']);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'newsletter':
|
|
|
|
|
$propbag->add('type', 'boolean');
|
|
|
|
|
$propbag->add('name', DEJURE_NEWSLETTER);
|
|
|
|
|
$propbag->add('description', DEJURE_NEWSLETTER_DESC);
|
|
|
|
|
$propbag->add('default', true);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'target':
|
|
|
|
|
$propbag->add('type', 'string');
|
|
|
|
|
$propbag->add('name', DEJURE_TARGET);
|
|
|
|
|
$propbag->add('description', DEJURE_TARGET_DESC);
|
|
|
|
|
$propbag->add('default', '');
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'css':
|
|
|
|
|
$propbag->add('type', 'string');
|
|
|
|
|
$propbag->add('name', DEJURE_CSS);
|
|
|
|
|
$propbag->add('description', DEJURE_CSS_DESC);
|
|
|
|
|
$propbag->add('default', '');
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'linkstyle':
|
|
|
|
|
$propbag->add('type', 'radio');
|
|
|
|
|
$propbag->add('name', DEJURE_LINKSTYLE);
|
|
|
|
|
$propbag->add('description', DEJURE_LINKSTYLE_DESC);
|
|
|
|
|
$propbag->add('radio', array(
|
|
|
|
|
'value' => array('schmal', 'weit'),
|
|
|
|
|
'desc' => array(DEJURE_LINKSTYLE_SHORT, DEJURE_LINKSTYLE_WIDE)
|
|
|
|
|
));
|
|
|
|
|
$propbag->add('default', 'schmal');
|
|
|
|
|
$propbag->add('radio_per_row', 1);
|
|
|
|
|
break;
|
|
|
|
|
|
2017-05-30 11:05:35 +02:00
|
|
|
|
case 'noheadings':
|
|
|
|
|
$propbag->add('type', 'boolean');
|
|
|
|
|
$propbag->add('name', DEJURE_NOHEADINGS);
|
|
|
|
|
$propbag->add('description', DEJURE_NOHEADINGS_DESC);
|
|
|
|
|
$propbag->add('default', false);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'buzer':
|
|
|
|
|
$propbag->add('type', 'boolean');
|
|
|
|
|
$propbag->add('name', DEJURE_BUZER);
|
|
|
|
|
$propbag->add('description', DEJURE_BUZER_DESC);
|
|
|
|
|
$propbag->add('default', true);
|
|
|
|
|
break;
|
|
|
|
|
|
2017-05-22 20:28:26 +02:00
|
|
|
|
case 'cache':
|
|
|
|
|
$propbag->add('type', 'boolean');
|
|
|
|
|
$propbag->add('name', DEJURE_CACHE);
|
|
|
|
|
$propbag->add('description', DEJURE_CACHE_DESC);
|
|
|
|
|
$propbag->add('default', false);
|
|
|
|
|
break;
|
|
|
|
|
|
2011-12-13 12:29:05 +01:00
|
|
|
|
default:
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function setupDB() {
|
|
|
|
|
global $serendipity;
|
|
|
|
|
|
|
|
|
|
$built = $this->get_config('db_built', null);
|
|
|
|
|
if (empty($built)) {
|
2017-05-22 20:28:26 +02:00
|
|
|
|
serendipity_db_schema_import("CREATE TABLE IF NOT EXISTS {$serendipity['dbPrefix']}dejure (
|
2011-12-13 12:29:05 +01:00
|
|
|
|
ckey varchar(32),
|
|
|
|
|
cache text,
|
|
|
|
|
last_update int(10) {UNSIGNED}
|
2017-05-22 20:28:26 +02:00
|
|
|
|
) {UTF_8}");
|
2011-12-13 12:29:05 +01:00
|
|
|
|
serendipity_db_schema_import('CREATE UNIQUE INDEX dejure_cacheidx ON {PREFIX}dejure (ckey)');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-22 20:28:26 +02:00
|
|
|
|
function dropDB() {
|
|
|
|
|
global $serendipity;
|
|
|
|
|
|
|
|
|
|
serendipity_db_schema_import("DROP TABLE {$serendipity['dbPrefix']}dejure");
|
|
|
|
|
}
|
|
|
|
|
|
2011-12-13 12:29:05 +01:00
|
|
|
|
function generate_content(&$title) {
|
|
|
|
|
$title = DEJURE_TITLE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function install() {
|
|
|
|
|
$this->setupDB();
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-06 14:08:17 +02:00
|
|
|
|
function uninstall(&$bag) {
|
2017-05-22 20:28:26 +02:00
|
|
|
|
$this->dropDB();
|
|
|
|
|
}
|
|
|
|
|
|
2011-12-13 12:29:05 +01:00
|
|
|
|
function cleanup() {
|
|
|
|
|
global $serendipity;
|
|
|
|
|
|
2017-05-22 20:28:26 +02:00
|
|
|
|
// Purge the whole DB cache
|
2011-12-13 12:29:05 +01:00
|
|
|
|
serendipity_db_query("DELETE FROM {$serendipity['dbPrefix']}dejure");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function cache_cleanup() {
|
|
|
|
|
global $serendipity;
|
|
|
|
|
|
2017-05-22 20:28:26 +02:00
|
|
|
|
// Purge old DB cache
|
|
|
|
|
serendipity_db_query("DELETE FROM {$serendipity['dbPrefix']}dejure
|
|
|
|
|
WHERE last_update < " . (time()-86400*CACHE_VORHALT));
|
2011-12-13 12:29:05 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function djo_vernetzen_ueber_dejure_org($ausgangstext, $parameter = array()) {
|
2017-05-30 11:05:35 +02:00
|
|
|
|
// M<>gliche Parameter: Anbieterkennung / Dokumentkennung / target / class / AktenzeichenIgnorieren / zeitlimit_in_sekunden
|
2011-12-13 12:29:05 +01:00
|
|
|
|
|
2017-05-30 11:05:35 +02:00
|
|
|
|
$uebergabe = 'Originaltext='.urlencode($ausgangstext);
|
|
|
|
|
foreach ($parameter as $option => $wert) {
|
|
|
|
|
if ($option == 'zeitlimit_in_sekunden') {
|
|
|
|
|
$zeitlimit_in_sekunden = $wert;
|
|
|
|
|
} else {
|
2017-05-22 20:28:26 +02:00
|
|
|
|
$uebergabe .= '&' . urlencode($option) . '=' . urlencode($wert);
|
2017-05-30 11:05:35 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
2011-12-13 12:29:05 +01:00
|
|
|
|
|
2017-05-30 11:05:35 +02:00
|
|
|
|
if (!isset($zeitlimit_in_sekunden)) {
|
|
|
|
|
$zeitlimit_in_sekunden = 2;
|
|
|
|
|
}
|
2011-12-13 12:29:05 +01:00
|
|
|
|
|
2017-05-22 20:28:26 +02:00
|
|
|
|
if (preg_match("/<!-- zeitlimitDJO:([0-9]+) -->/", $ausgangstext, $wert_ARR)) {
|
|
|
|
|
$zeitlimit_in_sekunden = $wert_ARR[1];
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-30 11:05:35 +02:00
|
|
|
|
$header = "POST /dienste/vernetzung/vernetzen HTTP/1.0\r\n";
|
2017-05-27 19:51:08 +02:00
|
|
|
|
$header .= 'User-Agent: '.$_SERVER['SERVER_NAME'] . ' (Serendipity-Vernetzung ' . DJO_VERSION . ')' . "\r\n";
|
2017-05-30 11:05:35 +02:00
|
|
|
|
$header .= "Content-type: application/x-www-form-urlencoded\r\n";
|
|
|
|
|
$header .= "Content-length: " . strlen($uebergabe) . "\r\n";
|
2017-05-27 19:51:08 +02:00
|
|
|
|
$header .= 'Host: rechtsnetz.dejure.org'."\r\n";
|
|
|
|
|
$header .= 'Connection: close'."\r\n";
|
|
|
|
|
$header .= "\r\n";
|
2011-12-13 12:29:05 +01:00
|
|
|
|
|
2018-03-30 12:01:41 +02:00
|
|
|
|
if (extension_loaded('openssl')) {
|
|
|
|
|
$fp = @fsockopen('ssl://rechtsnetz.dejure.org', 443, $errno, $errstr, $zeitlimit_in_sekunden);
|
|
|
|
|
} else {
|
|
|
|
|
$fp = @fsockopen('rechtsnetz.dejure.org', 80, $errno, $errstr, $zeitlimit_in_sekunden);
|
|
|
|
|
}
|
2011-12-13 12:29:05 +01:00
|
|
|
|
|
2017-05-30 11:05:35 +02:00
|
|
|
|
if ($fp === false) { // Verbindung gescheitert
|
|
|
|
|
return false;
|
|
|
|
|
} else {
|
|
|
|
|
stream_set_timeout($fp, $zeitlimit_in_sekunden, 0); // Verbindung nach $zeitlimit_in_sekunden Sekunden abbrechen
|
|
|
|
|
stream_set_blocking($fp, true);
|
|
|
|
|
fputs($fp, $header.$uebergabe);
|
|
|
|
|
$timeOutSock = false;
|
|
|
|
|
$eofSock = false;
|
|
|
|
|
$rueckgabe = '';
|
|
|
|
|
while (!$eofSock && !$timeOutSock) {
|
|
|
|
|
$rueckgabe.= fgets($fp, 1024); //
|
|
|
|
|
$stSock = socket_get_status($fp);
|
|
|
|
|
$eofSock = $stSock["eof"];
|
|
|
|
|
$timeOutSock = $stSock["timed_out"];
|
|
|
|
|
}
|
|
|
|
|
fclose($fp);
|
|
|
|
|
if (!preg_match("/^(.*?)\r?\n\r?\n\r?\n?(.*)/s",$rueckgabe, $rueckgabeARR)) {
|
|
|
|
|
return false; // Zeit<69>berschreitung oder Verbindungsproblem
|
|
|
|
|
} else if (strpos($rueckgabeARR[1],"200 OK") === false) {
|
|
|
|
|
return false; // sonstiges Serverproblem
|
|
|
|
|
} else {
|
|
|
|
|
$rueckgabe = $rueckgabeARR[2];
|
|
|
|
|
if (strlen($rueckgabe) < strlen($ausgangstext)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $rueckgabe;
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-12-13 12:29:05 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function djo_zwischenspeicherung() {
|
|
|
|
|
global $serendipity;
|
2017-05-22 20:28:26 +02:00
|
|
|
|
# Cache auf alte Eintraege pruefen vor dem Eintrag
|
|
|
|
|
$this->cache_cleanup();
|
2011-12-13 12:29:05 +01:00
|
|
|
|
|
2017-05-30 11:05:35 +02:00
|
|
|
|
if (is_array($this->djo_vernetzung_in_cache_schreiben)) {
|
|
|
|
|
foreach ($this->djo_vernetzung_in_cache_schreiben as $vernetzung) {
|
|
|
|
|
$schluessel = md5($vernetzung[0]);
|
|
|
|
|
if ($vernetzung[0] == $vernetzung[1]) {
|
|
|
|
|
$text = "<!-- idem -->";
|
|
|
|
|
} else {
|
|
|
|
|
$text = $vernetzung[1];
|
|
|
|
|
}
|
|
|
|
|
serendipity_db_Query("DELETE FROM {$serendipity['dbPrefix']}dejure WHERE ckey = '" . $schluessel . "'");
|
2017-05-22 20:28:26 +02:00
|
|
|
|
serendipity_db_Query("INSERT INTO {$serendipity['dbPrefix']}dejure
|
|
|
|
|
(ckey, cache, last_update)
|
|
|
|
|
VALUES ('".$schluessel."', '".serendipity_db_escape_string($text)."', " . time() . ")");
|
2017-05-30 11:05:35 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
2011-12-13 12:29:05 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function djo_vernetzen_ueber_cache(&$ausgangstext) {
|
|
|
|
|
global $serendipity;
|
|
|
|
|
|
2017-05-30 11:05:35 +02:00
|
|
|
|
$schluessel = md5($ausgangstext);
|
2017-05-22 20:28:26 +02:00
|
|
|
|
$rueckgabe = serendipity_db_query("SELECT cache FROM {$serendipity['dbPrefix']}dejure
|
|
|
|
|
WHERE ckey = '".$schluessel."' AND last_update > " . (time()-86400*CACHE_VORHALT), true, 'assoc');
|
2017-05-30 11:05:35 +02:00
|
|
|
|
if (!empty($rueckgabe['cache']) && $rueckgabe['cache'] == "<!-- idem -->") {
|
|
|
|
|
return $ausgangstext;
|
|
|
|
|
} else {
|
|
|
|
|
return $rueckgabe['cache'];
|
|
|
|
|
}
|
2011-12-13 12:29:05 +01:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function djo_vernetzen(&$text) {
|
2017-05-30 11:05:35 +02:00
|
|
|
|
global $serendipity;
|
2011-12-13 12:29:05 +01:00
|
|
|
|
|
2017-05-22 20:28:26 +02:00
|
|
|
|
# Cache leeren wenn Option gesetzt
|
|
|
|
|
if ($this->get_config('cache') === true) {
|
|
|
|
|
$this->cleanup;
|
|
|
|
|
$this->set_config('cache', false);
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-30 11:05:35 +02:00
|
|
|
|
if (!preg_match("/<2F>|§|Art\.|\/[0-9][0-9](?![0-9\/])|[0-9][0-9], /", $text) || preg_match("/<!--ohnedjo-->/", $text)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$ergebnis = $this->djo_vernetzen_ueber_cache($text);
|
|
|
|
|
if (empty($ergebnis)) {
|
|
|
|
|
$ergebnis = $this->djo_vernetzen_ueber_dejure_org(
|
|
|
|
|
$text,
|
|
|
|
|
array(
|
|
|
|
|
'Anbieterkennung' => urlencode($this->get_config('mail') . '|' . $serendipity['blogTitle']),
|
|
|
|
|
'format' => $this->get_config('linkstyle'),
|
|
|
|
|
'buzer' => $this->get_config('buzer'),
|
|
|
|
|
'ohnehtags' => $this->get_config('noheadings'),
|
|
|
|
|
'target' => $this->get_config('target'),
|
|
|
|
|
'class' => $this->get_config('css'),
|
|
|
|
|
'newsletter' => serendipity_db_bool($this->get_config('newsletter')) ? 'ja' : 'nein',
|
|
|
|
|
'Schema' => 'https'
|
|
|
|
|
)
|
|
|
|
|
);
|
2011-12-13 12:29:05 +01:00
|
|
|
|
|
2017-05-27 19:51:08 +02:00
|
|
|
|
if ($ergebnis !== false) {
|
|
|
|
|
$ergebnis = $this->integritaetskontrolle($text, $ergebnis);
|
|
|
|
|
}
|
2011-12-13 12:29:05 +01:00
|
|
|
|
|
|
|
|
|
if ($ergebnis) {
|
2017-05-30 11:05:35 +02:00
|
|
|
|
$this->djo_vernetzung_in_cache_schreiben[] = array($text, $ergebnis);
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-12-13 12:29:05 +01:00
|
|
|
|
|
|
|
|
|
if ($ergebnis !== false) {
|
2017-05-30 11:05:35 +02:00
|
|
|
|
$text = $ergebnis;
|
|
|
|
|
}
|
2011-12-13 12:29:05 +01:00
|
|
|
|
|
2017-05-30 11:05:35 +02:00
|
|
|
|
return true;
|
2011-12-13 12:29:05 +01:00
|
|
|
|
}
|
|
|
|
|
|
2017-05-30 11:05:35 +02:00
|
|
|
|
function integritaetskontrolle($ausgangstext, $neuertext) {
|
|
|
|
|
if (preg_replace("/<a href=\"https?:\/\/dejure.org\/[^>]*>([^<]*)<\/a>/i", "\\1", $ausgangstext) == preg_replace("/<a href=\"https?:\/\/dejure.org\/[^>]*>([^<]*)<\/a>/i", "\\1", $neuertext)) {
|
|
|
|
|
return $neuertext;
|
|
|
|
|
} else {
|
|
|
|
|
return $ausgangstext;
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-12-13 12:29:05 +01:00
|
|
|
|
|
|
|
|
|
function event_hook($event, &$bag, &$eventData, $addData = null) {
|
|
|
|
|
global $serendipity;
|
|
|
|
|
|
|
|
|
|
$hooks = &$bag->get('event_hooks');
|
|
|
|
|
|
|
|
|
|
if (isset($hooks[$event])) {
|
|
|
|
|
switch ($event) {
|
|
|
|
|
case 'genpage':
|
|
|
|
|
if (date("G") < 6 && rand(0,50) < 1) {
|
|
|
|
|
$this->cache_cleanup();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'frontend_display':
|
|
|
|
|
if ($addData['from'] == 'functions_entries:printEntries') {
|
|
|
|
|
$this->djo_vernetzen($eventData['body']);
|
|
|
|
|
$this->djo_vernetzen($eventData['extended']);
|
|
|
|
|
} elseif ($eventData['comment'] != '') {
|
|
|
|
|
$this->djo_vernetzen($eventData['comment']);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'frontend_footer':
|
|
|
|
|
$this->djo_zwischenspeicherung();
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|