Merge branch 'master' into movable_apps

This commit is contained in:
Georg Ehrke 2012-04-20 22:41:39 +02:00
commit 711aa229b8
28 changed files with 8559 additions and 116 deletions

2473
3rdparty/class.phpmailer.php vendored Normal file

File diff suppressed because it is too large Load Diff

817
3rdparty/class.smtp.php vendored Normal file
View File

@ -0,0 +1,817 @@
<?php
/*~ class.smtp.php
.---------------------------------------------------------------------------.
| Software: PHPMailer - PHP email class |
| Version: 5.2 |
| Site: https://code.google.com/a/apache-extras.org/p/phpmailer/ |
| ------------------------------------------------------------------------- |
| Admin: Jim Jagielski (project admininistrator) |
| Authors: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net |
| : Marcus Bointon (coolbru) coolbru@users.sourceforge.net |
| : Jim Jagielski (jimjag) jimjag@gmail.com |
| Founder: Brent R. Matzelle (original founder) |
| Copyright (c) 2010-2011, Jim Jagielski. All Rights Reserved. |
| Copyright (c) 2004-2009, Andy Prevost. All Rights Reserved. |
| Copyright (c) 2001-2003, Brent R. Matzelle |
| ------------------------------------------------------------------------- |
| License: Distributed under the Lesser General Public License (LGPL) |
| http://www.gnu.org/copyleft/lesser.html |
| This program is distributed in the hope that it will be useful - WITHOUT |
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| FITNESS FOR A PARTICULAR PURPOSE. |
'---------------------------------------------------------------------------'
*/
/**
* PHPMailer - PHP SMTP email transport class
* NOTE: Designed for use with PHP version 5 and up
* @package PHPMailer
* @author Andy Prevost
* @author Marcus Bointon
* @copyright 2004 - 2008 Andy Prevost
* @author Jim Jagielski
* @copyright 2010 - 2011 Jim Jagielski
* @license http://www.gnu.org/copyleft/lesser.html Distributed under the Lesser General Public License (LGPL)
* @version $Id: class.smtp.php 450 2010-06-23 16:46:33Z coolbru $
*/
/**
* SMTP is rfc 821 compliant and implements all the rfc 821 SMTP
* commands except TURN which will always return a not implemented
* error. SMTP also provides some utility methods for sending mail
* to an SMTP server.
* original author: Chris Ryan
*/
class SMTP {
/**
* SMTP server port
* @var int
*/
public $SMTP_PORT = 25;
/**
* SMTP reply line ending
* @var string
*/
public $CRLF = "\r\n";
/**
* Sets whether debugging is turned on
* @var bool
*/
public $do_debug; // the level of debug to perform
/**
* Sets VERP use on/off (default is off)
* @var bool
*/
public $do_verp = false;
/**
* Sets the SMTP PHPMailer Version number
* @var string
*/
public $Version = '5.2';
/////////////////////////////////////////////////
// PROPERTIES, PRIVATE AND PROTECTED
/////////////////////////////////////////////////
private $smtp_conn; // the socket to the server
private $error; // error if any on the last call
private $helo_rply; // the reply the server sent to us for HELO
/**
* Initialize the class so that the data is in a known state.
* @access public
* @return void
*/
public function __construct() {
$this->smtp_conn = 0;
$this->error = null;
$this->helo_rply = null;
$this->do_debug = 0;
}
/////////////////////////////////////////////////
// CONNECTION FUNCTIONS
/////////////////////////////////////////////////
/**
* Connect to the server specified on the port specified.
* If the port is not specified use the default SMTP_PORT.
* If tval is specified then a connection will try and be
* established with the server for that number of seconds.
* If tval is not specified the default is 30 seconds to
* try on the connection.
*
* SMTP CODE SUCCESS: 220
* SMTP CODE FAILURE: 421
* @access public
* @return bool
*/
public function Connect($host, $port = 0, $tval = 30) {
// set the error val to null so there is no confusion
$this->error = null;
// make sure we are __not__ connected
if($this->connected()) {
// already connected, generate error
$this->error = array("error" => "Already connected to a server");
return false;
}
if(empty($port)) {
$port = $this->SMTP_PORT;
}
// connect to the smtp server
$this->smtp_conn = @fsockopen($host, // the host of the server
$port, // the port to use
$errno, // error number if any
$errstr, // error message if any
$tval); // give up after ? secs
// verify we connected properly
if(empty($this->smtp_conn)) {
$this->error = array("error" => "Failed to connect to server",
"errno" => $errno,
"errstr" => $errstr);
if($this->do_debug >= 1) {
echo "SMTP -> ERROR: " . $this->error["error"] . ": $errstr ($errno)" . $this->CRLF . '<br />';
}
return false;
}
// SMTP server can take longer to respond, give longer timeout for first read
// Windows does not have support for this timeout function
if(substr(PHP_OS, 0, 3) != "WIN")
socket_set_timeout($this->smtp_conn, $tval, 0);
// get any announcement
$announce = $this->get_lines();
if($this->do_debug >= 2) {
echo "SMTP -> FROM SERVER:" . $announce . $this->CRLF . '<br />';
}
return true;
}
/**
* Initiate a TLS communication with the server.
*
* SMTP CODE 220 Ready to start TLS
* SMTP CODE 501 Syntax error (no parameters allowed)
* SMTP CODE 454 TLS not available due to temporary reason
* @access public
* @return bool success
*/
public function StartTLS() {
$this->error = null; # to avoid confusion
if(!$this->connected()) {
$this->error = array("error" => "Called StartTLS() without being connected");
return false;
}
fputs($this->smtp_conn,"STARTTLS" . $this->CRLF);
$rply = $this->get_lines();
$code = substr($rply,0,3);
if($this->do_debug >= 2) {
echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
}
if($code != 220) {
$this->error =
array("error" => "STARTTLS not accepted from server",
"smtp_code" => $code,
"smtp_msg" => substr($rply,4));
if($this->do_debug >= 1) {
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
}
return false;
}
// Begin encrypted connection
if(!stream_socket_enable_crypto($this->smtp_conn, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
return false;
}
return true;
}
/**
* Performs SMTP authentication. Must be run after running the
* Hello() method. Returns true if successfully authenticated.
* @access public
* @return bool
*/
public function Authenticate($username, $password) {
// Start authentication
fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF);
$rply = $this->get_lines();
$code = substr($rply,0,3);
if($code != 334) {
$this->error =
array("error" => "AUTH not accepted from server",
"smtp_code" => $code,
"smtp_msg" => substr($rply,4));
if($this->do_debug >= 1) {
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
}
return false;
}
// Send encoded username
fputs($this->smtp_conn, base64_encode($username) . $this->CRLF);
$rply = $this->get_lines();
$code = substr($rply,0,3);
if($code != 334) {
$this->error =
array("error" => "Username not accepted from server",
"smtp_code" => $code,
"smtp_msg" => substr($rply,4));
if($this->do_debug >= 1) {
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
}
return false;
}
// Send encoded password
fputs($this->smtp_conn, base64_encode($password) . $this->CRLF);
$rply = $this->get_lines();
$code = substr($rply,0,3);
if($code != 235) {
$this->error =
array("error" => "Password not accepted from server",
"smtp_code" => $code,
"smtp_msg" => substr($rply,4));
if($this->do_debug >= 1) {
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
}
return false;
}
return true;
}
/**
* Returns true if connected to a server otherwise false
* @access public
* @return bool
*/
public function Connected() {
if(!empty($this->smtp_conn)) {
$sock_status = socket_get_status($this->smtp_conn);
if($sock_status["eof"]) {
// the socket is valid but we are not connected
if($this->do_debug >= 1) {
echo "SMTP -> NOTICE:" . $this->CRLF . "EOF caught while checking if connected";
}
$this->Close();
return false;
}
return true; // everything looks good
}
return false;
}
/**
* Closes the socket and cleans up the state of the class.
* It is not considered good to use this function without
* first trying to use QUIT.
* @access public
* @return void
*/
public function Close() {
$this->error = null; // so there is no confusion
$this->helo_rply = null;
if(!empty($this->smtp_conn)) {
// close the connection and cleanup
fclose($this->smtp_conn);
$this->smtp_conn = 0;
}
}
/////////////////////////////////////////////////
// SMTP COMMANDS
/////////////////////////////////////////////////
/**
* Issues a data command and sends the msg_data to the server
* finializing the mail transaction. $msg_data is the message
* that is to be send with the headers. Each header needs to be
* on a single line followed by a <CRLF> with the message headers
* and the message body being seperated by and additional <CRLF>.
*
* Implements rfc 821: DATA <CRLF>
*
* SMTP CODE INTERMEDIATE: 354
* [data]
* <CRLF>.<CRLF>
* SMTP CODE SUCCESS: 250
* SMTP CODE FAILURE: 552,554,451,452
* SMTP CODE FAILURE: 451,554
* SMTP CODE ERROR : 500,501,503,421
* @access public
* @return bool
*/
public function Data($msg_data) {
$this->error = null; // so no confusion is caused
if(!$this->connected()) {
$this->error = array(
"error" => "Called Data() without being connected");
return false;
}
fputs($this->smtp_conn,"DATA" . $this->CRLF);
$rply = $this->get_lines();
$code = substr($rply,0,3);
if($this->do_debug >= 2) {
echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
}
if($code != 354) {
$this->error =
array("error" => "DATA command not accepted from server",
"smtp_code" => $code,
"smtp_msg" => substr($rply,4));
if($this->do_debug >= 1) {
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
}
return false;
}
/* the server is ready to accept data!
* according to rfc 821 we should not send more than 1000
* including the CRLF
* characters on a single line so we will break the data up
* into lines by \r and/or \n then if needed we will break
* each of those into smaller lines to fit within the limit.
* in addition we will be looking for lines that start with
* a period '.' and append and additional period '.' to that
* line. NOTE: this does not count towards limit.
*/
// normalize the line breaks so we know the explode works
$msg_data = str_replace("\r\n","\n",$msg_data);
$msg_data = str_replace("\r","\n",$msg_data);
$lines = explode("\n",$msg_data);
/* we need to find a good way to determine is headers are
* in the msg_data or if it is a straight msg body
* currently I am assuming rfc 822 definitions of msg headers
* and if the first field of the first line (':' sperated)
* does not contain a space then it _should_ be a header
* and we can process all lines before a blank "" line as
* headers.
*/
$field = substr($lines[0],0,strpos($lines[0],":"));
$in_headers = false;
if(!empty($field) && !strstr($field," ")) {
$in_headers = true;
}
$max_line_length = 998; // used below; set here for ease in change
while(list(,$line) = @each($lines)) {
$lines_out = null;
if($line == "" && $in_headers) {
$in_headers = false;
}
// ok we need to break this line up into several smaller lines
while(strlen($line) > $max_line_length) {
$pos = strrpos(substr($line,0,$max_line_length)," ");
// Patch to fix DOS attack
if(!$pos) {
$pos = $max_line_length - 1;
$lines_out[] = substr($line,0,$pos);
$line = substr($line,$pos);
} else {
$lines_out[] = substr($line,0,$pos);
$line = substr($line,$pos + 1);
}
/* if processing headers add a LWSP-char to the front of new line
* rfc 822 on long msg headers
*/
if($in_headers) {
$line = "\t" . $line;
}
}
$lines_out[] = $line;
// send the lines to the server
while(list(,$line_out) = @each($lines_out)) {
if(strlen($line_out) > 0)
{
if(substr($line_out, 0, 1) == ".") {
$line_out = "." . $line_out;
}
}
fputs($this->smtp_conn,$line_out . $this->CRLF);
}
}
// message data has been sent
fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF);
$rply = $this->get_lines();
$code = substr($rply,0,3);
if($this->do_debug >= 2) {
echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
}
if($code != 250) {
$this->error =
array("error" => "DATA not accepted from server",
"smtp_code" => $code,
"smtp_msg" => substr($rply,4));
if($this->do_debug >= 1) {
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
}
return false;
}
return true;
}
/**
* Sends the HELO command to the smtp server.
* This makes sure that we and the server are in
* the same known state.
*
* Implements from rfc 821: HELO <SP> <domain> <CRLF>
*
* SMTP CODE SUCCESS: 250
* SMTP CODE ERROR : 500, 501, 504, 421
* @access public
* @return bool
*/
public function Hello($host = '') {
$this->error = null; // so no confusion is caused
if(!$this->connected()) {
$this->error = array(
"error" => "Called Hello() without being connected");
return false;
}
// if hostname for HELO was not specified send default
if(empty($host)) {
// determine appropriate default to send to server
$host = "localhost";
}
// Send extended hello first (RFC 2821)
if(!$this->SendHello("EHLO", $host)) {
if(!$this->SendHello("HELO", $host)) {
return false;
}
}
return true;
}
/**
* Sends a HELO/EHLO command.
* @access private
* @return bool
*/
private function SendHello($hello, $host) {
fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF);
$rply = $this->get_lines();
$code = substr($rply,0,3);
if($this->do_debug >= 2) {
echo "SMTP -> FROM SERVER: " . $rply . $this->CRLF . '<br />';
}
if($code != 250) {
$this->error =
array("error" => $hello . " not accepted from server",
"smtp_code" => $code,
"smtp_msg" => substr($rply,4));
if($this->do_debug >= 1) {
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
}
return false;
}
$this->helo_rply = $rply;
return true;
}
/**
* Starts a mail transaction from the email address specified in
* $from. Returns true if successful or false otherwise. If True
* the mail transaction is started and then one or more Recipient
* commands may be called followed by a Data command.
*
* Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>
*
* SMTP CODE SUCCESS: 250
* SMTP CODE SUCCESS: 552,451,452
* SMTP CODE SUCCESS: 500,501,421
* @access public
* @return bool
*/
public function Mail($from) {
$this->error = null; // so no confusion is caused
if(!$this->connected()) {
$this->error = array(
"error" => "Called Mail() without being connected");
return false;
}
$useVerp = ($this->do_verp ? "XVERP" : "");
fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $useVerp . $this->CRLF);
$rply = $this->get_lines();
$code = substr($rply,0,3);
if($this->do_debug >= 2) {
echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
}
if($code != 250) {
$this->error =
array("error" => "MAIL not accepted from server",
"smtp_code" => $code,
"smtp_msg" => substr($rply,4));
if($this->do_debug >= 1) {
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
}
return false;
}
return true;
}
/**
* Sends the quit command to the server and then closes the socket
* if there is no error or the $close_on_error argument is true.
*
* Implements from rfc 821: QUIT <CRLF>
*
* SMTP CODE SUCCESS: 221
* SMTP CODE ERROR : 500
* @access public
* @return bool
*/
public function Quit($close_on_error = true) {
$this->error = null; // so there is no confusion
if(!$this->connected()) {
$this->error = array(
"error" => "Called Quit() without being connected");
return false;
}
// send the quit command to the server
fputs($this->smtp_conn,"quit" . $this->CRLF);
// get any good-bye messages
$byemsg = $this->get_lines();
if($this->do_debug >= 2) {
echo "SMTP -> FROM SERVER:" . $byemsg . $this->CRLF . '<br />';
}
$rval = true;
$e = null;
$code = substr($byemsg,0,3);
if($code != 221) {
// use e as a tmp var cause Close will overwrite $this->error
$e = array("error" => "SMTP server rejected quit command",
"smtp_code" => $code,
"smtp_rply" => substr($byemsg,4));
$rval = false;
if($this->do_debug >= 1) {
echo "SMTP -> ERROR: " . $e["error"] . ": " . $byemsg . $this->CRLF . '<br />';
}
}
if(empty($e) || $close_on_error) {
$this->Close();
}
return $rval;
}
/**
* Sends the command RCPT to the SMTP server with the TO: argument of $to.
* Returns true if the recipient was accepted false if it was rejected.
*
* Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
*
* SMTP CODE SUCCESS: 250,251
* SMTP CODE FAILURE: 550,551,552,553,450,451,452
* SMTP CODE ERROR : 500,501,503,421
* @access public
* @return bool
*/
public function Recipient($to) {
$this->error = null; // so no confusion is caused
if(!$this->connected()) {
$this->error = array(
"error" => "Called Recipient() without being connected");
return false;
}
fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF);
$rply = $this->get_lines();
$code = substr($rply,0,3);
if($this->do_debug >= 2) {
echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
}
if($code != 250 && $code != 251) {
$this->error =
array("error" => "RCPT not accepted from server",
"smtp_code" => $code,
"smtp_msg" => substr($rply,4));
if($this->do_debug >= 1) {
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
}
return false;
}
return true;
}
/**
* Sends the RSET command to abort and transaction that is
* currently in progress. Returns true if successful false
* otherwise.
*
* Implements rfc 821: RSET <CRLF>
*
* SMTP CODE SUCCESS: 250
* SMTP CODE ERROR : 500,501,504,421
* @access public
* @return bool
*/
public function Reset() {
$this->error = null; // so no confusion is caused
if(!$this->connected()) {
$this->error = array(
"error" => "Called Reset() without being connected");
return false;
}
fputs($this->smtp_conn,"RSET" . $this->CRLF);
$rply = $this->get_lines();
$code = substr($rply,0,3);
if($this->do_debug >= 2) {
echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
}
if($code != 250) {
$this->error =
array("error" => "RSET failed",
"smtp_code" => $code,
"smtp_msg" => substr($rply,4));
if($this->do_debug >= 1) {
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
}
return false;
}
return true;
}
/**
* Starts a mail transaction from the email address specified in
* $from. Returns true if successful or false otherwise. If True
* the mail transaction is started and then one or more Recipient
* commands may be called followed by a Data command. This command
* will send the message to the users terminal if they are logged
* in and send them an email.
*
* Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>
*
* SMTP CODE SUCCESS: 250
* SMTP CODE SUCCESS: 552,451,452
* SMTP CODE SUCCESS: 500,501,502,421
* @access public
* @return bool
*/
public function SendAndMail($from) {
$this->error = null; // so no confusion is caused
if(!$this->connected()) {
$this->error = array(
"error" => "Called SendAndMail() without being connected");
return false;
}
fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF);
$rply = $this->get_lines();
$code = substr($rply,0,3);
if($this->do_debug >= 2) {
echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
}
if($code != 250) {
$this->error =
array("error" => "SAML not accepted from server",
"smtp_code" => $code,
"smtp_msg" => substr($rply,4));
if($this->do_debug >= 1) {
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
}
return false;
}
return true;
}
/**
* This is an optional command for SMTP that this class does not
* support. This method is here to make the RFC821 Definition
* complete for this class and __may__ be implimented in the future
*
* Implements from rfc 821: TURN <CRLF>
*
* SMTP CODE SUCCESS: 250
* SMTP CODE FAILURE: 502
* SMTP CODE ERROR : 500, 503
* @access public
* @return bool
*/
public function Turn() {
$this->error = array("error" => "This method, TURN, of the SMTP ".
"is not implemented");
if($this->do_debug >= 1) {
echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF . '<br />';
}
return false;
}
/**
* Get the current error
* @access public
* @return array
*/
public function getError() {
return $this->error;
}
/////////////////////////////////////////////////
// INTERNAL FUNCTIONS
/////////////////////////////////////////////////
/**
* Read in as many lines as possible
* either before eof or socket timeout occurs on the operation.
* With SMTP we can tell if we have more lines to read if the
* 4th character is '-' symbol. If it is a space then we don't
* need to read anything else.
* @access private
* @return string
*/
private function get_lines() {
$data = "";
while($str = @fgets($this->smtp_conn,515)) {
if($this->do_debug >= 4) {
echo "SMTP -> get_lines(): \$data was \"$data\"" . $this->CRLF . '<br />';
echo "SMTP -> get_lines(): \$str is \"$str\"" . $this->CRLF . '<br />';
}
$data .= $str;
if($this->do_debug >= 4) {
echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF . '<br />';
}
// if 4th character is a space, we are done reading, break the loop
if(substr($str,3,1) == " ") { break; }
}
return $data;
}
}
?>

3
3rdparty/php-cloudfiles/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
*.swp
*~
tests/output.log

11
3rdparty/php-cloudfiles/AUTHORS vendored Normal file
View File

@ -0,0 +1,11 @@
Current maintainer:
Conrad Weidenkeller <conrad.weidenkeller@rackspace.com>
Previous maintainer:
Eric "EJ" Johnson <ej@racklabs.com>
Chmouel Boudjnah <chmouel.boudjnah@rackspace.co.uk>
Contributors:
Paul Kehrer
Ben Arwin
Jordan Callicoat

27
3rdparty/php-cloudfiles/COPYING vendored Normal file
View File

@ -0,0 +1,27 @@
Unless otherwise noted, all files are released under the MIT license,
exceptions contain licensing information in them.
Copyright (C) 2008 Rackspace US, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Except as contained in this notice, the name of Rackspace US, Inc. shall not
be used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from Rackspace US, Inc.

93
3rdparty/php-cloudfiles/Changelog vendored Normal file
View File

@ -0,0 +1,93 @@
1.7.10 Conrad Weidenkeller <conrad.weidenkeller@rackspace.com>
* Added Streaming URI Functionality
1.7.9 Conrad Weidenkeller <conrad.weidenkeller@rackspace.com>
* Added Manifest file support for Large Objects
1.7.8 Conrad Weidenkeller <conrad.weidenkeller@rackspace.com>
* Added CDN SSL URI Stuff
1.7.7 Conrad Weidenkeller <conrad.weidenkeller@rackspace.com>
* Added CDN Purge Functionality
1.7.6 - Chmouel Boudjnah <chmouel.boudjnah@rackspace.co.uk>
* Add Cloud UK Support (conrad.weidenkeller).
1.7.5 - Conrad Weidenkeller <conrad.weidenkeller@rackspace.com>
* Added the ability to list only currently enabled CDN containers
* Added curl timeout to CF_Http
* Fixed some logic errors in some if statements.
1.7.4 - Conrad Weidenkeller <conrad.weidenkeller@rackspace.com>
* Added Manual SSL support for MacOSX users
1.7.3 - Conrad Weidenkeller <conrad.weidenkeller@rackspace.com>
* Fixed a Small Bug where some users were seeing response bodies for PUTs
1.7.1 - Conrad Weidenkeller <conrad.weidenkeller@rackspace.com>
* Added Support for Auth Token Caching.
1.7.0 - Chmouel Boudjnah <chmouel.boudjnah@rackspace.co.uk>
* Adjust api auth to rackspacecloud not mosso (mshuler).
1.6.2 - Chmouel Boudjnah <chmouel.boudjnah@rackspace.co.uk>
* Add a close method to close all the current connection.
* Fix when container_name is named 0.
1.6.1 - Chmouel Boudjnah <chmouel.boudjnah@rackspace.co.uk>
* Fix setting etag on objects.
* Fix throwing proper exception when an invalid etag has been set.
* Fix throwing proper exception when no content type has been set.
1.6.0 - Chmouel Boudjnah <chmouel.boudjnah@rackspace.co.uk>
* Add CDN ACL restriction by referrer feature.
* Add CDN ACL restriction by User Agent feature.
* Add documentation for log_retention method.
* Return True if log_retention as succeeded.
* Invalid the PHP stats cache before getting filesize.
1.5.1 - Chmouel Boudjnah <chmouel.boudjnah@rackspace.co.uk> - 20091020
* If the environement variable RACKSPACE_SERVICENET is defined then force to
connect via rakcspace servicenet.
1.5.0 - Chmouel Boudjnah <chmouel.boudjnah@rackspace.co.uk> - 20091015
* Add the option servicenet to connection to use Rackspace service net
instead of public network.
1.4.0 - Chmouel Boudjnah <chmouel.boudjnah@rackspace.co.uk> - 20090808
* Add the ability to store the container log.
1.3.2 - Chmouel Boudjnah <chmouel.boudjnah@rackspace.co.uk> - 20090606
* Change the Unit Tests to phpunit.
* Automatically set the updated CA bundle when on the windows OS.
* More simplification of the mimetype detection and support for PHP 5.3.
* Fix documentation information about the ttl for cached object.
* Use the hash library to compute MD5 for streams instead of storing the
stream in memory.
* Fix CF_Connection::get_containers to display the container name properly.
1.3.1 - <ej@racklabs.com> - 20090325
* Simplify use of FileInfo, remove packaged MIME/Magic file
* Throw Exception if no Content-Type is set
* Fix bug with tracking bytes transferred
* Support/tested on Windows XP (PHP v5.2.9)
1.3.0 - <ej@racklabs.com> - 20090311
* Support for list operations in JSON/XML
* Added support for FileInfo automatic Content-Type/MIME detection
* Workaround for cURL's old CA bundle with CF_Connection->ssl_use_cabundle()
* Supports limit/marker on Account and Container lists
* Support "pathname" traversal on Container lists
* Helper function on Container to create directory marker Objects
* Support for chunked transfer on PUT requests
1.2.3 - <ej@racklabs.com> - 20081210
* Improved in-line comments and generated HTML docs
* Callbacks for read/write progress on CF_Connection class
* Fixed minor bugs
* Started this Changelog

73
3rdparty/php-cloudfiles/README vendored Normal file
View File

@ -0,0 +1,73 @@
;; PHP Cloud Files API
;; ========================================================================
;; This package contains the PHP API for the Cloud Files storage system.
;;
;; Please see http://www.rackspacecloud.com/ for more information regarding the
;; Cloud Files storage system.
;;
;; Install
;; ------------------------------------------------------------------------
;; Extract this archive and make sure the source code files are in your
;; PHP "include path". To use the API in your source code, just make
;; sure to include/require the "cloudfiles.php" script.
;;
;; Requirements
;; ------------------------------------------------------------------------
;; [mandatory] PHP version 5.x (developed against 5.2.0)
;; [mandatory] PHP's cURL module
;; [mandatory] PHP enabled with mbstring (multi-byte string) support
;; [suggested] PEAR FileInfo module (for Content-Type detection)
;;
;; Examples
;; ------------------------------------------------------------------------
;; For sample code, please see the tests and API docs.
;;
;; Docs
;; ------------------------------------------------------------------------
;; The included documentation was generated directly from the source
;; code files using the PHPDocumentor tool.
;;
;; This README file is actually the PHPDocumentor INI configuration file.
;; The following packages were installed via PEAR to generate the HTML
;; API documentation.
;;
;; * PEAR 1.4.11 (stable)
;; * PhpDocumentor 1.4.2 (stable)
;; * XML_Beautifier 1.2.0 (stable)
;; * XML_Parser 1.3.1 (stable)
;; * XML_Util 1.2.0 (stable)
;;
;; To re-generate the API docs, make sure the above software is
;; available and run:
;; rm -rf docs && phpdoc -c phpdoc.ini
;;
;; Tests
;; ------------------------------------------------------------------------
;; The tests are based on phpunit and are run with PHPUnit 3.3.17
;; please follow the instructions on :
;;
;; http://www.phpunit.de/manual/current/en/installation.html
;;
;; to install PHPUnit. When installed just run the command phpunit on
;; the top of the directory and it will launch the tests.
;;
;; The tests/Comprehensive.php is not enabled by default since
;; generating big files. If you want to run it you need to go in the
;; tests directory and run with phpunit Comprehensive.php
;;
;; ========================================================================
;; The lines below here are the configuration settings for re-generating
;; the PHP API documentation.
;;
[Parse Data]
title = php-cloudfiles
hidden = false
parseprivate = off
javadocdesc = off
defaultpackagename = php-cloudfiles
defaultcategoryname = php-cloudfiles
target = docs
directory = .
ignore = share/,examples/,tests/,.git/,.gitignore,*.ini,*.swp
output=HTML:Smarty:PHP
readmeinstallchangelog = README,COPYING,AUTHORS,Changelog

2599
3rdparty/php-cloudfiles/cloudfiles.php vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,41 @@
<?php
/**
* Custom Exceptions for the CloudFiles API
*
* Requres PHP 5.x (for Exceptions and OO syntax)
*
* See COPYING for license information.
*
* @author Eric "EJ" Johnson <ej@racklabs.com>
* @copyright Copyright (c) 2008, Rackspace US, Inc.
* @package php-cloudfiles-exceptions
*/
/**
* Custom Exceptions for the CloudFiles API
* @package php-cloudfiles-exceptions
*/
class SyntaxException extends Exception { }
class AuthenticationException extends Exception { }
class InvalidResponseException extends Exception { }
class NonEmptyContainerException extends Exception { }
class NoSuchObjectException extends Exception { }
class NoSuchContainerException extends Exception { }
class NoSuchAccountException extends Exception { }
class MisMatchedChecksumException extends Exception { }
class IOException extends Exception { }
class CDNNotEnabledException extends Exception { }
class BadContentTypeException extends Exception { }
class InvalidUTF8Exception extends Exception { }
class ConnectionNotOpenException extends Exception { }
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* c-hanging-comment-ender-p: nil
* End:
*/
?>

File diff suppressed because it is too large Load Diff

View File

@ -11,7 +11,7 @@ OC_Util::checkLoggedIn();
OC_Util::checkAppEnabled('calendar');
$cal = isset($_GET['calid']) ? $_GET['calid'] : NULL;
$event = isset($_GET['eventid']) ? $_GET['eventid'] : NULL;
$nl = "\n\r";
$nl = "\r\n";
if(isset($cal)){
$calendar = OC_Calendar_App::getCalendar($cal);
$calobjects = OC_Calendar_Object::all($cal);

View File

@ -10,7 +10,8 @@ ob_start();
OC_JSON::checkLoggedIn();
OC_Util::checkAppEnabled('calendar');
$nl = "\n";
$nl="\r\n";
$comps = array('VEVENT'=>true, 'VTODO'=>true, 'VJOURNAL'=>true);
$progressfile = 'import_tmp/' . md5(session_id()) . '.txt';
if(is_writable('import_tmp/')){
$progressfopen = fopen($progressfile, 'w');
@ -29,85 +30,94 @@ if($_POST['method'] == 'new'){
}
$id = $_POST['id'];
}
//analyse the calendar file
if(is_writable('import_tmp/')){
$progressfopen = fopen($progressfile, 'w');
fwrite($progressfopen, '20');
fclose($progressfopen);
}
$searchfor = array('VEVENT', 'VTODO', 'VJOURNAL');
$parts = $searchfor;
$filearr = explode($nl, $file);
$inelement = false;
$parts = array();
// normalize the newlines
$file = str_replace(array("\r","\n\n"), array("\n","\n"), $file);
$lines = explode("\n", $file);
unset($file);
if(is_writable('import_tmp/')){
$progressfopen = fopen($progressfile, 'w');
fwrite($progressfopen, '30');
fclose($progressfopen);
}
// analyze the file, group components by uid, and keep refs to originating calendar object
// $cals is array calendar objects, keys are 1st line# $cal, ie array( $cal => $caldata )
// $caldata is array( 'first' => 1st component line#, 'last' => last comp line#, 'end' => end line# )
// $caldata is used to create prefix/suffix strings when building import text
// $uids is array of component arrays, keys are $uid, ie array( $uid => array( $beginlineno => $component ) )
// $component is array( 'end' => end line#, 'cal'=> $cal )
$comp=$uid=$cal=false;
$cals=$uids=array();
$i = 0;
foreach($filearr as $line){
foreach($searchfor as $search){
if(substr_count($line, $search) == 1){
list($attr, $val) = explode(':', $line);
if($attr == 'BEGIN'){
$parts[]['begin'] = $i;
$inelement = true;
foreach($lines as $line) {
if(strpos($line, ':')!==false) {
list($attr, $val) = explode(':', strtoupper($line));
if ($attr == 'BEGIN' && $val == 'VCALENDAR') {
$cal = $i;
$cals[$cal] = array('first'=>$i,'last'=>$i,'end'=>$i);
} elseif ($attr =='BEGIN' && $cal!==false && isset($comps[$val])) {
$comp = $val;
$beginNo = $i;
} elseif ($attr == 'END' && $cal!==false && $val == 'VCALENDAR') {
if($comp!==false) {
unset($cals[$cal]); // corrupt calendar, unset it
} else {
$cals[$cal]['end'] = $i;
}
if($attr == 'END'){
$parts[count($parts) - 1]['end'] = $i;
$inelement = false;
$comp=$uid=$cal=false; // reset calendar
} elseif ($attr == 'END' && $comp!==false && $val == $comp) {
if(! $uid) {
$uid = OC_Calendar_Object::createUID();
}
$uids[$uid][$beginNo] = array('end'=>$i, 'cal'=>$cal);
if ($cals[$cal]['first'] == $cal) {
$cals[$cal]['first'] = $beginNo;
}
$cals[$cal]['last'] = $i;
$comp=$uid=false; // reset component
} elseif ($attr =="UID" && $comp!==false) {
list($attr, $uid) = explode(':', $line);
}
}
$i++;
}
//import the calendar
// import the calendar
if(is_writable('import_tmp/')){
$progressfopen = fopen($progressfile, 'w');
fwrite($progressfopen, '40');
fwrite($progressfopen, '60');
fclose($progressfopen);
}
$start = '';
for ($i = 0; $i < $parts[0]['begin']; $i++) {
if($i == 0){
$start = $filearr[0];
}else{
$start .= $nl . $filearr[$i];
foreach($uids as $uid) {
$prefix=$suffix=$content=array();
foreach($uid as $begin=>$details) {
$cal = $details['cal'];
if(!isset($cals[$cal])) {
continue; // from corrupt/incomplete calendar
}
}
$end = '';
for($i = $parts[count($parts) - 1]['end'] + 1;$i <= count($filearr) - 1; $i++){
if($i == $parts[count($parts) - 1]['end'] + 1){
$end = $filearr[$parts[count($parts) - 1]['end'] + 1];
}else{
$end .= $nl . $filearr[$i];
$cdata = $cals[$cal];
// if we have multiple components from different calendar objects,
// we should really merge their elements (enhancement?) -- 1st one wins for now.
if(! count($prefix)) {
$prefix = array_slice($lines, $cal, $cdata['first'] - $cal);
}
}
if(is_writable('import_tmp/')){
$progressfopen = fopen($progressfile, 'w');
fwrite($progressfopen, '50');
fclose($progressfopen);
}
$importready = array();
foreach($parts as $part){
for($i = $part['begin']; $i <= $part['end'];$i++){
if($i == $part['begin']){
$content = $filearr[$i];
}else{
$content .= $nl . $filearr[$i];
if(! count($suffix)) {
$suffix = array_slice($lines, $cdata['last']+1, $cdata['end'] - $cdata['last']);
}
$content = array_merge($content, array_slice($lines, $begin, $details['end'] - $begin + 1));
}
$importready[] = $start . $nl . $content . $nl . $end;
}
if(is_writable('import_tmp/')){
$progressfopen = fopen($progressfile, 'w');
fwrite($progressfopen, '70');
fclose($progressfopen);
}
if(count($parts) == 1){
OC_Calendar_Object::add($id, $file);
}else{
foreach($importready as $import){
if(count($content)) {
$import = join($nl, array_merge($prefix, $content, $suffix)) . $nl;
OC_Calendar_Object::add($id, $import);
}
}
//done the import
// finished import
if(is_writable('import_tmp/')){
$progressfopen = fopen($progressfile, 'w');
fwrite($progressfopen, '100');

View File

@ -42,8 +42,8 @@ tbody tr:hover, tbody tr:active, tbody tr.selected { background-color:#f8f8f8; }
tbody tr.selected { background-color:#eee; }
tbody a { color:#000; }
span.extension, td.date { color:#999; }
span.extension { text-transform:lowercase; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; -webkit-transition:opacity 300ms; -moz-transition:opacity 300ms; -o-transition:opacity 300ms; transition:opacity 300ms; }
tr:hover span.extension { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; }
span.extension { text-transform:lowercase; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; filter:alpha(opacity=70); opacity:.7; -webkit-transition:opacity 300ms; -moz-transition:opacity 300ms; -o-transition:opacity 300ms; transition:opacity 300ms; }
tr:hover span.extension { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; color:#777; }
div.crumb { float:left; display:block; background:no-repeat right 0; padding:.75em 1.5em 0 1em; height:2.9em; }
div.crumb:first-child { padding-left:1em; }
div.crumb.last { font-weight:bold; }

View File

@ -119,7 +119,7 @@ class OC_Crypt {
*/
public static function encrypt( $content, $key='') {
$bf = self::getBlowfish($key);
return($bf->encrypt($content));
return $bf->encrypt($content);
}
/**
@ -132,61 +132,62 @@ class OC_Crypt {
*/
public static function decrypt( $content, $key='') {
$bf = self::getBlowfish($key);
return($bf->decrypt($content));
$data=$bf->decrypt($content);
return rtrim($data, "\0");
}
/**
* @brief encryption of a file
* @param $filename
* @param $key the encryption key
* @param string $source
* @param string $target
* @param string $key the decryption key
*
* This function encrypts a file
*/
public static function encryptfile( $filename, $key) {
$handleread = fopen($filename, "rb");
if($handleread<>FALSE) {
$handlewrite = fopen($filename.OC_Crypt::$encription_extension, "wb");
public static function encryptFile( $source, $target, $key='') {
$handleread = fopen($source, "rb");
if($handleread!=FALSE) {
$handlewrite = fopen($target, "wb");
while (!feof($handleread)) {
$content = fread($handleread, 8192);
$enccontent=OC_CRYPT::encrypt( $content, $key);
fwrite($handlewrite, $enccontent);
}
fclose($handlewrite);
unlink($filename);
}
fclose($handleread);
}
}
/**
* @brief decryption of a file
* @param $filename
* @param $key the decryption key
* @param string $source
* @param string $target
* @param string $key the decryption key
*
* This function decrypts a file
*/
public static function decryptfile( $filename, $key) {
$handleread = fopen($filename.OC_Crypt::$encription_extension, "rb");
if($handleread<>FALSE) {
$handlewrite = fopen($filename, "wb");
public static function decryptFile( $source, $target, $key='') {
$handleread = fopen($source, "rb");
if($handleread!=FALSE) {
$handlewrite = fopen($target, "wb");
while (!feof($handleread)) {
$content = fread($handleread, 8192);
$enccontent=OC_CRYPT::decrypt( $content, $key);
fwrite($handlewrite, $enccontent);
}
fclose($handlewrite);
unlink($filename.OC_Crypt::$encription_extension);
}
fclose($handleread);
}
}
/**
* encrypt data in 8192b sized blocks
*/
public static function blockEncrypt($data){
public static function blockEncrypt($data, $key=''){
$result='';
while(strlen($data)){
$result=self::encrypt(substr($data,0,8192));
$result.=self::encrypt(substr($data,0,8192),$key);
$data=substr($data,8192);
}
return $result;
@ -195,10 +196,10 @@ class OC_Crypt {
/**
* decrypt data in 8192b sized blocks
*/
public static function blockDecrypt($data){
public static function blockDecrypt($data, $key=''){
$result='';
while(strlen($data)){
$result=self::decrypt(substr($data,0,8192));
$result.=self::decrypt(substr($data,0,8192),$key);
$data=substr($data,8192);
}
return $result;

View File

@ -64,29 +64,19 @@ class OC_CryptStream{
}
public function stream_read($count){
$pos=0;
$currentPos=ftell($this->source);
$offset=$currentPos%8192;
$result='';
if($offset>0){
if($this->meta['seekable']){
fseek($this->source,-$offset,SEEK_CUR);//if seeking isnt supported the internal read buffer will be used
}else{
$pos=strlen($this->readBuffer);
$result=$this->readBuffer;
//$count will always be 8192 https://bugs.php.net/bug.php?id=21641
//This makes this function a lot simpler but will breake everything the moment it's fixed
if($count!=8192){
OC_Log::write('files_encryption','php bug 21641 no longer holds, decryption will not work',OC_Log::FATAL);
die();
}
}
while($count>$pos){
$data=fread($this->source,8192);
$pos+=8192;
if(strlen($data)){
$result.=OC_Crypt::decrypt($data);
$result=OC_Crypt::decrypt($data);
}else{
$result='';
}
}
if(!$this->meta['seekable']){
$this->readBuffer=substr($result,$count);
}
return substr($result,0,$count);
return $result;
}
public function stream_write($data){
@ -107,9 +97,11 @@ class OC_CryptStream{
$oldPos=ftell($this->source);
$encryptedBlock=fread($this->source,8192);
fseek($this->source,$oldPos);
if($encryptedBlock){
$block=OC_Crypt::decrypt($encryptedBlock);
$data.=substr($block,strlen($data));
}
}
$encrypted=OC_Crypt::encrypt(substr($data,0,8192));
fwrite($this->source,$encrypted);
$data=substr($data,8192);

View File

@ -28,6 +28,7 @@
class OC_FileProxy_Encryption extends OC_FileProxy{
private static $blackList=null; //mimetypes blacklisted from encryption
private static $metaData=array(); //metadata cache
private static $enableEncryption=null;
/**
* check if a file should be encrypted during write
@ -35,6 +36,12 @@ class OC_FileProxy_Encryption extends OC_FileProxy{
* @return bool
*/
private static function shouldEncrypt($path){
if(is_null($this->enableEncryption)){
$this->enableEncryption=(OC_Appconfig::getValue('files_encryption','enabled','true')=='true');
}
if(!$this->enableEncryption){
return false;
}
if(is_null(self::$blackList)){
self::$blackList=explode(',',OC_Appconfig::getValue('files_encryption','type_blacklist','jpg,png,jpeg,avi,mpg,mpeg,mkv,mp3,oga,ogv,ogg'));
}

View File

@ -0,0 +1,42 @@
<?php
/**
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
class Test_Encryption extends UnitTestCase {
function testEncryption(){
$key=uniqid();
$file=OC::$SERVERROOT.'/3rdparty/MDB2.php';
$source=file_get_contents($file); //nice large text file
$encrypted=OC_Crypt::encrypt($source,$key);
$decrypted=OC_Crypt::decrypt($encrypted,$key);
$this->assertNotEqual($encrypted,$source);
$this->assertEqual($decrypted,$source);
$chunk=substr($source,0,8192);
$encrypted=OC_Crypt::encrypt($chunk,$key);
$this->assertEqual(strlen($chunk),strlen($encrypted));
$decrypted=OC_Crypt::decrypt($encrypted,$key);
$this->assertEqual($decrypted,$chunk);
$encrypted=OC_Crypt::blockEncrypt($source,$key);
$decrypted=OC_Crypt::blockDecrypt($encrypted,$key);
$this->assertNotEqual($encrypted,$source);
$this->assertEqual($decrypted,$source);
$tmpFileEncrypted=OC_Helper::tmpFile();
OC_Crypt::encryptfile($file,$tmpFileEncrypted,$key);
$encrypted=file_get_contents($tmpFileEncrypted);
$decrypted=OC_Crypt::blockDecrypt($encrypted,$key);
$this->assertNotEqual($encrypted,$source);
$this->assertEqual($decrypted,$source);
$tmpFileDecrypted=OC_Helper::tmpFile();
OC_Crypt::decryptfile($tmpFileEncrypted,$tmpFileDecrypted,$key);
$decrypted=file_get_contents($tmpFileDecrypted);
$this->assertEqual($decrypted,$source);
}
}

View File

@ -0,0 +1,56 @@
<?php
/**
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
class Test_CryptStream extends UnitTestCase {
private $tmpFiles=array();
function testStream(){
$stream=$this->getStream('test1','w');
fwrite($stream,'foobar');
fclose($stream);
$stream=$this->getStream('test1','r');
$data=fread($stream,6);
fclose($stream);
$this->assertEqual('foobar',$data);
$file=OC::$SERVERROOT.'/3rdparty/MDB2.php';
$source=fopen($file,'r');
$target=$this->getStream('test2','w');
OC_Helper::streamCopy($source,$target);
fclose($target);
fclose($source);
$stream=$this->getStream('test2','r');
$data=stream_get_contents($stream);
$original=file_get_contents($file);
$this->assertEqual(strlen($original),strlen($data));
$this->assertEqual($original,$data);
}
/**
* get a cryptstream to a temporary file
* @param string $id
* @param string $mode
* @return resource
*/
function getStream($id,$mode){
if($id===''){
$id=uniqid();
}
if(!isset($this->tmpFiles[$id])){
$file=OC_Helper::tmpFile();
$this->tmpFiles[$id]=$file;
}else{
$file=$this->tmpFiles[$id];
}
$stream=fopen($file,$mode);
OC_CryptStream::$sourceStreams[$id]=array('path'=>'dummy','stream'=>$stream);
return fopen('crypt://streams/'.$id,$mode);
}
}

View File

@ -9,3 +9,4 @@
OC::$CLASSPATH['OC_Filestorage_FTP']='apps/files_external/lib/ftp.php';
OC::$CLASSPATH['OC_Filestorage_DAV']='apps/files_external/lib/webdav.php';
OC::$CLASSPATH['OC_Filestorage_Google']='apps/files_external/lib/google.php';
OC::$CLASSPATH['OC_Filestorage_SWIFT']='apps/files_external/lib/swift.php';

View File

@ -0,0 +1,516 @@
<?php
/**
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
require_once('php-cloudfiles/cloudfiles.php');
class OC_FileStorage_SWIFT extends OC_Filestorage_Common{
private $host;
private $root;
private $user;
private $token;
private $secure;
/**
* @var CF_Authentication auth
*/
private $auth;
/**
* @var CF_Connection conn
*/
private $conn;
/**
* @var CF_Container rootContainer
*/
private $rootContainer;
private static $tempFiles=array();
const SUBCONTAINER_FILE='.subcontainers';
/**
* translate directory path to container name
* @param string path
* @return string
*/
private function getContainerName($path){
$path=trim($this->root.$path,'/');
return md5($path);
}
/**
* get container by path
* @param string path
* @return CF_Container
*/
private function getContainer($path){
if($path=='' or $path=='/'){
return $this->rootContainer;
}
try{
$container=$this->conn->get_container($this->getContainerName($path));
return $container;
}catch(NoSuchContainerException $e){
return null;
}
}
/**
* create container
* @param string path
* @return CF_Container
*/
private function createContainer($path){
if($path=='' or $path=='/'){
return $this->conn->create_container($this->getContainerName($path));
}
$parent=dirname($path);
if($parent=='' or $parent=='/'){
$parentContainer=$this->rootContainer;
}else{
if(!$this->containerExists($parent)){
$parentContainer=$this->createContainer($parent);
}else{
$parentContainer=$this->getContainer($parent);
}
}
$this->addSubContainer($parentContainer,basename($path));
return $this->conn->create_container($this->getContainerName($path));
}
/**
* get object by path
* @param string path
* @return CF_Object
*/
private function getObject($path){
$container=$this->getContainer(dirname($path));
if(is_null($container)){
return null;
}else{
try{
$obj=$container->get_object(basename($path));
return $obj;
}catch(NoSuchObjectException $e){
return null;
}
}
}
/**
* get the names of all objects in a container
* @param CF_Container
* @return array
*/
private function getObjects($container){
if(is_null($container)){
return array();
}else{
$files=$container->get_objects();
foreach($files as &$file){
$file=$file->name;
}
return $files;
}
}
/**
* create object
* @param string path
* @return CF_Object
*/
private function createObject($path){
$container=$this->getContainer(dirname($path));
if(!is_null($container)){
$container=$this->createContainer($path);
}
return $container->create_object(basename($path));
}
/**
* check if an object exists
* @param string
* @return bool
*/
private function objectExists($path){
return !is_null($this->getObject($path));
}
/**
* check if container for path exists
* @param string path
* @return bool
*/
private function containerExists($path){
return !is_null($this->getContainer($path));
}
/**
* get the list of emulated sub containers
* @param CF_Container container
* @return array
*/
private function getSubContainers($container){
$tmpFile=OC_Helper::tmpFile();
$obj=$this->getSubContainerFile($container);
try{
$obj->save_to_filename($tmpFile);
}catch(Exception $e){
return array();
}
$obj->save_to_filename($tmpFile);
$containers=file($tmpFile);
unlink($tmpFile);
foreach($containers as &$sub){
$sub=trim($sub);
}
return $containers;
}
/**
* add an emulated sub container
* @param CF_Container container
* @param string name
* @return bool
*/
private function addSubContainer($container,$name){
if(!$name){
return false;
}
$tmpFile=OC_Helper::tmpFile();
$obj=$this->getSubContainerFile($container);
try{
$obj->save_to_filename($tmpFile);
$containers=file($tmpFile);
foreach($containers as &$sub){
$sub=trim($sub);
}
if(array_search($name,$containers)!==false){
unlink($tmpFile);
return false;
}else{
$fh=fopen($tmpFile,'a');
fwrite($fh,$name."\n");
}
}catch(Exception $e){
$containers=array();
file_put_contents($tmpFile,$name."\n");
}
$obj->load_from_filename($tmpFile);
unlink($tmpFile);
return true;
}
/**
* remove an emulated sub container
* @param CF_Container container
* @param string name
* @return bool
*/
private function removeSubContainer($container,$name){
if(!$name){
return false;
}
$tmpFile=OC_Helper::tmpFile();
$obj=$this->getSubContainerFile($container);
try{
$obj->save_to_filename($tmpFile);
$containers=file($tmpFile);
}catch(Exception $e){
return false;
}
foreach($containers as &$sub){
$sub=trim($sub);
}
$i=array_search($name,$containers);
if($i===false){
unlink($tmpFile);
return false;
}else{
unset($containers[$i]);
file_put_contents($tmpFile,implode("\n",$containers)."\n");
}
$obj->load_from_filename($tmpFile);
unlink($tmpFile);
return true;
}
/**
* ensure a subcontainer file exists and return it's object
* @param CF_Container container
* @return CF_Object
*/
private function getSubContainerFile($container){
try{
return $container->get_object(self::SUBCONTAINER_FILE);
}catch(NoSuchObjectException $e){
return $container->create_object(self::SUBCONTAINER_FILE);
}
}
public function __construct($params){
$this->token=$params['token'];
$this->host=$params['host'];
$this->user=$params['user'];
$this->root=isset($params['root'])?$params['root']:'/';
$this->secure=isset($params['secure'])?(bool)$params['secure']:true;
if(substr($this->root,0,1)!='/'){
$this->root='/'.$this->root;
}
$this->auth = new CF_Authentication($this->user, $this->token, null, $this->host);
$this->auth->authenticate();
$this->conn = new CF_Connection($this->auth);
if(!$this->containerExists($this->root)){
$this->rootContainer=$this->createContainer('/');
}else{
$this->rootContainer=$this->getContainer('/');
}
}
public function mkdir($path){
if($this->containerExists($path)){
return false;
}else{
$this->createContainer($path);
return true;
}
}
public function rmdir($path){
if(!$this->containerExists($path)){
return false;
}else{
$this->emptyContainer($path);
if($path!='' and $path!='/'){
$parentContainer=$this->getContainer(dirname($path));
$this->removeSubContainer($parentContainer,basename($path));
}
$this->conn->delete_container($this->getContainerName($path));
return true;
}
}
private function emptyContainer($path){
$container=$this->getContainer($path);
if(is_null($container)){
return;
}
$subContainers=$this->getSubContainers($container);
foreach($subContainers as $sub){
if($sub){
$this->emptyContainer($path.'/'.$sub);
$this->conn->delete_container($this->getContainerName($path.'/'.$sub));
}
}
$objects=$this->getObjects($container);
foreach($objects as $object){
$container->delete_object($object);
}
}
public function opendir($path){
$container=$this->getContainer($path);
$files=$this->getObjects($container);
$i=array_search(self::SUBCONTAINER_FILE,$files);
if($i!==false){
unset($files[$i]);
}
$subContainers=$this->getSubContainers($container);
$files=array_merge($files,$subContainers);
$id=$this->getContainerName($path);
OC_FakeDirStream::$dirs[$id]=$files;
return opendir('fakedir://'.$id);
}
public function filetype($path){
if($this->containerExists($path)){
return 'dir';
}else{
return 'file';
}
}
public function is_readable($path){
return true;
}
public function is_writable($path){
return true;
}
public function file_exists($path){
if($this->is_dir($path)){
return true;
}else{
return $this->objectExists($path);
}
}
public function file_get_contents($path){
$obj=$this->getObject($path);
if(is_null($obj)){
return false;
}
return $obj->read();
}
public function file_put_contents($path,$content){
$obj=$this->getObject($path);
if(is_null($obj)){
$container=$this->getContainer(dirname($path));
if(is_null($container)){
return false;
}
$obj=$container->create_object(basename($path));
}
$this->resetMTime($obj);
return $obj->write($content);
}
public function unlink($path){
if($this->objectExists($path)){
$container=$this->getContainer(dirname($path));
$container->delete_object(basename($path));
}else{
return false;
}
}
public function fopen($path,$mode){
$obj=$this->getObject($path);
if(is_null($obj)){
return false;
}
switch($mode){
case 'r':
case 'rb':
$fp = fopen('php://temp', 'r+');
$obj->stream($fp);
rewind($fp);
return $fp;
case 'w':
case 'wb':
case 'a':
case 'ab':
case 'r+':
case 'w+':
case 'wb+':
case 'a+':
case 'x':
case 'x+':
case 'c':
case 'c+':
$tmpFile=$this->getTmpFile($path);
OC_CloseStreamWrapper::$callBacks[$tmpFile]=array($this,'writeBack');
self::$tempFiles[$tmpFile]=$path;
return fopen('close://'.$tmpFile,$mode);
}
}
public function writeBack($tmpFile){
if(isset(self::$tempFiles[$tmpFile])){
$this->fromTmpFile($tmpFile,self::$tempFiles[$tmpFile]);
unlink($tmpFile);
}
}
public function free_space($path){
return 0;
}
public function touch($path,$mtime=null){
$obj=$this->getObject($path);
if(is_null($obj)){
return false;
}
if(is_null($mtime)){
$mtime=time();
}
//emulate setting mtime with metadata
$obj->metadata['Mtime']=$mtime;
$obj->sync_metadata();
}
public function rename($path1,$path2){
$sourceContainer=$this->getContainer(dirname($path1));
$targetContainer=$this->getContainer(dirname($path2));
$result=$sourceContainer->move_object_to(basename($path1),$targetContainer,basename($path2));
if($result){
$targetObj=$this->getObject($path2);
$this->resetMTime($targetObj);
}
return $result;
}
public function copy($path1,$path2){
$sourceContainer=$this->getContainer(dirname($path1));
$targetContainer=$this->getContainer(dirname($path2));
$result=$sourceContainer->copy_object_to(basename($path1),$targetContainer,basename($path2));
if($result){
$targetObj=$this->getObject($path2);
$this->resetMTime($targetObj);
}
return $result;
}
public function stat($path){
$obj=$this->getObject($path);
if(is_null($obj)){
return false;
}
if(isset($obj->metadata['Mtime']) and $obj->metadata['Mtime']>-1){
$mtime=$obj->metadata['Mtime'];
}else{
$mtime=strtotime($obj->last_modified);
}
return array(
'mtime'=>$mtime,
'size'=>$obj->content_length,
'ctime'=>-1,
);
}
private function getTmpFile($path){
$obj=$this->getObject($path);
if(!is_null($obj)){
$tmpFile=OC_Helper::tmpFile();
$obj->save_to_filename($tmpFile);
return $tmpFile;
}else{
return false;
}
}
private function fromTmpFile($tmpFile,$path){
$obj=$this->getObject($path);
if(is_null($obj)){
$obj=$this->createObject($path);
}
$obj->load_from_filename($tmpFile);
$this->resetMTime($obj);
}
/**
* remove custom mtime metadata
* @param CF_Object obj
*/
private function resetMTime($obj){
if(isset($obj->metadata['Mtime'])){
$obj->metadata['Mtime']=-1;
$obj->sync_metadata();
}
}
}

View File

@ -21,5 +21,12 @@ return array(
'token'=>'test',
'token_secret'=>'test',
'root'=>'/google',
)
),
'swift'=>array(
'run'=>true,
'user'=>'test:tester',
'token'=>'testing',
'host'=>'localhost:8080/auth',
'root'=>'/',
),
);

View File

@ -0,0 +1,32 @@
<?php
/**
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
$config=include('apps/files_external/tests/config.php');
if(!is_array($config) or !isset($config['swift']) or !$config['swift']['run']){
abstract class Test_Filestorage_SWIFT extends Test_FileStorage{}
return;
}else{
class Test_Filestorage_SWIFT extends Test_FileStorage {
private $config;
private $id;
public function setUp(){
$id=uniqid();
$this->config=include('apps/files_external/tests/config.php');
$this->config['swift']['root'].='/'.$id;//make sure we have an new empty folder to work in
$this->instance=new OC_Filestorage_SWIFT($this->config['swift']);
}
public function tearDown(){
$this->instance->rmdir('');
}
}
}

View File

@ -19,6 +19,11 @@ $CONFIG = array(
"knowledgebaseurl" => "",
"appstoreenabled" => true,
"appstoreurl" => "",
"mail_smtpmode" => "sendmail",
"mail_smtphost" => "127.0.0.1",
"mail_smtpauth" => "false",
"mail_smtpname" => "",
"mail_smtppassword" => "",
// "datadirectory" => ""
);
?>

View File

@ -22,7 +22,10 @@ if (isset($_POST['user'])) {
$msg = $tmpl->fetchPage();
$l = OC_L10N::get('core');
$from = 'lostpassword-noreply@' . $_SERVER['HTTP_HOST'];
mail($email, $l->t('Owncloud password reset'), $msg, 'From:' . $from);
$r=mail($email, $l->t('Owncloud password reset'), $msg, 'From:' . $from);
//if($r==false) echo('error'); else echo('works!!!!!!!');
OC_MAIL::send($email,$_POST['user'],$l->t('Owncloud password reset'),$msg,$from,'ownCloud');
}
OC_Template::printGuestPage('core/lostpassword', 'lostpassword', array('error' => false, 'requested' => true));
} else {

View File

@ -357,6 +357,26 @@ class OC_Helper {
return $mimeType;
}
/**
* get the mimetype form a data string
* @param string data
* @return string
*/
static function getStringMimeType($data){
if(function_exists('finfo_open') and function_exists('finfo_file')){
$finfo=finfo_open(FILEINFO_MIME);
return finfo_buffer($finfo, $data);
}else{
$tmpFile=OC_Helper::tmpFile();
$fh=fopen($tmpFile,'wb');
fwrite($fh,$data,8024);
fclose($fh);
$mime=self::getMimeType($tmpFile);
unset($tmpFile);
return $mime;
}
}
/**
* @brief Checks $_REQUEST contains a var for the $s key. If so, returns the html-escaped value of this var; otherwise returns the default value provided by $d.
* @param $s name of the var to escape, if set.

116
lib/mail.php Normal file
View File

@ -0,0 +1,116 @@
<?php
/**
* Copyright (c) 2012 Frank Karlitschek <frank@owncloud.org>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
/**
* OC_Mail
*
* A class to handle mail sending.
*/
require_once('class.phpmailer.php');
class OC_Mail {
/**
* send an email
*
* @param string $toaddress
* @param string $toname
* @param string $subject
* @param string $mailtext
* @param string $fromaddress
* @param string $fromname
* @param bool $html
*/
public static function send($toaddress,$toname,$subject,$mailtext,$fromaddress,$fromname,$html=0,$altbody='',$ccaddress='',$ccname='',$bcc='') {
$SMTPMODE = OC_Config::getValue( 'mail_smtpmode', 'sendmail' );
$SMTPHOST = OC_Config::getValue( 'mail_smtphost', '127.0.0.1' );
$SMTPAUTH = OC_Config::getValue( 'mail_smtpauth', 'false' );
$SMTPUSERNAME = OC_Config::getValue( 'mail_smtpname', '' );
$SMTPPASSWORD = OC_Config::getValue( 'mail_smtppassword', '' );
$mailo = new PHPMailer();
if($SMTPMODE=='sendmail') {
$mailo->IsSendmail();
}elseif($SMTPMODE=='smtp'){
$mailo->IsSMTP();
}elseif($SMTPMODE=='qmail'){
$mailo->IsQmail();
}else{
$mailo->IsMail();
}
$mailo->Host = $SMTPHOST;
$mailo->SMTPAuth = $SMTPAUTH;
$mailo->Username = $SMTPUSERNAME;
$mailo->Password = $SMTPPASSWORD;
$mailo->From =$fromaddress;
$mailo->FromName = $fromname;;
$a=explode(' ',$toaddress);
foreach($a as $ad) {
$mailo->AddAddress($ad,$toname);
}
if($ccaddress<>'') $mailo->AddCC($ccaddress,$ccname);
if($bcc<>'') $mailo->AddBCC($bcc);
$mailo->AddReplyTo($fromaddress, $fromname);
$mailo->WordWrap = 50;
if($html==1) $mailo->IsHTML(true); else $mailo->IsHTML(false);
$mailo->Subject = $subject;
if($altbody=='') {
$mailo->Body = $mailtext.OC_MAIL::getfooter();
$mailo->AltBody = '';
}else{
$mailo->Body = $mailtext;
$mailo->AltBody = $altbody;
}
$mailo->CharSet = 'UTF-8';
$mailo->Send();
unset($mailo);
OC_Log::write('Mail from '.$fromname.' ('.$fromaddress.')'.' to: '.$toname.'('.$toaddress.')'.' subject: '.$subject,'mail',OC_Log::DEBUG);
}
/**
* sending a mail based on a template
*
* @param texttemplate $texttemplate
* @param htmltemplate $htmltemplate
* @param data $data
* @param To $toaddress
* @param ToName $toname
* @param Subject $subject
* @param From $fromaddress
* @param FromName $fromname
* @param ccaddress $ccaddress
* @param ccname $ccname
* @param bcc $bcc
*/
public static function getfooter() {
$txt="\n--\n";
$txt.="ownCloud\n";
$txt.="Your Cloud, Your Data, Your Way!\n";
return($txt);
}
}

View File

@ -199,7 +199,7 @@ class OC_OCSClient{
*
* This function returns a list of all the knowledgebase entries from the OCS server
*/
public static function getKnownledgebaseEntries($page,$pagesize){
public static function getKnownledgebaseEntries($page,$pagesize,$search=''){
if(OC_Config::getValue('knowledgebaseenabled', true)==false){
$kbe=array();
$kbe['totalitems']=0;
@ -208,7 +208,8 @@ class OC_OCSClient{
$p= (int) $page;
$s= (int) $pagesize;
$url=OC_OCSClient::getKBURL().'/knowledgebase/data?type=150&page='.$p.'&pagesize='.$s;
if($search<>'') $searchcmd='&search='.urlencode($search); else $searchcmd='';
$url=OC_OCSClient::getKBURL().'/knowledgebase/data?type=150&page='.$p.'&pagesize='.$s.$searchcmd;
$kbe=array();
$xml=@file_get_contents($url);

View File

@ -68,6 +68,15 @@ abstract class Test_FileStorage extends UnitTestCase {
$this->assertFalse($this->instance->file_exists('/folder'));
$this->assertFalse($this->instance->rmdir('/folder'));//cant remove non existing folders
$dh=$this->instance->opendir('/');
$content=array();
while($file=readdir($dh)){
if($file!='.' and $file!='..'){
$content[]=$file;
}
}
$this->assertEqual(array(),$content);
}
/**