miniblog

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 4a73e501f15c0eeee3500b7a2cf9f9c089601dc2
parent 8b3853172ebeb8cfe84420d837d4050cdb590ff5
Author: dankert <devnull@localhost>
Date:   Sun,  6 Jul 2014 12:48:15 +0200

Umfangreicher Umbau auf Plugin-System.

Diffstat:
blog.php | 214+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
client/OpenratClient.php | 123-------------------------------------------------------------------------------
cms/OpenRat.class.php | 267+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cms/openrat/OpenratClient.php | 123+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
config.ini | 21---------------------
index.php | 215-------------------------------------------------------------------------------
network/Facebook.class.php | 13+++++++++++++
network/GooglePlus.class.php | 13+++++++++++++
network/Reddit.class.php | 14++++++++++++++
network/Twitter.class.php | 13+++++++++++++
network/Xing.class.php | 13+++++++++++++
post.php | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
profiles/config-myproject.ini | 39+++++++++++++++++++++++++++++++++++++++
source/File.class.php | 133+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
source/Mailbox.class.php | 186+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
source/Mock.class.php | 28++++++++++++++++++++++++++++
16 files changed, 1115 insertions(+), 359 deletions(-)

diff --git a/blog.php b/blog.php @@ -0,0 +1,213 @@ +<?php + + +if ($dh = opendir('./profiles')) +{ + while (($file = readdir($dh)) !== false) + { + if ( substr($file,-4) == '.ini' ) + { + $config = parse_ini_file('./profiles/'.$file,true); + + if ( !$config['enabled'] ) + continue; + + $blogger = new Blogger(); + if ( $config['debug'] ) echo "<h2>Profile: $file</h2>"; + + $blogger->config = $config; + $blogger->debug = $config['debug']; + + $blogger->pull(); + $blogger->pushToCMS(); + $blogger->pushToNetwork(); + } + } + closedir($dh); +} + + + +class Blogger { + + public $debug = true; + public $config; + + private $blogs = array(); + + public function pull() + { + if ($dh = opendir('./source')) + { + while (($file = readdir($dh)) !== false) + { + if ( substr($file,-4) == '.php' ) + { + require_once('./source/'.$file); + $className = substr($file,0,strlen($file)-10); + + if ( $this->debug ) + echo "<h3>Source-Plugin: ".$className.'</h3>'; + + if ( isset($this->config[strtolower($className)] )) + { + $source = new $className; + + $source->config = $this->config[strtolower($className)]; + $source->debug = $this->debug; + + foreach( $source->pull() as $blog ) + { + $blog['filename'] = $this->createPageFilename($blog['subject']); + $d = isset($blog['timestamp'])?$blog['timestamp']:time(); + + switch( $this->config['urlschema' ]) + { + case 'flat': + $blog['path'] = array(); + break; + case 'yearly': + $blog['path'] = array( date('Y',$d) ); + break; + case 'monthly': + $blog['path'] = array( date('Y',$d),date('m',$d) ); + break; + case 'daily': + default: + $blog['path'] = array( date('Y',$d),date('m',$d),date('d',$d) ); + break; + } + $blog['url' ] = 'http://'.$this->config['hostname'].'/'.implode('/',$blog['path']).'/'.$blog['filename']; + $blog['shortUrl'] = $this->createShortUrl($blog['url']); + + $this->blogs[] = $blog; + } + } + } + } + closedir($dh); + + if ( $this->debug ) + { + echo "<h3>Blogs</h3>"; + echo '<pre>'; + print_r($this->blogs); + echo '</pre>'; + } + } + + } + + public function pushToCMS() + { + if ($dh = opendir('./cms')) + { + while (($file = readdir($dh)) !== false) + { + if ( substr($file,-4) == '.php' ) + { + require_once('./cms/'.$file); + $className = substr($file,0,strlen($file)-10); + + if ( $this->debug ) + echo "<h3>CMS-Plugin: ".$className.'</h3>'; + + $cms = new $className; + + if ( isset($this->config[strtolower($className)] )) + { + $cms->config = $this->config[strtolower($className)]; + + foreach( $this->blogs as $blog ) + { + + $cms->url = $blog['url']; + $cms->shortUrl = $blog['shortUrl']; + $cms->text = $blog['text']; + $cms->subject = $blog['subject']; + $cms->filenames = $blog['filenames']; + $cms->filename = $blog['filename']; + $cms->path = $blog['path']; + $cms->keywords = $blog['keywords']; + $cms->debug = $this->debug; + $cms->push(); + } + } + } + } + closedir($dh); + } + + } + + + public function pushToNetwork() + { + if ($dh = opendir('./network')) + { + while (($file = readdir($dh)) !== false) + { + if ( substr($file,-4) == '.php' ) + { + require_once('./network/'.$file); + $className = substr($file,0,strlen($file)-10); + + if ( $this->debug ) + echo "Network-Plugin: "+$className; + + if ( isset($this->config[strtolower($className)] )) + { + $network = new $className; + + $network->config = $this->config[strtolower($className)]; + + foreach( $this->blogs as $blog ) + { + $network->url = $blog['url']; + $network->shortUrl = $blog['shortUrl']; + $network->text = $blog['text']; + $network->subject = $blog['subject']; + $network->debug = $this->debug; + $network->push(); + } + } + } + } + closedir($dh); + } + + } + + + private function createShortUrl( $url ) + { + $su = file_get_contents('http://l.jdhh.de/?url='.$url); + $doc = json_decode($su,true); + + return 'http://l.jdhh.de/'.$doc['short_url']; + } + + + private function createPageFilename( $title ) + { + $title = strtolower(trim($title)); + $title = strtr($title, array( + ' ' => '-', + 'ä' => 'ae', + 'Ä' => 'ae', + 'ö' => 'oe', + 'Ö' => 'oe', + 'ü' => 'ue', + 'Ü' => 'ue', + 'ß' => 'ss', + '_' => '-' ) ); + + $gueltig = 'abcdefghijklmnopqrstuvwxyz0123456789-'; + $tmp = strtr($title, $gueltig, str_repeat('#', strlen($gueltig))); + $title = strtr($title, $tmp, str_repeat('-', strlen($tmp))); + + return $title; + } +} + +?>+ \ No newline at end of file diff --git a/client/OpenratClient.php b/client/OpenratClient.php @@ -1,122 +0,0 @@ -<?php - -class OpenratClient -{ - public $error = ''; - public $status = ''; - - public $host; - public $port; - public $path; - public $method = 'GET'; - public $response; - public $parameter = array(); - public $type = "text/json"; - public $cookie = ""; - - public function request() - { - $errno = 0; - $errstr = ''; - - // Die Funktion fsockopen() erwartet eine Protokollangabe (bei TCP optional, bei SSL notwendig). - if ( $this->port == '443' ) - $prx_proto = 'ssl://'; // SSL - else - $prx_proto = 'tcp://'; // Default - - $fp = fsockopen($prx_proto.$this->host,$this->port, $errno, $errstr, 30); - - if ( !$fp || !is_resource($fp) ) - { - $this->error = "Connection refused: '".$prx_proto.$host.':'.$port." - $errstr ($errno)"; - } - else - { - $lb = "\r\n"; - $http_get = $this->path; - - $parameterString = ''; - - foreach( $this->parameter as $pkey=>$pvalue) - { - if ( strlen($parameterString) > 0) - $parameterString .= '&'; - - $parameterString .= urlencode($pkey) . '=' .urlencode($pvalue); - } - //print_r($parameterString); - - if ( $this->method == 'GET') - if ( !empty($parameterString) ) - $http_get .= '?'.$parameterString; - - if ( $this->method == 'POST' ) - { - $header[] = 'Content-Type: application/x-www-form-urlencoded'; - $header[] = 'Content-Length: '.strlen($parameterString); - } - - $header[] = 'Host: '.$this->host; - $header[] = 'Accept: '.$this->type; - $header[] = 'Cookie: '.$this->cookie; - $request_header = array_merge(array( $this->method.' '.$http_get.' HTTP/1.0'),$header); - //print_r($request_header); - $http_request = implode($lb,$request_header).$lb.$lb; - - - if ( $this->method == 'POST' ) - $http_request .= $parameterString; - - //echo "<textarea>".htmlentities($http_request)."</textarea>"; - - if (!is_resource($fp)) { - $error = 'Connection lost after connect: '.$prx_proto.$host.':'.$port; - return false; - } - fputs($fp, $http_request); // Die HTTP-Anfrage zum Server senden. - - // Jetzt erfolgt das Auslesen der HTTP-Antwort. - $isHeader = true; - - // RFC 1945 (Section 6.1) schreibt als Statuszeile folgendes Format vor - // "HTTP/" 1*DIGIT "." 1*DIGIT SP 3DIGIT SP - if (!is_resource($fp)) { - echo 'Connection lost during transfer: '.$host.':'.$port; - } - elseif (!feof($fp)) { - $line = fgets($fp,1028); - $this->status = substr($line,9,3); - } - else - { - echo 'Unexpected EOF while reading HTTP-Response'; - } - - $body = ''; - - while (!feof($fp)) { - $line = fgets($fp,1028); - if ( $isHeader && trim($line)=='' ) // Leerzeile nach Header. - { - $isHeader = false; - } - elseif( $isHeader ) - { - list($headerName,$headerValue) = explode(': ',$line) + array(1=>''); - //if ( $headerName == 'Set-Cookie' ) - // $this->cookie = $headerValue; - $responseHeader[$headerName] = trim($headerValue); - } - else - { - $body .= $line; - } - } - fclose($fp); // Verbindung brav schliessen. - $this->response = $body; - } - } -} - -?>- \ No newline at end of file diff --git a/cms/OpenRat.class.php b/cms/OpenRat.class.php @@ -0,0 +1,266 @@ +<?php + + +class OpenRat { + + public $text = ''; + public $filenames = array(); + public $filename; + public $subject; + public $keywords = array(); + public $shortUrl; + public $path; + public $debug = true; + public $config; + + private $client; + + private function request( $method,$parameter ) + { + + $this->client->parameter = $parameter; + $this->client->method = $method; + $this->client->request(); + + if ( $this->client->status != '200' || $this->debug) + { + echo '<span style="background-color:'.($this->client->status=='200'?'green':'red').'">HTTP-Status '.$this->client->status.'</span>'; + } + + if ( $this->debug ) + { + echo "<h4>".$parameter['action'].'/'.$parameter['subaction'].'</h4>'; + ?><pre><?php print_r($this->client); ?></pre><?php + } + + $response = json_decode($this->client->response,true); + + if ( $response == null ) + { + echo '<span style="background-color:red">Kein JSON: <pre>'.htmlentities($this->client->response).'</pre></span>'; + exit; + } + + return $response; + } + + + public function push() + { + require_once('./cms/openrat/OpenratClient.php'); + $this->client = new OpenratClient(); + + /* + * + if (!isset($_SERVER['PHP_AUTH_USER'])) { + header('WWW-Authenticate: Basic realm="Blog Upload"'); + header('HTTP/1.0 401 Unauthorized'); + echo 'sorry, authentication required to blog something'; + exit; + } + */ + + $username = $this->config['user']; + $password = $this->config['password']; + + $this->client->host = $this->config['host']; + $this->client->port = $this->config['port']; + $this->client->path = $this->config['path']; + $this->client->type ="application/json"; + + + $response = $this->request( 'GET', + array('action' =>'login', + 'subaction'=>'login') ); + + $token = $response['session']['token']; + $this->client->cookie =$response['session']['name'].'='.$response['session']['id']; + + + $response = $this->request( 'POST', array( + 'action' => 'login', + 'subaction' => 'login', + 'token' => $token, + 'dbid' => $this->config['database'], + 'login_name' => $username, + 'login_password'=> $password ) ); + + $this->client->cookie =$response['session']['name'].'='.$response['session']['id']; + $token = $response['session']['token']; + + + // PRojekt auswählen + $response = $this->request( 'POST', array( + 'action' => 'start', + 'subaction' => 'projectmenu', + 'token' => $token, + 'id' => $this->config['projectid']) ); + + + // Ordner laden. + $rootfolderid = $this->config['rootfolderid']; + $folderid = $rootfolderid; + + foreach( $this->path as $foldername ) + { + $response = $this->request( 'GET', array + ( + 'action' => 'folder', + 'subaction' => 'edit', + 'id' => $folderid + ) ); + + // Prüfen, ob der nächste Unterordner bereits existiert. + $nextfolderid = null; + foreach( $response['output']['object'] as $objectid=>$object ) + { + if ( $object['name'] == $foldername ) + { + $nextfolderid = $objectid; + break; + } + } + if ( empty($nextfolderid) ) + { + // Der nächste Unterordner existiert noch nicht, also müssen wir diesen anlegen. + $responseCreate = $this->request( 'POST', array + ( + 'action' => 'folder', + 'subaction' => 'createfolder', + 'id' => $folderid, + 'token' => $token, + 'name' => $foldername + ) ); + $nextfolderid = $responseCreate['output']['objectid']; + } + $folderid = $nextfolderid; + } + + // Ein Unterordner pro Blogeintrag. + $responseCreate = $this->request( 'POST', array + ( + 'action' => 'folder', + 'subaction' => 'createfolder', + 'id' => $folderid, + 'token' => $token, + 'name' => $this->filename + ) ); + $folderid = $responseCreate['output']['objectid']; + + // Seite anlegen. + $response = $this->request( 'POST', array + ( + 'action' => 'folder', + 'subaction' => 'createpage', + 'id' => $folderid, + 'templateid' => $this->config['templateid'], + 'token' => $token, + 'name' => $this->subject, + 'filename' => 'index' + ) ); + $pageobjectid = $response['output']['objectid']; + + /* + * + // Ggf. Datei anlegen. + $response = $this->request( 'POST', array + ( + 'action' => 'folder', + 'subaction' => 'createfile', + 'token' => $token, + 'name' => $title, + 'filename' => $title + ) ); + $pageobjectid = $response['objectid']; + */ + + // Text speichern anlegen. + $response = $this->request( 'POST', array + ( + 'action' => 'pageelement', + 'subaction' => 'edit', + 'id' => $pageobjectid, + 'elementid' => $this->config['elementid_text'], + 'token' => $token, + 'release' => '1', + 'text' => $this->text + ) ); + + foreach( $this->filenames as $file ) + { + // Datei anlegen. + $response = $this->request( 'POST', array + ( + 'action' => 'folder', + 'subaction' => 'createfile', + 'id' => $folderid, + 'token' => $token, + 'name' => $file['name'], + 'filename' => basename($file['filename']) + ) ); + $fileobjectid = $response['output']['objectid']; + + // Datei-Inhalt hochladen. + $response = $this->request( 'POST', array + ( + 'action' => 'file', + 'subaction' => 'value', + 'id' => $fileobjectid, + 'token' => $token, + 'value' => file_get_contents($file['filename']) + ) ); + + } + + // Keywords + foreach( $this->keywords as $keyword ) + { + $response = $this->request( 'GET', array + ( + 'action' => 'folder', + 'subaction' => 'edit', + 'id' => $this->config['keywords_folderid'] + ) ); + + // Prüfen, ob das Keyword schon existiert + $keyword_folderid = null; + foreach( $response['output']['object'] as $objectid=>$object ) + { + if ( $object['name'] == $keyword ) + { + $keyword_folderid = $objectid; + break; + } + } + if ( empty($keyword_folderid) ) + { + // Der Keyword-Ordner existiert noch nicht, also müssen wir diesen anlegen. + $responseCreate = $this->request( 'POST', array + ( + 'action' => 'folder', + 'subaction' => 'createfolder', + 'id' => $this->config['keywords_folderid'], + 'token' => $token, + 'name' => $keyword + ) ); + $keyword_folderid = $responseCreate['output']['objectid']; + } + + $responseCreate = $this->request( 'POST', array + ( + 'action' => 'folder', + 'subaction' => 'createlink', + 'id' => $keyword_folderid, + 'token' => $token, + 'name' => $this->subject, + 'filename' => $this->filename, + 'targetobjectid'=> $pageobjectid + ) ); + + } + } + + +} + +?>+ \ No newline at end of file diff --git a/cms/openrat/OpenratClient.php b/cms/openrat/OpenratClient.php @@ -0,0 +1,122 @@ +<?php + +class OpenratClient +{ + public $error = ''; + public $status = ''; + + public $host; + public $port; + public $path; + public $method = 'GET'; + public $response; + public $parameter = array(); + public $type = "text/json"; + public $cookie = ""; + + public function request() + { + $errno = 0; + $errstr = ''; + + // Die Funktion fsockopen() erwartet eine Protokollangabe (bei TCP optional, bei SSL notwendig). + if ( $this->port == '443' ) + $prx_proto = 'ssl://'; // SSL + else + $prx_proto = 'tcp://'; // Default + + $fp = fsockopen($prx_proto.$this->host,$this->port, $errno, $errstr, 30); + + if ( !$fp || !is_resource($fp) ) + { + $this->error = "Connection refused: '".$prx_proto.$host.':'.$port." - $errstr ($errno)"; + } + else + { + $lb = "\r\n"; + $http_get = $this->path; + + $parameterString = ''; + + foreach( $this->parameter as $pkey=>$pvalue) + { + if ( strlen($parameterString) > 0) + $parameterString .= '&'; + + $parameterString .= urlencode($pkey) . '=' .urlencode($pvalue); + } + //print_r($parameterString); + + if ( $this->method == 'GET') + if ( !empty($parameterString) ) + $http_get .= '?'.$parameterString; + + if ( $this->method == 'POST' ) + { + $header[] = 'Content-Type: application/x-www-form-urlencoded'; + $header[] = 'Content-Length: '.strlen($parameterString); + } + + $header[] = 'Host: '.$this->host; + $header[] = 'Accept: '.$this->type; + $header[] = 'Cookie: '.$this->cookie; + $request_header = array_merge(array( $this->method.' '.$http_get.' HTTP/1.0'),$header); + //print_r($request_header); + $http_request = implode($lb,$request_header).$lb.$lb; + + + if ( $this->method == 'POST' ) + $http_request .= $parameterString; + + //echo "<textarea>".htmlentities($http_request)."</textarea>"; + + if (!is_resource($fp)) { + $error = 'Connection lost after connect: '.$prx_proto.$host.':'.$port; + return false; + } + fputs($fp, $http_request); // Die HTTP-Anfrage zum Server senden. + + // Jetzt erfolgt das Auslesen der HTTP-Antwort. + $isHeader = true; + + // RFC 1945 (Section 6.1) schreibt als Statuszeile folgendes Format vor + // "HTTP/" 1*DIGIT "." 1*DIGIT SP 3DIGIT SP + if (!is_resource($fp)) { + echo 'Connection lost during transfer: '.$host.':'.$port; + } + elseif (!feof($fp)) { + $line = fgets($fp,1028); + $this->status = substr($line,9,3); + } + else + { + echo 'Unexpected EOF while reading HTTP-Response'; + } + + $body = ''; + + while (!feof($fp)) { + $line = fgets($fp,1028); + if ( $isHeader && trim($line)=='' ) // Leerzeile nach Header. + { + $isHeader = false; + } + elseif( $isHeader ) + { + list($headerName,$headerValue) = explode(': ',$line) + array(1=>''); + //if ( $headerName == 'Set-Cookie' ) + // $this->cookie = $headerValue; + $responseHeader[$headerName] = trim($headerValue); + } + else + { + $body .= $line; + } + } + fclose($fp); // Verbindung brav schliessen. + $this->response = $body; + } + } +} + +?>+ \ No newline at end of file diff --git a/config.ini b/config.ini @@ -1,21 +0,0 @@ - - -[server] - -host="duese" -port="80" -path="/~dankert/cms/cms09/dispatcher.php" -database="pg_prod" - - -[project] - -projectid=13 -languageid=19 -rootfolderid=5145 -; daily|monthly|yearly|flat -urlschema=daily -templateid=23 - -elementid_text=69 -elementid_image= diff --git a/index.php b/index.php @@ -1,215 +0,0 @@ -<?php - -$config = parse_ini_file('./config.ini',true); - -require('./client/OpenratClient.php'); -$client = new OpenratClient(); - -if (!isset($_SERVER['PHP_AUTH_USER'])) { - header('WWW-Authenticate: Basic realm="Blog Upload"'); - header('HTTP/1.0 401 Unauthorized'); - echo 'sorry, authentication required to blog something'; - exit; -} - -$username = $_SERVER['PHP_AUTH_USER']; -$password = $_SERVER['PHP_AUTH_PW']; - -function request( $client,$method,$parameter ) -{ - echo "<hr />"; - $client->parameter = $parameter; - $client->method = $method; - $client->request(); - $response = json_decode($client->response,true); - ?><pre><?php print_r($client); ?></pre><?php - if ( $client->status != '200') - { - echo '<span style="background-color:'.($client->status=='200'?'green':'red').'">HTTP-Status '.$client->status.'</span>'; - } - return $response; -} - - -?> - -<html> -<head> -<title>Blog Form</title> -</head> -<body> - -<?php if ( !empty($_POST['text']) ) { - - ?><h1>Result</h1><?php - - $client->host = $config['server']['host']; - $client->port = $config['server']['port']; - $client->path = $config['server']['path']; - $client->type ="application/json"; - - - $response = request( $client,'GET', - array('action' =>'login', - 'subaction'=>'login') ); - - $token = $response['session']['token']; - $client->cookie =$response['session']['name'].'='.$response['session']['id']; - - - $response = request( $client,'POST', array( - 'action' => 'login', - 'subaction' => 'login', - 'token' => $token, - 'dbid' => $config['server']['database'], - 'login_name' => $username, - 'login_password'=> $password ) ); - - $client->cookie =$response['session']['name'].'='.$response['session']['id']; - $token = $response['session']['token']; - - - // PRojekt auswählen - $response = request( $client,'POST', array( - 'action' => 'start', - 'subaction' => 'projectmenu', - 'token' => $token, - 'id' => $config['project']['projectid']) ); - - - // Ordner laden. - $rootfolderid = $config['project']['rootfolderid']; - $urlschema = $config['project']['urlschema' ]; - - $folderid = $rootfolderid; - - switch( $urlschema ) - { - case 'flat': - $foldernames = array(); - break; - case 'yearly': - $foldernames = array( date('Y') ); - break; - case 'monthly': - $foldernames = array( date('Y'),date('m') ); - break; - case 'daily': - default: - $foldernames = array( date('Y'),date('m'),date('d') ); - break; - } - - foreach( $foldernames as $foldername ) - { - $response = request( $client,'GET', array - ( - 'action' => 'folder', - 'subaction' => 'edit', - 'id' => $folderid - ) ); - - // Prüfen, ob der nächste Unterordner bereits existiert. - $nextfolderid = null; - foreach( $response['output']['object'] as $objectid=>$object ) - { - if ( $object['name'] == $foldername ) - { - $nextfolderid = $objectid; - break; - } - } - if ( empty($nextfolderid) ) - { - // Der nächste Unterordner existiert noch nicht, also müssen wir diesen anlegen. - $responseCreate = request( $client,'POST', array - ( - 'action' => 'folder', - 'subaction' => 'createfolder', - 'id' => $folderid, - 'token' => $token, - 'name' => $foldername - ) ); - $nextfolderid = $responseCreate['output']['objectid']; - } - $folderid = $nextfolderid; - } - - // Seite anlegen. - $response = request( $client,'POST', array - ( - 'action' => 'folder', - 'subaction' => 'createpage', - 'id' => $folderid, - 'templateid' => $config['project']['templateid'], - 'token' => $token, - 'name' => $_POST['title'], - 'filename' => $_POST['title'] - ) ); - $pageobjectid = $response['output']['objectid']; - - /* - * - // Ggf. Datei anlegen. - $response = request( $client,'POST', array - ( - 'action' => 'folder', - 'subaction' => 'createfile', - 'token' => $token, - 'name' => $title, - 'filename' => $title - ) ); - $pageobjectid = $response['objectid']; - */ - - // Text speichern anlegen. - $response = request( $client,'POST', array - ( - 'action' => 'pageelement', - 'subaction' => 'edit', - 'id' => $pageobjectid, - 'elementid' => $config['project']['elementid_text'], - 'token' => $token, - 'release' => '1', - 'text' => $_POST['text'] - ) ); - - ?> - - - <?php } ?> - -<h1>Blog</h1> -<form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>" method="post"> - -<div class="line"> -<div class="label">Benutzer</div> -<div class="value"><input type="text" name="username" readonly="readonly" - value="<?php echo $username ?>" /></div> -</div> -<div class="line"> -<div class="label">Titel</div> -<div class="value"><input type="text" name="title" value="" /></div> -</div> -<div class="line"> -<div class="label">Text</div> -<div class="value"><textarea name="text"></textarea></div> -</div> -</div> -<div class="line"> -<div class="label">File</div> -<div class="value"><input type="file" name="image"></textarea></div> -</div> - -<div class="line"> -<div class="label">Options</div> -<div class="value"><select name="option"><option name="public" >test</option></select></div> -</div> - -<br> - -<input type="submit"></form> -<hr> - -</body> -</html> diff --git a/network/Facebook.class.php b/network/Facebook.class.php @@ -0,0 +1,12 @@ +<?php + +class Facebook +{ + public $config; + + public function push() + { + + } +} +?>+ \ No newline at end of file diff --git a/network/GooglePlus.class.php b/network/GooglePlus.class.php @@ -0,0 +1,12 @@ +<?php + +class GooglePlus +{ + public $config; + + public function push() + { + + } +} +?>+ \ No newline at end of file diff --git a/network/Reddit.class.php b/network/Reddit.class.php @@ -0,0 +1,13 @@ +<?php + +class Reddit +{ + public $config; + + public function push() + { + + } +} + +?>+ \ No newline at end of file diff --git a/network/Twitter.class.php b/network/Twitter.class.php @@ -0,0 +1,12 @@ +<?php + +class Twitter +{ + public $config; + + public function push() + { + + } +} +?>+ \ No newline at end of file diff --git a/network/Xing.class.php b/network/Xing.class.php @@ -0,0 +1,12 @@ +<?php + +class Xing +{ + public $config; + + public function push() + { + + } +} +?>+ \ No newline at end of file diff --git a/post.php b/post.php @@ -0,0 +1,59 @@ +<html> +<head> +<title>Submit a new blog entry</title> +</head> +<body> + +<?php if ( !empty($_POST['text']) ) { + + $dirname = './blogs/'.date('Ymd-His'); + mkdir($dirname); + + $textfile = fopen($dirname.'/text','w'); + fwrite($textfile,$_POST['text']); + + $titlefile = fopen($dirname.'/subject','w'); + fwrite($titlefile,$_POST['title']); + fclose($titlefile); + + if ( !empty($_FILES['image']) ) + { + $imagenamefile = fopen($dirname.'/image','w'); + fwrite($imagenamefile,'image-'.$_FILES['image']['name']); + fclose($imagenamefile); + move_uploaded_file($_FILES['image']['tmp_name'],$dirname.'/image-'.$_FILES['image']['name']); + } + + $okfile = fopen($dirname.'/OK','w'); + fwrite($okfile,''); + fclose($okfile); + + + ?> + <h3>Saved!</h3><a href="blog.php">Start push to server now...</a><?php } + ?> + +<h1>Blog</h1> +<form enctype="multipart/form-data" action="<?php echo $_SERVER['SCRIPT_NAME'] ?>" method="post"> + +<div class="line"> +<div class="label">Titel</div> +<div class="value"><input type="text" name="title" value="" /></div> +</div> +<div class="line"> +<div class="label">Text</div> +<div class="value"><textarea name="text"></textarea></div> +</div> +<div class="line"> +<div class="label">File</div> +<div class="value"><input type="file" name="image"></input></div> +</div> + + +<br> + +<input type="submit"></form> +<hr> + +</body> +</html> diff --git a/profiles/config-myproject.ini b/profiles/config-myproject.ini @@ -0,0 +1,39 @@ + +enabled=false +debug=false + +hostname = www.example.de +urlschema=daily ; daily|monthly|yearly|flat + + +[mailbox] + +host = {mail.example.de:143/novalidate-cert}INBOX +username = foo +password = bar +archive_folder = Archiv +dry=false + + +[mock-disabled] + + +[openrat] + +user=foo +password=bar + +host="cms.example.de" +port="80" +path="/~foo/cms/dispatcher.php" +database="dbname" + +projectid=1111 +languageid=1111 +rootfolderid=1111 + +templateid=1111 + +elementid_text=1111 + +keywords_folderid=1111 diff --git a/source/File.class.php b/source/File.class.php @@ -0,0 +1,132 @@ +<?php + +class File +{ + public $debug = false; + public $config = array(); + + private $text; + private $html; + private $filenames; + + public function pull() + { + $entrys = array(); + + $dh = opendir('./blogs'); + + while (($file = readdir($dh)) !== false) + { + $file = './blogs/'.$file; + if ( is_dir($file) && is_file($file.'/OK') && !is_file($file.'/PROCESSED')) + { + $filenames = array(); + + if ( file_exists($file.'/image') ) + { + $imagename = file_get_contents($file.'/image'); + $tmpfilename = tempnam('/tmp','blog-').$imagename; + copy( $file.'/'.$imagename,$tmpfilename); + $filenames[] = array('name'=>$imagename,'filename'=>$tmpfilename); + } + + $entrys[] = array( + 'filenames'=> $filenames, + 'keywords' => array(), + 'timestamp' => filectime($file), + 'subject' => file_get_contents($file.'/subject'), + 'text' => file_get_contents($file.'/text' ) + ); + + // als "verarbeitet" markieren... + $processed = fopen($file.'/PROCESSED','w'); + fwrite($processed,''); + fclose($processed); + + // und verschieben... + if ( !is_dir('./blogs/archive')) + { + mkdir('./blogs/archive'); + } + rename($file,'blogs/archive/'.basename($file)); + + } + } + + + return $entrys; + } + + + + private function getpart($mbox,$mid,$p,$partno) + { + // $partno = '1', '2', '2.1', '2.1.3', etc for multipart, 0 if simple + + // DECODE DATA + $data = ($partno) ? + imap_fetchbody($mbox,$mid,$partno): // multipart + imap_body($mbox,$mid); // simple + + // Any part may be encoded, even plain text messages, so check everything. + if ($p->encoding==4) + $data = quoted_printable_decode($data); + elseif ($p->encoding==3) + $data = base64_decode($data); + + // PARAMETERS + // get all parameters, like charset, filenames of attachments, etc. + $params = array(); + if ($p->parameters) + foreach ($p->parameters as $x) + $params[strtolower($x->attribute)] = $x->value; + if ($p->dparameters) + foreach ($p->dparameters as $x) + $params[strtolower($x->attribute)] = $x->value; + + // ATTACHMENT + // Any part with a filename is an attachment, + // so an attached text file (type 0) is not mistaken as the message. + if ($params['filename'] || $params['name']) { + // filename may be given as 'Filename' or 'Name' or both + $filename = ($params['filename'])? $params['filename'] : $params['name']; + // filename may be encoded, so see imap_mime_header_decode() + $fname = tempnam(null,'blog-file-'); + $file = fopen($fname,'w'); + fwrite($file,$data); + fclose($file); + chmod($fname,0644); + + $this->filenames[] = array('filename'=>$fname,'name'=>$filename); + } + + // TEXT + if ($p->type==0 && $data) { + // Messages may be split in different parts because of inline attachments, + // so append parts together with blank row. + if (strtolower($p->subtype)=='plain') + $this->text.= trim($data) ."\n\n"; + else + $this->html.= $data ."<br><br>"; + $charset = $params['charset']; // assume all parts are same charset + } + + // EMBEDDED MESSAGE + // Many bounce notifications embed the original message as type 2, + // but AOL uses type 1 (multipart), which is not handled here. + // There are no PHP functions to parse embedded messages, + // so this just appends the raw source to the main message. + elseif ($p->type==2 && $data) { + $this->text.= $data."\n\n"; + } + + // SUBPART RECURSION + if ($p->parts) { + foreach ($p->parts as $partno0=>$p2) + $this->getpart($mbox,$mid,$p2,$partno.'.'.($partno0+1)); // 1.2, 1.2.1, etc. + } + } + +} + +?>+ \ No newline at end of file diff --git a/source/Mailbox.class.php b/source/Mailbox.class.php @@ -0,0 +1,185 @@ +<?php + +class Mailbox +{ + public $debug = false; + public $config = array(); + + private $text; + private $html; + private $filenames; + + public function pull() + { + + $entrys = array(); + + /* connect to gmail */ + $hostname = $this->config['host']; + $username = $this->config['username']; + $password = $this->config['password']; + + /* try to connect */ + $inbox = imap_open($hostname,$username,$password) or die('Cannot connect to IMAP server: ' . imap_last_error()); + + /* grab emails */ + $emails = imap_search($inbox,'ALL UNDELETED UNSEEN'); + + print_r($emails); + + /* if emails are returned, cycle through each... */ + if($emails) { + + /* put the newest emails on top */ + rsort($emails); + + /* for every email... */ + foreach($emails as $email_number) { + + /* get information specific to this email */ + // $overview = imap_fetch_overview($inbox,$email_number,0); + $headers = imap_headerinfo($inbox,$email_number); + $structure = imap_fetchstructure($inbox,$email_number); + // $message = imap_fetchbody($inbox,$email_number); + + // echo "\nOverview:"; + // print_r($overview); + if ( $this->debug ) { echo '<pre>'; print_r($headers); echo '</pre>'; } + + // Initalize + $this->filenames = array(); + $this->text = ''; + $this->html = ''; + $subject = $headers->subject; + + $s = imap_fetchstructure($inbox,$email_number); + + if (!$s->parts) // simple + $this->getpart($inbox,$email_number,$s,0); // pass 0 as part-number + else { // multipart: cycle through each part + foreach ($s->parts as $partno0=>$p) + $this->getpart($inbox,$email_number,$p,$partno0+1); + } + + // print_r($message); + /* output the email header information */ + // $output.= '<div class="toggler '.($overview[0]->seen ? 'read' : 'unread').'">'; + // $output.= '<span class="subject">'.$overview[0]->subject.'</span> '; + // $output.= '<span class="from">'.$overview[0]->from.'</span>'; + // $output.= '<span class="date">on '.$overview[0]->date.'</span>'; + // $output.= '</div>'; + + /* output the email body */ + // $output.= '<div class="body">'.$message.'</div>'; + + if ( $this->debug ) echo "\n\nBetreff: ".$subject; + if ( $this->debug ) echo "\n\nText: "; + if ( $this->debug ) print_r($this->text); + if ( $this->debug ) echo "\n\nAnlagen: "; + if ( $this->debug ) print_r($this->filenames); + + $entrys[] = array( + 'filenames'=> $this->filenames, + 'keywords' => array(), + 'timestamp' => strtotime($headers->date), + 'subject' => $subject, + 'text' => $this->text + ); + + // Aufräumen: + // - Mail als gelesen markieren und in das Archiv verschieben. + if ( $this->config['dry'] ) + ; + else + { + imap_setflag_full($inbox,$email_number,'\\SEEN',0); + + if (isset($this->config['archive_folder'])) + { + imap_mail_move($inbox,$email_number,$this->config['archive_folder']) or die("IMAP: Move did not suceed: "+imap_last_error() ); + + imap_expunge($inbox); + } + } + } + } + + /* close the connection */ + imap_close($inbox); + + return $entrys; + } + + + + private function getpart($mbox,$mid,$p,$partno) + { + // $partno = '1', '2', '2.1', '2.1.3', etc for multipart, 0 if simple + + // DECODE DATA + $data = ($partno) ? + imap_fetchbody($mbox,$mid,$partno): // multipart + imap_body($mbox,$mid); // simple + + // Any part may be encoded, even plain text messages, so check everything. + if ($p->encoding==4) + $data = quoted_printable_decode($data); + elseif ($p->encoding==3) + $data = base64_decode($data); + + // PARAMETERS + // get all parameters, like charset, filenames of attachments, etc. + $params = array(); + if ($p->parameters) + foreach ($p->parameters as $x) + $params[strtolower($x->attribute)] = $x->value; + if ($p->dparameters) + foreach ($p->dparameters as $x) + $params[strtolower($x->attribute)] = $x->value; + + // ATTACHMENT + // Any part with a filename is an attachment, + // so an attached text file (type 0) is not mistaken as the message. + if ($params['filename'] || $params['name']) { + // filename may be given as 'Filename' or 'Name' or both + $filename = ($params['filename'])? $params['filename'] : $params['name']; + // filename may be encoded, so see imap_mime_header_decode() + $fname = tempnam(null,'blog-file-'); + $file = fopen($fname,'w'); + fwrite($file,$data); + fclose($file); + chmod($fname,0644); + + $this->filenames[] = array('filename'=>$fname,'name'=>$filename); + } + + // TEXT + if ($p->type==0 && $data) { + // Messages may be split in different parts because of inline attachments, + // so append parts together with blank row. + if (strtolower($p->subtype)=='plain') + $this->text.= trim($data) ."\n\n"; + else + $this->html.= $data ."<br><br>"; + $charset = $params['charset']; // assume all parts are same charset + } + + // EMBEDDED MESSAGE + // Many bounce notifications embed the original message as type 2, + // but AOL uses type 1 (multipart), which is not handled here. + // There are no PHP functions to parse embedded messages, + // so this just appends the raw source to the main message. + elseif ($p->type==2 && $data) { + $this->text.= $data."\n\n"; + } + + // SUBPART RECURSION + if ($p->parts) { + foreach ($p->parts as $partno0=>$p2) + $this->getpart($mbox,$mid,$p2,$partno.'.'.($partno0+1)); // 1.2, 1.2.1, etc. + } + } + +} + +?>+ \ No newline at end of file diff --git a/source/Mock.class.php b/source/Mock.class.php @@ -0,0 +1,27 @@ +<?php + +class Mock +{ + public $debug = false; + public $config = array(); + + public function pull() + { + $entrys[] = array( + 'filenames'=> array( array('name'=>'Motorrad','filename'=>'/tmp/DSC00281.JPG') ), + 'keywords' => array('Kazakhstan','Motorrad'), + 'timestamp' => time(), + 'subject' => 'Glorious Nation of Kazakhstan', + 'text' => "In Kazakhstan, the favorite hobbies are disco dancing, archery, rape, and table tennis.\n\nWawaweewaa! Ooh lala! Oh well, king in the castle, king in the castle, I have a chair! Go do this, go do this, king in the castle." + ); + + if ( $this->debug ) + echo '<h4>Mock!</h4>'; + + return $entrys; + } + + +} + +?>+ \ No newline at end of file