Skip to content

Commit

Permalink
Merged branch devel-api (from r2208 to r2387) back into trunk (omitti…
Browse files Browse the repository at this point in the history
…ng some sample plugins)
  • Loading branch information
thomascube committed Apr 19, 2009
1 parent fb253ee commit cc97ea0
Show file tree
Hide file tree
Showing 75 changed files with 3,466 additions and 1,270 deletions.
8 changes: 7 additions & 1 deletion config/main.inc.php.dist
Expand Up @@ -35,6 +35,12 @@ $rcmail_config['log_dir'] = 'logs/';
// use this folder to store temp files (must be writeable for apache user)
$rcmail_config['temp_dir'] = 'temp/';

// use this folder to search for plugin sources
$rcmail_config['plugins_dir'] = 'plugins/';

// List of active plugins. Add the name of a directory found in 'plugins_dir'
$rcmail_config['plugins'] = array();

// enable caching of messages and mailbox data in the local database.
// this is recommended if the IMAP server does not run on the same machine
$rcmail_config['enable_caching'] = TRUE;
Expand Down Expand Up @@ -152,7 +158,7 @@ $rcmail_config['date_long'] = 'd.m.Y H:i';
$rcmail_config['date_today'] = 'H:i';

// add this user-agent to message headers when sending
$rcmail_config['useragent'] = 'RoundCube Webmail/0.2-beta';
$rcmail_config['useragent'] = 'RoundCube Webmail/0.3-beta';

// use this name to compose page titles
$rcmail_config['product_name'] = 'RoundCube Webmail';
Expand Down
48 changes: 37 additions & 11 deletions index.php
Expand Up @@ -2,7 +2,7 @@
/*
+-------------------------------------------------------------------------+
| RoundCube Webmail IMAP Client |
| Version 0.2-20080829 |
| Version 0.3-20090419 |
| |
| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland |
| |
Expand Down Expand Up @@ -36,6 +36,9 @@
// init output class
$OUTPUT = !empty($_REQUEST['_remote']) ? $RCMAIL->init_json() : $RCMAIL->load_gui(!empty($_REQUEST['_framed']));

// init plugin API
$RCMAIL->plugins->init();

// set output buffering
if ($RCMAIL->action != 'get' && $RCMAIL->action != 'viewsource') {
// use gzip compression if supported
Expand Down Expand Up @@ -70,21 +73,29 @@
raise_error(array('code' => hexdec($_GET['_code'])), FALSE, TRUE);
}


// trigger startup plugin hook
$startup = $RCMAIL->plugins->exec_hook('startup', array('task' => $RCMAIL->task, 'action' => $RCMAIL->action));
$RCMAIL->set_task($startup['task']);
$RCMAIL->action = $startup['action'];


// try to log in
if ($RCMAIL->action=='login' && $RCMAIL->task=='mail') {
// purge the session in case of new login when a session already exists
$RCMAIL->kill_session();

// set IMAP host
$host = $RCMAIL->autoselect_host();
$RCMAIL->kill_session();

$auth = $RCMAIL->plugins->exec_hook('authenticate', array(
'host' => $RCMAIL->autoselect_host(),
'user' => trim(get_input_value('_user', RCUBE_INPUT_POST)),
)) + array('pass' => get_input_value('_pass', RCUBE_INPUT_POST, true, 'ISO-8859-1'));

// check if client supports cookies
if (empty($_COOKIE)) {
$OUTPUT->show_message("cookiesdisabled", 'warning');
}
else if ($_SESSION['temp'] && !empty($_POST['_user']) && !empty($_POST['_pass']) &&
$RCMAIL->login(trim(get_input_value('_user', RCUBE_INPUT_POST), ' '),
get_input_value('_pass', RCUBE_INPUT_POST, true, 'ISO-8859-1'), $host)) {
else if ($_SESSION['temp'] && !empty($auth['user']) && !empty($auth['host']) && isset($auth['pass']) &&
$RCMAIL->login($auth['user'], $auth['pass'], $auth['host'])) {
// create new session ID
unset($_SESSION['temp']);
rcube_sess_regenerate_id();
Expand All @@ -99,12 +110,22 @@
$RCMAIL->user->ID,
$_SERVER['REMOTE_ADDR']));
}

// restore original request parameters
$query = array();
if ($url = get_input_value('_url', RCUBE_INPUT_POST))
parse_str($url, $query);

// allow plugins to control the redirect url after login success
$redir = $RCMAIL->plugins->exec_hook('login_after', $query + array('task' => $RCMAIL->task));
unset($redir['abort']);

// send redirect
$OUTPUT->redirect();
$OUTPUT->redirect($redir);
}
else {
$OUTPUT->show_message($IMAP->error_code < -1 ? 'imaperror' : 'loginfailed', 'warning');
$RCMAIL->plugins->exec_hook('login_failed', array('code' => $IMAP->error_code, 'host' => $auth['host'], 'user' => $auth['user']));
$RCMAIL->kill_session();
}
}
Expand Down Expand Up @@ -208,9 +229,14 @@
while ($redirects < 5) {
$stepfile = !empty($action_map[$RCMAIL->task][$RCMAIL->action]) ?
$action_map[$RCMAIL->task][$RCMAIL->action] : strtr($RCMAIL->action, '-', '_') . '.inc';


// execute a plugin action
if (eregi('^plugin.', $RCMAIL->action)) {
$RCMAIL->plugins->exec_action($RCMAIL->action);
break;
}
// try to include the step file
if (is_file(($incfile = 'program/steps/'.$RCMAIL->task.'/'.$stepfile))) {
else if (is_file(($incfile = 'program/steps/'.$RCMAIL->task.'/'.$stepfile))) {
include($incfile);
$redirects++;
}
Expand Down
42 changes: 42 additions & 0 deletions plugins/additional_message_headers/additional_message_headers.php
@@ -0,0 +1,42 @@
<?php

/**
* Additional Message Headers
*
* Very simple plugin which will read additional headers for outgoing messages from the config file.
*
* Enable the plugin in config/main.inc.php and add your desired headers.
*
* @version 1.0
* @author Ziba Scott
* @website http://roundcube.net
*
* Example:
*
* $rcmail_config['additional_message_headers']['X-Remote-Browser'] = $_SERVER['HTTP_USER_AGENT'];
* $rcmail_config['additional_message_headers']['X-Originating-IP'] = $_SERVER['REMOTE_ADDR'];
* $rcmail_config['additional_message_headers']['X-RoundCube-Server'] = $_SERVER['SERVER_ADDR'];
* if( isset( $_SERVER['MACHINE_NAME'] )) {
* $rcmail_config['additional_message_headers']['X-RoundCube-Server'] .= ' (' . $_SERVER['MACHINE_NAME'] . ')';
* }
*/
class additional_message_headers extends rcube_plugin
{
public $task = 'mail';

function init()
{
$this->add_hook('outgoing_message_headers', array($this, 'message_headers'));
}

function message_headers($args){

// additional email headers
$additional_headers = rcmail::get_instance()->config->get('additional_message_headers',array());
foreach($additional_headers as $header=>$value){
$args['headers'][$header] = $value;
}

return $args;
}
}
44 changes: 44 additions & 0 deletions plugins/autologon/autologon.php
@@ -0,0 +1,44 @@
<?php

/**
* Sample plugin to try out some hooks.
* This performs an automatic login if accessed from localhost
*/
class autologon extends rcube_plugin
{

function init()
{
$this->add_hook('startup', array($this, 'startup'));
$this->add_hook('authenticate', array($this, 'authenticate'));
}

function startup($args)
{
$rcmail = rcmail::get_instance();

// change action to login
if ($args['task'] == 'mail' && empty($args['action']) && empty($_SESSION['user_id']) && !empty($_GET['_autologin']) && $this->is_localhost())
$args['action'] = 'login';

return $args;
}

function authenticate($args)
{
if (!empty($_GET['_autologin']) && $this->is_localhost()) {
$args['user'] = 'me';
$args['pass'] = '******';
$args['host'] = 'localhost';
}

return $args;
}

function is_localhost()
{
return $_SERVER['REMOTE_ADDR'] == '::1' || $_SERVER['REMOTE_ADDR'] == '127.0.0.1';
}

}

152 changes: 152 additions & 0 deletions plugins/database_attachments/database_attachments.php
@@ -0,0 +1,152 @@
<?php
/**
* Filesystem Attachments
*
* This plugin which provides database backed storage for temporary
* attachment file handling. The primary advantage of this plugin
* is its compatibility with round-robin dns multi-server roundcube
* installations.
*
* This plugin relies on the core filesystem_attachments plugin
*
* @author Ziba Scott <ziba@umich.edu>
*
*/
require_once('plugins/filesystem_attachments/filesystem_attachments.php');
class database_attachments extends filesystem_attachments
{

// A prefix for the cache key used in the session and in the key field of the cache table
private $cache_prefix = "db_attach";

/**
* Helper method to generate a unique key for the given attachment file
*/
private function _key($filepath)
{
return $this->cache_prefix.md5(mktime().$filepath.$_SESSION['user_id']);
}

/**
* Save a newly uploaded attachment
*/
function upload($args)
{
$args['status'] = false;
$rcmail = rcmail::get_instance();
$key = $this->_key($args['path']);
$data = base64_encode(file_get_contents($args['path']));

$status = $rcmail->db->query(
"INSERT INTO ".get_table_name('cache')."
(created, user_id, cache_key, data)
VALUES (".$rcmail->db->now().", ?, ?, ?)",
$_SESSION['user_id'],
$key,
$data);

if ($status) {
$args['id'] = $key;
$args['status'] = true;
unset($args['path']);
}

return $args;
}

/**
* Save an attachment from a non-upload source (draft or forward)
*/
function save($args)
{
$args['status'] = false;
$rcmail = rcmail::get_instance();

$key = $this->_key($args['name']);
$data = base64_encode($args['data']);

$status = $rcmail->db->query(
"INSERT INTO ".get_table_name('cache')."
(created, user_id, cache_key, data)
VALUES (".$rcmail->db->now().", ?, ?, ?)",
$_SESSION['user_id'],
$key,
$data);

if ($status) {
$args['id'] = $key;
$args['status'] = true;
}

return $args;
}

/**
* Remove an attachment from storage
* This is triggered by the remove attachment button on the compose screen
*/
function remove($args)
{
$args['status'] = false;
$rcmail = rcmail::get_instance();
$status = $rcmail->db->query(
"DELETE FROM ".get_table_name('cache')."
WHERE user_id=?
AND cache_key=?",
$_SESSION['user_id'],
$args['id']);

if ($status) {
$args['status'] = true;
}

return $args;
}

/**
* When composing an html message, image attachments may be shown
* For this plugin, $this->get_attachment will check the file and
* return it's contents
*/
function display($args)
{
return $this->get_attachment($args);
}

/**
* When displaying or sending the attachment the file contents are fetched
* using this method. This is also called by the display_attachment hook.
*/
function get_attachment($args)
{
$rcmail = rcmail::get_instance();

$sql_result = $rcmail->db->query(
"SELECT cache_id, data
FROM ".get_table_name('cache')."
WHERE user_id=?
AND cache_key=?",
$_SESSION['user_id'],
$args['id']);

if ($sql_arr = $rcmail->db->fetch_assoc($sql_result)) {
$args['data'] = base64_decode($sql_arr['data']);
$args['status'] = true;
}

return $args;
}

/**
* Delete all temp files associated with this user
*/
function cleanup($args)
{
$rcmail = rcmail::get_instance();
$rcmail->db->query(
"DELETE FROM ".get_table_name('cache')."
WHERE user_id=?
AND cache_key like '{$this->cache_prefix}%'",
$_SESSION['user_id']);
}
}

0 comments on commit cc97ea0

Please sign in to comment.