|
- t("Drop a VCF file to import contacts."); ?> (Max. )
+ t("Drop a VCF file to import contacts."); ?> (Max. )
@@ -36,5 +36,7 @@ if(OCP\App::isEnabled('files_encryption')) {
|
\ No newline at end of file
diff --git a/apps/files/ajax/newfolder.php b/apps/files/ajax/newfolder.php
index 0668a6191f..c5c37914c6 100644
--- a/apps/files/ajax/newfolder.php
+++ b/apps/files/ajax/newfolder.php
@@ -13,7 +13,7 @@ if(trim($foldername) == '') {
OCP\JSON::error(array("data" => array( "message" => "Empty Foldername" )));
exit();
}
-if(strpos($filename,'/')!==false){
+if(strpos($foldername,'/')!==false){
OCP\JSON::error(array("data" => array( "message" => "Invalid Foldername" )));
exit();
}
diff --git a/apps/files_external/lib/smb.php b/apps/files_external/lib/smb.php
index f5e6d78e77..f594fbb880 100644
--- a/apps/files_external/lib/smb.php
+++ b/apps/files_external/lib/smb.php
@@ -13,6 +13,7 @@ class OC_FileStorage_SMB extends OC_FileStorage_StreamWrapper{
private $user;
private $host;
private $root;
+ private $share;
private static $tempFiles=array();
@@ -20,17 +21,32 @@ class OC_FileStorage_SMB extends OC_FileStorage_StreamWrapper{
$this->host=$params['host'];
$this->user=$params['user'];
$this->password=$params['password'];
+ $this->share=$params['share'];
$this->root=isset($params['root'])?$params['root']:'/';
+ if(substr($this->root,-1,1)!='/'){
+ $this->root.='/';
+ }
+ if(substr($this->root,0,1)!='/'){
+ $this->root='/'.$this->root;
+ }
+ if(substr($this->share,0,1)!='/'){
+ $this->share='/'.$this->share;
+ }
+ if(substr($this->share,-1,1)=='/'){
+ $this->share=substr($this->share,0,-1);
+ }
//create the root folder if necesary
- $this->mkdir('');
+ if(!$this->is_dir('')){
+ $this->mkdir('');
+ }
}
public function constructUrl($path){
if(substr($path,-1)=='/'){
$path=substr($path,0,-1);
}
- return 'smb://'.$this->user.':'.$this->password.'@'.$this->host.$this->root.$path;
+ return 'smb://'.$this->user.':'.$this->password.'@'.$this->host.$this->share.$this->root.$path;
}
}
diff --git a/apps/files_external/tests/config.php b/apps/files_external/tests/config.php
index 970008d642..e58a87fabd 100644
--- a/apps/files_external/tests/config.php
+++ b/apps/files_external/tests/config.php
@@ -34,7 +34,8 @@ return array(
'user'=>'test',
'password'=>'test',
'host'=>'localhost',
- 'root'=>'/test',
+ 'share'=>'/test',
+ 'root'=>'/test/',
),
'amazons3'=>array(
'run'=>false,
diff --git a/apps/files_external/tests/smb.php b/apps/files_external/tests/smb.php
index 52e1700b01..e1495b7480 100644
--- a/apps/files_external/tests/smb.php
+++ b/apps/files_external/tests/smb.php
@@ -19,7 +19,7 @@ if(!is_array($config) or !isset($config['smb']) or !$config['smb']['run']){
public function setUp(){
$id=uniqid();
$this->config=include('apps/files_external/tests/config.php');
- $this->config['smb']['root'].='/'.$id;//make sure we have an new empty folder to work in
+ $this->config['smb']['root'].=$id;//make sure we have an new empty folder to work in
$this->instance=new OC_Filestorage_SMB($this->config['smb']);
}
diff --git a/apps/gallery/ajax/galleryOp.php b/apps/gallery/ajax/galleryOp.php
index b49e52f0bd..7cbe3e46e2 100644
--- a/apps/gallery/ajax/galleryOp.php
+++ b/apps/gallery/ajax/galleryOp.php
@@ -42,7 +42,7 @@ function handleRemove($name) {
function handleGetThumbnails($albumname) {
OCP\Response::enableCaching(3600 * 24); // 24 hour
- $view = OCP\App::getStorage('gallery');
+ $view = OCP\Files::getStorage('gallery');
$thumbnail = $view->fopen(urldecode($albumname).'.png', 'r');
header('Content-Type: '.OC_Image::getMimeTypeForFile($thumbnail));
OCP\Response::sendFile($thumbnail);
diff --git a/apps/gallery/ajax/sharing.php b/apps/gallery/ajax/sharing.php
index 304757b9e9..7134d19e78 100644
--- a/apps/gallery/ajax/sharing.php
+++ b/apps/gallery/ajax/sharing.php
@@ -80,7 +80,7 @@ function handleGetThumbnail($token, $imgpath) {
function handleGetAlbumThumbnail($token, $albumname)
{
$owner = OC_Gallery_Sharing::getTokenOwner($token);
- $view = OCP\App::getStorage('gallery');
+ $view = OCP\Files::getStorage('gallery');
$file = $view->fopen($albumname.'.png', 'r');
$image = new OC_Image($file);
if ($image->valid()) {
@@ -94,7 +94,7 @@ function handleGetAlbumThumbnail($token, $albumname)
function handleGetPhoto($token, $photo) {
$owner = OC_Gallery_Sharing::getTokenOwner($token);
- $view = OCP\App::getStorage('files');
+ $view = OCP\Files::getStorage('files');
$file = $view->fopen(urldecode($photo), 'r');
header('Content-Type: '.OC_Image::getMimeTypeForFile($file));
OCP\Response::sendFile($file);
diff --git a/apps/gallery/ajax/thumbnail.php b/apps/gallery/ajax/thumbnail.php
index ff0cb44022..4fc9eba992 100644
--- a/apps/gallery/ajax/thumbnail.php
+++ b/apps/gallery/ajax/thumbnail.php
@@ -20,14 +20,15 @@
* License along with this library. If not, see .
*
*/
-
OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('gallery');
+require_once('apps/gallery/lib/managers.php');
-$img = $_GET['img'];
-$image = OC_Gallery_Photo::getThumbnail($img);
+$img = $_GET['filepath'];
+
+$image = \OC\Pictures\ThumbnailsManager::getInstance()->getThumbnail($img);
if ($image) {
OCP\Response::enableCaching(3600 * 24); // 24 hour
$image->show();
diff --git a/apps/gallery/appinfo/database.xml b/apps/gallery/appinfo/database.xml
index f370e1521e..d1ccd6b5a2 100644
--- a/apps/gallery/appinfo/database.xml
+++ b/apps/gallery/appinfo/database.xml
@@ -5,16 +5,8 @@
false
latin1
- *dbprefix*gallery_albums
+ *dbprefix*pictures_images_cache
-
- album_id
- integer
- 0
- true
- 1
- 4
-
uid_owner
text
@@ -22,48 +14,22 @@
64
- album_name
- text
- true
- 100
-
-
- album_path
+ path
text
true
256
- parent_path
- text
- true
- 256
-
-
-
-
- *dbprefix*gallery_photos
-
-
- photo_id
+ width
integer
- 0
- true
- 1
- 4
-
-
- album_id
- integer
- 0
true
4
- file_path
- text
+ height
+ integer
true
- 256
+ 4
diff --git a/apps/gallery/appinfo/update.php b/apps/gallery/appinfo/update.php
new file mode 100644
index 0000000000..a0997ab5e8
--- /dev/null
+++ b/apps/gallery/appinfo/update.php
@@ -0,0 +1,11 @@
+execute();
+ $stmt = OCP\DB::prepare('DROP TABLE IF EXISTS *PREFIX*gallery_albums');
+ $stmt->execute();
+
+ \OC_DB::createDbFromStructure(OC::$APPSROOT.'/apps/'.$appid.'/appinfo/database.xml');
+}
diff --git a/apps/gallery/appinfo/version b/apps/gallery/appinfo/version
index 17b2ccd9bf..8f0916f768 100644
--- a/apps/gallery/appinfo/version
+++ b/apps/gallery/appinfo/version
@@ -1 +1 @@
-0.4.3
+0.5.0
diff --git a/apps/gallery/index.php b/apps/gallery/index.php
index a9fe200c4e..9d4654a7cc 100644
--- a/apps/gallery/index.php
+++ b/apps/gallery/index.php
@@ -27,26 +27,6 @@ OCP\User::checkLoggedIn();
OCP\App::checkAppEnabled('gallery');
OCP\App::setActiveNavigationEntry( 'gallery_index' );
-if (!isset($_GET['view'])) {
- $result = OC_Gallery_Album::find(OCP\USER::getUser());
-
- $r = array();
- while ($row = $result->fetchRow())
- $r[] = $row;
-
- $tmpl = new OCP\Template( 'gallery', 'index', 'user' );
- $tmpl->assign('r', $r);
- $tmpl->printPage();
-} else {
- $result = OC_Gallery_Photo::findForAlbum(OCP\USER::getUser(), $_GET['view']);
-
- $photos = array();
- while ($p = $result->fetchRow())
- $photos[] = $p['file_path'];
-
- $tmpl = new OCP\Template( 'gallery', 'view_album', 'user' );
- $tmpl->assign('photos', $photos);
- $tmpl->assign('albumName', $_GET['view']);
- $tmpl->printPage();
-}
+$tmpl = new OCP\Template( 'gallery', 'index', 'user' );
+$tmpl->printPage();
?>
diff --git a/apps/gallery/lib/album.php b/apps/gallery/lib/album.php
index 8ac27b1a70..39d6d3aded 100644
--- a/apps/gallery/lib/album.php
+++ b/apps/gallery/lib/album.php
@@ -90,7 +90,7 @@ class OC_Gallery_Album {
}
public static function changeThumbnailPath($oldname, $newname) {
- $view = OCP\App::getStorage('gallery');
+ $view = OCP\Files::getStorage('gallery');
$view->rename($oldname.'.png', $newname.'.png');
}
diff --git a/apps/gallery/lib/managers.php b/apps/gallery/lib/managers.php
new file mode 100644
index 0000000000..2444659d0a
--- /dev/null
+++ b/apps/gallery/lib/managers.php
@@ -0,0 +1,97 @@
+execute(array(\OCP\USER::getUser(), $path));
+ if (($row = $result->fetchRow()) != false) {
+ return $row;
+ }
+ $image = new \OC_Image();
+ if (!$image->loadFromFile($path)) {
+ return false;
+ }
+ \OCP\DB::beginTransaction();
+ $stmt = \OCP\DB::prepare('INSERT INTO *PREFIX*pictures_images_cache (uid_owner, path, width, height) VALUES (?, ?, ?, ?)');
+ $stmt->execute(array(\OCP\USER::getUser(), $path, $image->width(), $image->height()));
+ \OCP\DB::commit();
+ $ret = array('filepath' => $path, 'width' => $image->width(), 'height' => $image->height());
+ unset($image);
+ return $ret;
+ }
+
+ private function __construct() {}
+}
+
+class ThumbnailsManager {
+
+ private static $instance = null;
+ const TAG = 'ThumbnailManager';
+
+ public static function getInstance() {
+ if (self::$instance === null)
+ self::$instance = new ThumbnailsManager();
+ return self::$instance;
+ }
+
+ public function getThumbnail($path) {
+ $gallery_path = \OCP\Config::getSystemValue( 'datadirectory' ).'/'.\OC_User::getUser().'/gallery';
+ if (file_exists($gallery_path.$path)) {
+ return new \OC_Image($gallery_path.$path);
+ }
+ if (!\OC_Filesystem::file_exists($path)) {
+ \OC_Log::write(self::TAG, 'File '.$path.' don\'t exists', \OC_Log::WARN);
+ return false;
+ }
+ $image = new \OC_Image();
+ $image->loadFromFile(\OC_Filesystem::getLocalFile($path));
+ if (!$image->valid()) return false;
+
+ $image->fixOrientation();
+
+ $ret = $image->preciseResize(floor((150*$image->width())/$image->height()), 150);
+
+ if (!$ret) {
+ \OC_Log::write(self::TAG, 'Couldn\'t resize image', \OC_Log::ERROR);
+ unset($image);
+ return false;
+ }
+
+ $image->save($gallery_path.'/'.$path);
+ return $image;
+ }
+
+ public function getThumbnailInfo($path) {
+ $arr = DatabaseManager::getInstance()->getFileData($path);
+ $ret = array('filepath' => $arr['path'],
+ 'width' => $arr['width'],
+ 'height' => $arr['height']);
+ return $ret;
+ }
+
+ public function delete($path) {
+ unlink(\OC::$CONFIG_DATADIRECTORY_ROOT.'/'.\OC_User::getUser()."/gallery".$path);
+ }
+
+ private function __construct() {}
+
+}
+?>
diff --git a/apps/gallery/lib/photo.php b/apps/gallery/lib/photo.php
index b4b37236b0..f9527cb5fd 100644
--- a/apps/gallery/lib/photo.php
+++ b/apps/gallery/lib/photo.php
@@ -68,7 +68,7 @@ class OC_Gallery_Photo {
public static function getThumbnail($image_name, $owner = null) {
if (!$owner) $owner = OCP\USER::getUser();
- $view = OCP\App::getStorage('gallery');
+ $view = OCP\Files::getStorage('gallery');
$save_dir = dirname($image_name);
if (!$view->is_dir($save_dir)) {
$view->mkdir($save_dir);
diff --git a/apps/gallery/lib/scanner.php b/apps/gallery/lib/scanner.php
index e11ba1da45..233fa20bca 100644
--- a/apps/gallery/lib/scanner.php
+++ b/apps/gallery/lib/scanner.php
@@ -81,7 +81,7 @@ class OC_Gallery_Scanner {
$image->destroy();
}
}
- $view = OCP\App::getStorage('gallery');
+ $view = OCP\Files::getStorage('gallery');
imagepng($thumbnail, $view->getLocalFile($albumName.'.png'));
imagedestroy($thumbnail);
}
diff --git a/apps/gallery/lib/tiles.php b/apps/gallery/lib/tiles.php
new file mode 100644
index 0000000000..ff9519142a
--- /dev/null
+++ b/apps/gallery/lib/tiles.php
@@ -0,0 +1,178 @@
+tiles_array = array();
+ }
+
+ public function setAvailableSpace($space) {
+ $available_space = $space;
+ }
+
+ public function getTilesCount() {
+ return count($this->tiles_array);
+ }
+
+ public function addTile($tile) {
+ array_push($this->tiles_array, $tile);
+ }
+
+ public function getLeftSpace() {
+ $occupied_space = 0;
+ for ($i = 0; $i < count($this->tiles_array); $i++) {
+ $occupied_space += $this->tiles_array[$i]->getWidth();
+ }
+ return $this->available_space - $occupied_space;
+ }
+
+ public function tileWillFit($tile) {
+ return $this->getLeftSpace() > $tile->getWidth();
+ }
+
+ public function get() {
+ $r = '';
+
+ for ($i = 0; $i < count($this->tiles_array); $i++) {
+ $img_w = $this->tiles_array[$i]->getWidth();
+ $extra = '';
+ if ($img_w != IMAGE_WIDTH) $extra = ' style="width:'.$img_w.'px"';
+ $r .= '
'.$this->tiles_array[$i]->get().'
';
+ }
+
+ $r .= '
';
+ return $r;
+ }
+
+ private $tiles_array;
+ private $available_space;
+}
+
+class TileSingle extends TileBase {
+
+ public function __construct($path) {
+ \OC_Log::write(TAG, 'Loading file from path '.$path, \OC_Log::DEBUG);
+ $this->file_path = $path;
+/* $this->image = new \OC_Image();
+ if (!$this->image->loadFromFile($this->file_path)) {
+ \OC_Log::write(TAG, 'Loading file filed', \OC_Log::ERROR);
+ return;
+ }
+ $this->image->fixOrientation();*/
+ }
+
+ public function getWidth() {
+ $a = ThumbnailsManager::getInstance()->getThumbnailInfo($this->file_path);
+ return $a['width'];
+ }
+
+ public function get($extra = '') {
+ // !HACK! file path needs to be encoded twice because files app decode twice url, so any special chars like + or & in filename
+ // !HACK! will result in failing of opening them
+ return '';
+ }
+
+ public function getMiniatureSrc() {
+ return \OCP\Util::linkTo('gallery', 'ajax/thumbnail.php').'&filepath='.urlencode($this->getPath());
+ }
+
+ public function getPath() {
+ return $this->file_path;
+ }
+
+ public function getOnClickAction() {
+ return '';//'javascript:openFile(\''.$this->file_path.'\');';
+ }
+
+ private $file_path;
+ private $image;
+}
+
+class TileStack extends TileBase {
+
+ const STACK_REPRESENTATIVES = 3;
+
+ public function __construct($path_array, $stack_name) {
+ $this->tiles_array = array();
+ $this->stack_name = $stack_name;
+ for ($i = 0; $i < count($path_array) && $i < self::STACK_REPRESENTATIVES; $i++) {
+ $tile = new TileSingle($path_array[$i]);
+ array_push($this->tiles_array, $tile);
+ }
+ }
+
+ public function forceSize($width_must_fit=false) {
+ for ($i = 0; $i < count($this->tiles_array); $i++)
+ $this->tiles_array[$i]->forceSize(true);
+ }
+
+ public function getWidth() {
+ $max = 0;
+ for ($i = 0; $i < count($this->tiles_array); $i++) {
+ $max = max($max, $this->tiles_array[$i]->getWidth());
+ }
+ return min(IMAGE_WIDTH, $max);
+ }
+
+ public function get() {
+ $r = ''.$this->stack_name.'
';
+ for ($i = 0; $i < count($this->tiles_array); $i++) {
+ $top = rand(-5, 5);
+ $left = rand(-5, 5);
+ $img_w = $this->tiles_array[$i]->getWidth();
+ $extra = '';
+ if ($img_w < IMAGE_WIDTH) {
+ $extra = 'width:'.$img_w.'px;';
+ }
+ $r .= '';
+ }
+ return $r;
+ }
+
+ public function getOnHoverAction() {
+ return 'javascript:t(this);return false;';
+ }
+
+ public function getOnOutAction() {
+ return 'javascript:o(this);return false;';
+ }
+
+ public function getCount() {
+ return count($this->tiles_array);
+ }
+
+ public function getOnClickAction() {
+ return 'javascript:openNewGal(\''.$this->stack_name.'\');';
+ }
+
+ private $tiles_array;
+ private $stack_name;
+}
+
+?>
diff --git a/apps/gallery/lib/tiles_test.php b/apps/gallery/lib/tiles_test.php
new file mode 100644
index 0000000000..022a88f75c
--- /dev/null
+++ b/apps/gallery/lib/tiles_test.php
@@ -0,0 +1,87 @@
+
+
+
+
+
+addTile(new \OC\Pictures\TileSingle($images[$i]));
+ continue;
+ }
+ if (strcmp($prev_dir_arr[0], $dir_arr[0])!=0) {
+ $tl->addTile(new \OC\Pictures\TileStack($arr, $prev_dir_arr[0]));
+ $arr = array();
+ }
+ $arr[] = $root.$images[$i];
+ $previous_element = $images[$i];
+}
+
+$dir_arr = explode('/', $previous_element);
+
+if (count($dir_arr)==0) {
+ $tl->addTile(new \OC\Pictures\TileSingle($previous_element));
+} else if (count($dir_arr) && $ts->getCount() == 0){
+ $ts = new \OC\Pictures\TileStack(array($previous_element), $dir_arr[0]);
+} else {
+ $arr[] = $previous_element;
+ $ts->addTile($arr);
+}
+
+if ($ts->getCount() != 0) {
+ $tl->addTile($ts);
+}
+
+echo $tl->get();
+
+?>
diff --git a/apps/gallery/templates/index.php b/apps/gallery/templates/index.php
index 99af3bda0a..39e3bbf47b 100644
--- a/apps/gallery/templates/index.php
+++ b/apps/gallery/templates/index.php
@@ -1,31 +1,105 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+addTile(new \OC\Pictures\TileSingle($root.$images[$i]));
+ continue;
+ }
+ if (strcmp($prev_dir_arr[0], $dir_arr[0])!=0) {
+ $tl->addTile(new \OC\Pictures\TileStack($arr, $prev_dir_arr[0]));
+ $arr = array();
+ }
+ $arr[] = $root.$images[$i];
+ $previous_element = $images[$i];
+}
+
+$dir_arr = explode('/', $previous_element);
+
+if (count($images)>1) {
+ if (count($dir_arr)==0) {
+ $tl->addTile(new \OC\Pictures\TileSingle($previous_element));
+ } else if (count($dir_arr) && $ts->getCount() == 0){
+ $ts = new \OC\Pictures\TileStack(array($root.$previous_element), $dir_arr[0]);
+ } else {
+ $arr[] = $previous_element;
+ $ts->addTile($arr);
+ }
+}
+
+if ($ts->getCount() != 0) {
+ $tl->addTile($ts);
+}
+
+echo $tl->get();
+
+?>
diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php
index baca1d32ba..62e7c8ca6b 100644
--- a/apps/user_ldap/group_ldap.php
+++ b/apps/user_ldap/group_ldap.php
@@ -27,6 +27,11 @@ class OC_GROUP_LDAP extends OC_Group_Backend {
protected $ldapGroupMemberAssocAttr;
protected $configured = false;
+ protected $_group_user = array();
+ protected $_user_groups = array();
+ protected $_group_users = array();
+ protected $_groups = array();
+
public function __construct() {
$this->ldapGroupFilter = OCP\Config::getAppValue('user_ldap', 'ldap_group_filter', '(objectClass=posixGroup)');
$this->ldapGroupMemberAssocAttr = OCP\Config::getAppValue('user_ldap', 'ldap_group_member_assoc_attribute', 'uniqueMember');
@@ -48,6 +53,9 @@ class OC_GROUP_LDAP extends OC_Group_Backend {
if(!$this->configured) {
return false;
}
+ if(isset($this->_group_user[$gid][$uid])) {
+ return $this->_group_user[$gid][$uid];
+ }
$dn_user = OC_LDAP::username2dn($uid);
$dn_group = OC_LDAP::groupname2dn($gid);
// just in case
@@ -64,8 +72,8 @@ class OC_GROUP_LDAP extends OC_Group_Backend {
//TODO: this can be done with one LDAP query
if(strtolower($this->ldapGroupMemberAssocAttr) == 'memberuid') {
$dns = array();
- foreach($members as $uid) {
- $filter = str_replace('%uid', $uid, OC_LDAP::conf('ldapLoginFilter'));
+ foreach($members as $mid) {
+ $filter = str_replace('%uid', $mid, OC_LDAP::conf('ldapLoginFilter'));
$ldap_users = OC_LDAP::fetchListOfUsers($filter, 'dn');
if(count($ldap_users) < 1) {
continue;
@@ -75,7 +83,8 @@ class OC_GROUP_LDAP extends OC_Group_Backend {
$members = $dns;
}
- return in_array($dn_user, $members);
+ $this->_group_user[$gid][$uid] = in_array($dn_user, $members);
+ return $this->_group_user[$gid][$uid];
}
/**
@@ -90,8 +99,12 @@ class OC_GROUP_LDAP extends OC_Group_Backend {
if(!$this->configured) {
return array();
}
+ if(isset($this->_user_groups[$uid])) {
+ return $this->_user_groups[$uid];
+ }
$userDN = OC_LDAP::username2dn($uid);
if(!$userDN) {
+ $this->_user_groups[$uid] = array();
return array();
}
@@ -112,9 +125,9 @@ class OC_GROUP_LDAP extends OC_Group_Backend {
$this->ldapGroupMemberAssocAttr.'='.$uid
));
$groups = OC_LDAP::fetchListOfGroups($filter, array(OC_LDAP::conf('ldapGroupDisplayName'),'dn'));
- $userGroups = OC_LDAP::ownCloudGroupNames($groups);
+ $this->_user_groups[$uid] = array_unique(OC_LDAP::ownCloudGroupNames($groups), SORT_LOCALE_STRING);
- return array_unique($userGroups, SORT_LOCALE_STRING);
+ return $this->_user_groups[$uid];
}
/**
@@ -125,14 +138,19 @@ class OC_GROUP_LDAP extends OC_Group_Backend {
if(!$this->configured) {
return array();
}
+ if(isset($this->_group_users[$gid])) {
+ return $this->_group_users[$gid];
+ }
$groupDN = OC_LDAP::groupname2dn($gid);
if(!$groupDN) {
+ $this->_group_users[$gid] = array();
return array();
}
$members = OC_LDAP::readAttribute($groupDN, $this->ldapGroupMemberAssocAttr);
if(!$members) {
+ $this->_group_users[$gid] = array();
return array();
}
@@ -154,7 +172,8 @@ class OC_GROUP_LDAP extends OC_Group_Backend {
if(!$isMemberUid) {
$result = array_intersect($result, OCP\User::getUsers());
}
- return array_unique($result, SORT_LOCALE_STRING);
+ $this->_group_users[$gid] = array_unique($result, SORT_LOCALE_STRING);
+ return $this->_group_users[$gid];
}
/**
@@ -167,10 +186,11 @@ class OC_GROUP_LDAP extends OC_Group_Backend {
if(!$this->configured) {
return array();
}
-
- $ldap_groups = OC_LDAP::fetchListOfGroups($this->ldapGroupFilter, array(OC_LDAP::conf('ldapGroupDisplayName'), 'dn'));
- $groups = OC_LDAP::ownCloudGroupNames($ldap_groups);
- return $groups;
+ if(is_null($this->_groups)) {
+ $ldap_groups = OC_LDAP::fetchListOfGroups($this->ldapGroupFilter, array(OC_LDAP::conf('ldapGroupDisplayName'), 'dn'));
+ $this->_groups = OC_LDAP::ownCloudGroupNames($ldap_groups);
+ }
+ return $this->groups;
}
/**
diff --git a/apps/user_ldap/lib_ldap.php b/apps/user_ldap/lib_ldap.php
index b900a67ec3..22d464b65a 100644
--- a/apps/user_ldap/lib_ldap.php
+++ b/apps/user_ldap/lib_ldap.php
@@ -52,6 +52,8 @@ class OC_LDAP {
static protected $ldapGroupDisplayName;
static protected $ldapLoginFilter;
+ static protected $__d;
+
/**
* @brief initializes the LDAP backend
* @param $force read the config settings no matter what
@@ -59,6 +61,9 @@ class OC_LDAP {
* initializes the LDAP backend
*/
static public function init($force = false) {
+ if(is_null(self::$__d)) {
+ self::$__d = new OC_LDAP_DESTRUCTOR();
+ }
self::readConfiguration($force);
self::establishConnection();
}
@@ -258,7 +263,7 @@ class OC_LDAP {
$key = self::recursiveArraySearch($knownObjects, $ldapObject['dn']);
//everything is fine when we know the group
- if($key) {
+ if($key !== false) {
$ownCloudNames[] = $knownObjects[$key]['owncloud_name'];
continue;
}
@@ -329,30 +334,6 @@ class OC_LDAP {
return $query->execute()->fetchAll();
}
- /**
- * @brief inserts a new group into the mappings table
- * @param $dn the record in question
- * @param $ocname the name to use in ownCloud
- * @returns true on success, false otherwise
- *
- * inserts a new group into the mappings table
- */
- static private function mapGroup($dn, $ocname) {
- return self::mapComponent($dn, $ocname, false);
- }
-
- /**
- * @brief inserts a new user into the mappings table
- * @param $dn the record in question
- * @param $ocname the name to use in ownCloud
- * @returns true on success, false otherwise
- *
- * inserts a new user into the mappings table
- */
- static private function mapUser($dn, $ocname) {
- return self::mapComponent($dn, $ocname, true);
- }
-
/**
* @brief inserts a new user or group into the mappings table
* @param $dn the record in question
@@ -380,12 +361,22 @@ class OC_LDAP {
SELECT 1
FROM '.$table.'
WHERE ldap_dn = ?
- AND owncloud_name = ? )
+ OR owncloud_name = ? )
');
$res = $insert->execute(array($dn, $ocname, $dn, $ocname));
- return !OCP\DB::isError($res);
+ if(OCP\DB::isError($res)) {
+ return false;
+ }
+
+ $insRows = $res->numRows();
+
+ if($insRows == 0) {
+ return false;
+ }
+
+ return true;
}
static public function fetchListOfUsers($filter, $attr) {
@@ -530,7 +521,7 @@ class OC_LDAP {
static private function sanitizeDN($dn) {
//OID sometimes gives back DNs with whitespace after the comma a la "uid=foo, cn=bar, dn=..." We need to tackle this!
- $dn = preg_replace('/,\s+/',',',$dn);
+ $dn = preg_replace('/([^\\\]),(\s+)/','\1,',$dn);
//make comparisons and everything work
$dn = strtolower($dn);
diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php
index ba66c7a9ca..9281aebe81 100644
--- a/apps/user_ldap/user_ldap.php
+++ b/apps/user_ldap/user_ldap.php
@@ -34,6 +34,9 @@ class OC_USER_LDAP extends OC_User_Backend {
// will be retrieved from LDAP server
protected $ldap_dc = false;
+ // cache getUsers()
+ protected $_users = null;
+
public function __construct() {
$this->ldapUserFilter = OCP\Config::getAppValue('user_ldap', 'ldap_userlist_filter', '(objectClass=posixAccount)');
$this->ldapQuotaAttribute = OCP\Config::getAppValue('user_ldap', 'ldap_quota_attr', '');
@@ -108,9 +111,11 @@ class OC_USER_LDAP extends OC_User_Backend {
* Get a list of all users.
*/
public function getUsers(){
- $ldap_users = OC_LDAP::fetchListOfUsers($this->ldapUserFilter, array(OC_LDAP::conf('ldapUserDisplayName'), 'dn'));
- $users = OC_LDAP::ownCloudUserNames($ldap_users);
- return $users;
+ if(is_null($this->_users)) {
+ $ldap_users = OC_LDAP::fetchListOfUsers($this->ldapUserFilter, array(OC_LDAP::conf('ldapUserDisplayName'), 'dn'));
+ $this->_users = OC_LDAP::ownCloudUserNames($ldap_users);
+ }
+ return $this->_users;
}
/**
@@ -119,7 +124,7 @@ class OC_USER_LDAP extends OC_User_Backend {
* @return boolean
*/
public function userExists($uid){
- return in_array($uid, self::getUsers());
+ return in_array($uid, $this->getUsers());
}
}
diff --git a/apps/user_migrate/js/export.js b/apps/user_migrate/js/export.js
index 2d660b2de6..aef45c45a7 100644
--- a/apps/user_migrate/js/export.js
+++ b/apps/user_migrate/js/export.js
@@ -9,7 +9,7 @@ $(document).ready(function(){
function(result){
if(result.status == 'success'){
// Download the file
- window.location = OC.filePath('user_migrate','ajax','export.php?operation=download') ;
+ window.location = OC.linkTo('user_migrate','ajax/export.php') + '?operation=download';
$('.loading').hide();
$('#exportbtn').val(t('user_migrate', 'Export'));
} else {
diff --git a/config/config.sample.php b/config/config.sample.php
index 7ab327e2bc..c81e4a34eb 100644
--- a/config/config.sample.php
+++ b/config/config.sample.php
@@ -3,37 +3,66 @@
define("DEBUG", true);
$CONFIG = array(
+/* Flag to indicate OwnCloud is successfully installed (true = installed) */
"installed" => false,
+/* Type of database, can be sqlite, mysql or pgsql */
"dbtype" => "sqlite",
+/* Name of the OwnCloud database */
"dbname" => "owncloud",
+/* User to access the OwnCloud database */
"dbuser" => "",
+/* Password to access the OwnCloud database */
"dbpassword" => "",
+/* Host running the OwnCloud database */
"dbhost" => "",
+/* Prefix for the OwnCloud tables in the database */
"dbtableprefix" => "",
+/* Force use of HTTPS connection (true = use HTTPS) */
"forcessl" => false,
-"enablebackup" => false,
+/* Theme to use for OwnCloud */
"theme" => "",
+/* Path to the 3rdparty directory */
"3rdpartyroot" => "",
+/* URL to the 3rdparty directory, as seen by the browser */
"3rdpartyurl" => "",
+/* Default app to load on login */
"defaultapp" => "files",
+/* Enable the help menu item in the settings */
"knowledgebaseenabled" => true,
-"knowledgebaseurl" => "",
+/* URL to use for the help page, server should understand OCS */
+"knowledgebaseurl" => "http://api.apps.owncloud.com/v1",
+/* Enable installing apps from the appstore */
"appstoreenabled" => true,
-"appstoreurl" => "",
+/* URL of the appstore to use, server should understand OCS */
+"appstoreurl" => "http://api.apps.owncloud.com/v1",
+/* Mode to use for sending mail, can be sendmail, smtp, qmail or php, see PHPMailer docs */
"mail_smtpmode" => "sendmail",
+/* Host to use for sending mail, depends on mail_smtpmode if this is used */
"mail_smtphost" => "127.0.0.1",
+/* authentication needed to send mail, depends on mail_smtpmode if this is used
+ * (false = disable authentication)
+ */
"mail_smtpauth" => false,
+/* Username to use for sendmail mail, depends on mail_smtpauth if this is used */
"mail_smtpname" => "",
+/* Password to use for sendmail mail, depends on mail_smtpauth if this is used */
"mail_smtppassword" => "",
+/* Check 3rdparty apps for malicious code fragments */
"appcodechecker" => "",
-"log_type" => "",
+/* Place to log to, can be owncloud and syslog (owncloud is log menu item in admin menu) */
+"log_type" => "owncloud",
+/* File for the owncloud logger to log to, (default is ownloud.log in the data dir */
"logfile" => "",
+/* Loglevel to start logging at. 0=DEBUG, 1=INFO, 2=WARN, 3=ERROR (default is WARN) */
"loglevel" => "",
/* Set this to false to disable the check for writable apps dir.
* If the apps dir is not writable, you can't download&install extra apps
* in the admin apps menu.
*/
"writable_appsdir" => true,
+/* The directory where the user data is stored, default to data in the owncloud
+ * directory. The sqlite database is also stored here, when sqlite is used.
+ */
// "datadirectory" => ""
);
?>
diff --git a/core/lostpassword/index.php b/core/lostpassword/index.php
index f1d90eaeff..6bed7bdd93 100644
--- a/core/lostpassword/index.php
+++ b/core/lostpassword/index.php
@@ -23,7 +23,6 @@ if (isset($_POST['user'])) {
$msg = $tmpl->fetchPage();
$l = OC_L10N::get('core');
$from = 'lostpassword-noreply@' . OCP\Util::getServerHost();
- $r=mail($email, $l->t('Owncloud password reset'), $msg, 'From:' . $from);
OC_MAIL::send($email,$_POST['user'],$l->t('ownCloud password reset'),$msg,$from,'ownCloud');
echo('sent');
diff --git a/core/templates/layout.guest.php b/core/templates/layout.guest.php
index 7f5a4d50fc..55cc8008d9 100644
--- a/core/templates/layout.guest.php
+++ b/core/templates/layout.guest.php
@@ -4,7 +4,7 @@
ownCloud
-
+
@@ -14,7 +14,7 @@
var oc_webroot = '';
var oc_appswebroot = '';
-
+
diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php
index 8f6c029007..e04fcabf13 100644
--- a/core/templates/layout.user.php
+++ b/core/templates/layout.user.php
@@ -4,7 +4,7 @@
ownCloud
-
+
@@ -15,7 +15,7 @@
var oc_appswebroot = '';
var oc_current_user = '';
-
+
diff --git a/lib/app.php b/lib/app.php
index 667633e264..e8a5a1291d 100755
--- a/lib/app.php
+++ b/lib/app.php
@@ -67,6 +67,11 @@ class OC_App{
OC_Util::$scripts = array();
OC_Util::$core_styles = OC_Util::$styles;
OC_Util::$styles = array();
+
+ if (!OC_AppConfig::getValue('core', 'remote_core.css', false)) {
+ OC_AppConfig::setValue('core', 'remote_core.css', '/core/minimizer.php');
+ OC_AppConfig::setValue('core', 'remote_core.js', '/core/minimizer.php');
+ }
}
}
// return
diff --git a/lib/base.php b/lib/base.php
index a439651f4a..4bd165862b 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -271,7 +271,7 @@ class OC{
ini_set('session.cookie_httponly','1;');
session_start();
}
-
+
public static function loadapp(){
if(file_exists(OC::$APPSROOT . '/apps/' . OC::$REQUESTEDAPP . '/index.php')){
require_once(OC::$APPSROOT . '/apps/' . OC::$REQUESTEDAPP . '/index.php');
@@ -279,7 +279,7 @@ class OC{
trigger_error('The requested App was not found.', E_USER_ERROR);//load default app instead?
}
}
-
+
public static function loadfile(){
if(file_exists(OC::$APPSROOT . '/apps/' . OC::$REQUESTEDAPP . '/' . OC::$REQUESTEDFILE)){
if(substr(OC::$REQUESTEDFILE, -3) == 'css'){
@@ -289,7 +289,7 @@ class OC{
exit;
}elseif(substr(OC::$REQUESTEDFILE, -3) == 'php'){
require_once(OC::$APPSROOT . '/apps/' . OC::$REQUESTEDAPP . '/' . OC::$REQUESTEDFILE);
- }
+ }
}else{
header('HTTP/1.0 404 Not Found');
exit;
@@ -300,7 +300,7 @@ class OC{
// register autoloader
spl_autoload_register(array('OC','autoload'));
setlocale(LC_ALL, 'en_US.UTF-8');
-
+
// set some stuff
//ob_start();
error_reporting(E_ALL | E_STRICT);
@@ -320,7 +320,7 @@ class OC{
//try to configure php to enable big file uploads.
//this doesn´t work always depending on the webserver and php configuration.
//Let´s try to overwrite some defaults anyways
-
+
//try to set the maximum execution time to 60min
@set_time_limit(3600);
@ini_set('max_execution_time',3600);
@@ -350,7 +350,7 @@ class OC{
$_SERVER['PHP_AUTH_USER'] = strip_tags($name);
$_SERVER['PHP_AUTH_PW'] = strip_tags($password);
}
-
+
self::initPaths();
// register the stream wrappers
@@ -368,7 +368,7 @@ class OC{
if(isset($refererhost['host'])) $refererhost=$refererhost['host']; else $refererhost='';
$server=OC_Helper::serverHost();
$serverhost=explode(':',$server);
- $serverhost=$serverhost['0'];
+ $serverhost=$serverhost['0'];
if(!self::$CLI){
if(($_SERVER['REQUEST_METHOD']=='POST') and ($refererhost<>$serverhost)) {
$url = OC_Helper::serverProtocol().'://'.$server.OC::$WEBROOT.'/index.php';
@@ -419,18 +419,13 @@ class OC{
OC_App::loadApps();
}
}
-
+
// Check for blacklisted files
OC_Hook::connect('OC_Filesystem','write','OC_Filesystem','isBlacklisted');
//make sure temporary files are cleaned up
register_shutdown_function(array('OC_Helper','cleanTmp'));
- if (!OC_AppConfig::getValue('core', 'remote_core.css', false)) {
- OC_AppConfig::setValue('core', 'remote_core.css', '/core/minimizer.php');
- OC_AppConfig::setValue('core', 'remote_core.js', '/core/minimizer.php');
- }
-
//parse the given parameters
self::$REQUESTEDAPP = (isset($_GET['app'])?str_replace(array('\0', '/', '\\', '..'), '', strip_tags($_GET['app'])):OC_Config::getValue('defaultapp', 'files'));
if(substr_count(self::$REQUESTEDAPP, '?') != 0){
@@ -482,7 +477,7 @@ if(!function_exists('get_temp_dir')) {
return dirname($temp);
}
if( $temp=sys_get_temp_dir()) return $temp;
-
+
return null;
}
}
diff --git a/lib/cache.php b/lib/cache.php
index 70f11f3551..55d5b064c4 100644
--- a/lib/cache.php
+++ b/lib/cache.php
@@ -10,7 +10,17 @@ class OC_Cache {
static protected $cache;
static protected function init() {
+ $fast_cache = null;
+ if (!$fast_cache && function_exists('xcache_set')) {
+ $fast_cache = new OC_Cache_XCache();
+ }
+ if (!$fast_cache && function_exists('apc_store')) {
+ $fast_cache = new OC_Cache_APC();
+ }
self::$cache = new OC_Cache_File();
+ if ($fast_cache) {
+ self::$cache = new OC_Cache_Broker($fast_cache, self::$cache);
+ }
}
static public function get($key) {
diff --git a/lib/cache/broker.php b/lib/cache/broker.php
new file mode 100644
index 0000000000..62a7cd96d1
--- /dev/null
+++ b/lib/cache/broker.php
@@ -0,0 +1,55 @@
+
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+class OC_Cache_Broker {
+ protected $fast_cache;
+ protected $slow_cache;
+
+ public function __construct($fast_cache, $slow_cache) {
+ $this->fast_cache = $fast_cache;
+ $this->slow_cache = $slow_cache;
+ }
+
+ public function get($key) {
+ if ($r = $this->fast_cache->get($key)) {
+ return $r;
+ }
+ return $this->slow_cache->get($key);
+ }
+
+ public function set($key, $value, $ttl=0) {
+ $set_slow = strlen($value) > 8192;
+ if ($set_slow) {
+ if ($this->fast_cache->hasKey($key)) {
+ $this->fast_cache->remove($key);
+ }
+ $this->slow_cache->set($key, $value, $ttl);
+ } else {
+ $this->fast_cache->set($key, $value, $ttl);
+ }
+ }
+
+ public function hasKey($key) {
+ if ($this->fast_cache->hasKey($key)) {
+ return true;
+ }
+ return $this->slow_cache->hasKey($key);
+ }
+
+ public function remove($key) {
+ if ($this->fast_cache->remove($key)) {
+ return true;
+ }
+ return $this->slow_cache->remove($key);
+ }
+
+ public function clear(){
+ $this->fast_cache->clear();
+ $this->slow_cache->clear();
+ }
+}
diff --git a/lib/image.php b/lib/image.php
index a6bb92cea2..af61f9424e 100644
--- a/lib/image.php
+++ b/lib/image.php
@@ -136,6 +136,8 @@ class OC_Image {
*/
private function _output($filepath=null) {
if($filepath) {
+ if (!file_exists(dirname($filepath)))
+ mkdir(dirname($filepath), 0777, true);
if(!is_writable(dirname($filepath))) {
OC_Log::write('core',__METHOD__.'(): Directory \''.dirname($filepath).'\' is not writable.', OC_Log::ERROR);
return false;
@@ -426,7 +428,7 @@ class OC_Image {
if(is_resource($str)) {
return false;
}
- $this->resource = imagecreatefromstring($str);
+ $this->resource = @imagecreatefromstring($str);
if(!$this->resource) {
OC_Log::write('core','OC_Image->loadFromData, couldn\'t load', OC_Log::DEBUG);
return false;
@@ -445,7 +447,7 @@ class OC_Image {
}
$data = base64_decode($str);
if($data) { // try to load from string data
- $this->resource = imagecreatefromstring($data);
+ $this->resource = @imagecreatefromstring($data);
if(!$this->resource) {
OC_Log::write('core','OC_Image->loadFromBase64, couldn\'t load', OC_Log::DEBUG);
return false;
@@ -496,6 +498,32 @@ class OC_Image {
return true;
}
+ public function preciseResize($width, $height) {
+ if (!$this->valid()) {
+ OC_Log::write('core',__METHOD__.'(): No image loaded', OC_Log::ERROR);
+ return false;
+ }
+ $width_orig=imageSX($this->resource);
+ $height_orig=imageSY($this->resource);
+ $process = imagecreatetruecolor($width, $height);
+
+ if ($process == false) {
+ OC_Log::write('core',__METHOD__.'(): Error creating true color image',OC_Log::ERROR);
+ imagedestroy($process);
+ return false;
+ }
+
+ imagecopyresampled($process, $this->resource, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
+ if ($process == false) {
+ OC_Log::write('core',__METHOD__.'(): Error resampling process image '.$width.'x'.$height,OC_Log::ERROR);
+ imagedestroy($process);
+ return false;
+ }
+ imagedestroy($this->resource);
+ $this->resource = $process;
+ return true;
+ }
+
/**
* @brief Crops the image to the middle square. If the image is already square it just returns.
* @param int maximum size for the result (optional)
diff --git a/lib/l10n.php b/lib/l10n.php
index 682e15f0e9..3596c992ba 100644
--- a/lib/l10n.php
+++ b/lib/l10n.php
@@ -77,6 +77,10 @@ class OC_L10N{
* language.
*/
public function __construct($app, $lang = null){
+ $this->init($app, $lang);
+ }
+
+ protected function init($app, $lang = null){
// Find the right language
if(is_null($lang)){
$lang = self::findLanguage($app);
diff --git a/lib/mail.php b/lib/mail.php
index b46f73bd94..7343f5f0d9 100644
--- a/lib/mail.php
+++ b/lib/mail.php
@@ -88,19 +88,8 @@ class OC_Mail {
/**
- * sending a mail based on a template
+ * return the footer for a mail
*
- * @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() {
diff --git a/lib/ocsclient.php b/lib/ocsclient.php
index 33308553be..8e976171e9 100644
--- a/lib/ocsclient.php
+++ b/lib/ocsclient.php
@@ -35,12 +35,7 @@ class OC_OCSClient{
* This function returns the url of the OCS AppStore server. It´s possible to set it in the config file or it will fallback to the default
*/
private static function getAppStoreURL(){
- $configurl=OC_Config::getValue('appstoreurl', '');
- if($configurl<>'') {
- $url=$configurl;
- }else{
- $url='http://api.apps.owncloud.com/v1';
- }
+ $url = OC_Config::getValue('appstoreurl', 'http://api.apps.owncloud.com/v1');
return($url);
}
@@ -50,12 +45,7 @@ class OC_OCSClient{
* This function returns the url of the OCS knowledge base server. It´s possible to set it in the config file or it will fallback to the default
*/
private static function getKBURL(){
- $configurl=OC_Config::getValue('knowledgebaseurl', '');
- if($configurl<>'') {
- $url=$configurl;
- }else{
- $url='http://api.apps.owncloud.com/v1';
- }
+ $url = OC_Config::getValue('knowledgebaseurl', 'http://api.apps.owncloud.com/v1');
return($url);
}
diff --git a/settings/templates/help.php b/settings/templates/help.php
index a53ec76d68..cf61207e60 100644
--- a/settings/templates/help.php
+++ b/settings/templates/help.php
@@ -26,9 +26,9 @@
"") { echo('
'); } ?>
- '') echo('
'.$kb["name"].'
');?>
-
- '') echo('
'.$l->t('Answer').':
'.$kb['answer'].'
');?>
+ '') echo('
'.htmlentities($kb["name"]).'
');?>
+
+ '') echo('
'.$l->t('Answer').':
'.htmlentities($kb['answer']).'
');?>