diff --git a/Rocksolid_Light/newsportal.php b/Rocksolid_Light/newsportal.php deleted file mode 100644 index 12c2c0a..0000000 --- a/Rocksolid_Light/newsportal.php +++ /dev/null @@ -1,1387 +0,0 @@ -HTTP Gateway - * Version: 0.6.x - * Download: https://news.novabbs.com/getrslight - * - * Based on Newsportal by Florian Amrhein - * - * E-Mail: retroguy@novabbs.com - * Web: https://news.novabbs.com - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -if(file_exists("lib/types.inc.php")) - include "lib/types.inc.php"; -if(file_exists("lib/thread.inc.php")) - include "lib/thread.inc.php"; -if(file_exists("lib/message.inc.php")) - include "lib/message.inc.php"; -if(file_exists("lib/post.inc.php")) - include "lib/post.inc.php"; - -$CONFIG = include($config_file); - -/* - * opens the connection to the NNTP-Server - * - * $server: adress of the NNTP-Server - * $port: port of the server - */ -function nntp_open($nserver=0,$nport=0) { - global $text_error,$CONFIG; - global $server,$port; - // echo "
NNTP OPEN
"; - if(!isset($CONFIG['enable_nntp']) || $CONFIG['enable_nntp'] != true) { - $CONFIG['server_auth_user'] = $CONFIG['remote_auth_user']; - $CONFIG['server_auth_pass'] = $CONFIG['remote_auth_pass']; - } - $authorize=((isset($CONFIG['server_auth_user'])) && (isset($CONFIG['server_auth_pass'])) && - ($CONFIG['server_auth_user'] != "")); - if ($nserver==0) $nserver=$server; - if ($nport==0) $nport=$port; - $ns=@fsockopen($nserver,$nport); - $weg=line_read($ns); // kill the first line - if (substr($weg,0,2) != "20") { - echo "

".$text_error["error:"].$weg."

"; - fclose($ns); - $ns=false; - } else { - if ($ns != false) { - fputs($ns,"MODE reader\r\n"); - $weg=line_read($ns); // and once more - if ((substr($weg,0,2) != "20") && - ((!$authorize) || ((substr($weg,0,3) != "480") && ($authorize)))) { - echo "

".$text_error["error:"].$weg."

"; - fclose($ns); - $ns=false; - } - } - if ((isset($CONFIG['server_auth_user'])) && (isset($CONFIG['server_auth_pass'])) && - ($CONFIG['server_auth_user'] != "")) { - fputs($ns,"AUTHINFO USER ".$CONFIG['server_auth_user']."\r\n"); - $weg=line_read($ns); - fputs($ns,"AUTHINFO PASS ".$CONFIG['server_auth_pass']."\r\n"); - $weg=line_read($ns); -/* Only check auth if reading and posting same server */ - if (substr($weg,0,3) != "281" && !(isset($post_server)) && ($post_server!="")) { - echo "

".$text_error["error:"]."

"; - echo "

".$text_error["auth_error"]."

"; - } - } - } - if ($ns==false) echo "

".$text_error["connection_failed"]."

"; - return $ns; -} - -function nntp2_open($nserver=0,$nport=0) { - global $text_error,$CONFIG; - // echo "
NNTP OPEN
"; - $authorize=((isset($CONFIG['remote_auth_user'])) && (isset($CONFIG['remote_auth_pass'])) && - ($CONFIG['remote_auth_user'] != "")); - if ($nserver==0) $nserver=$CONFIG['remote_server']; - if ($nport==0) $nport=$CONFIG['remote_port']; - if($CONFIG['remote_ssl']) { - $ns=@fsockopen('ssl://'.$nserver.":".$nport); - } else { - if(isset($CONFIG['socks_host']) && $CONFIG['socks_host'] !== '') { - $ns=fsocks4asockopen($CONFIG['socks_host'], $CONFIG['socks_port'], $nserver, $nport); - } else { - $ns=@fsockopen('tcp://'.$nserver.":".$nport); - } - } -// $ns=@fsockopen($nserver,$nport); - $weg=line_read($ns); // kill the first line - if (substr($weg,0,2) != "20") { - echo "

".$text_error["error:"].$weg."

"; - fclose($ns); - $ns=false; - } else { - if ($ns != false) { - fputs($ns,"MODE reader\r\n"); - $weg=line_read($ns); // and once more - if ((substr($weg,0,2) != "20") && - ((!$authorize) || ((substr($weg,0,3) != "480") && ($authorize)))) { - echo "

".$text_error["error:"].$weg."

"; - fclose($ns); - $ns=false; - } - } - if ((isset($CONFIG['remote_auth_user'])) && (isset($CONFIG['remote_auth_pass'])) && - ($CONFIG['remote_auth_user'] != "")) { - fputs($ns,"AUTHINFO USER ".$CONFIG['remote_auth_user']."\r\n"); - $weg=line_read($ns); - fputs($ns,"AUTHINFO PASS ".$CONFIG['remote_auth_pass']."\r\n"); - $weg=line_read($ns); -/* Only check auth if reading and posting same server */ - if (substr($weg,0,3) != "281" && !(isset($post_server)) && ($post_server!="")) { - echo "

".$text_error["error:"]."

"; - echo "

".$text_error["auth_error"]."

"; - } - } - } - if ($ns==false) echo "

".$text_error["connection_failed"]."

"; - return $ns; -} - -function fsocks4asockopen($proxyHostname, $proxyPort, $targetHostname, $targetPort) -{ - $sock = fsockopen($proxyHostname, $proxyPort); - if($sock === false) - return false; - fwrite($sock, pack("CCnCCCCC", 0x04, 0x01, $targetPort, 0x00, 0x00, 0x00, 0x01, 0x00).$targetHostname.pack("C", 0x00)); - $response = fread($sock, 16); - $values = unpack("xnull/Cret/nport/Nip", $response); - if($values["ret"] == 0x5a) return $sock; - else - { - fclose($sock); - return false; - } -} - -/* - * Close a NNTP connection - * - * $ns: the handle of the connection - */ -function nntp_close(&$ns) { - if ($ns != false) { - fputs($ns,"QUIT\r\n"); - fclose($ns); - } -} - -/* - * Validates an email adress - * - * $address: a string containing the email-address to be validated - * - * returns true if the address passes the tests, false otherwise. - */ -function validate_email($address) -{ - global $validate_email; - $return=true; - if (($validate_email >= 1) && ($return == true)) -/* Need to clean up this regex to work properly with preg_match - $return = (preg_match('^[-!#$%&\'*+\\./0-9=?A-Z^_A-z{|}~]+'.'@'. - '[-!#$%&\'*+\\/0-9=?A-Z^_A-z{|}~]+\.'. - '[-!#$%&\'*+\\./0-9=?A-Z^_A-z{|}~]+$',$address)); -*/ - $return = 1; - if (($validate_email >= 2) && ($return == true)) { - $addressarray=address_decode($address,"garantiertungueltig"); - $return=checkdnsrr($addressarray[0]["host"],"MX"); - if (!$return) $return=checkdnsrr($addressarray[0]["host"],"A"); - } - return($return); -} - -/* - * decodes a block of 7bit-data in uuencoded format to it's original - * 8bit format. - * The headerline containing filename and permissions doesn't have to - * be included. - * - * $data: The uuencoded data as a string - * - * returns the 8bit data as a string - * - * Note: this function is very slow and doesn't recognize incorrect code. - */ -function uudecode_line($line) { - $data=substr($line,1); - $length=ord($line[0])-32; - $decoded=""; - for ($i=0; $i<(strlen($data)>>2); $i++) { - $pack=substr($data,$i<<2,4); - $upack=""; - $bitmaske=0; - for ($o=0; $o<4; $o++) { - $g=((ord($pack[3-$o])-32)); - if ($g==64) $g=0; - $bitmaske=$bitmaske | ($g << (6*$o)); - } - $schablone=255; - for ($o=0; $o<3; $o++) { - $c=($bitmaske & $schablone) >> ($o << 3); - $schablone=($schablone << 8); - $upack=chr($c).$upack; - } - $decoded.=$upack; - } - $decoded=substr($decoded,0,$length); - return $decoded; -} - -/* - * decodes uuencoded Attachments. - * - * $data: the encoded data - * - * returns the decoded data - */ -function uudecode($data) { - $d=explode("\n",$data); - $u=""; - for ($i=0; $i0) $return.=","; - $o++; - $return.=$groups[$i]; - } - } - return($return); -} - -/* - * read one line from the NNTP-server - */ -function line_read(&$ns) { - if ($ns != false) { - $t=str_replace("\n","",str_replace("\r","",fgets($ns,1200))); - return $t; - } -} - -/* - * Split an internet-address string into its parts. An address string could - * be for example: - * - user@host.domain (Realname) - * - "Realname" - * - user@host.domain - * - * The address will be split into user, host (incl. domain) and realname - * - * $adrstring: The string containing the address in internet format - * $defaulthost: The name of the host which should be returned if the - * address-string doesn't contain a hostname. - * - * returns an hash containing the fields "mailbox", "host" and "personal" - */ -function address_decode($adrstring,$defaulthost) { - $parsestring=trim($adrstring); - $len=strlen($parsestring); - $at_pos=strpos($parsestring,'@'); // find @ - $ka_pos=strpos($parsestring,"("); // find ( - $kz_pos=strpos($parsestring,')'); // find ) - $ha_pos=strpos($parsestring,'<'); // find < - $hz_pos=strpos($parsestring,'>'); // find > - $space_pos=strpos($parsestring,')'); // find ' ' - $email=""; - $mailbox=""; - $host=""; - $personal=""; - if ($space_pos != false) { - if (($ka_pos != false) && ($kz_pos != false)) { - $personal=substr($parsestring,$ka_pos+1,$kz_pos-$ka_pos-1); - $email=trim(substr($parsestring,0,$ka_pos-1)); - } - } else { - $email=$adrstring; - } - if (($ha_pos != false) && ($hz_pos != false)) { - $email=trim(substr($parsestring,$ha_pos+1,$hz_pos-$ha_pos-1)); - $personal=substr($parsestring,0,$ha_pos-1); - } - if ($at_pos != false) { - $mailbox=substr($email,0,strpos($email,'@')); - $host=substr($email,strpos($email,'@')+1); - } else { - $mailbox=$email; - $host=$defaulthost; - } - $personal=trim($personal); - if (substr($personal,0,1) == '"') $personal=substr($personal,1); - if (substr($personal,strlen($personal)-1,1) == '"') - $personal=substr($personal,0,strlen($personal)-1); - $result["mailbox"]=trim($mailbox); - $result["host"]=trim($host); - if ($personal!="") $result["personal"]=$personal; - $complete[]=$result; - return ($complete); -} - -/* - * Read the groupnames from groups.txt, and get additional informations - * of the groups from the newsserver - */ -function groups_read($server,$port,$load=0) { - global $gl_age,$file_groups,$spooldir,$config_name,$cache_index; - // is there a cached version, and is it actual enough? - $cachefile=$spooldir.'/'.$config_name.'-groups.dat'; - // if cache is new enough, don't recreate it - clearstatcache(TRUE, $cachefile); - if($load == 1 && file_exists($cachefile) && (filemtime($cachefile)+$cache_index>time())) { - return; - } - if(file_exists($cachefile) && $load == 0) { - // cached file exists and is new enough, so lets read it out. - $file=fopen($cachefile,"r"); - $data=""; - while(!feof($file)) { - $data.=fgets($file,1000); - } - fclose($file); - $newsgroups=unserialize($data); - } else { - $ns=nntp_open($server,$port); - if ($ns == false) return false; - $gf=fopen($file_groups,"r"); - // if we want to mark groups with new articles with colors, wie will later - // need the format of the overview - $overviewformat=thread_overview_read($ns); - while (!feof($gf)) { - $gruppe=new newsgroupType; - $tmp=trim(line_read($gf)); - $tmp=preg_replace('/\t/', ' ', $tmp); - if(substr($tmp,0,1)==":") { - $gruppe->text=substr($tmp,1); - $newsgroups[]=$gruppe; - } elseif(strlen(trim($tmp))>0) { - // is there a description in groups.txt? - $pos=strpos($tmp," "); - if ($pos != false) { - // yes. - $gruppe->name=substr($tmp,0,$pos); - $desc=substr($tmp,$pos); - } else { - // no, get it from the newsserver. - $gruppe->name=$tmp; - fputs($ns,"XGTITLE $gruppe->name\r\n"); - $response=line_read($ns); - if (strcmp(substr($response,0,3),"282") == 0) { - $neu=line_read($ns); - do { - $response=$neu; - if ($neu != ".") $neu=line_read($ns); - } while ($neu != "."); - $desc=strrchr($response,"\t"); - if (strcmp($response,".") == 0) { - $desc="-"; - } - } else { - $desc=""; - } - if (strcmp(substr($response,0,3),"500") == 0) - $desc="-"; - } - if (strcmp($desc,"") == 0) $desc="-"; - $gruppe->description=$desc; - fputs($ns,"GROUP ".$gruppe->name."\r\n"); - $t=explode(" ",line_read($ns)); -//RETRO - if($t[0]=="211") - $gruppe->count=$t[1]; - else { - nntp_close($ns); - $ns=nntp_open($server,$port); - if ($ns == false) return false; - fputs($ns,"GROUP ".$gruppe->name."\r\n"); - $t=explode(" ",line_read($ns)); - if($t[0]=="211") - $gruppe->count=$t[1]; - else - continue; - } - // mark group with new articles with colors - if($gl_age) { - fputs($ns,'XOVER '.$t[3]."\r\n"); - $tmp=explode(" ",line_read($ns)); - if($tmp[0]=="224") { - $tmp=line_read($ns); - if($tmp!=".") { - $head=thread_overview_interpret($tmp,$overviewformat,$gruppe->name); - $tmp=line_read($ns); - $gruppe->age=$head->date; - } - } - } - if ((strcmp(trim($gruppe->name),"") != 0) && - (substr($gruppe->name,0,1) != "#")) - $newsgroups[]=$gruppe; - } - } - fclose($gf); - nntp_close($ns); - // write the data to the cachefile - $file=fopen($cachefile,"w"); - fputs($file,serialize($newsgroups)); - fclose($file); - } - if ($load == 0) { - return $newsgroups; - } else { - return; - } -} - -function groups_show($gruppen) { - global $gl_age,$frame,$spooldir,$CONFIG,$spoolnews; - if ($gruppen == false) return; - global $file_thread,$text_groups; - $c = count($gruppen); - $acttype="keins"; - echo ''; - for($i = 0 ; $i < $c ; $i++) { - $g = $gruppen[$i]; - if(isset($g->text)) { - if($acttype!="text") { - $acttype="text"; - } - } else { - if($acttype!="group") { - $acttype="group"; - } -/* Display group name and description */ - $lineclass="np_thread_line".(($i%2)+1); - - echo ''; - - echo '
'; - echo 'LatestNewsgroupMessagesLast Message
'; - echo ''; - if(is_file("../common/mods/images/latest.png")) { - echo ''; - } else { - echo ''; - } - echo ''; - echo ''; - echo ''; - echo ''.group_display_name($g->name)."\n"; - if($g->description!="-") - echo '

'.$g->description.'

'; - -/* Display article count */ - echo '
'; - if($gl_age) - $datecolor=thread_format_date_color($g->age); - echo ''; - if($datecolor!="") - echo ''.$g->count.''; - else - echo $g->count; - echo ''; - -/* Display latest article info */ - echo '
'; - $filename = $spooldir."/".$g->name."-lastarticleinfo.dat"; - if($file=@fopen($filename,"r")) { - $lastarticleinfo=unserialize(fread($file,filesize($filename))); - fclose($file); - } else { - $lastarticleinfo->date = 0; - } - if((isset($spoolnews)) && ($spoolnews === true)) { - $ovfp=popen($CONFIG['tac'].' '.$spooldir.'/'.$g->name.'-overview', 'r'); - $lastpost=fgets($ovfp); - pclose($ovfp); - $lastdata = explode("\t", $lastpost); - echo get_date_interval(date("D, j M Y H:i T",strtotime($lastdata[3]))); - $fromline=address_decode(headerDecode($lastdata[2]),"nirgendwo"); - if (!isset($fromline[0]["personal"])) { - $lastname=$fromline[0]["mailbox"];; - } else { - $lastname=$fromline[0]["personal"]; - } - } else { - echo get_date_interval(date("D, j M Y H:i T",$lastarticleinfo->date)); - $lastarticleinfo->name = ltrim($lastarticleinfo->name, "<"); - $lastname = $lastarticleinfo->name; - } - echo '
'; - echo 'by: '; - echo create_name_link($lastname); - echo '
'; - } - echo "\n"; - flush(); - } - echo "
\n"; -} - -/* - * print the group names from an array to the webpage - */ -function groups_show_frames($gruppen) { - global $gl_age,$frame,$spooldir; - if ($gruppen == false) return; - global $file_thread,$text_groups; - $c = count($gruppen); - echo '
'; - $acttype="keins"; - for($i = 0 ; $i < $c ; $i++) { - $g = $gruppen[$i]; - if(isset($g->text)) { - if($acttype!="text") { - $acttype="text"; - if($i>0) - echo '
'; - echo '
'; - } - echo $g->text; - } else { - if($acttype!="group") { - $acttype="group"; - if($i>0) - echo '
'; - echo '
'; - } - echo '
'; - echo ''.group_display_name($g->name)."\n"; - if($gl_age) - $datecolor=thread_format_date_color($g->age); - echo '('; - if($datecolor!="") - echo ''.$g->count.''; - else - echo $g->count; - echo ')'; - if($g->description!="-") - echo '
'.$g->description.''; - echo '
'; - } - echo "\n"; - flush(); - } - echo "
\n"; -} - -/* - * gets a list of aviable articles in the group $groupname - */ -/* -function getArticleList(&$ns,$groupname) { - fputs($ns,"LISTGROUP $groupname \r\n"); - $line=line_read($ns); - $line=line_read($ns); - while(strcmp($line,".") != 0) { - $articleList[] = trim($line); - $line=line_read($ns); - } - if (!isset($articleList)) $articleList="-"; - return $articleList; -} -*/ - -/* - * Decode quoted-printable or base64 encoded headerlines - * - * $value: The to be decoded line - * - * returns the decoded line - */ -function headerDecode($value) { - return mb_decode_mimeheader($value); -} - -/* - * calculates an Unix timestamp out of a Date-Header in an article - * - * $value: Value of the Date: header - * - * returns an Unix timestamp - */ -function getTimestamp($value) { - global $CONFIG; - - return strtotime($value); -} - -function parse_header($hdr,$number="") { - for ($i=count($hdr)-1; $i>0; $i--) - if (preg_match("/^(\x09|\x20)/",$hdr[$i])) - $hdr[$i-1]=$hdr[$i-1]." ".ltrim($hdr[$i]); - $header = new headerType; - $header->isAnswer=false; - for ($count=0;$countfrom=$fromline[0]["mailbox"]."@".$fromline[0]["host"]; - $header->username=$fromline[0]["mailbox"]; - if (!isset($fromline[0]["personal"])) { - $header->name=""; - } else { - $header->name=$fromline[0]["personal"]; - } - break; - case "message-id:": - $header->id=$value; - break; - case "subject:": - $header->subject=headerDecode($value); - break; - case "newsgroups:": - $header->newsgroups=$value; - break; - case "organization:": - $header->organization=headerDecode($value); - break; - case "content-transfer-encoding:": - $header->content_transfer_encoding=trim(strtolower($value)); - break; - case "content-type:": - $header->content_type=array(); - $subheader=explode(";",$value); - $header->content_type[0]=strtolower(trim($subheader[0])); - for ($i=1; $icontent_type_charset=array(strtolower($subvalue)); - break; - case "name": - $header->content_type_name=array($subvalue); - break; - case "boundary": - $header->content_type_boundary=$subvalue; - break; - case "format": - $header->content_type_format=array($subvalue); - } - } - } - break; - case "references:": - $ref=trim($value); - while (strpos($ref,"> <") != false) { - $header->references[]=substr($ref,0,strpos($ref," ")); - $ref=substr($ref,strpos($ref,"> <")+2); - } - $header->references[]=trim($ref); - break; - case "date:": - $header->date=getTimestamp(trim($value)); - break; - case "followup-to:": - $header->followup=trim($value); - break; - case "x-newsreader:": - case "x-mailer:": - case "x-rslight-to:": - $header->rslight_to=trim($value); - break; - case "x-rslight-site:": - $header->rslight_site=trim($value); - break; - case "user-agent:": - $header->user_agent=trim($value); - break; - case "x-face:": // not ready -// echo "

-".base64_decode($value)."-

"; - break; - case "x-no-archive:": - $header->xnoarchive=strtolower(trim($value)); - } - } - if (!isset($header->content_type[0])) - $header->content_type[0]="text/plain"; - if (!isset($header->content_transfer_encoding)) - $header->content_transfer_encoding="8bit"; - if ($number != "") $header->number=$number; - return $header; -} - -/* - * convert the charset of a text - */ -function recode_charset($text,$source=false,$dest=false) { - global $iconv_enable,$www_charset; - if($dest==false) - $dest=$www_charset; - if(($iconv_enable) && ($source!=false)) { - $return=iconv($source, - $dest."//TRANSLIT",$text); - if($return!="") - return $return; - else - return $text; - } else { - return $text; - } -} - -function decode_body($body,$encoding) { - $bodyzeile=""; - switch ($encoding) { - case "base64": - $body=base64_decode($body); - break; - case "quoted-printable": - $body=Quoted_printable_decode($body); - $body=str_replace("=\n","",$body); -// default: -// $body=str_replace("\n..\n","\n.\n",$body); - } - - return $body; -} - -/* - * makes URLs clickable - * - * $text: A text-line probably containing links. - * - * the function returns the text-line with HTML-Links to the links or - * email-adresses. - */ -function html_parse($text) { - global $frame_externallink; - if ((isset($frame_externallink)) && ($frame_externallink != "")) { - $target=' TARGET="'.$frame_externallink.'" '; - } else { - $target=' '; - } - // regular expressions that will be applied to every word in the text - $regexp_replace=array( - 'http://((\.*([-a-z0-9_/~@?=%#;+]|&)+)+)' => - 'http://\1', - '(www\.[-a-z]+\.(de|pl|cz|sk|tk|tv|cc|cx|biz|us|uk|info|int|eu|dk|org|net|at|ch|com))' => - '\1', - 'https://([-a-z0-9_./~@?=%#&;\n]+)' => - 'https://\1', - 'gopher://([-a-z0-9_./~@?=%\n]+)' => - 'gopher://\1', - 'news://([-a-z0-9_./~@?=%\n]+)' => - 'news://\1', - 'ftp://([-a-z0-9_./~@?=%\n]+)' => - 'ftp://\1', - //'([-a-z0-9_./n]+)@([-a-z0-9_.]+)' => - // $_SESSION["loggedin"]!==true ? '(e-Mail)' : - // '\1@\2' - ); - $ntext=""; - // split every line into it's words - $words=explode(" ",$text); - $n=count($words); - for($i=0; $i<$n; $i++) { - $word=$words[$i]; - // test, if we need the slow walk through all the regular expressions - if(preg_match('/www|\:|@/i',$word)) { - // apply the regular expressions to the word until a matching - // expression is found - foreach ($regexp_replace as $key => $value) { - $nword=preg_replace('/{$key}/i',$value,$word); - if($nword!=$word) { - $word=$nword; - break; - } - } - } - // add the spaces between the words - if($i>0) - $ntext.=" "; - $ntext.=$word; - } - return($ntext); -} - - -/* - * read the header of an article in plaintext into an array - * $articleNumber can be the number of an article or its message-id. - */ -function readPlainHeader(&$ns,$group,$articleNumber) { - fputs($ns,"GROUP $group\r\n"); - $line=line_read($ns); - fputs($ns,"HEAD $articleNumber\r\n"); - $line=line_read($ns); - if (substr($line,0,3) != "221") { - echo $text_error["article_not_found"]; - $header=false; - } else { - $line=line_read($ns); - $body=""; - while(strcmp(trim($line),".") != 0) { - $body .= $line."\n"; - $line=line_read($ns); - } - return explode("\n",str_replace("\r\n","\n",$body)); - } -} - -/* - * cancel an article on the newsserver - * - * DO NOT USE THIS FUNCTION, IF YOU DON'T KNOW WHAT YOU ARE DOING! - * - * $ns: The handler of the NNTP-Connection - * $group: The group of the article - * $id: the Number of the article inside the group or the message-id - */ -function message_cancel($subject,$from,$newsgroups,$ref,$body,$id) { - global $server,$port,$send_poster_host,$CONFIG,$text_error; - global $www_charset; - flush(); - $ns=nntp_open($server,$port); - if ($ns != false) { - fputs($ns,"POST\r\n"); - $weg=line_read($ns); - fputs($ns,'Subject: '.quoted_printable_encode($subject)."\r\n"); - fputs($ns,'From: '.$from."\r\n"); - fputs($ns,'Newsgroups: '.$newsgroups."\r\n"); - fputs($ns,"Mime-Version: 1.0\r\n"); - fputs($ns,"Content-Type: text/plain; charset=".$www_charset."\r\n"); - fputs($ns,"Content-Transfer-Encoding: 8bit\r\n"); - if ($send_poster_host) - fputs($ns,'X-HTTP-Posting-Host: '.gethostbyaddr(getenv("REMOTE_ADDR"))."\r\n"); - if ($ref!=false) fputs($ns,'References: '.$ref."\r\n"); - if (isset($CONFIG['organization'])) - fputs($ns,'Organization: '.quoted_printable_encode($CONFIG['organization'])."\r\n"); - fputs($ns,"Control: cancel ".$id."\r\n"); - $body=str_replace("\n.\r","\n..\r",$body); - $body=str_replace("\r",'',$body); - $b=explode("\n",$body); - $body=""; - for ($i=0; $i") != false ) | (strcmp(substr($b[$i],0,1),">") == 0)) { - $body .= textwrap(stripSlashes($b[$i]),78,"\r\n")."\r\n"; - } else { - $body .= textwrap(stripSlashes($b[$i]),74,"\r\n")."\r\n"; - } - } - fputs($ns,"\r\n".$body."\r\n.\r\n"); - $message=line_read($ns); - nntp_close($ns); - } else { - $message=$text_error["post_failed"]; - } - return $message; -} -function rslight_encrypt($data, $key) { - $encryption_key = base64_decode($key); - $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc')); - $encrypted = openssl_encrypt($data, 'aes-256-cbc', $encryption_key, 0, $iv); - return base64_encode($encrypted . '::' . $iv); -} - -function _rawurlencode($string) { - $string = rawurlencode(str_replace('+','%2B',$string)); - return $string; -} - -function _rawurldecode($string) { - $string = rawurldecode(str_replace('%2B','+',$string)); - return $string; -} - -function rslight_decrypt($data, $key) { - $encryption_key = base64_decode($key); - list($encrypted_data, $iv) = explode('::', base64_decode($data), 2); - return openssl_decrypt($encrypted_data, 'aes-256-cbc', $encryption_key, 0, $iv); -} - -function group_display_name($gname) -{ - global $config_dir; - $namelist = file($config_dir."rename.conf", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); - foreach($namelist as $name) { - if($name[0] == '#') { - continue; - } - $nameitem = explode(':', $name); - if(!strcmp(trim($nameitem[0]),trim($gname))) { - return $nameitem[1]; - } - } - return $gname; -} -function check_bbs_auth($username, $password) { - global $config_dir,$CONFIG; - - $workpath = $config_dir."users/"; - $username = trim(strtolower($username)); - $userFilename = $workpath.$username; - $keyFilename = $config_dir."/userconfig/".$username; - -// Create accounts for $anonymous and $CONFIG['server_auth_user'] if not exist - if($username == strtolower($CONFIG['anonusername'])) { - if(filemtime($config_dir."rslight.inc.php") > filemtime($userFilename)) { - if ($userFileHandle = @fopen($userFilename, 'w+')) - { - fwrite($userFileHandle, password_hash($CONFIG['anonuserpass'], PASSWORD_DEFAULT)); - fclose($userFileHandle); - } - } - } - if($username == strtolower($CONFIG['server_auth_user'])) { - if(filemtime($config_dir."rslight.inc.php") > filemtime($userFilename)) { - if ($userFileHandle = @fopen($userFilename, 'w+')) - { - fwrite($userFileHandle, password_hash($CONFIG['server_auth_pass'], PASSWORD_DEFAULT)); - fclose($userFileHandle); - } - } - } - - if(trim($username) == strtolower($CONFIG['anonusername']) && $CONFIG['anonuser'] != true) { - return FALSE; - } - - if ($userFileHandle = @fopen($userFilename, 'r')) - { - $userFileInfo = fread($userFileHandle, filesize($userFilename)); - fclose($userFileHandle); - if (password_verify ( $password , $userFileInfo)) - { - touch($userFilename); - $ok = TRUE; - } else { - return FALSE; - } - } else { - $ok = FALSE; - } - if ($ok) - { - return TRUE; - } else { - if(isset($CONFIG['auto_create']) && $CONFIG['auto_create'] == true) { - if ($userFileHandle = @fopen($userFilename, 'w+')) { - fwrite($userFileHandle, password_hash($password, PASSWORD_DEFAULT)); - fclose($userFileHandle); - chmod($userFilename, 0666); - } - $newkey = base64_encode(openssl_random_pseudo_bytes(44)); - if ($userFileHandle = @fopen($keyFilename, 'w+')) { - fwrite($userFileHandle, 'encryptionkey:'.$newkey); - fclose($userFileHandle); - chmod($userFilename, 0666); - } - return TRUE; - } else { - return FALSE; - } - } -} -function check_encryption_groups($request) { - global $config_path; - $groupsFilename = $config_path."encryption_ok.txt"; - if ($groupsFileHandle = @fopen($groupsFilename, 'r')) - { - while (!feof($groupsFileHandle)) - { - $buffer = fgets($groupsFileHandle); - $buffer = str_replace(array("\r", "\n"), '',$buffer); - if(!strcmp($buffer, $request)) { - fclose($groupsFileHandle); - return TRUE; - } - } - fclose($userFileHandle); - } else { - return FALSE; - } -} - -function set_user_config($username,$request,$newval) { - global $config_dir; - $userconfigpath = $config_dir."userconfig/"; - $username = strtolower($username); - $userFilename = $userconfigpath.$username; - $userData = file($userFilename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); - $userFileHandle = fopen($userFilename, 'w'); - - $found=0; - foreach($userData as $data) { - if(strpos($data, $request.':') !== FALSE) { - fputs($userFileHandle, $request.':'.$newval."\r\n"); - $found=1; - } else { - fputs($userFileHandle, $data."\r\n"); - } - } - if($found == 0) { - fputs($userFileHandle, $request.':'.$newval."\r\n"); - } - fclose($userFileHandle); - return; -} - -function get_user_config($username,$request) { - global $config_dir; - $userconfigpath = $config_dir."userconfig/"; - $username = strtolower($username); - $userFilename = $userconfigpath.$username; - - if ($userFileHandle = @fopen($userFilename, 'r')) - { - while (!feof($userFileHandle)) - { - $buffer = fgets($userFileHandle); - if(strpos($buffer, $request.':') !== FALSE) { - $userdataline=$buffer; - fclose($userFileHandle); - $userdatafound = explode(':',$userdataline); - return $userdatafound[1]; - } - } - fclose($userFileHandle); - return FALSE; - } else { - return FALSE; - } -} - -function is_multibyte($s) { - return mb_strlen($s,'utf-8') < strlen($s); -} - -function check_spam($subject,$from,$newsgroups,$ref,$body,$msgid) -{ - global $msgid_generate,$msgid_fqdn,$spooldir; - global $CONFIG; - $spamfile = tempnam($spooldir, 'spam-'); - - $tmpheader='From: '.$from."\r\n"; - if(strpos($from, $CONFIG['anonusername'])) { - $tmpheader.="Anonymous: TRUE\r\n"; - } - $tmpheader.='Message-ID: '.$msgid."\r\n"; - $tmpheader.='Subject: '.encode_subject($subject)."\r\n\r\n"; - if ($spamFileHandle = fopen($spamfile, 'w')) - { - fwrite($spamFileHandle, $tmpheader); - fwrite($spamFileHandle, $body); - $spamcommand = $CONFIG['spamc'].' -E < '.$spamfile; - ob_start(); - $spamresult = passthru($spamcommand, $res); - $spamresult = ob_get_contents(); - ob_end_clean(); - $spam_fail=1; - foreach (explode(PHP_EOL, $spamresult) as $line) { - $line = str_replace(array("\n\r", "\n", "\r"), '', $line); - if(strpos($line, 'X-Spam-Checker-Version:') !== FALSE) { - $spamcheckerversion = $line; - $spam_fail=0; - } - if(strpos($line, 'X-Spam-Level:') !== FALSE) { - $spamlevel = $line; - } - } - } - fclose($spamFileHandle); - unlink($spamfile); - return array( - 'res' => $res, - 'spamresult' => $spamresult, - 'spamcheckerversion' => $spamcheckerversion, - 'spamlevel' => $spamlevel, - 'spam_fail' => $spam_fail - ); -} - -function format_log_date() { - return date('M d H:i:s'); -} - -function create_name_link($name) { - global $CONFIG; - if(strpos($name, '...@') !== false && (isset($CONFIG['hide_email']) && $CONFIG['hide_email'] == true)) { - $return = ''.substr(htmlspecialchars($name),0,20).''; - } else { - $return = ''.substr(htmlspecialchars($name),0,20).''; - } - return($return); -} -function truncate_email($address) { - $before_at = explode('@', $address); - $namelen = strlen($before_at[0]); - if ($namelen > 3) { - $endname = $namelen - 3; - if($endname > 8) - $endname = 8; - if($endname < 3) - $endname++; - if($endname < 3) - $endname++; - } else { - $endname = $namelen; - } - return substr($before_at[0], 0, $endname).'...'.substr($address, $namelen, strlen($address)); -} - -function get_date_interval($value) { - $current = time(); - $datetime1 = date_create($value); - $datetime2 = date_create("@$current"); - $interval = date_diff($datetime1, $datetime2); - $years = $interval->format('%y')." Years "; - $months = $interval->format('%m')." Months "; - $days = $interval->format('%d')." Days "; - $hours = $interval->format('%h')." Hours "; - $minutes = $interval->format('%i')." Minutes "; - if($interval->format('%y') == 1) { - $years = $interval->format('%y')." Year "; - } - if($interval->format('%m') == 1) { - $months = $interval->format('%m')." Month "; - } - if($interval->format('%d') == 1) { - $days = $interval->format('%d')." Day "; - } - if($interval->format('%h') == 1) { - $hours = $interval->format('%h')." Hour "; - } - if($interval->format('%i') == 1) { - $minutes = $interval->format('%i')." Minute "; - } - if($interval->format('%y') == 0) { - $years = ''; - } - if($interval->format('%m') == 0) { - $months = ''; - } - if($interval->format('%d') == 0) { - $days = ''; - } - if($interval->format('%h') == 0) { - $hours = ''; - } - if($interval->format('%i') == 0) { - $minutes = ''; - } - if($years > 0) { - $days = ''; - $hours = ''; - $minutes = ''; - } - if($months > 0) { - $hours = ''; - $minutes = ''; - } - if($days > 0) { - $minutes = ''; - } - $variance = $interval->format($years.$months.$days.$hours.$minutes.' ago'); - if(strlen($variance) < 5) { - $variance = " now"; - } - return $variance; -} - -function rslight_db_open($database, $table='overview') { - try { - $dbh = new PDO('sqlite:'.$database); - } catch (PDOExeption $e) { - echo 'Connection failed: '.$e->getMessage(); - exit; - } - $dbh->exec("CREATE TABLE IF NOT EXISTS overview( - id INTEGER PRIMARY KEY, - newsgroup TEXT, - number TEXT, - msgid TEXT, - date TEXT, - name TEXT, - subject TEXT)"); - $stmt = $dbh->query('CREATE INDEX IF NOT EXISTS id_date on overview(date)'); - $stmt->execute(); - $stmt = $dbh->query('CREATE INDEX IF NOT EXISTS id_newsgroup on overview(newsgroup)'); - $stmt->execute(); - $stmt = $dbh->query('CREATE INDEX IF NOT EXISTS id_newsgroup_number on overview(newsgroup,number)'); - $stmt->execute(); - $stmt = $dbh->query('CREATE INDEX IF NOT EXISTS id_name on overview(name)'); - $stmt->execute(); - return($dbh); -} - -function article_db_open($database) { - try { - $dbh = new PDO('sqlite:'.$database); - } catch (PDOExeption $e) { - echo 'Connection failed: '.$e->getMessage(); - exit; - } - $dbh->exec("CREATE TABLE IF NOT EXISTS articles( - id INTEGER PRIMARY KEY, - newsgroup TEXT, - number TEXT UNIQUE, - msgid TEXT UNIQUE, - date TEXT, - name TEXT, - subject TEXT, - article TEXT)"); - $stmt = $dbh->query('CREATE INDEX IF NOT EXISTS db_number on articles(number)'); - $stmt->execute(); -return($dbh); -} - -function np_get_db_article($article, $group, $makearray=1, $dbh=null) { - global $config_dir,$path,$groupconfig,$config_name,$logdir,$spooldir; - $logfile=$logdir.'/newsportal.log'; - $msg2=""; - $closeme = 0; - $database = $spooldir.'/'.$group.'-articles.db3'; - if(!$dbh) { - $dbh = article_db_open($database); - $closeme = 1; - } - $ok_article = 0; -// By Message-ID - if(!is_numeric($article)) { - $stmt = $dbh->prepare("SELECT * FROM articles WHERE msgid like :terms"); - $stmt->bindParam(':terms', $article); - $stmt->execute(); - while($found = $stmt->fetch()) { - $msg2 = $found['article']; - $ok_article = 1; - break; - } - } else { - $stmt = $dbh->prepare("SELECT * FROM articles WHERE number = :terms"); - $stmt->bindParam(':terms', $article); - $stmt->execute(); - while($found = $stmt->fetch()) { - $msg2 = $found['article']; - $ok_article = 1; - break; - } - } - if($closeme == 1) { - $dbh = null; - } - if($ok_article !== 1) { - file_put_contents($logfile, "\n".format_log_date()." ".$config_name." DEBUG: ".$article." from ".$group." not found in database", FILE_APPEND); - return FALSE; - } - file_put_contents($logfile, "\n".format_log_date()." ".$config_name." DEBUG: fetched: ".$article." from ".$group, FILE_APPEND); - if($makearray == 1) { - $thisarticle = preg_split("/\r\n|\n|\r/", trim($msg2)); - array_pop($thisarticle); - return $thisarticle; - } else { - return trim($msg2); - } -} - -function get_config_value($configfile,$request) { - global $config_dir; - - if ($configFileHandle = @fopen($config_dir.'/'.$configfile, 'r')) - { - while (!feof($configFileHandle)) - { - $buffer = fgets($configFileHandle); - if(strpos($buffer, $request.':') !== FALSE) { - $dataline=$buffer; - fclose($configFileHandle); - $datafound = explode(':',$dataline); - return $datafound[1]; - } - } - fclose($configFileHandle); - return FALSE; - } else { - return FALSE; - } -} -?>