server/apps/files_encryption/lib/proxy.php

112 lines
3.3 KiB
PHP
Raw Normal View History

2011-10-21 15:02:11 +00:00
<?php
/**
* ownCloud
*
* @author Robin Appelman
* @copyright 2011 Robin Appelman icewind1991@gmail.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library 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 AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
/**
* transparent encryption
*/
class OC_FileProxy_Encryption extends OC_FileProxy{
2011-11-24 00:44:54 +00:00
private static $blackList=null; //mimetypes blacklisted from encryption
2012-04-18 14:02:35 +00:00
private static $enableEncryption=null;
2011-11-24 00:44:54 +00:00
/**
* check if a file should be encrypted during write
* @param string $path
* @return bool
*/
private static function shouldEncrypt($path){
if(is_null(self::$enableEncryption)){
self::$enableEncryption=(OC_Appconfig::getValue('files_encryption','enable_encryption','true')=='true');
2012-04-18 14:02:35 +00:00
}
if(!self::$enableEncryption){
2012-04-18 14:02:35 +00:00
return false;
}
2011-11-24 00:44:54 +00:00
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'));
}
if(self::isEncrypted($path)){
2011-11-24 00:44:54 +00:00
return true;
}
$extension=substr($path,strrpos($path,'.')+1);
if(array_search($extension,self::$blackList)===false){
2011-11-24 00:44:54 +00:00
return true;
}
}
/**
* check if a file is encrypted
* @param string $path
* @return bool
*/
private static function isEncrypted($path){
2012-04-24 22:10:29 +00:00
$metadata=OC_FileCache::getCached($path);
return isset($metadata['encrypted']) and (bool)$metadata['encrypted'];
2011-11-24 00:44:54 +00:00
}
2011-10-21 15:02:11 +00:00
public function preFile_put_contents($path,&$data){
2011-11-24 00:44:54 +00:00
if(self::shouldEncrypt($path)){
if (!is_resource($data)) {//stream put contents should have been converter to fopen
$data=OC_Crypt::blockEncrypt($data);
OC_FileCache::put($path,array('encrypted'=>true));
2011-10-21 15:02:11 +00:00
}
}
}
public function postFile_get_contents($path,$data){
2011-11-24 00:44:54 +00:00
if(self::isEncrypted($path)){
$data=OC_Crypt::blockDecrypt($data);
2011-10-21 15:02:11 +00:00
}
2011-11-24 00:44:54 +00:00
return $data;
2011-10-21 15:02:11 +00:00
}
public function postFopen($path,&$result){
2011-11-24 00:44:54 +00:00
if(!$result){
return $result;
}
$meta=stream_get_meta_data($result);
if(self::isEncrypted($path)){
2011-10-21 15:02:11 +00:00
fclose($result);
2011-11-24 00:44:54 +00:00
$result=fopen('crypt://'.$path,$meta['mode']);
}elseif(self::shouldEncrypt($path) and $meta['mode']!='r' and $meta['mode']!='rb'){
if(OC_Filesystem::file_exists($path) and OC_Filesystem::filesize($path)>0){
2011-11-24 00:44:54 +00:00
//first encrypt the target file so we don't end up with a half encrypted file
OCP\Util::writeLog('files_encryption','Decrypting '.$path.' before writing',OCP\Util::DEBUG);
$tmp=fopen('php://temp');
2012-05-01 22:20:45 +00:00
OCP\Util::streamCopy($result,$tmp);
fclose($result);
OC_Filesystem::file_put_contents($path,$tmp);
fclose($tmp);
2011-11-24 00:44:54 +00:00
}
2011-10-22 12:11:15 +00:00
$result=fopen('crypt://'.$path,$meta['mode']);
2011-10-21 15:02:11 +00:00
}
2011-11-24 00:44:54 +00:00
return $result;
2011-10-21 15:02:11 +00:00
}
2012-02-15 20:44:58 +00:00
public function postGetMimeType($path,$mime){
if(self::isEncrypted($path)){
2012-05-01 22:20:45 +00:00
$mime=OCP\Util::getMimeType('crypt://'.$path,'w');
}
return $mime;
2012-02-15 20:44:58 +00:00
}
2011-10-21 15:02:11 +00:00
}