gforge-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gforge-commits] gforge/cronjobs forum_gateway.php,NONE,1.1


From: tperdue
Subject: [Gforge-commits] gforge/cronjobs forum_gateway.php,NONE,1.1
Date: Wed, 04 Aug 2004 11:18:41 -0500

Update of /cvsroot/gforge/gforge/cronjobs
In directory db.perdue.net:/home/tperdue/share/dev.gforge.org/cronjobs

Added Files:
        forum_gateway.php 
Log Message:
RBAC, DELETION, AND FORUM EMAIL GATEWAY

--- NEW FILE: forum_gateway.php ---
#! /usr/bin/php4 -f
<?php
/**
 * This script will get mails and store it into forum DB
 *
 * Copyright 2004 GForge, LLC
 *
 * @version   $Id: forum_gateway.php,v 1.1 2004/08/04 16:18:34 tperdue Exp $
 * @author Tim Perdue address@hidden
 * @author Sung Kim 
 *
 * This file is part of GForge.
 *
 * GForge 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.
 *
 * GForge 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 GForge; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

require_once ('squal_pre.php');
require_once ('common/include/Group.class');
require_once ('common/include/MailParser.class');
require_once ('common/forum/Forum.class');
require_once ('common/forum/ForumMessage.class');

class ForumGateway extends Error {
        /*
         * variables
         */
        var $From = "";
        var $FromName = "";
        var $FromEmail = "";
        var $Subject = "";
        var $ListId = "";
        var $Reference = "";
        var $MsgId = "";
        var $Sender="";
        var $Body="";
        var $ThreadId=0;
        var $IsFollowUp=0;
        var $Forum=-1;
        var $Parent=0;
        var $ForumId=-1;

        function ForumGateway() {
                $this->Error();
        
                /* Copy mail message to tmp file */
                $tmpfile = $this->copyMailTmp();
                //DBG("Tmpname: ". $tmpfile);

                /* parse email */
                $ret = $this->parseMail($tmpfile);
        
                /* Delete temp file */
                unlink($tmpfile);
        
                /* Check the return variable from parseMail */
                if (!$ret) {
                        return false;
                }

                /* add the info to forum */
                $ret = $this->addMessage();
                if (!$ret) {
                        return false;
                }
        
                return true;
        }
        
        
        /**
         * function - Copy mail(from stdin to tmp and return the tmp file
         *
         * @return tmp file name
         */
        function copyMailTmp() {
                // Unfortunatly we need a temp file
                // mailparse needs to read content several times
                $tmpfile = tempnam ("/tmp", "forum_gateway.".rand()."-".rand());
                $in = fopen("php://stdin", "r");
                $out = fopen($tmpfile, "w");
        
                while($buffer = fgets($in, 4096)) {
                        fputs($out, $buffer);
                }
        
                fclose($in);
                fclose($out);
        
                return $tmpfile;
        }


        /*
         * function - Parse mail and fill all kinds of head and body info
         *
         * @param  string tmp file name
         * @return boolean true if success
         */
        function parseMail($input_file) {
                global $argv;
//DBG("parseMail start");
                
                if (!$mp = new MailParser($input_file)) {
                        $this->setError('Error In MailParser');
//DBG("parseMail error1: ".$mp->getErrorMessage());
                        return false;
                } elseif ($mp->isError()) {
                        $this->setError('Error In MailParser 
'.$mp->getErrorMessage());
//DBG("parseMail error2: ".$mp->getErrorMessage());
                        return false;
                }

                $this->FromEmail = $mp->getFromEmail();
//DBG("email: ".$this->FromEmail);
//echo ")()()()()()()".$this->FromEmail."(*(*(*(*(*";
                //
                //subjects are in this required format: '[group - 
Forum][123456] My Subject'
                //where 123456 is the msg_id of the forum message.
                //we parse that ID to get the forum and thread that this should 
post to
                //
                $subj = $mp->getSubject();
/*
DBG("mp headers: ".implode("**\n",$mp->headers));
DBG("mp body: ".$mp->body);
DBG("SUBJ: ".$subj);
DBG("BODY: ".$mp->getBody());
                $parent_start = (strpos($subj,'[',(strpos($subj,'[')+1))+1);
                $parent_end = (strpos($subj,']',$parent_start)-1);
                $this->Parent = 
substr($subj,$parent_start,($parent_end-$parent_start+1));
                if (!$this->Parent || !is_numeric($this->Parent)) {
//                      $argv[1] - listname
//                      echo "No Parent ".$argv[0]."||".$argv[1];
                        $this->Parent=0;
                        $this->Subject = addslashes($subj);
//                      $this->setError('No Valid Parent ID Found in Subject 
Line');
//                      return false;
                } else {
//                      echo "Parent: 
".$this->Parent."||".$argv[0]."||".$argv[1];
                        $this->Subject = 
addslashes(substr($subj,$parent_end+3));
                }
*/
                if (ereg('(\[)([0-9]*)(\])',$subj,$arr)) {
                        $this->Parent=$arr[2];
                        $parent_end=(strpos($subj,'['.$arr[2].']')) + 
strlen('['.$arr[2].']');
                        $this->Subject = addslashes(substr($subj,$parent_end));
                } else {
                        $this->Subject = addslashes($subj);
                        $this->Parent=0;
                }

                $this->Body =& addslashes($mp->getBody());
//DBG('FPARENT: '.$this->Parent);
//DBG('FSUBJ: '.$this->Subject);
//DBG('FBODY: '.$this->Body);
//exit;
                return true;
        }
        
        /**
         * Insert data into the forum db
         *
         * @return - true or false
         */
        function addMessage() {
                //
                //      get user_id
                //
                $user_id = $this->getUserId();
                if ($user_id) {
                        //
                        //      Set up this user's session before posting
                        //
                        session_set_new($user_id);
                }

                $Forum =& $this->getForum();
                if (!$Forum || !is_object($Forum)) {
                        $this->setError("Could Not Get Forum");
                        return false;
                } elseif ($Forum->isError()) {
                        $this->setError("Forum Error: 
".$Forum->getErrorMessage());
                        return false;
                }
                if (!$user_id && !$Forum->AllowAnonymous()) {
                        $this->setError("Could Not Match Sender Email Address 
to User and Forum Does Not Allow Anonymous Posts");
                        return false;
                }

                //
                //      Create a blank forum message
                //
                $ForumMessage = new ForumMessage($Forum);
                if (!$ForumMessage || !is_object($Forum)) {
                        $this->setError("Could Not Get Forum Message");
                        return false;
                } elseif ($ForumMessage->isError()) {
                        $this->setError("ForumMessage Error: 
".$ForumMessage->getErrorMessage());
                        return false;
                }
                if 
(!$ForumMessage->create($this->Subject,$this->Body,$this->ThreadId,$this->Parent))
 {
                        $this->setError("ForumMessage Create Error: 
".$ForumMessage->getErrorMessage());
                        return false;
                } else {
                        return true;
                }
        }


        
/*------------------------------------------------------------------------
         *  Utility functions 
         
*-----------------------------------------------------------------------*/

        /* Find user_id from email */
        function getUserId() {
                // Find User id using email
                // If no user id, user id is 0;
                $sql = "SELECT user_id FROM users 
                        WHERE lower(email) ='".strtolower($this->FromEmail)."' 
AND status='A'";
                $res = db_query($sql);
                if (!$res || db_numrows($res) < 1) {
                        return false;
                } else {
                        $user_id = db_result($res,0,'user_id');
                }
                db_free_result($res);
        
                return $user_id;
        }

        function &getForum() {
                global $argv;

                if ($this->Forum==-1) {
                        $Group =& group_get_object_by_name($argv[1]);
                        if (!$Group || !is_object($Group)) {
                                $this->setError('Could Not Get Group Object');
                                return false;
                        } elseif ($Group->isError()) {
                                $this->setError('Getting Group Object: 
'.$Group->getErrorMessage());
                                return false;
                        }
                        if ($this->Parent) {
                                //
                                // Find Forum id by parent
                                //
                                $sql = "SELECT group_forum_id,thread_id 
                                        FROM forum
                                        WHERE msg_id='$this->Parent'";
                        } else {
                                //
                                //      Find forum by arguments passed by 
aliases file
                                //
                                $sql = "SELECT group_forum_id, 0 AS thread_id 
                                        FROM forum_group_list
                                        WHERE forum_name='$argv[2]'
                                        AND group_id='".$Group->getID()."'";
                        }
                        $res = db_query($sql);
                        if (!$res || db_numrows($res) < 1) {
                                $this->setError('Getting Forum IDs: 
'.db_error());
                                return false;
                        }
                        $this->ForumId = db_result($res,0,'group_forum_id');
                        $this->ThreadId = db_result($res,0,'thread_id');
                        db_free_result($res);

                        $this->Forum = new Forum($Group,$this->ForumId);
                }
        
                return $this->Forum;
        }
 
}


/**
 * Simple debugging printput
 *
 * Add this in /etc/syslog.conf and see /var/log/debug file:
 * # Debug
 * *.=debug                     /var/log/debug
 * 
 */
function DBG($str) {
        global $debug;
system("echo \"forum: ".$str."\n\" >> /tmp/forum.log");

        if ($debug==1) {
                syslog(LOG_DEBUG, "forum_gateway: ". $str);
        } else if ($debug==2) {
                echo $str."\n";
        }
}
 

/* Main routine */
$debug = 1;
$listforum = new ForumGateway();
if ($listforum->isError()) {
        mail ($listforum->FromEmail,'Forum Post 
Rejected',$listforum->getErrorMessage());
        DBG('Final Message: '.$listforum->getErrorMessage());
} else {
//      DBG("Success!!");
}

?>





reply via email to

[Prev in Thread] Current Thread [Next in Thread]