From aff8bc62d26e1fc7555eb49a2f4a98f0c3d45c3f Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 31 Jul 2011 20:24:27 +0200 Subject: [PATCH 01/78] some improvements in oc_media_collections --- apps/media/lib_collection.php | 36 ++++++++++------------------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/apps/media/lib_collection.php b/apps/media/lib_collection.php index 5a16aaee84..7e540ab585 100644 --- a/apps/media/lib_collection.php +++ b/apps/media/lib_collection.php @@ -123,14 +123,9 @@ class OC_MEDIA_COLLECTION{ if(!$exact and $search!='%'){ $search="%$search%"; } - $query=OC_DB::prepare("SELECT DISTINCT *PREFIX*media_artists.artist_name AS name , *PREFIX*media_artists.artist_id AS id FROM *PREFIX*media_artists + $query=OC_DB::prepare("SELECT DISTINCT *PREFIX*media_artists.artist_name AS artist_name , *PREFIX*media_artists.artist_id AS artist_id FROM *PREFIX*media_artists INNER JOIN *PREFIX*media_songs ON *PREFIX*media_artists.artist_id=*PREFIX*media_songs.song_artist WHERE artist_name LIKE ? AND *PREFIX*media_songs.song_user=?"); - $artists=$query->execute(array($search,OC_User::getUser()))->fetchAll(); - $result=array(); - foreach($artists as $artist){ - $result[]=array('artist_name'=>$artist['name'],'artist_id'=>$artist['id']); - } - return $result; + return $query->execute(array($search,OC_User::getUser()))->fetchAll(); } /** @@ -148,7 +143,7 @@ class OC_MEDIA_COLLECTION{ if($artistId!=0){ return $artistId; }else{ - $query=OC_DB::prepare("INSERT INTO `*PREFIX*media_artists` (`artist_id` ,`artist_name`) VALUES (NULL , ?)"); + $query=OC_DB::prepare("INSERT INTO `*PREFIX*media_artists` (`artist_id` ,`artist_name`) VALUES (NULL , ?)"); $result=$query->execute(array($name)); return self::getArtistId($name);; } @@ -161,28 +156,22 @@ class OC_MEDIA_COLLECTION{ * @return array the list of albums found */ static public function getAlbums($artist=0,$search='%',$exact=false){ - $cmd="SELECT * FROM *PREFIX*media_albums WHERE 1=1 "; - $params=array(); + $cmd="SELECT DISTINCT *PREFIX*media_albums.album_name AS album_name , *PREFIX*media_albums.album_artist AS album_artist , *PREFIX*media_albums.album_id AS album_id + FROM *PREFIX*media_albums INNER JOIN *PREFIX*media_songs ON *PREFIX*media_albums.album_id=*PREFIX*media_songs.song_album WHERE *PREFIX*media_songs.song_user=? "; + $params=array(OC_User::getUser()); if($artist!=0){ - $cmd.="AND album_artist = ? "; + $cmd.="AND *PREFIX*media_albums.album_artist = ? "; array_push($params,$artist); } if($search!='%'){ - $cmd.="AND album_name LIKE ? "; + $cmd.="AND *PREFIX*media_albums.album_name LIKE ? "; if(!$exact){ $search="%$search%"; } array_push($params,$search); } $query=OC_DB::prepare($cmd); - $albums=$query->execute($params)->fetchAll(); - $result=array(); - foreach($albums as $album){ - if(count(self::getSongs($album['album_artist'],$album['album_id']))){ - $result[]=$album; - } - } - return $result; + return $query->execute($params)->fetchAll(); } /** @@ -242,12 +231,7 @@ class OC_MEDIA_COLLECTION{ $searchString=''; } $query=OC_DB::prepare("SELECT * FROM *PREFIX*media_songs WHERE song_user=? $artistString $albumString $searchString"); - $songs=$query->execute($params)->fetchAll(); - if(is_array($songs)){ - return $songs; - }else{ - return array(); - } + return $query->execute($params)->fetchAll(); } /** From 14f7daf53c90f14e8fa600926ae19b3e44320158 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 31 Jul 2011 20:24:53 +0200 Subject: [PATCH 02/78] add transitions to oc_db --- lib/db.php | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/lib/db.php b/lib/db.php index 858db09b76..b7775b75ea 100644 --- a/lib/db.php +++ b/lib/db.php @@ -361,4 +361,37 @@ class OC_DB { self::dropTable($name); } } + + /** + * Start a transaction or set a savepoint. + * @param string $savePoint (optional) name of the savepoint to set + */ + public static function beginTransaction($savePoint=''){ + if (!self::$DBConnection->supports('transactions')) { + return false; + } + if($savePoint && !self::$DBConnection->supports('savepoints')){ + return false; + } + if($savePoint){ + self::$DBConnection->beginTransaction($savePoint); + }else{ + self::$DBConnection->beginTransaction(); + } + } + + /** + * Commit the database changes done during a transaction that is in progress or release a savepoint. + * @param string $savePoint (optional) name of the savepoint to commit + */ + public static function commit($savePoint=''){ + if(!self::$DBConnection->inTransaction()){ + return false; + } + if($savePoint){ + self::$DBConnection->commit($savePoint); + }else{ + self::$DBConnection->commit(); + } + } } From 6e2ce76223eb6f0dcd1ef34e086fa59eb5fb3f8b Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sun, 31 Jul 2011 20:25:13 +0200 Subject: [PATCH 03/78] use db transitions for collection scanner --- apps/media/lib_scanner.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/media/lib_scanner.php b/apps/media/lib_scanner.php index e3cb2f051c..f788562fdb 100644 --- a/apps/media/lib_scanner.php +++ b/apps/media/lib_scanner.php @@ -37,6 +37,7 @@ class OC_MEDIA_SCANNER{ * @return int the number of songs found */ public static function scanFolder($path){ + OC_DB::beginTransaction(); if (OC_Filesystem::is_dir($path)) { $songs=0; if ($dh = OC_Filesystem::opendir($path)) { @@ -59,6 +60,7 @@ class OC_MEDIA_SCANNER{ }else{ $songs=0; } + OC_DB::commit(); return $songs; } From 2d199657506a53dda1bd2879f951684c26133ff2 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 1 Aug 2011 00:07:46 +0200 Subject: [PATCH 04/78] some improvements to collection scanning --- apps/media/ajax/api.php | 2 ++ apps/media/lib_collection.php | 10 ++++-- apps/media/lib_scanner.php | 59 +++++++++++++---------------------- lib/db.php | 2 ++ 4 files changed, 34 insertions(+), 39 deletions(-) diff --git a/apps/media/ajax/api.php b/apps/media/ajax/api.php index b86c69d0be..bb86c13f28 100644 --- a/apps/media/ajax/api.php +++ b/apps/media/ajax/api.php @@ -75,6 +75,7 @@ if($arguments['action']){ echo json_encode($artists); break; case 'scan': + OC_DB::beginTransaction(); set_time_limit(0); //recursive scan can take a while $path=$arguments['path']; if(OC_Filesystem::is_dir($path)){ @@ -85,6 +86,7 @@ if($arguments['action']){ } } echo OC_MEDIA_SCANNER::scanFolder($path); + OC_DB::commit(); flush(); break; case 'scanFile': diff --git a/apps/media/lib_collection.php b/apps/media/lib_collection.php index 7e540ab585..4721202690 100644 --- a/apps/media/lib_collection.php +++ b/apps/media/lib_collection.php @@ -28,6 +28,7 @@ class OC_MEDIA_COLLECTION{ private static $artistIdCache=array(); private static $albumIdCache=array(); private static $songIdCache=array(); + private static $queries=array(); /** * get the id of an artist (case-insensitive) @@ -254,8 +255,13 @@ class OC_MEDIA_COLLECTION{ if($songId!=0){ return $songId; }else{ - $query=OC_DB::prepare("INSERT INTO `*PREFIX*media_songs` (`song_id` ,`song_name` ,`song_artist` ,`song_album` ,`song_path` ,`song_user`,`song_length`,`song_track`,`song_size`,`song_playcount`,`song_lastplayed`) - VALUES (NULL , ?, ?, ?, ?,?,?,?,?,0,0)"); + if(!isset(self::$queries['addsong'])){ + $query=OC_DB::prepare("INSERT INTO `*PREFIX*media_songs` (`song_name` ,`song_artist` ,`song_album` ,`song_path` ,`song_user`,`song_length`,`song_track`,`song_size`,`song_playcount`,`song_lastplayed`) + VALUES (?, ?, ?, ?,?,?,?,?,0,0)"); + self::$queries['addsong']=$query; + }else{ + $query=self::$queries['addsong']; + } $query->execute(array($name,$artist,$album,$path,$uid,$length,$track,$size)); $songId=OC_DB::insertid(); // self::setLastUpdated(); diff --git a/apps/media/lib_scanner.php b/apps/media/lib_scanner.php index f788562fdb..4d0b38f820 100644 --- a/apps/media/lib_scanner.php +++ b/apps/media/lib_scanner.php @@ -30,6 +30,7 @@ class OC_MEDIA_SCANNER{ //these are used to store which artists and albums we found, it can save a lot of addArtist/addAlbum calls static private $artists=array(); static private $albums=array();//stored as "$artist/$album" to allow albums with the same name from different artists + static private $useMp3Info=null; /** * scan a folder for music @@ -37,7 +38,7 @@ class OC_MEDIA_SCANNER{ * @return int the number of songs found */ public static function scanFolder($path){ - OC_DB::beginTransaction(); +// OC_DB::beginTransaction(); if (OC_Filesystem::is_dir($path)) { $songs=0; if ($dh = OC_Filesystem::opendir($path)) { @@ -47,7 +48,8 @@ class OC_MEDIA_SCANNER{ if(OC_Filesystem::is_dir($file)){ $songs+=self::scanFolder($file); }elseif(OC_Filesystem::is_file($file)){ - if(self::scanFile($file)){ + $data=self::scanFile($file); + if($data){ $songs++; } } @@ -60,7 +62,7 @@ class OC_MEDIA_SCANNER{ }else{ $songs=0; } - OC_DB::commit(); +// OC_DB::commit(); return $songs; } @@ -70,45 +72,28 @@ class OC_MEDIA_SCANNER{ * @return boolean */ public static function scanFile($path){ + if(is_null(self::$useMp3Info)){ + self::$useMp3Info=OC_Helper::canExecute("mp3info"); + } $file=OC_Filesystem::getLocalFile($path); - if(substr($path,-3)=='mp3' and OC_Helper::canExecute("id3info") and OC_Helper::canExecute("mp3info")){//use the command line tool id3info if possible + if(substr($path,-3)=='mp3' and self::$useMp3Info){//use the command line tool id3info if possible $output=array(); $size=filesize($file); - $length=0; - $title='unknown'; - $album='unknown'; - $artist='unknown'; - $track=0; - exec('id3info "'.$file.'"',$output); - $data=array(); - foreach($output as $line) { - switch(substr($line,0,3)){ - case '***'://comments - break; - case '==='://tag information - $key=substr($line,4,4); - $value=substr($line,strpos($line,':')+2); - switch(strtolower($key)){ - case 'tit1': - case 'tit2': - $title=$value; - break; - case 'tpe1': - case 'tpe2': - $artist=$value; - break; - case 'talb': - $album=$value; - break; - case 'trck': - $track=$value; - break; - } - break; - } + exec('mp3info -p "%a\n%l\n%t\n%n\n%S" "'.$file.'"',$output); + if(count($output)>4){ + $artist=$output[0]; + $album=$output[1]; + $title=$output[2]; + $track=$output[3]; + $length=$output[4]; + }else{ + return; //invalid mp3 file } - $length=exec('mp3info -p "%S" "'.$file.'"'); }else{ + $mimetype=OC_Filesystem::getMimeType($path); + if(substr($mimetype,0,4)!=='audio'){ + return; + } if(!self::$getID3){ self::$getID3=@new getID3(); } diff --git a/lib/db.php b/lib/db.php index b7775b75ea..9b18bc4c97 100644 --- a/lib/db.php +++ b/lib/db.php @@ -367,6 +367,7 @@ class OC_DB { * @param string $savePoint (optional) name of the savepoint to set */ public static function beginTransaction($savePoint=''){ + self::connect(); if (!self::$DBConnection->supports('transactions')) { return false; } @@ -385,6 +386,7 @@ class OC_DB { * @param string $savePoint (optional) name of the savepoint to commit */ public static function commit($savePoint=''){ + self::connect(); if(!self::$DBConnection->inTransaction()){ return false; } From bd6b38e6383488ab1a84261c63856adac2e215dd Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 1 Aug 2011 00:18:09 +0200 Subject: [PATCH 05/78] cache the media collection between page loads --- apps/media/ajax/api.php | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/apps/media/ajax/api.php b/apps/media/ajax/api.php index bb86c13f28..b888316673 100644 --- a/apps/media/ajax/api.php +++ b/apps/media/ajax/api.php @@ -56,6 +56,7 @@ OC_MEDIA_COLLECTION::$uid=OC_User::getUser(); if($arguments['action']){ switch($arguments['action']){ case 'delete': + unset($_SESSION['collection']); $path=$arguments['path']; OC_MEDIA_COLLECTION::deleteSongByPath($path); $paths=explode(PATH_SEPARATOR,OC_Preferences::getValue(OC_User::getUser(),'media','paths','')); @@ -64,17 +65,21 @@ if($arguments['action']){ OC_Preferences::setValue(OC_User::getUser(),'media','paths',implode(PATH_SEPARATOR,$paths)); } case 'get_collection': - $artists=OC_MEDIA_COLLECTION::getArtists(); - foreach($artists as &$artist){ - $artist['albums']=OC_MEDIA_COLLECTION::getAlbums($artist['artist_id']); - foreach($artist['albums'] as &$album){ - $album['songs']=OC_MEDIA_COLLECTION::getSongs($artist['artist_id'],$album['album_id']); + if(!isset($_SESSION['collection'])){ + $artists=OC_MEDIA_COLLECTION::getArtists(); + foreach($artists as &$artist){ + $artist['albums']=OC_MEDIA_COLLECTION::getAlbums($artist['artist_id']); + foreach($artist['albums'] as &$album){ + $album['songs']=OC_MEDIA_COLLECTION::getSongs($artist['artist_id'],$album['album_id']); + } } + + $_SESSION['collection']=json_encode($artists); } - - echo json_encode($artists); + echo $_SESSION['collection']; break; case 'scan': + unset($_SESSION['collection']); OC_DB::beginTransaction(); set_time_limit(0); //recursive scan can take a while $path=$arguments['path']; @@ -90,6 +95,7 @@ if($arguments['action']){ flush(); break; case 'scanFile': + unset($_SESSION['collection']); echo (OC_MEDIA_SCANNER::scanFile($arguments['path']))?'true':'false'; break; case 'get_artists': From f88b47745911f06a844fbc3f35a347c679f0339c Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 1 Aug 2011 00:25:53 +0200 Subject: [PATCH 06/78] fix search results not displaying --- apps/media/js/music.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/media/js/music.js b/apps/media/js/music.js index 5b77194ebc..3dee87744f 100644 --- a/apps/media/js/music.js +++ b/apps/media/js/music.js @@ -21,7 +21,7 @@ $(document).ready(function(){ var data={}; for(var i=0;i Date: Mon, 1 Aug 2011 00:32:44 +0200 Subject: [PATCH 07/78] automatically scan songs that are played from the filebrowser --- apps/media/ajax/api.php | 13 +++++++++++++ apps/media/js/player.js | 7 ++++++- apps/media/lib_scanner.php | 4 +--- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/apps/media/ajax/api.php b/apps/media/ajax/api.php index b888316673..e0183ff05d 100644 --- a/apps/media/ajax/api.php +++ b/apps/media/ajax/api.php @@ -107,6 +107,19 @@ if($arguments['action']){ case 'get_songs': echo json_encode(OC_MEDIA_COLLECTION::getSongs($arguments['artist'],$arguments['album'],$arguments['search'])); break; + case 'get_path_info': + $songId=OC_MEDIA_COLLECTION::getSongByPath($arguments['path']); + if($songId==0){ + unset($_SESSION['collection']); + $songId= OC_MEDIA_SCANNER::scanFile($arguments['path']); + } + if($songId>0){ + $song=OC_MEDIA_COLLECTION::getSong($songId); + $song['artist']=OC_MEDIA_COLLECTION::getArtistName($song['song_artist']); + $song['album']=OC_MEDIA_COLLECTION::getAlbumName($song['song_album']); + echo json_encode($song); + } + break; case 'play': ob_end_clean(); diff --git a/apps/media/js/player.js b/apps/media/js/player.js index ebb8044598..1243f20b8e 100644 --- a/apps/media/js/player.js +++ b/apps/media/js/player.js @@ -96,7 +96,12 @@ var PlayList={ }, addFile:function(path){ var type=musicTypeFromFile(path); - var item={name:'unknown',artist:'unknown',album:'unknwon',type:type};//todo get song data + var item={name:'unknown',artist:'unknown',album:'unknwon',type:type}; + $.getJSON(OC.filePath('media','ajax','api.php')+'?action=get_path_info&path='+encodeURIComponent(path),function(song){ + item.name=song.song_name; + item.artist=song.artist; + item.album=song.album; + }); item[type]=PlayList.urlBase+encodeURIComponent(path); PlayList.items.push(item); }, diff --git a/apps/media/lib_scanner.php b/apps/media/lib_scanner.php index 4d0b38f820..ab38d76294 100644 --- a/apps/media/lib_scanner.php +++ b/apps/media/lib_scanner.php @@ -38,7 +38,6 @@ class OC_MEDIA_SCANNER{ * @return int the number of songs found */ public static function scanFolder($path){ -// OC_DB::beginTransaction(); if (OC_Filesystem::is_dir($path)) { $songs=0; if ($dh = OC_Filesystem::opendir($path)) { @@ -62,7 +61,6 @@ class OC_MEDIA_SCANNER{ }else{ $songs=0; } -// OC_DB::commit(); return $songs; } @@ -141,6 +139,6 @@ class OC_MEDIA_SCANNER{ $albumId=self::$albums[$artist.'/'.$album]; } $songId=OC_MEDIA_COLLECTION::addSong($title,$path,$artistId,$albumId,$length,$track,$size); - return !($title=='unkown' && $artist=='unkown' && $album=='unkown'); + return (!($title=='unkown' && $artist=='unkown' && $album=='unkown'))?$songId:0; } } \ No newline at end of file From 76a2f5b5476c87d330cb81a25793461554af416a Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 1 Aug 2011 01:12:28 +0200 Subject: [PATCH 08/78] persistent playlist for the media player --- apps/media/js/files.js | 5 +++++ apps/media/js/music.js | 1 + apps/media/js/player.js | 23 ++++++++++++++++++++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/apps/media/js/files.js b/apps/media/js/files.js index 307c6012a2..79741e1970 100644 --- a/apps/media/js/files.js +++ b/apps/media/js/files.js @@ -47,4 +47,9 @@ $(document).ready(function() { FileActions.register('application/ogg','','Play',playAudio); FileActions.setDefault('audio','Play'); FileActions.setDefault('application/ogg','Play'); + if(typeof localStorage !== 'undefined'){ + if(localStorage.hasOwnProperty('oc_playlist_items')){ + loadPlayer(); + } + } }); \ No newline at end of file diff --git a/apps/media/js/music.js b/apps/media/js/music.js index 3dee87744f..90b5a09800 100644 --- a/apps/media/js/music.js +++ b/apps/media/js/music.js @@ -41,6 +41,7 @@ $(document).ready(function(){ }); row.find('div.name').append(button); } + PlayList.init(); }); diff --git a/apps/media/js/player.js b/apps/media/js/player.js index 1243f20b8e..d79d6135df 100644 --- a/apps/media/js/player.js +++ b/apps/media/js/player.js @@ -33,11 +33,13 @@ var PlayList={ PlayList.player.jPlayer("setMedia", PlayList.items[PlayList.current]); PlayList.items[index].playcount++; PlayList.player.jPlayer("play"); - if(Collection){ + if (typeof Collection !== 'undefined') { Collection.registerPlay(); } } }else{ + localStorage.setItem('oc_playlist_current',PlayList.current); + localStorage.setItem('oc_playlist_playing','true'); PlayList.init(PlayList.items[index].type,PlayList.play); } } @@ -62,6 +64,7 @@ var PlayList={ ended:PlayList.next, supplied:type, ready:function(){ + PlayList.load(); if(ready){ ready(); } @@ -93,6 +96,7 @@ var PlayList={ item[type]=PlayList.urlBase+encodeURIComponent(song.song_path); PlayList.items.push(item); } + PlayList.save(); }, addFile:function(path){ var type=musicTypeFromFile(path); @@ -116,5 +120,22 @@ var PlayList={ }else{ return !PlayList.player.data("jPlayer").status.paused; } + }, + save:function(){ + if(typeof localStorage !== 'undefined'){ + localStorage.setItem('oc_playlist_items',JSON.stringify(PlayList.items)); + } + }, + load:function(){ + if(typeof localStorage !== 'undefined'){ + if(localStorage.hasOwnProperty('oc_playlist_items')){ + PlayList.items=JSON.parse(localStorage.getItem('oc_playlist_items')); + PlayList.current=parseInt((localStorage.getItem('oc_playlist_current'))); + if(JSON.parse(localStorage.getItem('oc_playlist_playing'))){ + PlayList.play(); + } + PlayList.render(); + } + } } } From e1596cc65a93d86f81aac025a53144c8513be217 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 1 Aug 2011 01:17:54 +0200 Subject: [PATCH 09/78] fix bug in saving currently played song --- apps/media/js/player.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/media/js/player.js b/apps/media/js/player.js index d79d6135df..5f48878563 100644 --- a/apps/media/js/player.js +++ b/apps/media/js/player.js @@ -33,13 +33,13 @@ var PlayList={ PlayList.player.jPlayer("setMedia", PlayList.items[PlayList.current]); PlayList.items[index].playcount++; PlayList.player.jPlayer("play"); + localStorage.setItem('oc_playlist_current',index); + localStorage.setItem('oc_playlist_playing','true'); if (typeof Collection !== 'undefined') { Collection.registerPlay(); } } }else{ - localStorage.setItem('oc_playlist_current',PlayList.current); - localStorage.setItem('oc_playlist_playing','true'); PlayList.init(PlayList.items[index].type,PlayList.play); } } From 1933426e3eef35ff55b2c5ed494012cbfe637e10 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 1 Aug 2011 01:20:00 +0200 Subject: [PATCH 10/78] make the persitent playlist work anywhere --- apps/media/appinfo/app.php | 4 +--- apps/media/js/{files.js => loader.js} | 10 ++++++---- 2 files changed, 7 insertions(+), 7 deletions(-) rename apps/media/js/{files.js => loader.js} (83%) diff --git a/apps/media/appinfo/app.php b/apps/media/appinfo/app.php index b29b842d23..20c58689f0 100644 --- a/apps/media/appinfo/app.php +++ b/apps/media/appinfo/app.php @@ -22,9 +22,7 @@ require_once('apps/media/lib_media.php'); -if(OC_App::getCurrentApp()=='files'){ - OC_Util::addScript('media','files'); -} +OC_Util::addScript('media','loader'); OC_App::register( array( 'order' => 3, 'id' => 'media', 'name' => 'Media' )); diff --git a/apps/media/js/files.js b/apps/media/js/loader.js similarity index 83% rename from apps/media/js/files.js rename to apps/media/js/loader.js index 79741e1970..b2a306b9b3 100644 --- a/apps/media/js/files.js +++ b/apps/media/js/loader.js @@ -43,10 +43,12 @@ $(document).ready(function() { // FileActions.register('audio','Add to playlist','',addAudio); // FileActions.register('application/ogg','Add to playlist','',addAudio); - FileActions.register('audio','Play','',playAudio); - FileActions.register('application/ogg','','Play',playAudio); - FileActions.setDefault('audio','Play'); - FileActions.setDefault('application/ogg','Play'); + if(typeof FileActions!=='undefined'){ + FileActions.register('audio','Play','',playAudio); + FileActions.register('application/ogg','','Play',playAudio); + FileActions.setDefault('audio','Play'); + FileActions.setDefault('application/ogg','Play'); + } if(typeof localStorage !== 'undefined'){ if(localStorage.hasOwnProperty('oc_playlist_items')){ loadPlayer(); From 28a64bc2f8d4f7573033fb2cba121866c0206086 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 1 Aug 2011 01:21:50 +0200 Subject: [PATCH 11/78] fix an isue with persitent playlists inside the media player app --- apps/media/js/loader.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/media/js/loader.js b/apps/media/js/loader.js index b2a306b9b3..9eb51113f3 100644 --- a/apps/media/js/loader.js +++ b/apps/media/js/loader.js @@ -49,9 +49,11 @@ $(document).ready(function() { FileActions.setDefault('audio','Play'); FileActions.setDefault('application/ogg','Play'); } - if(typeof localStorage !== 'undefined'){ - if(localStorage.hasOwnProperty('oc_playlist_items')){ - loadPlayer(); + if(typeof PlayList==='undefined'){ + if(typeof localStorage !== 'undefined'){ + if(localStorage.hasOwnProperty('oc_playlist_items')){ + loadPlayer(); + } } } }); \ No newline at end of file From 9b764cb7f4f1438b80f03ae5e080231b8aaa9719 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 1 Aug 2011 01:25:34 +0200 Subject: [PATCH 12/78] show names of next/previous song when you hover the next/previous button --- apps/media/js/player.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps/media/js/player.js b/apps/media/js/player.js index 5f48878563..6dee7b0ac2 100644 --- a/apps/media/js/player.js +++ b/apps/media/js/player.js @@ -35,6 +35,18 @@ var PlayList={ PlayList.player.jPlayer("play"); localStorage.setItem('oc_playlist_current',index); localStorage.setItem('oc_playlist_playing','true'); + if(index>=0){ + var previous=index-1; + }else{ + var previous=PlayList.items.length-1; + } + if(index+1 Date: Mon, 1 Aug 2011 01:56:45 +0200 Subject: [PATCH 13/78] some fixes for persistent playlists --- apps/media/js/loader.js | 2 +- apps/media/js/music.js | 9 +++++---- apps/media/js/player.js | 16 ++++++++-------- core/templates/layout.admin.php | 1 + core/templates/layout.user.php | 1 + 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/apps/media/js/loader.js b/apps/media/js/loader.js index 9eb51113f3..429ef742d1 100644 --- a/apps/media/js/loader.js +++ b/apps/media/js/loader.js @@ -51,7 +51,7 @@ $(document).ready(function() { } if(typeof PlayList==='undefined'){ if(typeof localStorage !== 'undefined'){ - if(localStorage.hasOwnProperty('oc_playlist_items')){ + if(localStorage.hasOwnProperty(oc_current_user+'oc_playlist_items')){ loadPlayer(); } } diff --git a/apps/media/js/music.js b/apps/media/js/music.js index 90b5a09800..d551127971 100644 --- a/apps/media/js/music.js +++ b/apps/media/js/music.js @@ -13,9 +13,11 @@ $(document).ready(function(){ Collection.hide(); }); var tab=window.location.href.slice(window.location.href.indexOf('#') + 1); - if(tab=='collection'){ - $('#plugins a[href="#collection"]').trigger('click'); - } + PlayList.init('mp3',function(){ + if(tab=='collection'){ + $('#plugins a[href="#collection"]').trigger('click'); + } + }); OC.search.customResults.Music=function(row,item){ var parts=item.link.substr(item.link.indexOf('#')+1).split('&'); var data={}; @@ -41,7 +43,6 @@ $(document).ready(function(){ }); row.find('div.name').append(button); } - PlayList.init(); }); diff --git a/apps/media/js/player.js b/apps/media/js/player.js index 6dee7b0ac2..8ef85f4848 100644 --- a/apps/media/js/player.js +++ b/apps/media/js/player.js @@ -33,9 +33,9 @@ var PlayList={ PlayList.player.jPlayer("setMedia", PlayList.items[PlayList.current]); PlayList.items[index].playcount++; PlayList.player.jPlayer("play"); - localStorage.setItem('oc_playlist_current',index); - localStorage.setItem('oc_playlist_playing','true'); - if(index>=0){ + localStorage.setItem(oc_current_user+'oc_playlist_current',index); + localStorage.setItem(oc_current_user+'oc_playlist_playing','true'); + if(index>0){ var previous=index-1; }else{ var previous=PlayList.items.length-1; @@ -135,15 +135,15 @@ var PlayList={ }, save:function(){ if(typeof localStorage !== 'undefined'){ - localStorage.setItem('oc_playlist_items',JSON.stringify(PlayList.items)); + localStorage.setItem(oc_current_user+'oc_playlist_items',JSON.stringify(PlayList.items)); } }, load:function(){ if(typeof localStorage !== 'undefined'){ - if(localStorage.hasOwnProperty('oc_playlist_items')){ - PlayList.items=JSON.parse(localStorage.getItem('oc_playlist_items')); - PlayList.current=parseInt((localStorage.getItem('oc_playlist_current'))); - if(JSON.parse(localStorage.getItem('oc_playlist_playing'))){ + if(localStorage.hasOwnProperty(oc_current_user+'oc_playlist_items')){ + PlayList.items=JSON.parse(localStorage.getItem(oc_current_user+'oc_playlist_items')); + PlayList.current=parseInt((localStorage.getItem(oc_current_user+'oc_playlist_current'))); + if(JSON.parse(localStorage.getItem(oc_current_user+'oc_playlist_playing'))){ PlayList.play(); } PlayList.render(); diff --git a/core/templates/layout.admin.php b/core/templates/layout.admin.php index 3aac4c98ac..be4419af84 100644 --- a/core/templates/layout.admin.php +++ b/core/templates/layout.admin.php @@ -9,6 +9,7 @@ diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php index 1de0ccf80c..33de9d5f72 100644 --- a/core/templates/layout.user.php +++ b/core/templates/layout.user.php @@ -9,6 +9,7 @@ From f13ff8f60109c312f6e229848a66fd80c378dd5b Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Mon, 1 Aug 2011 02:16:43 +0200 Subject: [PATCH 14/78] fixed sidebar CSS --- core/css/styles.css | 4 ++-- core/img/body_background.jpg | Bin 305 -> 0 bytes 2 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 core/img/body_background.jpg diff --git a/core/css/styles.css b/core/css/styles.css index eb6b04d28d..ff2aa98dda 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -1,5 +1,5 @@ * { margin:0; padding:0; border:0; cursor:default; } -body { background:#fefefe url('../img/body_background.jpg') repeat-y left top; font:normal 80%/1.6em "Lucida Grande", Arial, Verdana, sans-serif; color:#000; } +body { background:#fefefe; font:normal 80%/1.6em "Lucida Grande", Arial, Verdana, sans-serif; color:#000; } #header { position:fixed; top:0; z-index:100; width:100%; height:2.5em; padding:0.5em 1.5em; background:#1d2d44; -moz-box-shadow:0 0 10px #000, inset 0 -2px 10px #222; -webkit-box-shadow:0 0 10px #000, inset 0 -2px 10px #222; box-shadow:0 0 10px #000, inset 0 -2px 10px #222; } #body-settings #header { background:#313131; } #owncloud { float:left; } @@ -83,7 +83,7 @@ form.searchbox { display:inline; position:fixed; top:.9em; right:9em; margin:0; input[type="search"] { font-size:1em; padding-left:2em; background:#eee url('../img/actions/search.png') .5em center no-repeat; } /* NAVIGATION ------------------------------------------------------------- */ -#plugins { position:fixed; top:3.5em; float:left; width:15.7em; padding:0; z-index:50; } +#plugins { position:fixed; top:3.5em; float:left; width:15.7em; padding:0; z-index:50; height:100%; background:#eee; border-right: 1px #ccc solid; -moz-box-shadow: -3px 0 7px #000; -webkit-box-shadow: -3px 0 7px #000; box-shadow: -3px 0 7px #000; } } #plugins ul { list-style-type:none; border-top:1px solid #ccc; } #plugins a { display:block; padding:0.5em 0.5em 0.5em 3em; background-position:1.5em center; background-repeat:no-repeat; border-bottom:1px solid #ddd; border-top:1px solid #fff; text-decoration:none; font-size:1.2em; color:#666; } #plugins a.active, #plugins a:hover, #plugins a:focus, #plugins a.selected { background-color:#ccc; border-top:1px solid #ccc; border-bottom:1px solid #ccc; color:#000; outline:0; } diff --git a/core/img/body_background.jpg b/core/img/body_background.jpg deleted file mode 100644 index c3d0102f711d0b290c18082e53461ac8702f4eb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305 zcmb7@qc_bHZynyks@g`%(6~UE%lcxQWzYlkJ zZ&)42!w857dk%0f*nt#55D3XhN*StHD^?ms%b3zEqm(Ewnld-_nyA`Tb=!7bmzVv} z+o7?Y^+S-YDpZNqi8W;G-*RUl4G33(JuC Date: Mon, 1 Aug 2011 16:19:51 +0200 Subject: [PATCH 15/78] properly save play/pause state of media player --- apps/media/js/player.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/apps/media/js/player.js b/apps/media/js/player.js index 8ef85f4848..369d3e389c 100644 --- a/apps/media/js/player.js +++ b/apps/media/js/player.js @@ -19,7 +19,7 @@ var PlayList={ PlayList.play(next); PlayList.render(); }, - play:function(index){ + play:function(index,ready){ if(index==null){ index=PlayList.current; } @@ -28,13 +28,12 @@ var PlayList={ if(PlayList.player){ if(PlayList.player.data('jPlayer').options.supplied!=PlayList.items[index].type){//the the audio type changes we need to reinitialize jplayer PlayList.player.jPlayer("destroy"); - PlayList.init(PlayList.items[index].type,PlayList.play); + PlayList.init(PlayList.items[index].type,function(){PlayList.play(null,ready)}); }else{ PlayList.player.jPlayer("setMedia", PlayList.items[PlayList.current]); PlayList.items[index].playcount++; PlayList.player.jPlayer("play"); localStorage.setItem(oc_current_user+'oc_playlist_current',index); - localStorage.setItem(oc_current_user+'oc_playlist_playing','true'); if(index>0){ var previous=index-1; }else{ @@ -50,6 +49,9 @@ var PlayList={ if (typeof Collection !== 'undefined') { Collection.registerPlay(); } + if(ready){ + ready(); + } } }else{ PlayList.init(PlayList.items[index].type,PlayList.play); @@ -74,6 +76,12 @@ var PlayList={ } $(PlayList.player).jPlayer({ ended:PlayList.next, + pause:function(){ + localStorage.setItem(oc_current_user+'oc_playlist_playing','false'); + }, + play:function(){ + localStorage.setItem(oc_current_user+'oc_playlist_playing','true'); + }, supplied:type, ready:function(){ PlayList.load(); @@ -145,6 +153,10 @@ var PlayList={ PlayList.current=parseInt((localStorage.getItem(oc_current_user+'oc_playlist_current'))); if(JSON.parse(localStorage.getItem(oc_current_user+'oc_playlist_playing'))){ PlayList.play(); + }else{ + PlayList.play(null,function(){ + PlayList.player.jPlayer("pause"); + }); } PlayList.render(); } From 29239d66383ec0544cefca2e1c6de95d81b48376 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 1 Aug 2011 16:43:02 +0200 Subject: [PATCH 16/78] remember volume and playback time in the media player --- apps/media/ajax/api.php | 1 + apps/media/js/player.js | 31 +++++++++++++++++++++++++------ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/apps/media/ajax/api.php b/apps/media/ajax/api.php index e0183ff05d..bf1ebd8e4d 100644 --- a/apps/media/ajax/api.php +++ b/apps/media/ajax/api.php @@ -132,6 +132,7 @@ if($arguments['action']){ header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); + header('Accept-Ranges: bytes'); header('Content-Length: '.OC_Filesystem::filesize($arguments['path'])); OC_Filesystem::readfile($arguments['path']); diff --git a/apps/media/js/player.js b/apps/media/js/player.js index 369d3e389c..b6d3bc01dd 100644 --- a/apps/media/js/player.js +++ b/apps/media/js/player.js @@ -3,6 +3,7 @@ var PlayList={ current:-1, items:[], player:null, + volume:0.8, next:function(){ var next=PlayList.current+1; if(next>=PlayList.items.length){ @@ -19,7 +20,7 @@ var PlayList={ PlayList.play(next); PlayList.render(); }, - play:function(index,ready){ + play:function(index,time,ready){ if(index==null){ index=PlayList.current; } @@ -28,11 +29,11 @@ var PlayList={ if(PlayList.player){ if(PlayList.player.data('jPlayer').options.supplied!=PlayList.items[index].type){//the the audio type changes we need to reinitialize jplayer PlayList.player.jPlayer("destroy"); - PlayList.init(PlayList.items[index].type,function(){PlayList.play(null,ready)}); + PlayList.init(PlayList.items[index].type,function(){PlayList.play(null,time,eady)}); }else{ PlayList.player.jPlayer("setMedia", PlayList.items[PlayList.current]); PlayList.items[index].playcount++; - PlayList.player.jPlayer("play"); + PlayList.player.jPlayer("play",time); localStorage.setItem(oc_current_user+'oc_playlist_current',index); if(index>0){ var previous=index-1; @@ -82,6 +83,14 @@ var PlayList={ play:function(){ localStorage.setItem(oc_current_user+'oc_playlist_playing','true'); }, + timeupdate:function(){ + var time=Math.round(PlayList.player.data('jPlayer').status.currentTime); + localStorage.setItem(oc_current_user+'oc_playlist_time',time); + }, + volumechange:function(){ + var volume=PlayList.player.data('jPlayer').options.volume*100; + localStorage.setItem(oc_current_user+'oc_playlist_volume',volume); + }, supplied:type, ready:function(){ PlayList.load(); @@ -89,6 +98,7 @@ var PlayList={ ready(); } }, + volume:PlayList.volume, cssSelectorAncestor:'#jp-interface', swfPath:OC.linkTo('media','js'), }); @@ -150,11 +160,20 @@ var PlayList={ if(typeof localStorage !== 'undefined'){ if(localStorage.hasOwnProperty(oc_current_user+'oc_playlist_items')){ PlayList.items=JSON.parse(localStorage.getItem(oc_current_user+'oc_playlist_items')); - PlayList.current=parseInt((localStorage.getItem(oc_current_user+'oc_playlist_current'))); + PlayList.current=parseInt(localStorage.getItem(oc_current_user+'oc_playlist_current')); + var time=parseInt(localStorage.getItem(oc_current_user+'oc_playlist_time')); + if(localStorage.hasOwnProperty(oc_current_user+'oc_playlist_volume')){ + var volume=localStorage.getItem(oc_current_user+'oc_playlist_volume'); + PlayList.volume=volume/100; + $('.jp-volume-bar-value').css('width',volume+'%'); + if(PlayList.player.data('jPlayer')){ + PlayList.player.jPlayer("option",'volume',volume/100); + } + } if(JSON.parse(localStorage.getItem(oc_current_user+'oc_playlist_playing'))){ - PlayList.play(); + PlayList.play(null,time); }else{ - PlayList.play(null,function(){ + PlayList.play(null,time,function(){ PlayList.player.jPlayer("pause"); }); } From e79c827b22135810c3e66b3178c284d96b4232b7 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Mon, 1 Aug 2011 18:08:11 +0200 Subject: [PATCH 17/78] removed log feature because it is a privacy issue --- log/appinfo/app.php | 4 ++-- log/index.php | 3 ++- log/templates/index.php | 5 ++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/log/appinfo/app.php b/log/appinfo/app.php index f3ef650704..a3aa19d528 100644 --- a/log/appinfo/app.php +++ b/log/appinfo/app.php @@ -1,6 +1,6 @@ - 1, "id" => "log", "name" => "Log" )); OC_App::addSettingsPage( array( "id" => "log", "order" => 999, "href" => OC_Helper::linkTo( "log", "index.php" ), "name" => "Log", "icon" => OC_Helper::imagePath( "log", "logs.png" ))); -?> +*/ ?> diff --git a/log/index.php b/log/index.php index e201411e48..a4fbc36470 100644 --- a/log/index.php +++ b/log/index.php @@ -22,6 +22,7 @@ */ //require_once('../../config/config.php'); +/* require_once('../lib/base.php'); if( !OC_User::isLoggedIn()){ @@ -103,4 +104,4 @@ $tmpl->assign( 'size', $pageSize ); $tmpl->assign( 'showActions', $showActions ); $tmpl->printPage(); -?> +*/ ?> diff --git a/log/templates/index.php b/log/templates/index.php index 2756332f51..9c2ce98f58 100644 --- a/log/templates/index.php +++ b/log/templates/index.php @@ -1,4 +1,4 @@ -
+

t( 'Filter:' ); ?> @@ -50,5 +50,4 @@

- - +*/ ?>Z From a8ffe16f4f1652cfe9646f93dfc4e7a9a5766835 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Mon, 1 Aug 2011 18:37:47 +0200 Subject: [PATCH 18/78] Ctrl-Z the Z --- log/templates/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/log/templates/index.php b/log/templates/index.php index 9c2ce98f58..863ac73fdb 100644 --- a/log/templates/index.php +++ b/log/templates/index.php @@ -50,4 +50,4 @@

-*/ ?>Z +*/ ?> From ad45c78b44f887be547329501cba7c84c3a3c331 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Mon, 1 Aug 2011 21:31:16 +0200 Subject: [PATCH 19/78] pimped the search dropdown style a bit --- core/css/styles.css | 2 ++ core/templates/part.searchbox.php | 2 +- search/css/results.css | 18 +++++++++--------- search/css/search.css | 17 ----------------- 4 files changed, 12 insertions(+), 27 deletions(-) delete mode 100644 search/css/search.css diff --git a/core/css/styles.css b/core/css/styles.css index ff2aa98dda..5d3864f4b3 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -82,6 +82,8 @@ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#35537a', end form.searchbox { display:inline; position:fixed; top:.9em; right:9em; margin:0; padding:0; } input[type="search"] { font-size:1em; padding-left:2em; background:#eee url('../img/actions/search.png') .5em center no-repeat; } + + /* NAVIGATION ------------------------------------------------------------- */ #plugins { position:fixed; top:3.5em; float:left; width:15.7em; padding:0; z-index:50; height:100%; background:#eee; border-right: 1px #ccc solid; -moz-box-shadow: -3px 0 7px #000; -webkit-box-shadow: -3px 0 7px #000; box-shadow: -3px 0 7px #000; } } #plugins ul { list-style-type:none; border-top:1px solid #ccc; } diff --git a/core/templates/part.searchbox.php b/core/templates/part.searchbox.php index 49b44c718e..f5a62de2c8 100644 --- a/core/templates/part.searchbox.php +++ b/core/templates/part.searchbox.php @@ -1,3 +1,3 @@ diff --git a/search/css/results.css b/search/css/results.css index e61bf419b3..c3147451e4 100644 --- a/search/css/results.css +++ b/search/css/results.css @@ -1,9 +1,9 @@ -#searchresults { position:fixed; top:3.3em; right:0; z-index:50; background-color:white; border:1px solid black; margin-bottom:3em; overflow:auto; max-height:80%; width:40em; } -#searchresults table{ width:100%; table-layout:fixed; top:1em;border-spacing:0} -#searchresults td{padding-right:0.3em;padding-left:0.3em;vertical-align:top} -#searchresults td.result div.text{padding-left:1em;} -#searchresults div.text,div.name{width:30em; white-space:normal} -#searchresults td.result{width:30em;} -#searchresults td.result *{cursor:pointer} -#searchresults td.type{width:7em;text-align:right; border-right:1px solid #aaa;border-bottom:none} -#searchresults tr.current{background-color:#ddd} +#searchresults { list-style:none; position:fixed; top:3.5em; right:0; z-index:100; background-color:#fff; overflow:hidden; text-overflow:ellipsis; max-height:80%; width:26.5em; padding-bottom:1em; -moz-box-shadow:0 0 10px #000; -webkit-box-shadow:0 0 10px #000; box-shadow:0 0 10px #000; -moz-border-radius-bottomleft:1em; -webkit-border-bottom-left-radius:1em; border-bottom-left-radius:1em; } +#searchresults li.resultHeader { font-size:1.2em; font-weight:bold; border-bottom:solid 1px #CCC; padding:.2em; background-color:#eee; } +#searchresults li.result { margin-left:2em; } +#searchresults table { width:100%; table-layout:fixed; top:0; border-spacing:0; } +#searchresults td { padding:0 .3em; vertical-align:top; } +#searchresults td.result div.text { padding-left:1em; white-space:nowrap; } +#searchresults td.result * { cursor:pointer; } +#searchresults td.type { width:3.5em; text-align:right; border-right:1px solid #aaa; border-bottom:none; font-weight:bold; } +#searchresults tr.current { background-color:#ddd; } diff --git a/search/css/search.css b/search/css/search.css deleted file mode 100644 index df0712be03..0000000000 --- a/search/css/search.css +++ /dev/null @@ -1,17 +0,0 @@ -#searchresults{ - margin: 2em; - list-style:none; - border: solid 1px #CCC; -} - -#searchresults li.resultHeader{ - font-size:1.2em; - font-weight:bold; - border-bottom: solid 1px #CCC; - padding:0.2em; - background-color:#eee; -} - -#searchresults li.result{ - margin-left:2em; -} \ No newline at end of file From 9f981de85437930ec89ecc85c2e79f096f65b5bb Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 1 Aug 2011 23:53:01 +0200 Subject: [PATCH 20/78] fance collection scanning wip --- apps/media/ajax/api.php | 46 ++++++++++++++---- apps/media/index.php | 1 + apps/media/js/collection.js | 42 +++++++++++++++++ apps/media/js/scanner.js | 72 +++++++++++++++++++++++++++++ apps/media/lib_scanner.php | 13 +++++- apps/media/templates/collection.php | 9 +++- 6 files changed, 170 insertions(+), 13 deletions(-) create mode 100644 apps/media/js/scanner.js diff --git a/apps/media/ajax/api.php b/apps/media/ajax/api.php index bf1ebd8e4d..60458167a9 100644 --- a/apps/media/ajax/api.php +++ b/apps/media/ajax/api.php @@ -53,6 +53,7 @@ if(!isset($arguments['search'])){ $arguments['search']=''; } OC_MEDIA_COLLECTION::$uid=OC_User::getUser(); +unset($_SESSION['collection']); if($arguments['action']){ switch($arguments['action']){ case 'delete': @@ -108,16 +109,18 @@ if($arguments['action']){ echo json_encode(OC_MEDIA_COLLECTION::getSongs($arguments['artist'],$arguments['album'],$arguments['search'])); break; case 'get_path_info': - $songId=OC_MEDIA_COLLECTION::getSongByPath($arguments['path']); - if($songId==0){ - unset($_SESSION['collection']); - $songId= OC_MEDIA_SCANNER::scanFile($arguments['path']); - } - if($songId>0){ - $song=OC_MEDIA_COLLECTION::getSong($songId); - $song['artist']=OC_MEDIA_COLLECTION::getArtistName($song['song_artist']); - $song['album']=OC_MEDIA_COLLECTION::getAlbumName($song['song_album']); - echo json_encode($song); + if(OC_Filesystem::file_exists($arguments['path'])){ + $songId=OC_MEDIA_COLLECTION::getSongByPath($arguments['path']); + if($songId==0){ + unset($_SESSION['collection']); + $songId= OC_MEDIA_SCANNER::scanFile($arguments['path']); + } + if($songId>0){ + $song=OC_MEDIA_COLLECTION::getSong($songId); + $song['artist']=OC_MEDIA_COLLECTION::getArtistName($song['song_artist']); + $song['album']=OC_MEDIA_COLLECTION::getAlbumName($song['song_album']); + echo json_encode($song); + } } break; case 'play': @@ -137,7 +140,30 @@ if($arguments['action']){ OC_Filesystem::readfile($arguments['path']); exit; + case 'find_music': + echo json_encode(findMusic()); + exit; } } +function findMusic($path='/'){ + $music=array(); + $dh=OC_Filesystem::opendir($path); + if($dh){ + while($filename=readdir($dh)){ + if($filename[0]!='.'){ + $file=$path.'/'.$filename; + if(OC_Filesystem::is_dir($file)){ + $music=array_merge($music,findMusic($file)); + }else{ + if(OC_MEDIA_SCANNER::isMusic($filename)){ + $music[]=$file; + } + } + } + } + } + return $music; +} + ?> \ No newline at end of file diff --git a/apps/media/index.php b/apps/media/index.php index 43423d27de..a7128aaad4 100644 --- a/apps/media/index.php +++ b/apps/media/index.php @@ -37,6 +37,7 @@ OC_Util::addScript('media','player'); OC_Util::addScript('media','music'); OC_Util::addScript('media','playlist'); OC_Util::addScript('media','collection'); +OC_Util::addScript('media','scanner'); OC_Util::addScript('media','jquery.jplayer.min'); OC_Util::addStyle('media','player'); OC_Util::addStyle('media','music'); diff --git a/apps/media/js/collection.js b/apps/media/js/collection.js index 95e5293ea4..42d249112b 100644 --- a/apps/media/js/collection.js +++ b/apps/media/js/collection.js @@ -32,6 +32,10 @@ Collection={ for(var i=0;i +

0 Songs scanned

+
+ + +
  • loadingLoading Collection... @@ -7,4 +13,5 @@
  • -
\ No newline at end of file + + From 04b745d67a7d6c18b1bb06d1cf97cc65a640b1f4 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Tue, 2 Aug 2011 02:03:14 +0200 Subject: [PATCH 21/78] compacted sidebar --- core/css/styles.css | 23 ++++++++++------------- core/templates/layout.admin.php | 2 +- core/templates/layout.user.php | 2 +- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/core/css/styles.css b/core/css/styles.css index 5d3864f4b3..fa7421e094 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -1,6 +1,6 @@ * { margin:0; padding:0; border:0; cursor:default; } body { background:#fefefe; font:normal 80%/1.6em "Lucida Grande", Arial, Verdana, sans-serif; color:#000; } -#header { position:fixed; top:0; z-index:100; width:100%; height:2.5em; padding:0.5em 1.5em; background:#1d2d44; -moz-box-shadow:0 0 10px #000, inset 0 -2px 10px #222; -webkit-box-shadow:0 0 10px #000, inset 0 -2px 10px #222; box-shadow:0 0 10px #000, inset 0 -2px 10px #222; } +#header { position:fixed; top:0; z-index:100; width:100%; height:2.5em; padding:.5em; background:#1d2d44; -moz-box-shadow:0 0 10px #000, inset 0 -2px 10px #222; -webkit-box-shadow:0 0 10px #000, inset 0 -2px 10px #222; box-shadow:0 0 10px #000, inset 0 -2px 10px #222; } #body-settings #header { background:#313131; } #owncloud { float:left; } h1 { margin:1em 3em 1em 0; border-bottom:1px solid #666; text-transform:uppercase; font-weight:normal; font-style:italic; color:#666; } @@ -72,7 +72,7 @@ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#35537a', end .prettybutton:hover, .prettybutton:focus { background-color:#ccc; outline:0; } /* META NAVIGATION (Settings, Log out) ---------------------------------------------------------------- */ -#metanav { float:right; position:relative; top:0.5em; right:2.5em; list-style:none; margin:0; padding:0; } +#metanav { float:right; position:relative; top:.5em; right:1em; list-style:none; margin:0; padding:0; } #metanav li { display:inline; } #metanav li a { margin:.2em; padding:.7em; } #metanav li a:hover, #metanav li a:focus { background:rgba(0,0,0,.5); -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; box-shadow:#555 0 1px 0; -moz-box-shadow:#555 0 1px 0; -webkit-box-shadow:#555 0 1px 0; } @@ -82,20 +82,17 @@ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#35537a', end form.searchbox { display:inline; position:fixed; top:.9em; right:9em; margin:0; padding:0; } input[type="search"] { font-size:1em; padding-left:2em; background:#eee url('../img/actions/search.png') .5em center no-repeat; } - - /* NAVIGATION ------------------------------------------------------------- */ -#plugins { position:fixed; top:3.5em; float:left; width:15.7em; padding:0; z-index:50; height:100%; background:#eee; border-right: 1px #ccc solid; -moz-box-shadow: -3px 0 7px #000; -webkit-box-shadow: -3px 0 7px #000; box-shadow: -3px 0 7px #000; } } -#plugins ul { list-style-type:none; border-top:1px solid #ccc; } -#plugins a { display:block; padding:0.5em 0.5em 0.5em 3em; background-position:1.5em center; background-repeat:no-repeat; border-bottom:1px solid #ddd; border-top:1px solid #fff; text-decoration:none; font-size:1.2em; color:#666; } -#plugins a.active, #plugins a:hover, #plugins a:focus, #plugins a.selected { background-color:#ccc; border-top:1px solid #ccc; border-bottom:1px solid #ccc; color:#000; outline:0; } -#plugins a:active { outline:0; } -#plugins .subentry { background-color:#ddd; border-top:1px solid #aaa; color:#000; outline:0; } -#plugins .subentry.active { background-color:#bbb; border-top:1px solid #aaa; color:#000; outline:0; } -#plugins li.subentry a { padding-left:3.7em; font-size:1em; } +#navigation { position:fixed; top:3.5em; float:left; width:12.5em; padding:0; z-index:50; height:100%; background:#eee; border-right: 1px #ccc solid; -moz-box-shadow: -3px 0 7px #000; -webkit-box-shadow: -3px 0 7px #000; box-shadow: -3px 0 7px #000; } } +#navigation ul { list-style-type:none; border-top:1px solid #ccc; } +#navigation a { display:block; padding:.5em .5em .5em 2.5em; background-position:1em center; background-repeat:no-repeat; border-bottom:1px solid #ddd; border-top:1px solid #fff; text-decoration:none; font-size:1.2em; color:#666; } +#navigation a.active, #navigation a:hover, #navigation a:focus, #navigation a.selected { background-color:#ccc; border-top:1px solid #c8c8c8; border-bottom:1px solid #ccc; color:#000; outline:0; } +#navigation .subentry { background-color:#ddd; border-top:1px solid #aaa; color:#555; outline:0; } +#navigation .subentry.active { background-color:#bbb; border-top:1px solid #888; border-bottom:1px solid #bbb; outline:0; } +#navigation li.subentry a { padding-left:3.1em; font-size:1em; } /* CONTENT ------------------------------------------------------------------ */ -#content { margin:3.5em 0 0 15.7em; } +#content { margin:3.5em 0 0 12.5em; } /* USER SETTINGS ------------------------------------------------------------ */ #quota_indicator { margin:0 4em 1em 0; padding:0; border:1px solid #ddd; border-radius:10px; -webkit-border-radius:10px; -moz-border-radius:10px; } diff --git a/core/templates/layout.admin.php b/core/templates/layout.admin.php index be4419af84..d70c54f7b1 100644 --- a/core/templates/layout.admin.php +++ b/core/templates/layout.admin.php @@ -37,7 +37,7 @@
-
+
+
From 93b342ee391147895b9a9aeabc0050489fc0ee02 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 4 Aug 2011 01:19:21 +0200 Subject: [PATCH 50/78] only load the music player outside the media app if the media app isnt already open in another tab --- apps/media/js/loader.js | 2 +- apps/media/js/player.js | 28 +++++++++++++++++----------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/apps/media/js/loader.js b/apps/media/js/loader.js index 06449abf52..c49d90cf3e 100644 --- a/apps/media/js/loader.js +++ b/apps/media/js/loader.js @@ -51,7 +51,7 @@ $(document).ready(function() { } if(typeof PlayList==='undefined'){ if(typeof localStorage !== 'undefined'){ - if(localStorage.hasOwnProperty(oc_current_user+'oc_playlist_items') && localStorage.getItem(oc_current_user+'oc_playlist_items')!='[]'){ + if(localStorage.hasOwnProperty(oc_current_user+'oc_playlist_items') && localStorage.getItem(oc_current_user+'oc_playlist_items')!='[]' && localStorage.getItem(oc_current_user+'oc_playlist_active')!='true'){ loadPlayer(); } } diff --git a/apps/media/js/player.js b/apps/media/js/player.js index 6d585e6e09..ec22b0eaf9 100644 --- a/apps/media/js/player.js +++ b/apps/media/js/player.js @@ -4,6 +4,7 @@ var PlayList={ items:[], player:null, volume:0.8, + active:false, next:function(){ var next=PlayList.current+1; if(next>=PlayList.items.length){ @@ -34,7 +35,6 @@ var PlayList={ PlayList.player.jPlayer("setMedia", PlayList.items[PlayList.current]); PlayList.items[index].playcount++; PlayList.player.jPlayer("play",time); - localStorage.setItem(oc_current_user+'oc_playlist_current',index); if(index>0){ var previous=index-1; }else{ @@ -83,14 +83,6 @@ var PlayList={ play:function(){ localStorage.setItem(oc_current_user+'oc_playlist_playing','true'); }, - timeupdate:function(){ - var time=Math.round(PlayList.player.data('jPlayer').status.currentTime); - localStorage.setItem(oc_current_user+'oc_playlist_time',time); - }, - volumechange:function(){ - var volume=PlayList.player.data('jPlayer').options.volume*100; - localStorage.setItem(oc_current_user+'oc_playlist_volume',volume); - }, supplied:type, ready:function(){ PlayList.load(); @@ -126,7 +118,6 @@ var PlayList={ item[type]=PlayList.urlBase+encodeURIComponent(song.song_path); PlayList.items.push(item); } - PlayList.save(); }, addFile:function(path){ var type=musicTypeFromFile(path); @@ -142,7 +133,6 @@ var PlayList={ remove:function(index){ PlayList.items.splice(index,1); PlayList.render(); - PlayList.save(); }, render:function(){}, playing:function(){ @@ -155,10 +145,20 @@ var PlayList={ save:function(){ if(typeof localStorage !== 'undefined'){ localStorage.setItem(oc_current_user+'oc_playlist_items',JSON.stringify(PlayList.items)); + localStorage.setItem(oc_current_user+'oc_playlist_current',PlayList.current); + var time=Math.round(PlayList.player.data('jPlayer').status.currentTime); + localStorage.setItem(oc_current_user+'oc_playlist_time',time); + var volume=PlayList.player.data('jPlayer').options.volume*100; + localStorage.setItem(oc_current_user+'oc_playlist_volume',volume); + if(PlayList.active){ + localStorage.setItem(oc_current_user+'oc_playlist_active','false'); + } } }, load:function(){ if(typeof localStorage !== 'undefined'){ + PlayList.active=true; + localStorage.setItem(oc_current_user+'oc_playlist_active','true'); if(localStorage.hasOwnProperty(oc_current_user+'oc_playlist_items')){ PlayList.items=JSON.parse(localStorage.getItem(oc_current_user+'oc_playlist_items')); if(PlayList.items.length>0){ @@ -185,3 +185,9 @@ var PlayList={ } } } + +$(document).ready(function(){ + $(window).bind('beforeunload', function (){ + PlayList.save(); + }); +}) From 122c3a3cf8340b5737e0b954cc4fa6b2d03b68ab Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 4 Aug 2011 01:26:29 +0200 Subject: [PATCH 51/78] dont show confusing 'X files scanned' message when we are not scanning files --- apps/media/js/collection.js | 2 +- apps/media/js/scanner.js | 2 ++ apps/media/templates/collection.php | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/media/js/collection.js b/apps/media/js/collection.js index 42d249112b..520ce7d112 100644 --- a/apps/media/js/collection.js +++ b/apps/media/js/collection.js @@ -33,7 +33,7 @@ Collection={ Collection.loadedListeners[i](); } if(collection.length==0){ - $('#scan input.start').val('Scan'); + $('#scan input.start').val('Scan Collection'); $('#plugins a[href="#collection"]').trigger('click'); } diff --git a/apps/media/js/scanner.js b/apps/media/js/scanner.js index de67c7c993..165f86d05f 100644 --- a/apps/media/js/scanner.js +++ b/apps/media/js/scanner.js @@ -50,6 +50,7 @@ Scanner={ }, start:function(ready){ Scanner.stopScanning=false; + $('#scancount').show(); var scanSong=function(){ Scanner.currentIndex++; if(!Scanner.stopScanning && Scanner.currentIndex -

0 Songs scanned

+
- +
    From 12cc7c77bae8fdd5b15c2cb2fa13f5e09fbf87a1 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 4 Aug 2011 15:29:35 +0200 Subject: [PATCH 52/78] widen upload and new folder so that upload button text does not overflow --- files/css/files.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/files/css/files.css b/files/css/files.css index 61af30b74e..6c93e4d7ce 100644 --- a/files/css/files.css +++ b/files/css/files.css @@ -8,8 +8,8 @@ .file_upload_filename { background-image:url("../img/file.png"); font-weight:bold; }.file_upload_start { opacity:0;filter:alpha(opacity = 0); } input.highlight{ background-color:#ffc100; border:#dda600 1px solid; } -#file_newfolder_name { background-image:url("../img/folder.png"); font-weight:bold; width:11em; } -.file_upload_start, .file_upload_filename { position:absolute; top:0px; left:0px; width:11em; font-size:0.9em; } +#file_newfolder_name { background-image:url("../img/folder.png"); font-weight:bold; width:12em; } +.file_upload_start, .file_upload_filename { position:absolute; top:0px; left:0px; width:12em; font-size:0.9em; } .file_upload_wrapper { position:relative; top:-1.2em; left:-2em; display:-moz-inline-box; /* fallback for older firefox versions*/ display:inline-block; width:12em; } #file_newfolder_submit, #file_upload_submit { width:3em; } .file_upload_target { display:none; } @@ -64,4 +64,4 @@ table thead.fixed {height:2em} position:fixed; top:2.8em; left:40%; -} \ No newline at end of file +} From 60a7a9d6f0c65f81edd7d1bf54a55a48538e6f77 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 4 Aug 2011 18:49:29 +0200 Subject: [PATCH 53/78] allow users to use myhost/owncloud/?myusername as openid identity --- apps/user_openid/appinfo/app.php | 14 ++++++++++++-- apps/user_openid/phpmyid.php | 10 +++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/apps/user_openid/appinfo/app.php b/apps/user_openid/appinfo/app.php index 74c13402ca..f2d5313c7e 100644 --- a/apps/user_openid/appinfo/app.php +++ b/apps/user_openid/appinfo/app.php @@ -6,8 +6,18 @@ if (!in_array ('curl', get_loaded_extensions())){ } $urlBase=((isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == 'on') ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST']; -OC_Util::addHeader('link',array('rel'=>'openid.server', 'href'=>$urlBase.OC_Helper::linkTo( "user_openid", "user.php" ).'/')); -OC_Util::addHeader('link',array('rel'=>'openid.delegate', 'href'=>$urlBase.OC_Helper::linkTo( "user_openid", "user.php" ).'/')); + +$userName=''; +if(strpos($_SERVER["REQUEST_URI"],'?') and !strpos($_SERVER["REQUEST_URI"],'=')){ + if(strpos($_SERVER["REQUEST_URI"],'/?')){ + $userName=substr($_SERVER["REQUEST_URI"],strpos($_SERVER["REQUEST_URI"],'/?')+2); + }elseif(strpos($_SERVER["REQUEST_URI"],'.php?')){ + $userName=substr($_SERVER["REQUEST_URI"],strpos($_SERVER["REQUEST_URI"],'.php?')+5); + } +} + +OC_Util::addHeader('link',array('rel'=>'openid.server', 'href'=>$urlBase.OC_Helper::linkTo( "user_openid", "user.php" ).'/'.$userName)); +OC_Util::addHeader('link',array('rel'=>'openid.delegate', 'href'=>$urlBase.OC_Helper::linkTo( "user_openid", "user.php" ).'/'.$userName)); require_once 'apps/user_openid/user_openid.php'; diff --git a/apps/user_openid/phpmyid.php b/apps/user_openid/phpmyid.php index bcab9e55cb..24fab44ca7 100644 --- a/apps/user_openid/phpmyid.php +++ b/apps/user_openid/phpmyid.php @@ -1646,12 +1646,12 @@ $profile['req_url'] = sprintf("%s://%s%s", // $port,//host already includes the path $_SERVER["REQUEST_URI"]); -$fullId='user.php/'.$USERNAME.'/'; -$incompleteId='user.php/'; +// $fullId='user.php/'.$USERNAME.'/'; +// $incompleteId='user.php/'; -if(!strpos($profile['req_url'],$fullId)){ - $profile['req_url']=str_replace($incompleteId,$fullId,$profile['req_url']); -} +// if(!strpos($profile['req_url'],$fullId)){ +// $profile['req_url']=str_replace($incompleteId,$fullId,$profile['req_url']); +// } // error_log('inc id: '.$fullId); // error_log('req url: '.$profile['req_url']); From 01cecc8388179e1b6b8f759c4d717848f191eb25 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 4 Aug 2011 20:06:33 +0200 Subject: [PATCH 54/78] redirect index.php to files/webdav.php for webdav (PROPFIND) requests --- index.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/index.php b/index.php index 46dc990af6..a804a25d95 100644 --- a/index.php +++ b/index.php @@ -40,6 +40,11 @@ elseif($not_installed OR $install_called) { require_once('setup.php'); } +if($_SERVER['REQUEST_METHOD']=='PROPFIND'){//handle webdav + header('location: '.OC_Helper::linkTo('files','webdav.php')); + exit(); +} + // Someone is logged in : elseif(OC_User::isLoggedIn()) { if(isset($_GET["logout"]) and ($_GET["logout"])) { From 193b9c9386eee28bc5d96e7c6c638803b517ba5c Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Fri, 5 Aug 2011 07:37:08 +0200 Subject: [PATCH 55/78] styled undo file deletion --- files/css/files.css | 16 +++------------- files/js/filelist.js | 10 +++++----- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/files/css/files.css b/files/css/files.css index 6c93e4d7ce..813fb4dd7d 100644 --- a/files/css/files.css +++ b/files/css/files.css @@ -52,16 +52,6 @@ table thead.fixed {height:2em} /* add breadcrumb divider to the File item in navigation panel */ #navigation>ul>li:first-child { background:url('../../core/img/breadcrumb-divider-start.png') no-repeat 12.5em 0px; width:12.5em; padding-right:1em; } - -#notification{ - z-index:150; - border-radius:10px; - background-color:#eee; - border:1px solid #ccc; - padding-left:1em; - padding-right:1em; - display:none; - position:fixed; - top:2.8em; - left:40%; -} +#notification{ z-index:150; background-color:#fc4; border:0; padding:0 .7em .3em; display:block; position:fixed; left:50%; top:0; +-moz-border-radius-bottomleft:1em; -webkit-border-bottom-left-radius:1em; border-bottom-left-radius:1em; +-moz-border-radius-bottomright:1em; -webkit-border-bottom-right-radius:1em; border-bottom-right-radius:1em; } diff --git a/files/js/filelist.js b/files/js/filelist.js index b4d0adf982..8fd3bceafb 100644 --- a/files/js/filelist.js +++ b/files/js/filelist.js @@ -168,9 +168,8 @@ FileList={ procesSelection(); FileList.deleteCanceled=false; FileList.deleteFiles=files; - $('#notification').text(files.length+' file'+((files.length>1)?'s':'')+' deleted, click here to undo'); - - $('#notification').show(); + $('#notification').text('undo deletion'); + $('#notification').fadeIn(); }, finishDelete:function(ready,sync){ if(!FileList.deleteCanceled && FileList.deleteFiles){ @@ -181,7 +180,7 @@ FileList={ data: "dir="+$('#dir').val()+"&files="+encodeURIComponent(fileNames), complete: function(data){ boolOperationFinished(data, function(){ - $('#notification').hide(); + $('#notification').fadeOut(); $.each(FileList.deleteFiles,function(index,file){ // alert(file); FileList.remove(file); @@ -199,9 +198,10 @@ FileList={ } $(document).ready(function(){ + $('#notification').hide(); $('#notification').click(function(){ FileList.deleteCanceled=true; - $('#notification').hide(); + $('#notification').fadeOut(); $.each(FileList.deleteFiles,function(index,file){ $('tr[data-file="'+file+'"]').show(); // alert(file); From 6d5cb13018197355978230a5b59790fa31ccc6fd Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Fri, 5 Aug 2011 08:19:51 +0200 Subject: [PATCH 56/78] fixed relative time calculation --- lib/template.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/template.php b/lib/template.php index fe173f609b..45008940e9 100644 --- a/lib/template.php +++ b/lib/template.php @@ -82,19 +82,19 @@ function relative_modified_date($timestamp) { $diffdays = round($diffhours/24); $diffmonths = round($diffdays/31); $diffyears = round($diffdays/365); + if($timediff < 60) { return 'seconds ago'; } else if($timediff < 120) { return '1 minute ago'; } else if($timediff < 3600) { return $diffminutes.' minutes ago'; } //else if($timediff < 7200) { return '1 hour ago'; } //else if($timediff < 86400) { return $diffhours.' hours ago'; } - else if($timediff < 86400) { return 'today'; } - else if($timediff < 172800) { return 'yesterday'; } + else if((date(G)-$diffhours) > 0) { return 'today'; } + else if((date(G)-$diffhours) > -24) { return 'yesterday'; } else if($timediff < 2678400) { return $diffdays.' days ago'; } else if($timediff < 5184000) { return 'last month'; } - //else if($timediff < 31556926) { return $diffmonths.' months ago'; } - else if($timediff < 31556926) { return 'months ago'; } + else if((date(n)-$diffmonths) > 0) { return 'months ago'; } else if($timediff < 63113852) { return 'last year'; } - else { return $diffyears.' years ago'; } + else { return 'years ago'; } } From faf6c0e8e10347e16799699eab401060e28d7531 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 5 Aug 2011 11:19:46 +0200 Subject: [PATCH 57/78] fix some forgotten quotes around strings --- lib/template.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/template.php b/lib/template.php index 45008940e9..7f8bd5c271 100644 --- a/lib/template.php +++ b/lib/template.php @@ -88,11 +88,11 @@ function relative_modified_date($timestamp) { else if($timediff < 3600) { return $diffminutes.' minutes ago'; } //else if($timediff < 7200) { return '1 hour ago'; } //else if($timediff < 86400) { return $diffhours.' hours ago'; } - else if((date(G)-$diffhours) > 0) { return 'today'; } - else if((date(G)-$diffhours) > -24) { return 'yesterday'; } + else if((date('G')-$diffhours) > 0) { return 'today'; } + else if((date('G')-$diffhours) > -24) { return 'yesterday'; } else if($timediff < 2678400) { return $diffdays.' days ago'; } else if($timediff < 5184000) { return 'last month'; } - else if((date(n)-$diffmonths) > 0) { return 'months ago'; } + else if((date('n')-$diffmonths) > 0) { return 'months ago'; } else if($timediff < 63113852) { return 'last year'; } else { return 'years ago'; } } From c998bc1215cce9508d2cf42b49fefab0a573baaf Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 5 Aug 2011 16:05:10 +0200 Subject: [PATCH 58/78] fix some issues with browsers not supporting html5 localStorage --- apps/media/js/loader.js | 2 +- apps/media/js/player.js | 4 ++-- apps/user_openid/settings.php | 23 ----------------------- apps/user_openid/templates/settings.php | 7 ------- 4 files changed, 3 insertions(+), 33 deletions(-) delete mode 100644 apps/user_openid/settings.php delete mode 100644 apps/user_openid/templates/settings.php diff --git a/apps/media/js/loader.js b/apps/media/js/loader.js index c49d90cf3e..b7ef2fb7be 100644 --- a/apps/media/js/loader.js +++ b/apps/media/js/loader.js @@ -50,7 +50,7 @@ $(document).ready(function() { FileActions.setDefault('application/ogg','Play'); } if(typeof PlayList==='undefined'){ - if(typeof localStorage !== 'undefined'){ + if(typeof localStorage !== 'undefined' && localStorage){ if(localStorage.hasOwnProperty(oc_current_user+'oc_playlist_items') && localStorage.getItem(oc_current_user+'oc_playlist_items')!='[]' && localStorage.getItem(oc_current_user+'oc_playlist_active')!='true'){ loadPlayer(); } diff --git a/apps/media/js/player.js b/apps/media/js/player.js index ec22b0eaf9..4e1cc3cd75 100644 --- a/apps/media/js/player.js +++ b/apps/media/js/player.js @@ -143,7 +143,7 @@ var PlayList={ } }, save:function(){ - if(typeof localStorage !== 'undefined'){ + if(typeof localStorage !== 'undefined' && localStorage){ localStorage.setItem(oc_current_user+'oc_playlist_items',JSON.stringify(PlayList.items)); localStorage.setItem(oc_current_user+'oc_playlist_current',PlayList.current); var time=Math.round(PlayList.player.data('jPlayer').status.currentTime); @@ -156,7 +156,7 @@ var PlayList={ } }, load:function(){ - if(typeof localStorage !== 'undefined'){ + if(typeof localStorage !== 'undefined' && localStorage){ PlayList.active=true; localStorage.setItem(oc_current_user+'oc_playlist_active','true'); if(localStorage.hasOwnProperty(oc_current_user+'oc_playlist_items')){ diff --git a/apps/user_openid/settings.php b/apps/user_openid/settings.php deleted file mode 100644 index 4293a6c8aa..0000000000 --- a/apps/user_openid/settings.php +++ /dev/null @@ -1,23 +0,0 @@ -assign('identity',$identity); -$tmpl->assign('user',OC_User::getUser()); - -$tmpl->printPage(); - -?> diff --git a/apps/user_openid/templates/settings.php b/apps/user_openid/templates/settings.php deleted file mode 100644 index 7a1b530fbc..0000000000 --- a/apps/user_openid/templates/settings.php +++ /dev/null @@ -1,7 +0,0 @@ -
    -
    - t( 'OpenID identity' );?> -
    - -
    - From f039320a0b432937297c3deb93c1c78fe2d8d4a9 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 5 Aug 2011 16:05:58 +0200 Subject: [PATCH 59/78] move openid settings to Personal --- apps/user_openid/appinfo/app.php | 2 -- settings/ajax/openid.php | 26 ++++++++++++++++++++++++++ settings/index.php | 5 +++++ settings/js/main.js | 13 ++++++++++++- settings/templates/index.php | 11 +++++++++++ 5 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 settings/ajax/openid.php diff --git a/apps/user_openid/appinfo/app.php b/apps/user_openid/appinfo/app.php index f2d5313c7e..93b178ac70 100644 --- a/apps/user_openid/appinfo/app.php +++ b/apps/user_openid/appinfo/app.php @@ -21,8 +21,6 @@ OC_Util::addHeader('link',array('rel'=>'openid.delegate', 'href'=>$urlBase.OC_He require_once 'apps/user_openid/user_openid.php'; -OC_App::addSettingsPage( array( "id" => "user_openid_settings", 'order'=>1, "href" => OC_Helper::linkTo( "user_openid", "settings.php" ), "name" => "OpenID")); - //active the openid backend OC_User::useBackend('openid'); diff --git a/settings/ajax/openid.php b/settings/ajax/openid.php new file mode 100644 index 0000000000..021fe35d8e --- /dev/null +++ b/settings/ajax/openid.php @@ -0,0 +1,26 @@ + "error", "data" => array( "message" => $l->t("Authentication error") ))); + exit(); +} + +// Get data +if( isset( $_POST['identity'] ) ){ + $identity=$_POST['identity']; + OC_Preferences::setValue(OC_User::getUser(),'user_openid','identity',$identity); + echo json_encode( array( "status" => "success", "data" => array( "message" => $l->t("OpenID Changed") ))); +}else{ + echo json_encode( array( "status" => "error", "data" => array( "message" => $l->t("Invalid request") ))); +} + +?> diff --git a/settings/index.php b/settings/index.php index a37ae7e6ea..8b970a13c5 100644 --- a/settings/index.php +++ b/settings/index.php @@ -29,6 +29,11 @@ $tmpl->assign('usage',OC_Helper::humanFileSize($used)); $tmpl->assign('total_space',OC_Helper::humanFileSize($total)); $tmpl->assign('usage_relative',$relative); $tmpl->assign('languages',$languages); +$tmpl->assign('hasopenid',OC_App::isEnabled( 'user_openid' )); +if(OC_App::isEnabled( 'user_openid' )){ + $identity=OC_Preferences::getValue(OC_User::getUser(),'user_openid','identity',''); + $tmpl->assign('identity',$identity); +} $tmpl->printPage(); ?> diff --git a/settings/js/main.js b/settings/js/main.js index 010225bcb2..e6ca30d0ce 100644 --- a/settings/js/main.js +++ b/settings/js/main.js @@ -18,7 +18,18 @@ $(document).ready(function(){ }); return false; }); - + + $('#openidform').submit(function(event){ + event.preventDefault(); + var post = $( "#openidform" ).serialize(); + $.post( 'ajax/openid.php', post, function(data){ + if( data.status == "success" ){ + }else{ + alert('error while setting OpenID'); + } + }); + }); + $("#languageinput").change( function(){ // Serialize the data var post = $( "#languageinput" ).serialize(); diff --git a/settings/templates/index.php b/settings/templates/index.php index 761289acef..819b71c894 100644 --- a/settings/templates/index.php +++ b/settings/templates/index.php @@ -29,6 +29,17 @@ + +
    +
    + t( 'OpenID' );?> +

    OpenID identity for

    +

    '>

    +

    +
    + + +
    t( 'Language' );?> From 5f7c040ec031c151f0f3bc628506ce78b127ad2f Mon Sep 17 00:00:00 2001 From: Jakob Sack Date: Sat, 6 Aug 2011 11:36:56 +0200 Subject: [PATCH 60/78] Add principals, minor changes in base.php --- files/webdav.php | 23 ++-- lib/base.php | 30 +++-- lib/connector/sabre/principal.php | 181 ++++++++++++++++++++++++++++++ lib/template.php | 22 ++++ 4 files changed, 233 insertions(+), 23 deletions(-) create mode 100644 lib/connector/sabre/principal.php diff --git a/files/webdav.php b/files/webdav.php index a59dee70c2..b1d242b2cc 100644 --- a/files/webdav.php +++ b/files/webdav.php @@ -27,26 +27,21 @@ $RUNTIME_NOSETUPFS = true; require_once('../lib/base.php'); -require_once('Sabre/autoload.php'); + +// Backends +$authBackend = new OC_Connector_Sabre_Auth(); +$lockBackend = new OC_Connector_Sabre_Locks(); // Create ownCloud Dir $publicDir = new OC_Connector_Sabre_Directory(''); -$server = new Sabre_DAV_Server($publicDir); -// Path to our script +// Fire up server +$server = new Sabre_DAV_Server($publicDir); $server->setBaseUri($WEBROOT.'/files/webdav.php'); -// Auth backend -$authBackend = new OC_Connector_Sabre_Auth(); -$authPlugin = new Sabre_DAV_Auth_Plugin($authBackend,'ownCloud'); -$server->addPlugin($authPlugin); - -// Also make sure there is a 'data' directory, writable by the server. This directory is used to store information about locks -$lockBackend = new OC_Connector_Sabre_Locks(); -$lockPlugin = new Sabre_DAV_Locks_Plugin($lockBackend); -$server->addPlugin($lockPlugin); +// Load plugins +$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend,'ownCloud')); +$server->addPlugin(new Sabre_DAV_Locks_Plugin($lockBackend)); // And off we go! $server->exec(); - -?> diff --git a/lib/base.php b/lib/base.php index b2c5bd3231..e9451c45b6 100644 --- a/lib/base.php +++ b/lib/base.php @@ -22,6 +22,8 @@ /** * Class that is a namespace for all global OC variables + * No, we can not put this class in its own file because it is used by + * OC_autoload! */ class OC{ /** @@ -52,19 +54,22 @@ class OC{ * TODO: What's this for? */ public static $CONFIG_DATADIRECTORY_ROOT = ''; -} -// Get rid of this stupid require_once OC_... -function OC_autoload($className){ - if(array_key_exists($className,OC::$CLASSPATH)){ - require_once OC::$CLASSPATH[$className]; - } - elseif(strpos($className,'OC_')===0){ - require_once strtolower(str_replace('_','/',substr($className,3)) . '.php'); + /** + * SPL autoload + */ + public static function autoload($className){ + if(array_key_exists($className,OC::$CLASSPATH)){ + require_once OC::$CLASSPATH[$className]; + } + elseif(strpos($className,'OC_')===0){ + require_once strtolower(str_replace('_','/',substr($className,3)) . '.php'); + } } } -spl_autoload_register('OC_autoload'); +// this requires all our OC_* classes +spl_autoload_register(array('OC','autoload')); // set some stuff //ob_start(); @@ -94,6 +99,9 @@ if($WEBROOT!='' and $WEBROOT[0]!=='/'){ // set the right include path set_include_path($SERVERROOT.'/lib'.PATH_SEPARATOR.$SERVERROOT.'/config'.PATH_SEPARATOR.$SERVERROOT.'/3dparty'.PATH_SEPARATOR.get_include_path().PATH_SEPARATOR.$SERVERROOT); +//Some libs we really depend on +require_once('Sabre/autoload.php'); + // define runtime variables - unless this already has been done if( !isset( $RUNTIME_NOSETUPFS )){ $RUNTIME_NOSETUPFS = false; @@ -150,6 +158,10 @@ if(!$error and !$RUNTIME_NOSETUPFS ){ OC_Util::setupFS(); } +// Last part: connect some hooks +OC_HOOK::connect('OC_User', 'post_createUser', 'OC_Connector_Sabre_Principal', 'addPrincipal'); +OC_HOOK::connect('OC_User', 'post_deleteUser', 'OC_Connector_Sabre_Principal', 'deletePrincipal'); + // FROM Connect.php function OC_CONNECT_TEST($path,$user,$password){ diff --git a/lib/connector/sabre/principal.php b/lib/connector/sabre/principal.php new file mode 100644 index 0000000000..b3070087fd --- /dev/null +++ b/lib/connector/sabre/principal.php @@ -0,0 +1,181 @@ +execute(array($uri,$displayname)); + + // Add calendar and addressbook read and write support (sharing calendars) + $uri = 'principals/'.$params['uid'].'/calendar-proxy-read'; + $displayname = null; + $query->execute(array($uri,$displayname)); + $uri = 'principals/'.$params['uid'].'/calendar-proxy-write'; + $query->execute(array($uri,$displayname)); + $uri = 'principals/'.$params['uid'].'/addressbook-proxy-read'; + $query->execute(array($uri,$displayname)); + $uri = 'principals/'.$params['uid'].'/addressbook-proxy-write'; + $query->execute(array($uri,$displayname)); + + return true; + } + + /** + * TODO: write doc + */ + public static function deletePrincipal($params){ + $query = OC_DB::prepare('SELECT * FROM *PREFIX*principals'); + $result = $query->execute(); + + $deleteprincipal = OC_DB::prepare('DELETE FROM *PREFIX*principals WHERE id = ?'); + $deletegroup = OC_DB::prepare('DELETE FROM *PREFIX*principalgroups WHERE principal_id = ? OR member_id = ?'); + // We have to delete the principals and relations! Principals include + while($row = $result->fetchRow()){ + // Checking if the principal is in the prefix + list($rowPrefix,$rowUser) = Sabre_DAV_URLUtil::splitPath($row['uri']); + if ($rowUser !== $params['uid']) continue; + $deleteprincipal->execute(array($row['id'])); + $deletegroup->execute(array($row['id'],$row['id'])); + } + return true; + } + /** + * Returns a list of principals based on a prefix. + * + * This prefix will often contain something like 'principals'. You are only + * expected to return principals that are in this base path. + * + * You are expected to return at least a 'uri' for every user, you can + * return any additional properties if you wish so. Common properties are: + * {DAV:}displayname + * + * @param string $prefixPath + * @return array + */ + public function getPrincipalsByPrefix( $prefixPath ){ + $query = OC_DB::prepare('SELECT * FROM *PREFIX*principals'); + $result = $query->execute(); + + $principals = array(); + + while($row = $result->fetchRow()){ + // Checking if the principal is in the prefix + list($rowPrefix) = Sabre_DAV_URLUtil::splitPath($row['uri']); + if ($rowPrefix !== $prefixPath) continue; + + $principals[] = array( + 'uri' => $row['uri'], + '{DAV:}displayname' => $row['displayname']?$row['displayname']:basename($row['uri']) + ); + + } + + return $principals; + } + + /** + * Returns a specific principal, specified by it's path. + * The returned structure should be the exact same as from + * getPrincipalsByPrefix. + * + * @param string $path + * @return array + */ + public function getPrincipalByPath($path) { + $query = OC_DB::prepare('SELECT * FROM *PREFIX*principals WHERE uri=?'); + $result = $query->execute(array($path)); + + $users = array(); + + $row = $result->fetchRow(); + if (!$row) return; + + return array( + 'id' => $row['id'], + 'uri' => $row['uri'], + '{DAV:}displayname' => $row['displayname']?$row['displayname']:basename($row['uri']) + ); + + } + + /** + * Returns the list of members for a group-principal + * + * @param string $principal + * @return array + */ + public function getGroupMemberSet($principal) { + $principal = $this->getPrincipalByPath($principal); + if (!$principal) throw new Sabre_DAV_Exception('Principal not found'); + + $query = OC_DB::prepare('SELECT principals.uri as uri FROM *PREFIX*principalgroups AS groupmembers LEFT JOIN *PREFIX*principals AS principals ON groupmembers.member_id = principals.id WHERE groupmembers.principal_id = ?'); + $result = $query->execute(array($principal['id'])); + + $return = array(); + while ($row = $result->fetchRow()){ + $return[] = $row['uri']; + } + return $return; + } + + /** + * Returns the list of groups a principal is a member of + * + * @param string $principal + * @return array + */ + public function getGroupMembership($principal) { + $principal = $this->getPrincipalByPath($principal); + if (!$principal) throw new Sabre_DAV_Exception('Principal not found'); + + $query = OC_DB::prepare('SELECT principals.uri as uri FROM *PREFIX*principalgroups AS groupmembers LEFT JOIN *PREFIX*principals AS principals ON groupmembers.member_id = principals.id WHERE groupmembers.member_id = ?'); + $result = $query->execute(array($principal['id'])); + + $return = array(); + while ($row = $result->fetchRow()){ + $return[] = $row['uri']; + } + return $return; + } + + /** + * Updates the list of group members for a group principal. + * + * The principals should be passed as a list of uri's. + * + * @param string $principal + * @param array $members + * @return void + */ + public function setGroupMemberSet($principal, array $members) { + $query = OC_DB::prepare('SELECT id, uri FROM *PREFIX*principals WHERE uri IN (? '.str_repeat(', ?', count($members)).')'); + $result = $query->execute(array_merge(array($principal), $members)); + + $memberIds = array(); + $principalId = null; + + while($row = $$result->fetchRow()) { + if ($row['uri'] == $principal) { + $principalId = $row['id']; + } + else{ + $memberIds[] = $row['id']; + } + } + if (!$principalId) throw new Sabre_DAV_Exception('Principal not found'); + + // Wiping out old members + $query = OC_DB::prepare('DELETE FROM *PREFIX*principalgroups WHERE principal_id = ?'); + $query->execute(array($principalID)); + + $query = OC_DB::prepare('INSERT INTO *PREFIX*principalgroups (principal_id, member_id) VALUES (?, ?);'); + foreach($memberIds as $memberId) { + $query->execute(array($principalId, $memberId)); + } + } +} diff --git a/lib/template.php b/lib/template.php index fe173f609b..045ecdaf13 100644 --- a/lib/template.php +++ b/lib/template.php @@ -320,6 +320,28 @@ class OC_Template{ return $data; } + /** + * @brief Include template + * @returns returns content of included template + * + * Includes another template. use inc('template'); ?> to + * do this. + */ + public function inc( $file ) + { + // $_ erstellen + $_ = $this->vars; + + // Einbinden + ob_start(); + include( $this->path.'/'.$file.'.php' ); + $data = ob_get_contents(); + ob_end_clean(); + + // Daten zurĂĽckgeben + return $data; + } + /** * @brief Shortcut to print a simple page for users * @param $application The application we render the template for From d9ccbe96dda717712d67274c777a0e614743784f Mon Sep 17 00:00:00 2001 From: Jakob Sack Date: Sat, 6 Aug 2011 17:00:06 +0200 Subject: [PATCH 61/78] fix template.php ;-) --- lib/template.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/template.php b/lib/template.php index b8adba0833..124343bd85 100644 --- a/lib/template.php +++ b/lib/template.php @@ -139,12 +139,14 @@ class OC_Template{ } // Templates have the ending .php + $path = $template; $template .= "$name.php"; // Set the private data $this->renderas = $renderas; $this->application = $app; $this->template = $template; + $this->path = $path; $this->vars = array(); $this->l10n = new OC_L10N($app); } @@ -327,14 +329,13 @@ class OC_Template{ * Includes another template. use inc('template'); ?> to * do this. */ - public function inc( $file ) - { + public function inc( $file ){ // $_ erstellen $_ = $this->vars; // Einbinden ob_start(); - include( $this->path.'/'.$file.'.php' ); + include( $this->path.$file.'.php' ); $data = ob_get_contents(); ob_end_clean(); From 2f10598af69209f2e84797aaf3399536f824f564 Mon Sep 17 00:00:00 2001 From: Jakob Sack Date: Sat, 6 Aug 2011 22:32:06 +0200 Subject: [PATCH 62/78] New app: contacts --- apps/contacts/appinfo/app.php | 18 ++ apps/contacts/appinfo/info.xml | 9 + apps/contacts/carddav.php | 28 +++ apps/contacts/css/styles.css | 1 + apps/contacts/details.php | 57 +++++ apps/contacts/img/icon.png | Bin 0 -> 741 bytes apps/contacts/index.php | 68 ++++++ apps/contacts/js/interface.js | 14 ++ apps/contacts/lib/addressbook.php | 287 ++++++++++++++++++++++++++ apps/contacts/lib/connector_sabre.php | 186 +++++++++++++++++ apps/contacts/photo.php | 85 ++++++++ apps/contacts/templates/_contacts.php | 3 + apps/contacts/templates/_details.php | 4 + apps/contacts/templates/index.php | 13 ++ 14 files changed, 773 insertions(+) create mode 100644 apps/contacts/appinfo/app.php create mode 100644 apps/contacts/appinfo/info.xml create mode 100644 apps/contacts/carddav.php create mode 100644 apps/contacts/css/styles.css create mode 100644 apps/contacts/details.php create mode 100644 apps/contacts/img/icon.png create mode 100644 apps/contacts/index.php create mode 100644 apps/contacts/js/interface.js create mode 100644 apps/contacts/lib/addressbook.php create mode 100644 apps/contacts/lib/connector_sabre.php create mode 100644 apps/contacts/photo.php create mode 100644 apps/contacts/templates/_contacts.php create mode 100644 apps/contacts/templates/_details.php create mode 100644 apps/contacts/templates/index.php diff --git a/apps/contacts/appinfo/app.php b/apps/contacts/appinfo/app.php new file mode 100644 index 0000000000..f38a45f279 --- /dev/null +++ b/apps/contacts/appinfo/app.php @@ -0,0 +1,18 @@ + 10, + 'id' => 'contacts', + 'name' => 'Contacts' )); + +OC_App::addNavigationEntry( array( + 'id' => 'contacts_index', + 'order' => 10, + 'href' => OC_Helper::linkTo( 'contacts', 'index.php' ), + 'icon' => OC_Helper::imagePath( 'contacts', 'icon.png' ), + 'name' => 'Addressbook' )); + +?> diff --git a/apps/contacts/appinfo/info.xml b/apps/contacts/appinfo/info.xml new file mode 100644 index 0000000000..93463b9cf0 --- /dev/null +++ b/apps/contacts/appinfo/info.xml @@ -0,0 +1,9 @@ + + + contacts + Contacts + 0.1 + AGPL + Jakob Sack + 2 + diff --git a/apps/contacts/carddav.php b/apps/contacts/carddav.php new file mode 100644 index 0000000000..ae2c5b9736 --- /dev/null +++ b/apps/contacts/carddav.php @@ -0,0 +1,28 @@ +setBaseUri($WEBROOT.'/apps/contacts/carddav.php'); +// Add plugins +$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend,'ownCloud')); +$server->addPlugin(new Sabre_CardDAV_Plugin()); +$server->addPlugin(new Sabre_DAVACL_Plugin()); + +// And off we go! +$server->exec(); diff --git a/apps/contacts/css/styles.css b/apps/contacts/css/styles.css new file mode 100644 index 0000000000..8d1c8b69c3 --- /dev/null +++ b/apps/contacts/css/styles.css @@ -0,0 +1 @@ + diff --git a/apps/contacts/details.php b/apps/contacts/details.php new file mode 100644 index 0000000000..7ab1b64de2 --- /dev/null +++ b/apps/contacts/details.php @@ -0,0 +1,57 @@ +. + * + */ + +// Init owncloud +require_once('../../lib/base.php'); + +$id = $_GET['id']; + +$l10n = new OC_L10N('contacts'); + +// Check if we are a user +if( !OC_User::isLoggedIn()){ + echo $l10n->t('You need to log in!'); + exit(); +} + + +$card = OC_Contacts_Addressbook::findCard( $id ); +if( $card === false ){ + echo json_encode( array( 'status' => 'error', 'data' => array( 'message' => $l10n->t('Can not find Contact!')))); + exit(); +} + +$addressbook = OC_Contacts_Addressbook::findAddressbook( $card['addressbookid'] ); +if( $addressbook === false || $addressbook['userid'] != OC_USER::getUser()){ + echo json_encode( array( 'status' => 'error', 'data' => array( 'message' => $l10n->t('This is not your contact!')))); + exit(); +} + +$vcard = Sabre_VObject_Reader::read($card['carddata']); +$details = OC_Contacts_Addressbook::structureContact($vcard); + +$tmpl = new OC_Template('contacts','_details'); +$tmpl->assign('details',$details); +$tmpl->assign('id',$id); +$page = $tmpl->fetchPage(); + +echo json_encode( array( 'status' => 'success', 'data' => array( 'page' => $page ))); diff --git a/apps/contacts/img/icon.png b/apps/contacts/img/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ea2ed9e3335ea5be11896d705b6afaf92a691695 GIT binary patch literal 741 zcmV0xSW>Y?K}?-*lmo6Y7T0C=7^?|GhUn&yCMnrwJ@*cC!N z_kCaM1B{K0y{uNNGbsUkmq@VF@{t`gkrH+NRkA7fKsXC5D|1;M?Rmo zR#sL>2=QCjb)+I92q8|Tlt~|;R;wKn5r_!oa{1Tl>guWQ`}=7wRjpRLH1!L>#>U16 z*L6c8!otGBrj$~xt*w2k*XtMHiHV7$_4W15EPw&P?Ck7aB6?gZl{jMz%gf7+D2je; zZ*PCKZCeu2JpgcB_fSgtJqysr$H(VQ(|qALj%^r*rRzGn-EKDw!zhm9BiD6r4Gs<# z0U!*+vmgk*5Yf)o*491%Xw7ExJrUi(HF17^{+Eat0Hl*wN~t)G<956Kjfmbb&iP2z zlwDD3zVv3sxNX~9DRn=Jq8u$PEmhj>cCOd!F-_BS0F+(b|CGz+m=J<#Ns?3mQ~(qJ z@VU9U*Kr)XS1V^b%XAnpDdjPM<4pb)5nVTuzTli|+ST7!tyZ7y?(R+=930#Zf?!A~ zWh$l2BuQWxMu&6WDHIApynVC8412h^924Dn08Gs9b126z+02F{f0L}pX1aR^X X4}!;3{&)-G00000NkvXXu0mjfU`t8+ literal 0 HcmV?d00001 diff --git a/apps/contacts/index.php b/apps/contacts/index.php new file mode 100644 index 0000000000..2d5bcefd87 --- /dev/null +++ b/apps/contacts/index.php @@ -0,0 +1,68 @@ +. + * + */ + +function contactsort($a,$b){ + return strcmp($a['name'],$b['name']); +} + +// Init owncloud +require_once('../../lib/base.php'); + +// Check if we are a user +if( !OC_User::isLoggedIn()){ + header( 'Location: '.OC_Helper::linkTo( '', 'index.php' )); + exit(); +} + +// Load the files we need +OC_App::setActiveNavigationEntry( 'contacts_index' ); + +// Load a specific user? +$id = isset( $_GET['id'] ) ? $_GET['id'] : null; + +// Addressbooks to load +$openaddressbooks = explode(';',OC_Preferences::getValue(OC_User::getUser(),'contacts','openaddressbooks',null)); + +$contacts = array(); +foreach( $openaddressbooks as $addressbook ){ + $addressbookcontacts = OC_Contacts_Addressbook::allCards($addressbook); + foreach( $addressbookcontacts as $contact ){ + $contacts[] = array( 'name' => $contact['fullname'], 'id' => $contact['id'] ); + } +} + + +usort($contacts,'contactsort'); +$details = array(); + +if( !is_null($id) || count($contacts)){ + $contact = OC_Contacts_Addressbook::findCard(is_null($id)?$contacts[0]['id']:$id); + $vcard = Sabre_VObject_Reader::read($contact['carddata']); + $details = OC_Contacts_Addressbook::structureContact($vcard); +} + +// Process the template +$tmpl = new OC_Template( 'contacts', 'index', 'user' ); +$tmpl->assign('contacts', $contacts); +$tmpl->assign('details', $details ); +$tmpl->assign('id',$id); +$tmpl->printPage(); diff --git a/apps/contacts/js/interface.js b/apps/contacts/js/interface.js new file mode 100644 index 0000000000..045562b496 --- /dev/null +++ b/apps/contacts/js/interface.js @@ -0,0 +1,14 @@ +$(document).ready(function(){ + $('.contacts_contacts').find('li').live('click',function(){ + var id = $(this).attr('x-id'); + $.getJSON('details.php',{'id':id},function(jsondata){ + if(jsondata.status == 'success'){ + $('.contacts_details').html(jsondata.data.page); + } + else{ + alert(jsondata.data.message); + } + }); + return false; + }); +}); diff --git a/apps/contacts/lib/addressbook.php b/apps/contacts/lib/addressbook.php new file mode 100644 index 0000000000..c0f26c7df5 --- /dev/null +++ b/apps/contacts/lib/addressbook.php @@ -0,0 +1,287 @@ +. + * + */ +/* + * + * The following SQL statement is just a help for developers and will not be + * executed! + * + * CREATE TABLE contacts_addressbooks ( + * id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + * userid VARCHAR(255) NOT NULL, + * displayname VARCHAR(255), + * uri VARCHAR(100), + * description TEXT, + * ctag INT(11) UNSIGNED NOT NULL DEFAULT '1' + * ); + * + * CREATE TABLE contacts_cards ( + * id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + * addressbookid INT(11) UNSIGNED NOT NULL, + * fullname VARCHAR(255), + * carddata TEXT, + * uri VARCHAR(100), + * lastmodified INT(11) UNSIGNED + * ); + */ + +/** + * This class manages our addressbooks. + */ +class OC_Contacts_Addressbook{ + public static function allAddressbooks($uid){ + $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*contacts_addressbooks WHERE userid = ?' ); + $result = $stmt->execute(array($uid)); + + $addressbooks = array(); + while( $row = $result->fetchRow()){ + $addressbooks[] = $row; + } + + return $addressbooks; + } + + public static function allAddressbooksWherePrincipalURIIs($principaluri){ + $uid = self::extractUserID($principaluri); + return self::allAddressbooks($uid); + } + + public static function findAddressbook($id){ + $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*contacts_addressbooks WHERE id = ?' ); + $result = $stmt->execute(array($id)); + + return $result->fetchRow(); + } + + public static function addAddressbook($userid,$name,$description){ + $all = self::allAddressbooks($userid); + $uris = array(); + foreach($all as $i){ + $uris[] = $i['uri']; + } + + $uri = self::createURI('name', $uris ); + + $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_addressbooks (userid,displayname,uri,description,ctag) VALUES(?,?,?,?,?)' ); + $result = $stmt->execute(array($userid,$name,$uri,$description,1)); + + return OC_DB::insertid(); + } + + public static function addAddressbookFromDAVData($principaluri,$uri,$name,$description){ + $userid = self::extractUserID($principaluri); + + $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_addressbooks (userid,displayname,uri,description,ctag) VALUES(?,?,?,?,?)' ); + $result = $stmt->execute(array($userid,$name,$uri,$description,1)); + + return OC_DB::insertid(); + } + + public static function editAddressbook($id,$name,$description){ + // Need these ones for checking uri + $addressbook = self::find($id); + + if(is_null($name)){ + $name = $addressbook['name']; + } + if(is_null($description)){ + $description = $addressbook['description']; + } + + $stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_addressbooks SET displayname=?,description=?, ctag=ctag+1 WHERE id=?' ); + $result = $stmt->execute(array($name,$description,$id)); + + return true; + } + + public static function touchAddressbook($id){ + $stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_addressbooks SET ctag = ctag + 1 WHERE id = ?' ); + $stmt->execute(array($id)); + + return true; + } + + public static function deleteAddressbook($id){ + $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*contacts_cards WHERE id = ?' ); + $stmt->execute(array($id)); + + $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*contacts_addressbooks WHERE addressbookid = ?' ); + $stmt->execute(array($id)); + + return true; + } + + public static function allCards($id){ + $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid = ?' ); + $result = $stmt->execute(array($id)); + + $addressbooks = array(); + while( $row = $result->fetchRow()){ + $addressbooks[] = $row; + } + + return $addressbooks; + } + + public static function findCard($id){ + $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE id = ?' ); + $result = $stmt->execute(array($id)); + + return $result->fetchRow(); + } + + public static function findCardWhereDAVDataIs($aid,$uri){ + $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid = ? AND uri = ?' ); + $result = $stmt->execute(array($aid,$uri)); + + return $result->fetchRow(); + } + + public static function addCard($id,$data){ + $fn = null; + $uri = null; + $card = Sabre_VObject_Reader::read($data); + foreach($card->children as $property){ + if($property->name == 'FN'){ + $fn = $property->value; + } + elseif(is_null($uri) && $property->name == 'UID' ){ + $uri = $property->value.'.vcf'; + } + } + $uri = self::createUID().'.vcf'; + + $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_cards (addressbookid,fullname,carddata,uri,lastmodified) VALUES(?,?,?,?,?)' ); + $result = $stmt->execute(array($id,$fn,$data,$uri,time())); + + self::touch($id); + + return OC_DB::insertid; + } + + public static function addCardFromDAVData($id,$uri,$data){ + $fn = null; + $card = Sabre_VObject_Reader::read($data); + foreach($card->children as $property){ + if($property->name == 'FN'){ + $fn = $property->value; + } + } + + $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_cards (addressbookid,fullname,carddata,uri,lastmodified) VALUES(?,?,?,?,?)' ); + $result = $stmt->execute(array($id,$fn,$data,$uri,time())); + + self::touch($id); + + return OC_DB::insertid; + } + + public static function editCard($id, $data){ + $oldcard = self::findCard($id,$aid,$uri); + $fn = null; + $card = Sabre_VObject_Reader::read($data); + foreach($card->children as $property){ + if($property->name == 'FN'){ + $fn = $property->value; + } + } + + $stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_cards SET fullname = ?,carddata = ?, lastmodified = ? WHERE id = ?' ); + $result = $stmt->execute(array($fn,$data,time(),$id)); + + self::touch($oldcard['addressbookid']); + + return true; + } + + public static function editCardFromDAVData($aid,$uri,$data){ + $oldcard = self::findCardWhereDAVDataIs($aid,$uri); + + $fn = null; + $card = Sabre_VObject_Reader::read($data); + foreach($card->children as $property){ + if($property->name == 'FN'){ + $fn = $property->value; + } + } + + $stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_cards SET fullname = ?,carddata = ?, lastmodified = ? WHERE id = ?' ); + $result = $stmt->execute(array($fn,$data,time(),$oldcard['id'])); + + self::touch($oldcard['addressbookid']); + + return true; + } + + public static function deleteCard($id){ + $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*contacts_addressbooks WHERE id = ?' ); + $stmt->execute(array($id)); + + return true; + } + + public static function deleteCardFromDAVData($aid,$uri){ + $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*contacts_addressbooks WHERE addressbookid = ? AND uri=?' ); + $stmt->execute(array($aid,$uri)); + + return true; + } + + public static function createURI($name,$existing){ + $name = strtolower($name); + $newname = $name; + $i = 1; + while(in_array($newname,$existing)){ + $newname = $name.$i; + $i = $i + 1; + } + return $newname; + } + + public static function createUID(){ + return substr(md5(rand().time()),0,10); + } + + public static function extractUserID($principaluri){ + list($prefix,$userid) = Sabre_DAV_URLUtil::splitPath($principaluri); + return $userid; + } + + public static function structureContact($object){ + $details = array(); + foreach($object->children as $property){ + $temp = array( + 'name' => $property->name, + 'value' => ($property->name == 'PHOTO' || $property->name == 'LOGO' ? null : $property->value ), + 'parameters' => array()); + foreach($property->parameters as $parameter){ + $temp['parameters'][] = array( 'name' => $parameter->name, 'value' => $parameter->value); + } + if(array_key_exists($property->name,$details)){ + $details[$property->name][] = $temp; + } + else{ + $details[$property->name] = array($temp); + } + } + return $details; + } +} diff --git a/apps/contacts/lib/connector_sabre.php b/apps/contacts/lib/connector_sabre.php new file mode 100644 index 0000000000..98e2598b3a --- /dev/null +++ b/apps/contacts/lib/connector_sabre.php @@ -0,0 +1,186 @@ + $i['id'], + 'uri' => $i['uri'], + 'principaluri' => 'principals/'.$i['userid'], + '{DAV:}displayname' => $i['displayname'], + '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' => $i['description'], + '{http://calendarserver.org/ns/}getctag' => $i['ctag'], + ); + } + + return $addressbooks; + } + + + /** + * Updates an addressbook's properties + * + * See Sabre_DAV_IProperties for a description of the mutations array, as + * well as the return value. + * + * @param mixed $addressbookid + * @param array $mutations + * @see Sabre_DAV_IProperties::updateProperties + * @return bool|array + */ + public function updateAddressBook($addressbookid, array $mutations) { + $name = null; + $description = null; + + foreach($mutations as $property=>$newvalue) { + switch($property) { + case '{DAV:}displayname' : + $name = $newvalue; + break; + case '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' : + $description = $newvalue; + break; + default : + // If any unsupported values were being updated, we must + // let the entire request fail. + return false; + } + } + + OC_Contacts_Addressbook::editAddressbook($addressbookid,$name,$description); + + return true; + + } + + /** + * Creates a new address book + * + * @param string $principaluri + * @param string $url Just the 'basename' of the url. + * @param array $properties + * @return void + */ + public function createAddressBook($principaluri, $url, array $properties) { + + $displayname = null; + $description = null; + + foreach($properties as $property=>$newvalue) { + + switch($property) { + case '{DAV:}displayname' : + $displayname = $newvalue; + break; + case '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' : + $description = $newvalue; + break; + default : + throw new Sabre_DAV_Exception_BadRequest('Unknown property: ' . $property); + } + + } + + OC_Contacts_Addressbook::addAddressbookFromDAVData($principaluri,$url,$name,$description); + } + + /** + * Deletes an entire addressbook and all its contents + * + * @param int $addressbookid + * @return void + */ + public function deleteAddressBook($addressbookid) { + OC_Contacts_Addressbook::deleteAddressbook($addressbookid); + } + + /** + * Returns all cards for a specific addressbook id. + * + * @param mixed $addressbookid + * @return array + */ + public function getCards($addressbookid) { + $data = OC_Contacts_Addressbook::allCards($addressbookid); + $cards = array(); + foreach($data as $i){ + $cards[] = array( + 'id' => $i['id'], + 'carddata' => $i['carddata'], + 'uri' => $i['uri'], + 'lastmodified' => $i['lastmodified'] ); + } + + return $cards; + } + + /** + * Returns a specfic card + * + * @param mixed $addressbookid + * @param string $carduri + * @return array + */ + public function getCard($addressbookid, $carduri) { + return OC_Contacts_Addressbook::findCardWhereDAVDataIs($addressbookid,$carduri); + + } + + /** + * Creates a new card + * + * @param mixed $addressbookid + * @param string $carduri + * @param string $carddata + * @return bool + */ + public function createCard($addressbookid, $carduri, $carddata) { + OC_Contacts_Addressbook::addCardFromDAVData($addressbookid, $carduri, $carddata); + return true; + } + + /** + * Updates a card + * + * @param mixed $addressbookid + * @param string $carduri + * @param string $carddata + * @return bool + */ + public function updateCard($addressbookid, $carduri, $carddata) { + return OC_Contacts_Addressbook::editCardFromDAVData($addressbookid, $carduri, $carddata); + } + + /** + * Deletes a card + * + * @param mixed $addressbookid + * @param string $carduri + * @return bool + */ + public function deleteCard($addressbookid, $carduri) { + return OC_Contacts_Addressbook::deleteCardFromDAVData($addressbookid, $carduri); + } +} diff --git a/apps/contacts/photo.php b/apps/contacts/photo.php new file mode 100644 index 0000000000..62386421cd --- /dev/null +++ b/apps/contacts/photo.php @@ -0,0 +1,85 @@ +. + * + */ + +// Init owncloud +require_once('../../lib/base.php'); + +$id = $_GET['id']; + +$l10n = new OC_L10N('contacts'); + +// Check if we are a user +if( !OC_User::isLoggedIn()){ + echo $l10n->t('You need to log in!'); + exit(); +} + + +$card = OC_Contacts_Addressbook::findCard( $id ); +if( $card === false ){ + echo $l10n->t('Can not find Contact!'); + exit(); +} + +$addressbook = OC_Contacts_Addressbook::findAddressbook( $card['addressbookid'] ); +if( $addressbook === false || $addressbook['userid'] != OC_USER::getUser()){ + echo $l10n->t('This is not your contact!'); + exit(); +} + +$content = Sabre_VObject_Reader::read($card['carddata']); + +// Photo :-) +foreach($content->children as $child){ + if($child->name == 'PHOTO'){ + $mime = 'image/jpeg'; + foreach($child->parameters as $parameter){ + if( $parameter->name == 'TYPE' ){ + $mime = $parameter->value; + } + } + $photo = base64_decode($child->value); + header('Content-Type: '.$mime); + header('Content-Length: ' . strlen($photo)); + echo $photo; + exit(); + } +} +// Logo :-/ +foreach($content->children as $child){ + if($child->name == 'PHOTO'){ + $mime = 'image/jpeg'; + foreach($child->parameters as $parameter){ + if($parameter->name == 'TYPE'){ + $mime = $parameter->value; + } + } + $photo = base64_decode($child->value()); + header('Content-Type: '.$mime); + header('Content-Length: ' . strlen($photo)); + echo $photo; + exit(); + } +} + +// Not found :-( +echo $l10n->t('This card does not contain photo data!'); diff --git a/apps/contacts/templates/_contacts.php b/apps/contacts/templates/_contacts.php new file mode 100644 index 0000000000..bf633b79b0 --- /dev/null +++ b/apps/contacts/templates/_contacts.php @@ -0,0 +1,3 @@ + +
  • + diff --git a/apps/contacts/templates/_details.php b/apps/contacts/templates/_details.php new file mode 100644 index 0000000000..e27b17ef2e --- /dev/null +++ b/apps/contacts/templates/_details.php @@ -0,0 +1,4 @@ +Name + + + \ No newline at end of file diff --git a/apps/contacts/templates/index.php b/apps/contacts/templates/index.php new file mode 100644 index 0000000000..0cd214bfb1 --- /dev/null +++ b/apps/contacts/templates/index.php @@ -0,0 +1,13 @@ + + +
    +
      + inc("_contacts"); ?> +
    +
    +
    + inc("_details"); ?> +
    From be9c044b24045a4fc1a4ac419697efccf1f42d00 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 6 Aug 2011 23:04:39 +0200 Subject: [PATCH 63/78] descriptions for OC:: variables --- lib/base.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/base.php b/lib/base.php index e9451c45b6..7846f0cfb7 100644 --- a/lib/base.php +++ b/lib/base.php @@ -35,23 +35,23 @@ class OC{ */ public static $DOCUMENTROOT = ''; /** - * TODO: What's this for? + * The installation path for owncloud on the server (e.g. /srv/http/owncloud) */ public static $SERVERROOT = ''; /** - * TODO: What's this for? + * the current request path relative to the owncloud root (e.g. files/index.php) */ public static $SUBURI = ''; /** - * TODO: What's this for? + * the owncloud root path for http requests (e.g. owncloud/) */ public static $WEBROOT = ''; /** - * TODO: What's this for? + * the folder that stores that data files for the filesystem of the user (e.g. /srv/http/owncloud/data/myusername/files) */ public static $CONFIG_DATADIRECTORY = ''; /** - * TODO: What's this for? + * the folder that stores the data for the root filesystem (e.g. /srv/http/owncloud/data) */ public static $CONFIG_DATADIRECTORY_ROOT = ''; From 42a65497295aeba95163af89802989701aea30ca Mon Sep 17 00:00:00 2001 From: Jakob Sack Date: Sat, 6 Aug 2011 23:09:38 +0200 Subject: [PATCH 64/78] Database.xml --- apps/contacts/appinfo/database.xml | 129 +++++++++++++++++++++++++++++ lib/connector/sabre/principal.php | 4 +- 2 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 apps/contacts/appinfo/database.xml diff --git a/apps/contacts/appinfo/database.xml b/apps/contacts/appinfo/database.xml new file mode 100644 index 0000000000..7c8268d71f --- /dev/null +++ b/apps/contacts/appinfo/database.xml @@ -0,0 +1,129 @@ + + + + *dbname* + true + false + + utf8 + +
+ + *dbprefix*contacts_addressbooks + + + + + id + integer + 0 + true + 1 + true + 4 + + + + userid + text + + true + 255 + + + + displayname + text + + false + 255 + + + + uri + text + + false + 100 + + + + description + clob + false + + + + ctag + integer + 1 + true + true + 4 + + + + +
+ + + + *dbprefix*contacts_cards + + + + + id + integer + 0 + true + 1 + true + 4 + + + + addressbookid + integer + + true + true + 4 + + + + fullname + text + + false + 255 + + + + carddata + clob + false + + + + uri + text + + false + 100 + + + + lastmodified + integer + + false + true + 4 + + + + +
+ + diff --git a/lib/connector/sabre/principal.php b/lib/connector/sabre/principal.php index b3070087fd..9c386f85e1 100644 --- a/lib/connector/sabre/principal.php +++ b/lib/connector/sabre/principal.php @@ -37,8 +37,8 @@ class OC_Connector_Sabre_Principal implements Sabre_DAVACL_IPrincipalBackend { // We have to delete the principals and relations! Principals include while($row = $result->fetchRow()){ // Checking if the principal is in the prefix - list($rowPrefix,$rowUser) = Sabre_DAV_URLUtil::splitPath($row['uri']); - if ($rowUser !== $params['uid']) continue; + $array = explode('/',$row['uri']); + if ($array[1] != $params['uid']) continue; $deleteprincipal->execute(array($row['id'])); $deletegroup->execute(array($row['id'],$row['id'])); } From 77fccc9d0054b1748a05e25f2e57d64cf462b8f6 Mon Sep 17 00:00:00 2001 From: Jakob Sack Date: Sat, 6 Aug 2011 23:09:55 +0200 Subject: [PATCH 65/78] TEMPORARY update path for carddav testers --- apps/contacts/temporaryupdate.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 apps/contacts/temporaryupdate.php diff --git a/apps/contacts/temporaryupdate.php b/apps/contacts/temporaryupdate.php new file mode 100644 index 0000000000..bb5ff7604f --- /dev/null +++ b/apps/contacts/temporaryupdate.php @@ -0,0 +1,13 @@ +getPrincipalByPath('principals/'.$user); + if(!isset($foo)){ + OC_Connector_Sabre_Principal::addPrincipal(array('uid'=>$user)); + } +} +echo "done"; \ No newline at end of file From b513a6054036455605d96f1d1827e156b2127ce3 Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Sat, 6 Aug 2011 23:19:00 +0200 Subject: [PATCH 66/78] nicer error report and streamlined setup --- lib/base.php | 12 +++++++++++- lib/util.php | 16 +++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/lib/base.php b/lib/base.php index e9451c45b6..520c12d4df 100644 --- a/lib/base.php +++ b/lib/base.php @@ -125,7 +125,17 @@ if( OC_Config::getValue( "forcessl", false )){ } } -$error=(count(OC_Util::checkServer())>0); +$errors=OC_Util::checkServer(); +$error=(count($errors)>0); + +if($error) { + $tmpl = new OC_Template( '', 'error', 'guest' ); + $tmpl->assign('errors',$errors); + $tmpl->printPage(); + exit; +} + + // User and Groups if( !OC_Config::getValue( "installed", false )){ diff --git a/lib/util.php b/lib/util.php index d9c749521e..e07400fc1f 100644 --- a/lib/util.php +++ b/lib/util.php @@ -25,7 +25,13 @@ class OC_Util { // Create root dir if(!is_dir($CONFIG_DATADIRECTORY_ROOT)){ - @mkdir($CONFIG_DATADIRECTORY_ROOT) or die("Can't create data directory ($CONFIG_DATADIRECTORY_ROOT), you can usually fix this by setting the owner of '$SERVERROOT' to the user that the web server uses (www-data for debian/ubuntu)"); + $success=@mkdir($CONFIG_DATADIRECTORY_ROOT); + if(!$success) { + $tmpl = new OC_Template( '', 'error', 'guest' ); + $tmpl->assign('errors',array(1=>array('error'=>"Can't create data directory ($CONFIG_DATADIRECTORY_ROOT)",'hint'=>"You can usually fix this by setting the owner of '$SERVERROOT' to the user that the web server uses (www-data for debian/ubuntu)"))); + $tmpl->printPage(); + exit; + } } // If we are not forced to load a specific user we load the one that is logged in @@ -210,21 +216,21 @@ class OC_Util { //check for correct file permissions if(!stristr(PHP_OS, 'WIN')){ - $prems=substr(decoct(fileperms($CONFIG_DATADIRECTORY_ROOT)),-3); + $prems=substr(decoct(@fileperms($CONFIG_DATADIRECTORY_ROOT)),-3); if(substr($prems,-1)!='0'){ OC_Helper::chmodr($CONFIG_DATADIRECTORY_ROOT,0770); clearstatcache(); - $prems=substr(decoct(fileperms($CONFIG_DATADIRECTORY_ROOT)),-3); + $prems=substr(decoct(@fileperms($CONFIG_DATADIRECTORY_ROOT)),-3); if(substr($prems,2,1)!='0'){ $errors[]=array('error'=>'Data directory ('.$CONFIG_DATADIRECTORY_ROOT.') is readable from the web
','hint'=>$permissionsHint); } } if( OC_Config::getValue( "enablebackup", false )){ - $prems=substr(decoct(fileperms($CONFIG_BACKUPDIRECTORY)),-3); + $prems=substr(decoct(@fileperms($CONFIG_BACKUPDIRECTORY)),-3); if(substr($prems,-1)!='0'){ OC_Helper::chmodr($CONFIG_BACKUPDIRECTORY,0770); clearstatcache(); - $prems=substr(decoct(fileperms($CONFIG_BACKUPDIRECTORY)),-3); + $prems=substr(decoct(@fileperms($CONFIG_BACKUPDIRECTORY)),-3); if(substr($prems,2,1)!='0'){ $errors[]=array('error'=>'Data directory ('.$CONFIG_BACKUPDIRECTORY.') is readable from the web
','hint'=>$permissionsHint); } From 6d5402247c9a2d6cf5f8e716d9ab99d688e07038 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 6 Aug 2011 23:18:49 +0200 Subject: [PATCH 67/78] some documentation for the common javascript --- core/js/js.js | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/core/js/js.js b/core/js/js.js index a83d6abb6a..00618cb30c 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -1,3 +1,9 @@ +/** + * translate a string + * @param app the id of the app for which to translate the string + * @param text the string to translate + * @return string + */ function t(app,text){ if( !( app in t.cache )){ @@ -22,9 +28,22 @@ t.cache={}; OC={ webroot:oc_webroot, coreApps:['files','admin','log','search','settings','core'], + /** + * get an absolute url to a file in an appen + * @param app the id of the app the file belongs to + * @param file the file path relative to the app folder + * @return string + */ linkTo:function(app,file){ return OC.filePath(app,'',file); }, + /** + * get the absolute url for a file in an app + * @param app the id of the app + * @param type the type of the file to link to (e.g. css,img,ajax.template) + * @param file the filename + * @return string + */ filePath:function(app,type,file){ var isCore=OC.coreApps.indexOf(app)!=-1; app+='/'; @@ -39,12 +58,28 @@ OC={ link+=file; return link; }, + /** + * get the absolute path to an image file + * @param app the app id to which the image belongs + * @param file the name of the image file + * @return string + * + * if no extention is given for the image, it will automatically decide between .png and .svg based on what the browser supports + */ imagePath:function(app,file){ if(file.indexOf('.')==-1){//if no extention is given, use png or svg depending on browser support file+=(SVGSupport())?'.svg':'.png' } return OC.filePath(app,'img',file); }, + /** + * load a script for the server and load it + * @param app the app id to which the script belongs + * @param script the filename of the script + * @param ready event handeler to be called when the script is loaded + * + * if the script is already loaded, the event handeler will be called directly + */ addScript:function(app,script,ready){ var path=OC.filePath(app,'js',script+'.js'); if(OC.addStyle.loaded.indexOf(path)==-1){ @@ -60,6 +95,11 @@ OC={ } } }, + /** + * load a css file and load it + * @param app the app id to which the css style belongs + * @param style the filename of the css file + */ addStyle:function(app,style){ var path=OC.filePath(app,'css',style+'.css'); if(OC.addScript.loaded.indexOf(path)==-1){ @@ -68,6 +108,10 @@ OC={ $('head').append(style); } }, + /** + * do a search query and display the results + * @param query the search query + */ search:function(query){ if(query){ OC.addStyle('search','results'); @@ -85,6 +129,9 @@ OC.search.lastResults={}; OC.addStyle.loaded=[]; OC.addScript.loaded=[]; +/** + * implement Array.filter for browsers without native support + */ if (!Array.prototype.filter) { Array.prototype.filter = function(fun /*, thisp*/) { var len = this.length >>> 0; @@ -103,6 +150,9 @@ if (!Array.prototype.filter) { return res; } } +/** + * implement Array.indexOf for browsers without native support + */ if (!Array.prototype.indexOf){ Array.prototype.indexOf = function(elt /*, from*/) { @@ -125,10 +175,25 @@ if (!Array.prototype.indexOf){ }; } +/** + * check if the browser support svg images + */ function SVGSupport() { return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") || document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Shape", "1.0"); } +/** + * prototypal inharitence functions + * + * usage: + * MySubObject=object(MyObject) + */ +function object(o) { + function F() {} + F.prototype = o; + return new F(); +} + $(document).ready(function(){ if(!SVGSupport()){//replace all svg images with png images for browser that dont support svg $('img.svg').each(function(index,element){ From 5e2f7bfda9ff5c05c157df894e0675958f634b6c Mon Sep 17 00:00:00 2001 From: Jakob Sack Date: Sat, 6 Aug 2011 23:29:25 +0200 Subject: [PATCH 68/78] Small details in contacts --- apps/contacts/appinfo/app.php | 2 +- apps/contacts/index.php | 13 +++++++++++-- apps/contacts/js/interface.js | 5 +++++ apps/contacts/templates/index.php | 11 +++++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/apps/contacts/appinfo/app.php b/apps/contacts/appinfo/app.php index f38a45f279..7ff4726525 100644 --- a/apps/contacts/appinfo/app.php +++ b/apps/contacts/appinfo/app.php @@ -13,6 +13,6 @@ OC_App::addNavigationEntry( array( 'order' => 10, 'href' => OC_Helper::linkTo( 'contacts', 'index.php' ), 'icon' => OC_Helper::imagePath( 'contacts', 'icon.png' ), - 'name' => 'Addressbook' )); + 'name' => 'Contacts' )); ?> diff --git a/apps/contacts/index.php b/apps/contacts/index.php index 2d5bcefd87..1e01b1c9fb 100644 --- a/apps/contacts/index.php +++ b/apps/contacts/index.php @@ -20,7 +20,7 @@ * */ -function contactsort($a,$b){ +function contacts_namesort($a,$b){ return strcmp($a['name'],$b['name']); } @@ -33,12 +33,20 @@ if( !OC_User::isLoggedIn()){ exit(); } +// Check if the user has an addressbook +$addressbooks = OC_Contacts_Addressbook::allAddressbooks(OC_User::getUser()); +if( count($addressbooks) == 0){ + OC_Contacts_Addressbook::addAddressbook(OC_User::getUser(),'default','Default Address Book'); +} + // Load the files we need OC_App::setActiveNavigationEntry( 'contacts_index' ); // Load a specific user? $id = isset( $_GET['id'] ) ? $_GET['id'] : null; +// sort addressbooks (use contactsort) +usort($addressbooks,'contacts_namesort'); // Addressbooks to load $openaddressbooks = explode(';',OC_Preferences::getValue(OC_User::getUser(),'contacts','openaddressbooks',null)); @@ -51,7 +59,7 @@ foreach( $openaddressbooks as $addressbook ){ } -usort($contacts,'contactsort'); +usort($contacts,'contacts_namesort'); $details = array(); if( !is_null($id) || count($contacts)){ @@ -62,6 +70,7 @@ if( !is_null($id) || count($contacts)){ // Process the template $tmpl = new OC_Template( 'contacts', 'index', 'user' ); +$tmpl->assign('addressbooks', $addressbooks); $tmpl->assign('contacts', $contacts); $tmpl->assign('details', $details ); $tmpl->assign('id',$id); diff --git a/apps/contacts/js/interface.js b/apps/contacts/js/interface.js index 045562b496..6af160b392 100644 --- a/apps/contacts/js/interface.js +++ b/apps/contacts/js/interface.js @@ -11,4 +11,9 @@ $(document).ready(function(){ }); return false; }); + + $('.contacts_addressbooksexpander').click(function(){ + $('.contacts_addressbooksdetails').toggle(); + return false; + }); }); diff --git a/apps/contacts/templates/index.php b/apps/contacts/templates/index.php index 0cd214bfb1..ca189cb4c8 100644 --- a/apps/contacts/templates/index.php +++ b/apps/contacts/templates/index.php @@ -3,6 +3,17 @@ OC_Util::addScript('contacts','interface'); OC_Util::addStyle('contacts','styles'); ?> +
+
+ Addressbooks +
+ +
    inc("_contacts"); ?> From 1dc3cb67fa2420703c1e07125d01dddc4dce0356 Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Sat, 6 Aug 2011 23:31:38 +0200 Subject: [PATCH 69/78] more improved error reporting --- core/templates/layout.guest.php | 4 ++-- lib/base.php | 19 +++++++++++-------- lib/helper.php | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/core/templates/layout.guest.php b/core/templates/layout.guest.php index 5655a64d8d..0b6189ef1c 100644 --- a/core/templates/layout.guest.php +++ b/core/templates/layout.guest.php @@ -4,13 +4,13 @@ ownCloud - + - + diff --git a/lib/base.php b/lib/base.php index d02f63a276..270e8c20c7 100644 --- a/lib/base.php +++ b/lib/base.php @@ -128,14 +128,6 @@ if( OC_Config::getValue( "forcessl", false )){ $errors=OC_Util::checkServer(); $error=(count($errors)>0); -if($error) { - $tmpl = new OC_Template( '', 'error', 'guest' ); - $tmpl->assign('errors',$errors); - $tmpl->printPage(); - exit; -} - - // User and Groups if( !OC_Config::getValue( "installed", false )){ @@ -173,6 +165,17 @@ OC_HOOK::connect('OC_User', 'post_createUser', 'OC_Connector_Sabre_Principal', ' OC_HOOK::connect('OC_User', 'post_deleteUser', 'OC_Connector_Sabre_Principal', 'deletePrincipal'); + +if($error) { + $tmpl = new OC_Template( '', 'error', 'guest' ); + $tmpl->assign('errors',$errors); + $tmpl->printPage(); + exit; +} + + + + // FROM Connect.php function OC_CONNECT_TEST($path,$user,$password){ echo 'connecting...'; diff --git a/lib/helper.php b/lib/helper.php index 5dc3dd44a1..fa5163ac26 100755 --- a/lib/helper.php +++ b/lib/helper.php @@ -204,7 +204,7 @@ class OC_Helper { } } closedir($dh); - if(chmod($path, $filemode)) + if(@chmod($path, $filemode)) return TRUE; else return FALSE; From 8876ae0e9821e3207003ee179c1e51020a0f6ee6 Mon Sep 17 00:00:00 2001 From: Jakob Sack Date: Sun, 7 Aug 2011 10:53:39 +0200 Subject: [PATCH 70/78] Add two tables to db scheme file --- db_structure.xml | 96 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/db_structure.xml b/db_structure.xml index c24c2c669a..ddb8c44d19 100644 --- a/db_structure.xml +++ b/db_structure.xml @@ -310,6 +310,102 @@ + + + *dbprefix*principalgroups + + + + + id + integer + 0 + true + 1 + true + 4 + + + + principal_id + integer + + true + true + 4 + + + + member_id + integer + + true + true + 4 + + + + principals_members_index + true + + principal_id + ascending + + + member_id + ascending + + + + + +
    + + + + *dbprefix*principals + + + + + id + integer + 0 + true + 1 + true + 4 + + + + uri + text + + false + 255 + + + + displayname + text + + false + 255 + + + + uri + true + + uri + ascending + + + + + +
    + *dbprefix*properties From 7c254dd94dfca6ca5878d37217b7d85baeedf416 Mon Sep 17 00:00:00 2001 From: Serge Martin Date: Sun, 7 Aug 2011 15:39:01 +0200 Subject: [PATCH 71/78] Exit after call to setup --- index.php | 1 + 1 file changed, 1 insertion(+) diff --git a/index.php b/index.php index a804a25d95..4520f40107 100644 --- a/index.php +++ b/index.php @@ -38,6 +38,7 @@ if(count($errors) > 0) { // Setup required : elseif($not_installed OR $install_called) { require_once('setup.php'); + exit(); } if($_SERVER['REQUEST_METHOD']=='PROPFIND'){//handle webdav From 51caa624bb0874fff878a00fb2883e58ad60cde3 Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Sun, 7 Aug 2011 17:32:48 +0200 Subject: [PATCH 72/78] first step to file encription --- 3dparty/Crypt_Blowfish/Blowfish.php | 317 +++++++++++++++++ .../Crypt_Blowfish/Blowfish/DefaultKey.php | 327 ++++++++++++++++++ lib/crypt.php | 62 ++++ 3 files changed, 706 insertions(+) create mode 100644 3dparty/Crypt_Blowfish/Blowfish.php create mode 100644 3dparty/Crypt_Blowfish/Blowfish/DefaultKey.php create mode 100755 lib/crypt.php diff --git a/3dparty/Crypt_Blowfish/Blowfish.php b/3dparty/Crypt_Blowfish/Blowfish.php new file mode 100644 index 0000000000..a7b8948f04 --- /dev/null +++ b/3dparty/Crypt_Blowfish/Blowfish.php @@ -0,0 +1,317 @@ + + * @copyright 2005 Matthew Fonda + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: Blowfish.php,v 1.81 2005/05/30 18:40:36 mfonda Exp $ + * @link http://pear.php.net/package/Crypt_Blowfish + */ + + +require_once 'PEAR.php'; + + +/** + * + * Example usage: + * $bf = new Crypt_Blowfish('some secret key!'); + * $encrypted = $bf->encrypt('this is some example plain text'); + * $plaintext = $bf->decrypt($encrypted); + * echo "plain text: $plaintext"; + * + * + * @category Encryption + * @package Crypt_Blowfish + * @author Matthew Fonda + * @copyright 2005 Matthew Fonda + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @link http://pear.php.net/package/Crypt_Blowfish + * @version @package_version@ + * @access public + */ +class Crypt_Blowfish +{ + /** + * P-Array contains 18 32-bit subkeys + * + * @var array + * @access private + */ + var $_P = array(); + + + /** + * Array of four S-Blocks each containing 256 32-bit entries + * + * @var array + * @access private + */ + var $_S = array(); + + /** + * Mcrypt td resource + * + * @var resource + * @access private + */ + var $_td = null; + + /** + * Initialization vector + * + * @var string + * @access private + */ + var $_iv = null; + + + /** + * Crypt_Blowfish Constructor + * Initializes the Crypt_Blowfish object, and gives a sets + * the secret key + * + * @param string $key + * @access public + */ + function Crypt_Blowfish($key) + { + if (extension_loaded('mcrypt')) { + $this->_td = mcrypt_module_open(MCRYPT_BLOWFISH, '', 'ecb', ''); + $this->_iv = mcrypt_create_iv(8, MCRYPT_RAND); + } + $this->setKey($key); + } + + /** + * Deprecated isReady method + * + * @return bool + * @access public + * @deprecated + */ + function isReady() + { + return true; + } + + /** + * Deprecated init method - init is now a private + * method and has been replaced with _init + * + * @return bool + * @access public + * @deprecated + * @see Crypt_Blowfish::_init() + */ + function init() + { + $this->_init(); + } + + /** + * Initializes the Crypt_Blowfish object + * + * @access private + */ + function _init() + { + $defaults = new Crypt_Blowfish_DefaultKey(); + $this->_P = $defaults->P; + $this->_S = $defaults->S; + } + + /** + * Enciphers a single 64 bit block + * + * @param int &$Xl + * @param int &$Xr + * @access private + */ + function _encipher(&$Xl, &$Xr) + { + for ($i = 0; $i < 16; $i++) { + $temp = $Xl ^ $this->_P[$i]; + $Xl = ((($this->_S[0][($temp>>24) & 255] + + $this->_S[1][($temp>>16) & 255]) ^ + $this->_S[2][($temp>>8) & 255]) + + $this->_S[3][$temp & 255]) ^ $Xr; + $Xr = $temp; + } + $Xr = $Xl ^ $this->_P[16]; + $Xl = $temp ^ $this->_P[17]; + } + + + /** + * Deciphers a single 64 bit block + * + * @param int &$Xl + * @param int &$Xr + * @access private + */ + function _decipher(&$Xl, &$Xr) + { + for ($i = 17; $i > 1; $i--) { + $temp = $Xl ^ $this->_P[$i]; + $Xl = ((($this->_S[0][($temp>>24) & 255] + + $this->_S[1][($temp>>16) & 255]) ^ + $this->_S[2][($temp>>8) & 255]) + + $this->_S[3][$temp & 255]) ^ $Xr; + $Xr = $temp; + } + $Xr = $Xl ^ $this->_P[1]; + $Xl = $temp ^ $this->_P[0]; + } + + + /** + * Encrypts a string + * + * @param string $plainText + * @return string Returns cipher text on success, PEAR_Error on failure + * @access public + */ + function encrypt($plainText) + { + if (!is_string($plainText)) { + PEAR::raiseError('Plain text must be a string', 0, PEAR_ERROR_DIE); + } + + if (extension_loaded('mcrypt')) { + return mcrypt_generic($this->_td, $plainText); + } + + $cipherText = ''; + $len = strlen($plainText); + $plainText .= str_repeat(chr(0),(8 - ($len%8))%8); + for ($i = 0; $i < $len; $i += 8) { + list(,$Xl,$Xr) = unpack("N2",substr($plainText,$i,8)); + $this->_encipher($Xl, $Xr); + $cipherText .= pack("N2", $Xl, $Xr); + } + return $cipherText; + } + + + /** + * Decrypts an encrypted string + * + * @param string $cipherText + * @return string Returns plain text on success, PEAR_Error on failure + * @access public + */ + function decrypt($cipherText) + { + if (!is_string($cipherText)) { + PEAR::raiseError('Chiper text must be a string', 1, PEAR_ERROR_DIE); + } + + if (extension_loaded('mcrypt')) { + return mdecrypt_generic($this->_td, $cipherText); + } + + $plainText = ''; + $len = strlen($cipherText); + $cipherText .= str_repeat(chr(0),(8 - ($len%8))%8); + for ($i = 0; $i < $len; $i += 8) { + list(,$Xl,$Xr) = unpack("N2",substr($cipherText,$i,8)); + $this->_decipher($Xl, $Xr); + $plainText .= pack("N2", $Xl, $Xr); + } + return $plainText; + } + + + /** + * Sets the secret key + * The key must be non-zero, and less than or equal to + * 56 characters in length. + * + * @param string $key + * @return bool Returns true on success, PEAR_Error on failure + * @access public + */ + function setKey($key) + { + if (!is_string($key)) { + PEAR::raiseError('Key must be a string', 2, PEAR_ERROR_DIE); + } + + $len = strlen($key); + + if ($len > 56 || $len == 0) { + PEAR::raiseError('Key must be less than 56 characters and non-zero. Supplied key length: ' . $len, 3, PEAR_ERROR_DIE); + } + + if (extension_loaded('mcrypt')) { + mcrypt_generic_init($this->_td, $key, $this->_iv); + return true; + } + + require_once 'Blowfish/DefaultKey.php'; + $this->_init(); + + $k = 0; + $data = 0; + $datal = 0; + $datar = 0; + + for ($i = 0; $i < 18; $i++) { + $data = 0; + for ($j = 4; $j > 0; $j--) { + $data = $data << 8 | ord($key{$k}); + $k = ($k+1) % $len; + } + $this->_P[$i] ^= $data; + } + + for ($i = 0; $i <= 16; $i += 2) { + $this->_encipher($datal, $datar); + $this->_P[$i] = $datal; + $this->_P[$i+1] = $datar; + } + for ($i = 0; $i < 256; $i += 2) { + $this->_encipher($datal, $datar); + $this->_S[0][$i] = $datal; + $this->_S[0][$i+1] = $datar; + } + for ($i = 0; $i < 256; $i += 2) { + $this->_encipher($datal, $datar); + $this->_S[1][$i] = $datal; + $this->_S[1][$i+1] = $datar; + } + for ($i = 0; $i < 256; $i += 2) { + $this->_encipher($datal, $datar); + $this->_S[2][$i] = $datal; + $this->_S[2][$i+1] = $datar; + } + for ($i = 0; $i < 256; $i += 2) { + $this->_encipher($datal, $datar); + $this->_S[3][$i] = $datal; + $this->_S[3][$i+1] = $datar; + } + + return true; + } + +} + +?> diff --git a/3dparty/Crypt_Blowfish/Blowfish/DefaultKey.php b/3dparty/Crypt_Blowfish/Blowfish/DefaultKey.php new file mode 100644 index 0000000000..2ff8ac788a --- /dev/null +++ b/3dparty/Crypt_Blowfish/Blowfish/DefaultKey.php @@ -0,0 +1,327 @@ + + * @copyright 2005 Matthew Fonda + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: DefaultKey.php,v 1.81 2005/05/30 18:40:37 mfonda Exp $ + * @link http://pear.php.net/package/Crypt_Blowfish + */ + + +/** + * Class containing default key + * + * @category Encryption + * @package Crypt_Blowfish + * @author Matthew Fonda + * @copyright 2005 Matthew Fonda + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @link http://pear.php.net/package/Crypt_Blowfish + * @version @package_version@ + * @access public + */ +class Crypt_Blowfish_DefaultKey +{ + var $P = array(); + + var $S = array(); + + function Crypt_Blowfish_DefaultKey() + { + $this->P = array( + 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, + 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89, + 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, + 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, + 0x9216D5D9, 0x8979FB1B + ); + + $this->S = array( + array( + 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, + 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99, + 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16, + 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, + 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE, + 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013, + 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF, + 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E, + 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60, + 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440, + 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE, + 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A, + 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, + 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677, + 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193, + 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032, + 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88, + 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239, + 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, + 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0, + 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3, + 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98, + 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88, + 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE, + 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6, + 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D, + 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B, + 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7, + 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA, + 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463, + 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F, + 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09, + 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3, + 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB, + 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279, + 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8, + 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB, + 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82, + 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB, + 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573, + 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0, + 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B, + 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790, + 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8, + 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4, + 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0, + 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7, + 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C, + 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD, + 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1, + 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299, + 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9, + 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477, + 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF, + 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, + 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF, + 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA, + 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5, + 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41, + 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915, + 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400, + 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915, + 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664, + 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A + ), + array( + 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, + 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266, + 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1, + 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, + 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6, + 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1, + 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E, + 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1, + 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737, + 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8, + 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF, + 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD, + 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701, + 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7, + 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41, + 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331, + 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF, + 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF, + 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E, + 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87, + 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C, + 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2, + 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16, + 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD, + 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B, + 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509, + 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E, + 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3, + 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F, + 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A, + 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4, + 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960, + 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66, + 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28, + 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802, + 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84, + 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510, + 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF, + 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14, + 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E, + 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50, + 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7, + 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8, + 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281, + 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99, + 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696, + 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128, + 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73, + 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0, + 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0, + 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105, + 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250, + 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3, + 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285, + 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00, + 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061, + 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB, + 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E, + 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735, + 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC, + 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9, + 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340, + 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20, + 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7 + ), + array( + 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, + 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068, + 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF, + 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840, + 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45, + 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504, + 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A, + 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB, + 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE, + 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6, + 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42, + 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B, + 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2, + 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB, + 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527, + 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B, + 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33, + 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C, + 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3, + 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC, + 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17, + 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564, + 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B, + 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115, + 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922, + 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728, + 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0, + 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E, + 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37, + 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D, + 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804, + 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B, + 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3, + 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB, + 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D, + 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C, + 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350, + 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9, + 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A, + 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE, + 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D, + 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC, + 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F, + 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61, + 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2, + 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9, + 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2, + 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C, + 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E, + 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633, + 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10, + 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169, + 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52, + 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027, + 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, + 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62, + 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634, + 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76, + 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24, + 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC, + 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4, + 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C, + 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837, + 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0 + ), + array( + 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, + 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE, + 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B, + 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4, + 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8, + 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6, + 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304, + 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22, + 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4, + 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6, + 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9, + 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59, + 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593, + 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51, + 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28, + 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C, + 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B, + 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28, + 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C, + 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD, + 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A, + 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319, + 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB, + 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F, + 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991, + 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32, + 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680, + 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166, + 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE, + 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB, + 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5, + 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47, + 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370, + 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D, + 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84, + 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048, + 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8, + 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD, + 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9, + 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7, + 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38, + 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F, + 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C, + 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525, + 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1, + 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442, + 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964, + 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E, + 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8, + 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D, + 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F, + 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299, + 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02, + 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC, + 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614, + 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A, + 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6, + 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, + 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0, + 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060, + 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E, + 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9, + 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F, + 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 + ) + ); + } + +} + +?> diff --git a/lib/crypt.php b/lib/crypt.php new file mode 100755 index 0000000000..baa433f9dc --- /dev/null +++ b/lib/crypt.php @@ -0,0 +1,62 @@ +. + * + */ + +require_once('Crypt_Blowfish/Blowfish.php'); + +/** + * This class is for crypting and decrypting + */ +class OC_Crypt { + + /** + * @brief encrypts an content + * @param $content the cleartext message you want to encrypt + * @param $key the encryption key + * @returns encrypted content + * + * This function encrypts an content + */ + public static function encrypt( $content, $key) { + $bf = new Crypt_Blowfish($key); + return($bf->encrypt($contents)); + } + + + /** + * @brief decryption of an content + * @param $content the cleartext message you want to decrypt + * @param $key the encryption key + * @returns cleartext content + * + * This function decrypts an content + */ + public static function decrypt( $content, $key) { + $bf = new Crypt_Blowfish($key); + return($bf->encrypt($contents)); + } + + + + + +} From f5a030f4ae5298c2b3325a27e8d05153f0488ea0 Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Sun, 7 Aug 2011 17:36:49 +0200 Subject: [PATCH 73/78] remove the ownCloud 3D support and add lot's of usefull 3rd party libraries instead. --- {3dparty => 3rdparty}/COPYING-PHP | 0 {3dparty => 3rdparty}/COPYING-README | 0 {3dparty => 3rdparty}/Console/Getopt.php | 0 {3dparty => 3rdparty}/Crypt_Blowfish/Blowfish.php | 0 {3dparty => 3rdparty}/Crypt_Blowfish/Blowfish/DefaultKey.php | 0 {3dparty => 3rdparty}/MDB2.php | 0 {3dparty => 3rdparty}/MDB2/Date.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Datatype/Common.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Datatype/mysql.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Datatype/pgsql.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Datatype/sqlite.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Function/Common.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Function/mysql.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Function/pgsql.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Function/sqlite.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Manager/Common.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Manager/mysql.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Manager/pgsql.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Manager/sqlite.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Native/Common.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Native/mysql.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Native/pgsql.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Native/sqlite.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Reverse/Common.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Reverse/mysql.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Reverse/pgsql.php | 0 {3dparty => 3rdparty}/MDB2/Driver/Reverse/sqlite.php | 0 {3dparty => 3rdparty}/MDB2/Driver/mysql.php | 0 {3dparty => 3rdparty}/MDB2/Driver/pgsql.php | 0 {3dparty => 3rdparty}/MDB2/Driver/sqlite.php | 0 {3dparty => 3rdparty}/MDB2/Extended.php | 0 {3dparty => 3rdparty}/MDB2/Iterator.php | 0 {3dparty => 3rdparty}/MDB2/LOB.php | 0 {3dparty => 3rdparty}/MDB2/Schema.php | 0 {3dparty => 3rdparty}/MDB2/Schema/Parser.php | 0 {3dparty => 3rdparty}/MDB2/Schema/Parser2.php | 0 {3dparty => 3rdparty}/MDB2/Schema/Reserved/ibase.php | 0 {3dparty => 3rdparty}/MDB2/Schema/Reserved/mssql.php | 0 {3dparty => 3rdparty}/MDB2/Schema/Reserved/mysql.php | 0 {3dparty => 3rdparty}/MDB2/Schema/Reserved/oci8.php | 0 {3dparty => 3rdparty}/MDB2/Schema/Reserved/pgsql.php | 0 {3dparty => 3rdparty}/MDB2/Schema/Tool.php | 0 {3dparty => 3rdparty}/MDB2/Schema/Tool/ParameterException.php | 0 {3dparty => 3rdparty}/MDB2/Schema/Validate.php | 0 {3dparty => 3rdparty}/MDB2/Schema/Writer.php | 0 {3dparty => 3rdparty}/PEAR.php | 0 {3dparty => 3rdparty}/PEAR/Autoloader.php | 0 {3dparty => 3rdparty}/PEAR/Builder.php | 0 {3dparty => 3rdparty}/PEAR/Command.php | 0 {3dparty => 3rdparty}/PEAR/Command/Auth.php | 0 {3dparty => 3rdparty}/PEAR/Command/Build.php | 0 {3dparty => 3rdparty}/PEAR/Command/Common.php | 0 {3dparty => 3rdparty}/PEAR/Command/Config.php | 0 {3dparty => 3rdparty}/PEAR/Command/Install.php | 0 {3dparty => 3rdparty}/PEAR/Command/Mirror.php | 0 {3dparty => 3rdparty}/PEAR/Command/Package.php | 0 {3dparty => 3rdparty}/PEAR/Command/Registry.php | 0 {3dparty => 3rdparty}/PEAR/Command/Remote.php | 0 {3dparty => 3rdparty}/PEAR/Common.php | 0 {3dparty => 3rdparty}/PEAR/Config.php | 0 {3dparty => 3rdparty}/PEAR/Dependency.php | 0 {3dparty => 3rdparty}/PEAR/Downloader.php | 0 {3dparty => 3rdparty}/PEAR/ErrorStack.php | 0 {3dparty => 3rdparty}/PEAR/Exception.php | 0 {3dparty => 3rdparty}/PEAR/Frontend/CLI.php | 0 {3dparty => 3rdparty}/PEAR/Installer.php | 0 {3dparty => 3rdparty}/PEAR/Packager.php | 0 {3dparty => 3rdparty}/PEAR/Registry.php | 0 {3dparty => 3rdparty}/PEAR/Remote.php | 0 {3dparty => 3rdparty}/PEAR/RunTest.php | 0 {3dparty => 3rdparty}/Sabre.includes.php | 0 {3dparty => 3rdparty}/Sabre/CalDAV/Backend/Abstract.php | 0 {3dparty => 3rdparty}/Sabre/CalDAV/Backend/PDO.php | 0 {3dparty => 3rdparty}/Sabre/CalDAV/Calendar.php | 0 {3dparty => 3rdparty}/Sabre/CalDAV/CalendarObject.php | 0 {3dparty => 3rdparty}/Sabre/CalDAV/CalendarRootNode.php | 0 .../Sabre/CalDAV/Exception/InvalidICalendarObject.php | 0 {3dparty => 3rdparty}/Sabre/CalDAV/ICSExportPlugin.php | 0 {3dparty => 3rdparty}/Sabre/CalDAV/ICalendarUtil.php | 0 {3dparty => 3rdparty}/Sabre/CalDAV/Plugin.php | 0 {3dparty => 3rdparty}/Sabre/CalDAV/Principal/Collection.php | 0 {3dparty => 3rdparty}/Sabre/CalDAV/Principal/ProxyRead.php | 0 {3dparty => 3rdparty}/Sabre/CalDAV/Principal/ProxyWrite.php | 0 {3dparty => 3rdparty}/Sabre/CalDAV/Principal/User.php | 0 .../Sabre/CalDAV/Property/SupportedCalendarComponentSet.php | 0 .../Sabre/CalDAV/Property/SupportedCalendarData.php | 0 .../Sabre/CalDAV/Property/SupportedCollationSet.php | 0 {3dparty => 3rdparty}/Sabre/CalDAV/Server.php | 0 {3dparty => 3rdparty}/Sabre/CalDAV/UserCalendars.php | 0 {3dparty => 3rdparty}/Sabre/CalDAV/Version.php | 0 {3dparty => 3rdparty}/Sabre/CalDAV/XMLUtil.php | 0 {3dparty => 3rdparty}/Sabre/CardDAV/AddressBook.php | 0 {3dparty => 3rdparty}/Sabre/CardDAV/AddressBookQueryParser.php | 0 {3dparty => 3rdparty}/Sabre/CardDAV/AddressBookRoot.php | 0 {3dparty => 3rdparty}/Sabre/CardDAV/Backend/Abstract.php | 0 {3dparty => 3rdparty}/Sabre/CardDAV/Backend/PDO.php | 0 {3dparty => 3rdparty}/Sabre/CardDAV/Card.php | 0 {3dparty => 3rdparty}/Sabre/CardDAV/IAddressBook.php | 0 {3dparty => 3rdparty}/Sabre/CardDAV/ICard.php | 0 {3dparty => 3rdparty}/Sabre/CardDAV/IDirectory.php | 0 {3dparty => 3rdparty}/Sabre/CardDAV/Plugin.php | 0 {3dparty => 3rdparty}/Sabre/CardDAV/UserAddressBooks.php | 0 {3dparty => 3rdparty}/Sabre/CardDAV/Version.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Auth/Backend/AbstractBasic.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Auth/Backend/AbstractDigest.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Auth/Backend/Apache.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Auth/Backend/File.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Auth/Backend/PDO.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Auth/IBackend.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Auth/Plugin.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Browser/GuessContentType.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Browser/MapGetToPropFind.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Browser/Plugin.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Client.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Collection.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Directory.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Exception.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Exception/BadRequest.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Exception/Conflict.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Exception/ConflictingLock.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Exception/FileNotFound.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Exception/Forbidden.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Exception/InsufficientStorage.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Exception/InvalidResourceType.php | 0 .../Sabre/DAV/Exception/LockTokenMatchesRequestUri.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Exception/Locked.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Exception/MethodNotAllowed.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Exception/NotAuthenticated.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Exception/NotImplemented.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Exception/PreconditionFailed.php | 0 .../Sabre/DAV/Exception/ReportNotImplemented.php | 0 .../Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php | 0 .../Sabre/DAV/Exception/UnsupportedMediaType.php | 0 {3dparty => 3rdparty}/Sabre/DAV/FS/Directory.php | 0 {3dparty => 3rdparty}/Sabre/DAV/FS/File.php | 0 {3dparty => 3rdparty}/Sabre/DAV/FS/Node.php | 0 {3dparty => 3rdparty}/Sabre/DAV/FSExt/Directory.php | 0 {3dparty => 3rdparty}/Sabre/DAV/FSExt/File.php | 0 {3dparty => 3rdparty}/Sabre/DAV/FSExt/Node.php | 0 {3dparty => 3rdparty}/Sabre/DAV/File.php | 0 {3dparty => 3rdparty}/Sabre/DAV/ICollection.php | 0 {3dparty => 3rdparty}/Sabre/DAV/IExtendedCollection.php | 0 {3dparty => 3rdparty}/Sabre/DAV/IFile.php | 0 {3dparty => 3rdparty}/Sabre/DAV/ILockable.php | 0 {3dparty => 3rdparty}/Sabre/DAV/INode.php | 0 {3dparty => 3rdparty}/Sabre/DAV/IProperties.php | 0 {3dparty => 3rdparty}/Sabre/DAV/IQuota.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Locks/Backend/Abstract.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Locks/Backend/FS.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Locks/Backend/File.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Locks/Backend/PDO.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Locks/LockInfo.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Locks/Plugin.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Mount/Plugin.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Node.php | 0 {3dparty => 3rdparty}/Sabre/DAV/ObjectTree.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Property.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Property/GetLastModified.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Property/Href.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Property/HrefList.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Property/IHref.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Property/LockDiscovery.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Property/ResourceType.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Property/Response.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Property/ResponseList.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Property/SupportedLock.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Property/SupportedReportSet.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Server.php | 0 {3dparty => 3rdparty}/Sabre/DAV/ServerPlugin.php | 0 {3dparty => 3rdparty}/Sabre/DAV/SimpleCollection.php | 0 {3dparty => 3rdparty}/Sabre/DAV/SimpleDirectory.php | 0 {3dparty => 3rdparty}/Sabre/DAV/StringUtil.php | 0 {3dparty => 3rdparty}/Sabre/DAV/TemporaryFileFilterPlugin.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Tree.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Tree/Filesystem.php | 0 {3dparty => 3rdparty}/Sabre/DAV/URLUtil.php | 0 {3dparty => 3rdparty}/Sabre/DAV/UUIDUtil.php | 0 {3dparty => 3rdparty}/Sabre/DAV/Version.php | 0 {3dparty => 3rdparty}/Sabre/DAV/XMLUtil.php | 0 .../Sabre/DAVACL/AbstractPrincipalCollection.php | 0 {3dparty => 3rdparty}/Sabre/DAVACL/Exception/AceConflict.php | 0 {3dparty => 3rdparty}/Sabre/DAVACL/Exception/NeedPrivileges.php | 0 {3dparty => 3rdparty}/Sabre/DAVACL/Exception/NoAbstract.php | 0 .../Sabre/DAVACL/Exception/NotRecognizedPrincipal.php | 0 .../Sabre/DAVACL/Exception/NotSupportedPrivilege.php | 0 {3dparty => 3rdparty}/Sabre/DAVACL/IACL.php | 0 {3dparty => 3rdparty}/Sabre/DAVACL/IPrincipal.php | 0 {3dparty => 3rdparty}/Sabre/DAVACL/IPrincipalBackend.php | 0 {3dparty => 3rdparty}/Sabre/DAVACL/Plugin.php | 0 {3dparty => 3rdparty}/Sabre/DAVACL/Principal.php | 0 {3dparty => 3rdparty}/Sabre/DAVACL/PrincipalBackend/PDO.php | 0 {3dparty => 3rdparty}/Sabre/DAVACL/PrincipalCollection.php | 0 {3dparty => 3rdparty}/Sabre/DAVACL/Property/Acl.php | 0 .../Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php | 0 {3dparty => 3rdparty}/Sabre/DAVACL/Property/Principal.php | 0 .../Sabre/DAVACL/Property/SupportedPrivilegeSet.php | 0 {3dparty => 3rdparty}/Sabre/DAVACL/Version.php | 0 {3dparty => 3rdparty}/Sabre/HTTP/AWSAuth.php | 0 {3dparty => 3rdparty}/Sabre/HTTP/AbstractAuth.php | 0 {3dparty => 3rdparty}/Sabre/HTTP/BasicAuth.php | 0 {3dparty => 3rdparty}/Sabre/HTTP/DigestAuth.php | 0 {3dparty => 3rdparty}/Sabre/HTTP/Request.php | 0 {3dparty => 3rdparty}/Sabre/HTTP/Response.php | 0 {3dparty => 3rdparty}/Sabre/HTTP/Util.php | 0 {3dparty => 3rdparty}/Sabre/HTTP/Version.php | 0 {3dparty => 3rdparty}/Sabre/VObject/Component.php | 0 {3dparty => 3rdparty}/Sabre/VObject/Element.php | 0 {3dparty => 3rdparty}/Sabre/VObject/Element/DateTime.php | 0 {3dparty => 3rdparty}/Sabre/VObject/Element/MultiDateTime.php | 0 {3dparty => 3rdparty}/Sabre/VObject/ElementList.php | 0 {3dparty => 3rdparty}/Sabre/VObject/Node.php | 0 {3dparty => 3rdparty}/Sabre/VObject/Parameter.php | 0 {3dparty => 3rdparty}/Sabre/VObject/ParseException.php | 0 {3dparty => 3rdparty}/Sabre/VObject/Property.php | 0 {3dparty => 3rdparty}/Sabre/VObject/Reader.php | 0 {3dparty => 3rdparty}/Sabre/VObject/Version.php | 0 {3dparty => 3rdparty}/Sabre/VObject/includes.php | 0 {3dparty => 3rdparty}/Sabre/autoload.php | 0 {3dparty => 3rdparty}/System.php | 0 {3dparty => 3rdparty}/XML/Parser.php | 0 {3dparty => 3rdparty}/XML/RPC.php | 0 {3dparty => 3rdparty}/XML/RPC/Server.php | 0 222 files changed, 0 insertions(+), 0 deletions(-) rename {3dparty => 3rdparty}/COPYING-PHP (100%) rename {3dparty => 3rdparty}/COPYING-README (100%) rename {3dparty => 3rdparty}/Console/Getopt.php (100%) rename {3dparty => 3rdparty}/Crypt_Blowfish/Blowfish.php (100%) rename {3dparty => 3rdparty}/Crypt_Blowfish/Blowfish/DefaultKey.php (100%) rename {3dparty => 3rdparty}/MDB2.php (100%) rename {3dparty => 3rdparty}/MDB2/Date.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Datatype/Common.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Datatype/mysql.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Datatype/pgsql.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Datatype/sqlite.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Function/Common.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Function/mysql.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Function/pgsql.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Function/sqlite.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Manager/Common.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Manager/mysql.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Manager/pgsql.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Manager/sqlite.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Native/Common.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Native/mysql.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Native/pgsql.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Native/sqlite.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Reverse/Common.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Reverse/mysql.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Reverse/pgsql.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/Reverse/sqlite.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/mysql.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/pgsql.php (100%) rename {3dparty => 3rdparty}/MDB2/Driver/sqlite.php (100%) rename {3dparty => 3rdparty}/MDB2/Extended.php (100%) rename {3dparty => 3rdparty}/MDB2/Iterator.php (100%) rename {3dparty => 3rdparty}/MDB2/LOB.php (100%) rename {3dparty => 3rdparty}/MDB2/Schema.php (100%) rename {3dparty => 3rdparty}/MDB2/Schema/Parser.php (100%) rename {3dparty => 3rdparty}/MDB2/Schema/Parser2.php (100%) rename {3dparty => 3rdparty}/MDB2/Schema/Reserved/ibase.php (100%) rename {3dparty => 3rdparty}/MDB2/Schema/Reserved/mssql.php (100%) rename {3dparty => 3rdparty}/MDB2/Schema/Reserved/mysql.php (100%) rename {3dparty => 3rdparty}/MDB2/Schema/Reserved/oci8.php (100%) rename {3dparty => 3rdparty}/MDB2/Schema/Reserved/pgsql.php (100%) rename {3dparty => 3rdparty}/MDB2/Schema/Tool.php (100%) rename {3dparty => 3rdparty}/MDB2/Schema/Tool/ParameterException.php (100%) rename {3dparty => 3rdparty}/MDB2/Schema/Validate.php (100%) rename {3dparty => 3rdparty}/MDB2/Schema/Writer.php (100%) rename {3dparty => 3rdparty}/PEAR.php (100%) rename {3dparty => 3rdparty}/PEAR/Autoloader.php (100%) rename {3dparty => 3rdparty}/PEAR/Builder.php (100%) rename {3dparty => 3rdparty}/PEAR/Command.php (100%) rename {3dparty => 3rdparty}/PEAR/Command/Auth.php (100%) rename {3dparty => 3rdparty}/PEAR/Command/Build.php (100%) rename {3dparty => 3rdparty}/PEAR/Command/Common.php (100%) rename {3dparty => 3rdparty}/PEAR/Command/Config.php (100%) rename {3dparty => 3rdparty}/PEAR/Command/Install.php (100%) rename {3dparty => 3rdparty}/PEAR/Command/Mirror.php (100%) rename {3dparty => 3rdparty}/PEAR/Command/Package.php (100%) rename {3dparty => 3rdparty}/PEAR/Command/Registry.php (100%) rename {3dparty => 3rdparty}/PEAR/Command/Remote.php (100%) rename {3dparty => 3rdparty}/PEAR/Common.php (100%) rename {3dparty => 3rdparty}/PEAR/Config.php (100%) rename {3dparty => 3rdparty}/PEAR/Dependency.php (100%) rename {3dparty => 3rdparty}/PEAR/Downloader.php (100%) rename {3dparty => 3rdparty}/PEAR/ErrorStack.php (100%) rename {3dparty => 3rdparty}/PEAR/Exception.php (100%) rename {3dparty => 3rdparty}/PEAR/Frontend/CLI.php (100%) rename {3dparty => 3rdparty}/PEAR/Installer.php (100%) rename {3dparty => 3rdparty}/PEAR/Packager.php (100%) rename {3dparty => 3rdparty}/PEAR/Registry.php (100%) rename {3dparty => 3rdparty}/PEAR/Remote.php (100%) rename {3dparty => 3rdparty}/PEAR/RunTest.php (100%) rename {3dparty => 3rdparty}/Sabre.includes.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/Backend/Abstract.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/Backend/PDO.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/Calendar.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/CalendarObject.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/CalendarRootNode.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/Exception/InvalidICalendarObject.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/ICSExportPlugin.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/ICalendarUtil.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/Plugin.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/Principal/Collection.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/Principal/ProxyRead.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/Principal/ProxyWrite.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/Principal/User.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/Property/SupportedCalendarData.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/Property/SupportedCollationSet.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/Server.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/UserCalendars.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/Version.php (100%) rename {3dparty => 3rdparty}/Sabre/CalDAV/XMLUtil.php (100%) rename {3dparty => 3rdparty}/Sabre/CardDAV/AddressBook.php (100%) rename {3dparty => 3rdparty}/Sabre/CardDAV/AddressBookQueryParser.php (100%) rename {3dparty => 3rdparty}/Sabre/CardDAV/AddressBookRoot.php (100%) rename {3dparty => 3rdparty}/Sabre/CardDAV/Backend/Abstract.php (100%) rename {3dparty => 3rdparty}/Sabre/CardDAV/Backend/PDO.php (100%) rename {3dparty => 3rdparty}/Sabre/CardDAV/Card.php (100%) rename {3dparty => 3rdparty}/Sabre/CardDAV/IAddressBook.php (100%) rename {3dparty => 3rdparty}/Sabre/CardDAV/ICard.php (100%) rename {3dparty => 3rdparty}/Sabre/CardDAV/IDirectory.php (100%) rename {3dparty => 3rdparty}/Sabre/CardDAV/Plugin.php (100%) rename {3dparty => 3rdparty}/Sabre/CardDAV/UserAddressBooks.php (100%) rename {3dparty => 3rdparty}/Sabre/CardDAV/Version.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Auth/Backend/AbstractBasic.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Auth/Backend/AbstractDigest.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Auth/Backend/Apache.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Auth/Backend/File.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Auth/Backend/PDO.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Auth/IBackend.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Auth/Plugin.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Browser/GuessContentType.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Browser/MapGetToPropFind.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Browser/Plugin.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Client.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Collection.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Directory.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Exception.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Exception/BadRequest.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Exception/Conflict.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Exception/ConflictingLock.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Exception/FileNotFound.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Exception/Forbidden.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Exception/InsufficientStorage.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Exception/InvalidResourceType.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Exception/Locked.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Exception/MethodNotAllowed.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Exception/NotAuthenticated.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Exception/NotImplemented.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Exception/PreconditionFailed.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Exception/ReportNotImplemented.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Exception/UnsupportedMediaType.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/FS/Directory.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/FS/File.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/FS/Node.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/FSExt/Directory.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/FSExt/File.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/FSExt/Node.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/File.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/ICollection.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/IExtendedCollection.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/IFile.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/ILockable.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/INode.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/IProperties.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/IQuota.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Locks/Backend/Abstract.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Locks/Backend/FS.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Locks/Backend/File.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Locks/Backend/PDO.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Locks/LockInfo.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Locks/Plugin.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Mount/Plugin.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Node.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/ObjectTree.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Property.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Property/GetLastModified.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Property/Href.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Property/HrefList.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Property/IHref.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Property/LockDiscovery.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Property/ResourceType.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Property/Response.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Property/ResponseList.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Property/SupportedLock.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Property/SupportedReportSet.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Server.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/ServerPlugin.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/SimpleCollection.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/SimpleDirectory.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/StringUtil.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/TemporaryFileFilterPlugin.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Tree.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Tree/Filesystem.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/URLUtil.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/UUIDUtil.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/Version.php (100%) rename {3dparty => 3rdparty}/Sabre/DAV/XMLUtil.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/AbstractPrincipalCollection.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/Exception/AceConflict.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/Exception/NeedPrivileges.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/Exception/NoAbstract.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/Exception/NotSupportedPrivilege.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/IACL.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/IPrincipal.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/IPrincipalBackend.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/Plugin.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/Principal.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/PrincipalBackend/PDO.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/PrincipalCollection.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/Property/Acl.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/Property/Principal.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/Property/SupportedPrivilegeSet.php (100%) rename {3dparty => 3rdparty}/Sabre/DAVACL/Version.php (100%) rename {3dparty => 3rdparty}/Sabre/HTTP/AWSAuth.php (100%) rename {3dparty => 3rdparty}/Sabre/HTTP/AbstractAuth.php (100%) rename {3dparty => 3rdparty}/Sabre/HTTP/BasicAuth.php (100%) rename {3dparty => 3rdparty}/Sabre/HTTP/DigestAuth.php (100%) rename {3dparty => 3rdparty}/Sabre/HTTP/Request.php (100%) rename {3dparty => 3rdparty}/Sabre/HTTP/Response.php (100%) rename {3dparty => 3rdparty}/Sabre/HTTP/Util.php (100%) rename {3dparty => 3rdparty}/Sabre/HTTP/Version.php (100%) rename {3dparty => 3rdparty}/Sabre/VObject/Component.php (100%) rename {3dparty => 3rdparty}/Sabre/VObject/Element.php (100%) rename {3dparty => 3rdparty}/Sabre/VObject/Element/DateTime.php (100%) rename {3dparty => 3rdparty}/Sabre/VObject/Element/MultiDateTime.php (100%) rename {3dparty => 3rdparty}/Sabre/VObject/ElementList.php (100%) rename {3dparty => 3rdparty}/Sabre/VObject/Node.php (100%) rename {3dparty => 3rdparty}/Sabre/VObject/Parameter.php (100%) rename {3dparty => 3rdparty}/Sabre/VObject/ParseException.php (100%) rename {3dparty => 3rdparty}/Sabre/VObject/Property.php (100%) rename {3dparty => 3rdparty}/Sabre/VObject/Reader.php (100%) rename {3dparty => 3rdparty}/Sabre/VObject/Version.php (100%) rename {3dparty => 3rdparty}/Sabre/VObject/includes.php (100%) rename {3dparty => 3rdparty}/Sabre/autoload.php (100%) rename {3dparty => 3rdparty}/System.php (100%) rename {3dparty => 3rdparty}/XML/Parser.php (100%) rename {3dparty => 3rdparty}/XML/RPC.php (100%) rename {3dparty => 3rdparty}/XML/RPC/Server.php (100%) diff --git a/3dparty/COPYING-PHP b/3rdparty/COPYING-PHP similarity index 100% rename from 3dparty/COPYING-PHP rename to 3rdparty/COPYING-PHP diff --git a/3dparty/COPYING-README b/3rdparty/COPYING-README similarity index 100% rename from 3dparty/COPYING-README rename to 3rdparty/COPYING-README diff --git a/3dparty/Console/Getopt.php b/3rdparty/Console/Getopt.php similarity index 100% rename from 3dparty/Console/Getopt.php rename to 3rdparty/Console/Getopt.php diff --git a/3dparty/Crypt_Blowfish/Blowfish.php b/3rdparty/Crypt_Blowfish/Blowfish.php similarity index 100% rename from 3dparty/Crypt_Blowfish/Blowfish.php rename to 3rdparty/Crypt_Blowfish/Blowfish.php diff --git a/3dparty/Crypt_Blowfish/Blowfish/DefaultKey.php b/3rdparty/Crypt_Blowfish/Blowfish/DefaultKey.php similarity index 100% rename from 3dparty/Crypt_Blowfish/Blowfish/DefaultKey.php rename to 3rdparty/Crypt_Blowfish/Blowfish/DefaultKey.php diff --git a/3dparty/MDB2.php b/3rdparty/MDB2.php similarity index 100% rename from 3dparty/MDB2.php rename to 3rdparty/MDB2.php diff --git a/3dparty/MDB2/Date.php b/3rdparty/MDB2/Date.php similarity index 100% rename from 3dparty/MDB2/Date.php rename to 3rdparty/MDB2/Date.php diff --git a/3dparty/MDB2/Driver/Datatype/Common.php b/3rdparty/MDB2/Driver/Datatype/Common.php similarity index 100% rename from 3dparty/MDB2/Driver/Datatype/Common.php rename to 3rdparty/MDB2/Driver/Datatype/Common.php diff --git a/3dparty/MDB2/Driver/Datatype/mysql.php b/3rdparty/MDB2/Driver/Datatype/mysql.php similarity index 100% rename from 3dparty/MDB2/Driver/Datatype/mysql.php rename to 3rdparty/MDB2/Driver/Datatype/mysql.php diff --git a/3dparty/MDB2/Driver/Datatype/pgsql.php b/3rdparty/MDB2/Driver/Datatype/pgsql.php similarity index 100% rename from 3dparty/MDB2/Driver/Datatype/pgsql.php rename to 3rdparty/MDB2/Driver/Datatype/pgsql.php diff --git a/3dparty/MDB2/Driver/Datatype/sqlite.php b/3rdparty/MDB2/Driver/Datatype/sqlite.php similarity index 100% rename from 3dparty/MDB2/Driver/Datatype/sqlite.php rename to 3rdparty/MDB2/Driver/Datatype/sqlite.php diff --git a/3dparty/MDB2/Driver/Function/Common.php b/3rdparty/MDB2/Driver/Function/Common.php similarity index 100% rename from 3dparty/MDB2/Driver/Function/Common.php rename to 3rdparty/MDB2/Driver/Function/Common.php diff --git a/3dparty/MDB2/Driver/Function/mysql.php b/3rdparty/MDB2/Driver/Function/mysql.php similarity index 100% rename from 3dparty/MDB2/Driver/Function/mysql.php rename to 3rdparty/MDB2/Driver/Function/mysql.php diff --git a/3dparty/MDB2/Driver/Function/pgsql.php b/3rdparty/MDB2/Driver/Function/pgsql.php similarity index 100% rename from 3dparty/MDB2/Driver/Function/pgsql.php rename to 3rdparty/MDB2/Driver/Function/pgsql.php diff --git a/3dparty/MDB2/Driver/Function/sqlite.php b/3rdparty/MDB2/Driver/Function/sqlite.php similarity index 100% rename from 3dparty/MDB2/Driver/Function/sqlite.php rename to 3rdparty/MDB2/Driver/Function/sqlite.php diff --git a/3dparty/MDB2/Driver/Manager/Common.php b/3rdparty/MDB2/Driver/Manager/Common.php similarity index 100% rename from 3dparty/MDB2/Driver/Manager/Common.php rename to 3rdparty/MDB2/Driver/Manager/Common.php diff --git a/3dparty/MDB2/Driver/Manager/mysql.php b/3rdparty/MDB2/Driver/Manager/mysql.php similarity index 100% rename from 3dparty/MDB2/Driver/Manager/mysql.php rename to 3rdparty/MDB2/Driver/Manager/mysql.php diff --git a/3dparty/MDB2/Driver/Manager/pgsql.php b/3rdparty/MDB2/Driver/Manager/pgsql.php similarity index 100% rename from 3dparty/MDB2/Driver/Manager/pgsql.php rename to 3rdparty/MDB2/Driver/Manager/pgsql.php diff --git a/3dparty/MDB2/Driver/Manager/sqlite.php b/3rdparty/MDB2/Driver/Manager/sqlite.php similarity index 100% rename from 3dparty/MDB2/Driver/Manager/sqlite.php rename to 3rdparty/MDB2/Driver/Manager/sqlite.php diff --git a/3dparty/MDB2/Driver/Native/Common.php b/3rdparty/MDB2/Driver/Native/Common.php similarity index 100% rename from 3dparty/MDB2/Driver/Native/Common.php rename to 3rdparty/MDB2/Driver/Native/Common.php diff --git a/3dparty/MDB2/Driver/Native/mysql.php b/3rdparty/MDB2/Driver/Native/mysql.php similarity index 100% rename from 3dparty/MDB2/Driver/Native/mysql.php rename to 3rdparty/MDB2/Driver/Native/mysql.php diff --git a/3dparty/MDB2/Driver/Native/pgsql.php b/3rdparty/MDB2/Driver/Native/pgsql.php similarity index 100% rename from 3dparty/MDB2/Driver/Native/pgsql.php rename to 3rdparty/MDB2/Driver/Native/pgsql.php diff --git a/3dparty/MDB2/Driver/Native/sqlite.php b/3rdparty/MDB2/Driver/Native/sqlite.php similarity index 100% rename from 3dparty/MDB2/Driver/Native/sqlite.php rename to 3rdparty/MDB2/Driver/Native/sqlite.php diff --git a/3dparty/MDB2/Driver/Reverse/Common.php b/3rdparty/MDB2/Driver/Reverse/Common.php similarity index 100% rename from 3dparty/MDB2/Driver/Reverse/Common.php rename to 3rdparty/MDB2/Driver/Reverse/Common.php diff --git a/3dparty/MDB2/Driver/Reverse/mysql.php b/3rdparty/MDB2/Driver/Reverse/mysql.php similarity index 100% rename from 3dparty/MDB2/Driver/Reverse/mysql.php rename to 3rdparty/MDB2/Driver/Reverse/mysql.php diff --git a/3dparty/MDB2/Driver/Reverse/pgsql.php b/3rdparty/MDB2/Driver/Reverse/pgsql.php similarity index 100% rename from 3dparty/MDB2/Driver/Reverse/pgsql.php rename to 3rdparty/MDB2/Driver/Reverse/pgsql.php diff --git a/3dparty/MDB2/Driver/Reverse/sqlite.php b/3rdparty/MDB2/Driver/Reverse/sqlite.php similarity index 100% rename from 3dparty/MDB2/Driver/Reverse/sqlite.php rename to 3rdparty/MDB2/Driver/Reverse/sqlite.php diff --git a/3dparty/MDB2/Driver/mysql.php b/3rdparty/MDB2/Driver/mysql.php similarity index 100% rename from 3dparty/MDB2/Driver/mysql.php rename to 3rdparty/MDB2/Driver/mysql.php diff --git a/3dparty/MDB2/Driver/pgsql.php b/3rdparty/MDB2/Driver/pgsql.php similarity index 100% rename from 3dparty/MDB2/Driver/pgsql.php rename to 3rdparty/MDB2/Driver/pgsql.php diff --git a/3dparty/MDB2/Driver/sqlite.php b/3rdparty/MDB2/Driver/sqlite.php similarity index 100% rename from 3dparty/MDB2/Driver/sqlite.php rename to 3rdparty/MDB2/Driver/sqlite.php diff --git a/3dparty/MDB2/Extended.php b/3rdparty/MDB2/Extended.php similarity index 100% rename from 3dparty/MDB2/Extended.php rename to 3rdparty/MDB2/Extended.php diff --git a/3dparty/MDB2/Iterator.php b/3rdparty/MDB2/Iterator.php similarity index 100% rename from 3dparty/MDB2/Iterator.php rename to 3rdparty/MDB2/Iterator.php diff --git a/3dparty/MDB2/LOB.php b/3rdparty/MDB2/LOB.php similarity index 100% rename from 3dparty/MDB2/LOB.php rename to 3rdparty/MDB2/LOB.php diff --git a/3dparty/MDB2/Schema.php b/3rdparty/MDB2/Schema.php similarity index 100% rename from 3dparty/MDB2/Schema.php rename to 3rdparty/MDB2/Schema.php diff --git a/3dparty/MDB2/Schema/Parser.php b/3rdparty/MDB2/Schema/Parser.php similarity index 100% rename from 3dparty/MDB2/Schema/Parser.php rename to 3rdparty/MDB2/Schema/Parser.php diff --git a/3dparty/MDB2/Schema/Parser2.php b/3rdparty/MDB2/Schema/Parser2.php similarity index 100% rename from 3dparty/MDB2/Schema/Parser2.php rename to 3rdparty/MDB2/Schema/Parser2.php diff --git a/3dparty/MDB2/Schema/Reserved/ibase.php b/3rdparty/MDB2/Schema/Reserved/ibase.php similarity index 100% rename from 3dparty/MDB2/Schema/Reserved/ibase.php rename to 3rdparty/MDB2/Schema/Reserved/ibase.php diff --git a/3dparty/MDB2/Schema/Reserved/mssql.php b/3rdparty/MDB2/Schema/Reserved/mssql.php similarity index 100% rename from 3dparty/MDB2/Schema/Reserved/mssql.php rename to 3rdparty/MDB2/Schema/Reserved/mssql.php diff --git a/3dparty/MDB2/Schema/Reserved/mysql.php b/3rdparty/MDB2/Schema/Reserved/mysql.php similarity index 100% rename from 3dparty/MDB2/Schema/Reserved/mysql.php rename to 3rdparty/MDB2/Schema/Reserved/mysql.php diff --git a/3dparty/MDB2/Schema/Reserved/oci8.php b/3rdparty/MDB2/Schema/Reserved/oci8.php similarity index 100% rename from 3dparty/MDB2/Schema/Reserved/oci8.php rename to 3rdparty/MDB2/Schema/Reserved/oci8.php diff --git a/3dparty/MDB2/Schema/Reserved/pgsql.php b/3rdparty/MDB2/Schema/Reserved/pgsql.php similarity index 100% rename from 3dparty/MDB2/Schema/Reserved/pgsql.php rename to 3rdparty/MDB2/Schema/Reserved/pgsql.php diff --git a/3dparty/MDB2/Schema/Tool.php b/3rdparty/MDB2/Schema/Tool.php similarity index 100% rename from 3dparty/MDB2/Schema/Tool.php rename to 3rdparty/MDB2/Schema/Tool.php diff --git a/3dparty/MDB2/Schema/Tool/ParameterException.php b/3rdparty/MDB2/Schema/Tool/ParameterException.php similarity index 100% rename from 3dparty/MDB2/Schema/Tool/ParameterException.php rename to 3rdparty/MDB2/Schema/Tool/ParameterException.php diff --git a/3dparty/MDB2/Schema/Validate.php b/3rdparty/MDB2/Schema/Validate.php similarity index 100% rename from 3dparty/MDB2/Schema/Validate.php rename to 3rdparty/MDB2/Schema/Validate.php diff --git a/3dparty/MDB2/Schema/Writer.php b/3rdparty/MDB2/Schema/Writer.php similarity index 100% rename from 3dparty/MDB2/Schema/Writer.php rename to 3rdparty/MDB2/Schema/Writer.php diff --git a/3dparty/PEAR.php b/3rdparty/PEAR.php similarity index 100% rename from 3dparty/PEAR.php rename to 3rdparty/PEAR.php diff --git a/3dparty/PEAR/Autoloader.php b/3rdparty/PEAR/Autoloader.php similarity index 100% rename from 3dparty/PEAR/Autoloader.php rename to 3rdparty/PEAR/Autoloader.php diff --git a/3dparty/PEAR/Builder.php b/3rdparty/PEAR/Builder.php similarity index 100% rename from 3dparty/PEAR/Builder.php rename to 3rdparty/PEAR/Builder.php diff --git a/3dparty/PEAR/Command.php b/3rdparty/PEAR/Command.php similarity index 100% rename from 3dparty/PEAR/Command.php rename to 3rdparty/PEAR/Command.php diff --git a/3dparty/PEAR/Command/Auth.php b/3rdparty/PEAR/Command/Auth.php similarity index 100% rename from 3dparty/PEAR/Command/Auth.php rename to 3rdparty/PEAR/Command/Auth.php diff --git a/3dparty/PEAR/Command/Build.php b/3rdparty/PEAR/Command/Build.php similarity index 100% rename from 3dparty/PEAR/Command/Build.php rename to 3rdparty/PEAR/Command/Build.php diff --git a/3dparty/PEAR/Command/Common.php b/3rdparty/PEAR/Command/Common.php similarity index 100% rename from 3dparty/PEAR/Command/Common.php rename to 3rdparty/PEAR/Command/Common.php diff --git a/3dparty/PEAR/Command/Config.php b/3rdparty/PEAR/Command/Config.php similarity index 100% rename from 3dparty/PEAR/Command/Config.php rename to 3rdparty/PEAR/Command/Config.php diff --git a/3dparty/PEAR/Command/Install.php b/3rdparty/PEAR/Command/Install.php similarity index 100% rename from 3dparty/PEAR/Command/Install.php rename to 3rdparty/PEAR/Command/Install.php diff --git a/3dparty/PEAR/Command/Mirror.php b/3rdparty/PEAR/Command/Mirror.php similarity index 100% rename from 3dparty/PEAR/Command/Mirror.php rename to 3rdparty/PEAR/Command/Mirror.php diff --git a/3dparty/PEAR/Command/Package.php b/3rdparty/PEAR/Command/Package.php similarity index 100% rename from 3dparty/PEAR/Command/Package.php rename to 3rdparty/PEAR/Command/Package.php diff --git a/3dparty/PEAR/Command/Registry.php b/3rdparty/PEAR/Command/Registry.php similarity index 100% rename from 3dparty/PEAR/Command/Registry.php rename to 3rdparty/PEAR/Command/Registry.php diff --git a/3dparty/PEAR/Command/Remote.php b/3rdparty/PEAR/Command/Remote.php similarity index 100% rename from 3dparty/PEAR/Command/Remote.php rename to 3rdparty/PEAR/Command/Remote.php diff --git a/3dparty/PEAR/Common.php b/3rdparty/PEAR/Common.php similarity index 100% rename from 3dparty/PEAR/Common.php rename to 3rdparty/PEAR/Common.php diff --git a/3dparty/PEAR/Config.php b/3rdparty/PEAR/Config.php similarity index 100% rename from 3dparty/PEAR/Config.php rename to 3rdparty/PEAR/Config.php diff --git a/3dparty/PEAR/Dependency.php b/3rdparty/PEAR/Dependency.php similarity index 100% rename from 3dparty/PEAR/Dependency.php rename to 3rdparty/PEAR/Dependency.php diff --git a/3dparty/PEAR/Downloader.php b/3rdparty/PEAR/Downloader.php similarity index 100% rename from 3dparty/PEAR/Downloader.php rename to 3rdparty/PEAR/Downloader.php diff --git a/3dparty/PEAR/ErrorStack.php b/3rdparty/PEAR/ErrorStack.php similarity index 100% rename from 3dparty/PEAR/ErrorStack.php rename to 3rdparty/PEAR/ErrorStack.php diff --git a/3dparty/PEAR/Exception.php b/3rdparty/PEAR/Exception.php similarity index 100% rename from 3dparty/PEAR/Exception.php rename to 3rdparty/PEAR/Exception.php diff --git a/3dparty/PEAR/Frontend/CLI.php b/3rdparty/PEAR/Frontend/CLI.php similarity index 100% rename from 3dparty/PEAR/Frontend/CLI.php rename to 3rdparty/PEAR/Frontend/CLI.php diff --git a/3dparty/PEAR/Installer.php b/3rdparty/PEAR/Installer.php similarity index 100% rename from 3dparty/PEAR/Installer.php rename to 3rdparty/PEAR/Installer.php diff --git a/3dparty/PEAR/Packager.php b/3rdparty/PEAR/Packager.php similarity index 100% rename from 3dparty/PEAR/Packager.php rename to 3rdparty/PEAR/Packager.php diff --git a/3dparty/PEAR/Registry.php b/3rdparty/PEAR/Registry.php similarity index 100% rename from 3dparty/PEAR/Registry.php rename to 3rdparty/PEAR/Registry.php diff --git a/3dparty/PEAR/Remote.php b/3rdparty/PEAR/Remote.php similarity index 100% rename from 3dparty/PEAR/Remote.php rename to 3rdparty/PEAR/Remote.php diff --git a/3dparty/PEAR/RunTest.php b/3rdparty/PEAR/RunTest.php similarity index 100% rename from 3dparty/PEAR/RunTest.php rename to 3rdparty/PEAR/RunTest.php diff --git a/3dparty/Sabre.includes.php b/3rdparty/Sabre.includes.php similarity index 100% rename from 3dparty/Sabre.includes.php rename to 3rdparty/Sabre.includes.php diff --git a/3dparty/Sabre/CalDAV/Backend/Abstract.php b/3rdparty/Sabre/CalDAV/Backend/Abstract.php similarity index 100% rename from 3dparty/Sabre/CalDAV/Backend/Abstract.php rename to 3rdparty/Sabre/CalDAV/Backend/Abstract.php diff --git a/3dparty/Sabre/CalDAV/Backend/PDO.php b/3rdparty/Sabre/CalDAV/Backend/PDO.php similarity index 100% rename from 3dparty/Sabre/CalDAV/Backend/PDO.php rename to 3rdparty/Sabre/CalDAV/Backend/PDO.php diff --git a/3dparty/Sabre/CalDAV/Calendar.php b/3rdparty/Sabre/CalDAV/Calendar.php similarity index 100% rename from 3dparty/Sabre/CalDAV/Calendar.php rename to 3rdparty/Sabre/CalDAV/Calendar.php diff --git a/3dparty/Sabre/CalDAV/CalendarObject.php b/3rdparty/Sabre/CalDAV/CalendarObject.php similarity index 100% rename from 3dparty/Sabre/CalDAV/CalendarObject.php rename to 3rdparty/Sabre/CalDAV/CalendarObject.php diff --git a/3dparty/Sabre/CalDAV/CalendarRootNode.php b/3rdparty/Sabre/CalDAV/CalendarRootNode.php similarity index 100% rename from 3dparty/Sabre/CalDAV/CalendarRootNode.php rename to 3rdparty/Sabre/CalDAV/CalendarRootNode.php diff --git a/3dparty/Sabre/CalDAV/Exception/InvalidICalendarObject.php b/3rdparty/Sabre/CalDAV/Exception/InvalidICalendarObject.php similarity index 100% rename from 3dparty/Sabre/CalDAV/Exception/InvalidICalendarObject.php rename to 3rdparty/Sabre/CalDAV/Exception/InvalidICalendarObject.php diff --git a/3dparty/Sabre/CalDAV/ICSExportPlugin.php b/3rdparty/Sabre/CalDAV/ICSExportPlugin.php similarity index 100% rename from 3dparty/Sabre/CalDAV/ICSExportPlugin.php rename to 3rdparty/Sabre/CalDAV/ICSExportPlugin.php diff --git a/3dparty/Sabre/CalDAV/ICalendarUtil.php b/3rdparty/Sabre/CalDAV/ICalendarUtil.php similarity index 100% rename from 3dparty/Sabre/CalDAV/ICalendarUtil.php rename to 3rdparty/Sabre/CalDAV/ICalendarUtil.php diff --git a/3dparty/Sabre/CalDAV/Plugin.php b/3rdparty/Sabre/CalDAV/Plugin.php similarity index 100% rename from 3dparty/Sabre/CalDAV/Plugin.php rename to 3rdparty/Sabre/CalDAV/Plugin.php diff --git a/3dparty/Sabre/CalDAV/Principal/Collection.php b/3rdparty/Sabre/CalDAV/Principal/Collection.php similarity index 100% rename from 3dparty/Sabre/CalDAV/Principal/Collection.php rename to 3rdparty/Sabre/CalDAV/Principal/Collection.php diff --git a/3dparty/Sabre/CalDAV/Principal/ProxyRead.php b/3rdparty/Sabre/CalDAV/Principal/ProxyRead.php similarity index 100% rename from 3dparty/Sabre/CalDAV/Principal/ProxyRead.php rename to 3rdparty/Sabre/CalDAV/Principal/ProxyRead.php diff --git a/3dparty/Sabre/CalDAV/Principal/ProxyWrite.php b/3rdparty/Sabre/CalDAV/Principal/ProxyWrite.php similarity index 100% rename from 3dparty/Sabre/CalDAV/Principal/ProxyWrite.php rename to 3rdparty/Sabre/CalDAV/Principal/ProxyWrite.php diff --git a/3dparty/Sabre/CalDAV/Principal/User.php b/3rdparty/Sabre/CalDAV/Principal/User.php similarity index 100% rename from 3dparty/Sabre/CalDAV/Principal/User.php rename to 3rdparty/Sabre/CalDAV/Principal/User.php diff --git a/3dparty/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php b/3rdparty/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php similarity index 100% rename from 3dparty/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php rename to 3rdparty/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php diff --git a/3dparty/Sabre/CalDAV/Property/SupportedCalendarData.php b/3rdparty/Sabre/CalDAV/Property/SupportedCalendarData.php similarity index 100% rename from 3dparty/Sabre/CalDAV/Property/SupportedCalendarData.php rename to 3rdparty/Sabre/CalDAV/Property/SupportedCalendarData.php diff --git a/3dparty/Sabre/CalDAV/Property/SupportedCollationSet.php b/3rdparty/Sabre/CalDAV/Property/SupportedCollationSet.php similarity index 100% rename from 3dparty/Sabre/CalDAV/Property/SupportedCollationSet.php rename to 3rdparty/Sabre/CalDAV/Property/SupportedCollationSet.php diff --git a/3dparty/Sabre/CalDAV/Server.php b/3rdparty/Sabre/CalDAV/Server.php similarity index 100% rename from 3dparty/Sabre/CalDAV/Server.php rename to 3rdparty/Sabre/CalDAV/Server.php diff --git a/3dparty/Sabre/CalDAV/UserCalendars.php b/3rdparty/Sabre/CalDAV/UserCalendars.php similarity index 100% rename from 3dparty/Sabre/CalDAV/UserCalendars.php rename to 3rdparty/Sabre/CalDAV/UserCalendars.php diff --git a/3dparty/Sabre/CalDAV/Version.php b/3rdparty/Sabre/CalDAV/Version.php similarity index 100% rename from 3dparty/Sabre/CalDAV/Version.php rename to 3rdparty/Sabre/CalDAV/Version.php diff --git a/3dparty/Sabre/CalDAV/XMLUtil.php b/3rdparty/Sabre/CalDAV/XMLUtil.php similarity index 100% rename from 3dparty/Sabre/CalDAV/XMLUtil.php rename to 3rdparty/Sabre/CalDAV/XMLUtil.php diff --git a/3dparty/Sabre/CardDAV/AddressBook.php b/3rdparty/Sabre/CardDAV/AddressBook.php similarity index 100% rename from 3dparty/Sabre/CardDAV/AddressBook.php rename to 3rdparty/Sabre/CardDAV/AddressBook.php diff --git a/3dparty/Sabre/CardDAV/AddressBookQueryParser.php b/3rdparty/Sabre/CardDAV/AddressBookQueryParser.php similarity index 100% rename from 3dparty/Sabre/CardDAV/AddressBookQueryParser.php rename to 3rdparty/Sabre/CardDAV/AddressBookQueryParser.php diff --git a/3dparty/Sabre/CardDAV/AddressBookRoot.php b/3rdparty/Sabre/CardDAV/AddressBookRoot.php similarity index 100% rename from 3dparty/Sabre/CardDAV/AddressBookRoot.php rename to 3rdparty/Sabre/CardDAV/AddressBookRoot.php diff --git a/3dparty/Sabre/CardDAV/Backend/Abstract.php b/3rdparty/Sabre/CardDAV/Backend/Abstract.php similarity index 100% rename from 3dparty/Sabre/CardDAV/Backend/Abstract.php rename to 3rdparty/Sabre/CardDAV/Backend/Abstract.php diff --git a/3dparty/Sabre/CardDAV/Backend/PDO.php b/3rdparty/Sabre/CardDAV/Backend/PDO.php similarity index 100% rename from 3dparty/Sabre/CardDAV/Backend/PDO.php rename to 3rdparty/Sabre/CardDAV/Backend/PDO.php diff --git a/3dparty/Sabre/CardDAV/Card.php b/3rdparty/Sabre/CardDAV/Card.php similarity index 100% rename from 3dparty/Sabre/CardDAV/Card.php rename to 3rdparty/Sabre/CardDAV/Card.php diff --git a/3dparty/Sabre/CardDAV/IAddressBook.php b/3rdparty/Sabre/CardDAV/IAddressBook.php similarity index 100% rename from 3dparty/Sabre/CardDAV/IAddressBook.php rename to 3rdparty/Sabre/CardDAV/IAddressBook.php diff --git a/3dparty/Sabre/CardDAV/ICard.php b/3rdparty/Sabre/CardDAV/ICard.php similarity index 100% rename from 3dparty/Sabre/CardDAV/ICard.php rename to 3rdparty/Sabre/CardDAV/ICard.php diff --git a/3dparty/Sabre/CardDAV/IDirectory.php b/3rdparty/Sabre/CardDAV/IDirectory.php similarity index 100% rename from 3dparty/Sabre/CardDAV/IDirectory.php rename to 3rdparty/Sabre/CardDAV/IDirectory.php diff --git a/3dparty/Sabre/CardDAV/Plugin.php b/3rdparty/Sabre/CardDAV/Plugin.php similarity index 100% rename from 3dparty/Sabre/CardDAV/Plugin.php rename to 3rdparty/Sabre/CardDAV/Plugin.php diff --git a/3dparty/Sabre/CardDAV/UserAddressBooks.php b/3rdparty/Sabre/CardDAV/UserAddressBooks.php similarity index 100% rename from 3dparty/Sabre/CardDAV/UserAddressBooks.php rename to 3rdparty/Sabre/CardDAV/UserAddressBooks.php diff --git a/3dparty/Sabre/CardDAV/Version.php b/3rdparty/Sabre/CardDAV/Version.php similarity index 100% rename from 3dparty/Sabre/CardDAV/Version.php rename to 3rdparty/Sabre/CardDAV/Version.php diff --git a/3dparty/Sabre/DAV/Auth/Backend/AbstractBasic.php b/3rdparty/Sabre/DAV/Auth/Backend/AbstractBasic.php similarity index 100% rename from 3dparty/Sabre/DAV/Auth/Backend/AbstractBasic.php rename to 3rdparty/Sabre/DAV/Auth/Backend/AbstractBasic.php diff --git a/3dparty/Sabre/DAV/Auth/Backend/AbstractDigest.php b/3rdparty/Sabre/DAV/Auth/Backend/AbstractDigest.php similarity index 100% rename from 3dparty/Sabre/DAV/Auth/Backend/AbstractDigest.php rename to 3rdparty/Sabre/DAV/Auth/Backend/AbstractDigest.php diff --git a/3dparty/Sabre/DAV/Auth/Backend/Apache.php b/3rdparty/Sabre/DAV/Auth/Backend/Apache.php similarity index 100% rename from 3dparty/Sabre/DAV/Auth/Backend/Apache.php rename to 3rdparty/Sabre/DAV/Auth/Backend/Apache.php diff --git a/3dparty/Sabre/DAV/Auth/Backend/File.php b/3rdparty/Sabre/DAV/Auth/Backend/File.php similarity index 100% rename from 3dparty/Sabre/DAV/Auth/Backend/File.php rename to 3rdparty/Sabre/DAV/Auth/Backend/File.php diff --git a/3dparty/Sabre/DAV/Auth/Backend/PDO.php b/3rdparty/Sabre/DAV/Auth/Backend/PDO.php similarity index 100% rename from 3dparty/Sabre/DAV/Auth/Backend/PDO.php rename to 3rdparty/Sabre/DAV/Auth/Backend/PDO.php diff --git a/3dparty/Sabre/DAV/Auth/IBackend.php b/3rdparty/Sabre/DAV/Auth/IBackend.php similarity index 100% rename from 3dparty/Sabre/DAV/Auth/IBackend.php rename to 3rdparty/Sabre/DAV/Auth/IBackend.php diff --git a/3dparty/Sabre/DAV/Auth/Plugin.php b/3rdparty/Sabre/DAV/Auth/Plugin.php similarity index 100% rename from 3dparty/Sabre/DAV/Auth/Plugin.php rename to 3rdparty/Sabre/DAV/Auth/Plugin.php diff --git a/3dparty/Sabre/DAV/Browser/GuessContentType.php b/3rdparty/Sabre/DAV/Browser/GuessContentType.php similarity index 100% rename from 3dparty/Sabre/DAV/Browser/GuessContentType.php rename to 3rdparty/Sabre/DAV/Browser/GuessContentType.php diff --git a/3dparty/Sabre/DAV/Browser/MapGetToPropFind.php b/3rdparty/Sabre/DAV/Browser/MapGetToPropFind.php similarity index 100% rename from 3dparty/Sabre/DAV/Browser/MapGetToPropFind.php rename to 3rdparty/Sabre/DAV/Browser/MapGetToPropFind.php diff --git a/3dparty/Sabre/DAV/Browser/Plugin.php b/3rdparty/Sabre/DAV/Browser/Plugin.php similarity index 100% rename from 3dparty/Sabre/DAV/Browser/Plugin.php rename to 3rdparty/Sabre/DAV/Browser/Plugin.php diff --git a/3dparty/Sabre/DAV/Client.php b/3rdparty/Sabre/DAV/Client.php similarity index 100% rename from 3dparty/Sabre/DAV/Client.php rename to 3rdparty/Sabre/DAV/Client.php diff --git a/3dparty/Sabre/DAV/Collection.php b/3rdparty/Sabre/DAV/Collection.php similarity index 100% rename from 3dparty/Sabre/DAV/Collection.php rename to 3rdparty/Sabre/DAV/Collection.php diff --git a/3dparty/Sabre/DAV/Directory.php b/3rdparty/Sabre/DAV/Directory.php similarity index 100% rename from 3dparty/Sabre/DAV/Directory.php rename to 3rdparty/Sabre/DAV/Directory.php diff --git a/3dparty/Sabre/DAV/Exception.php b/3rdparty/Sabre/DAV/Exception.php similarity index 100% rename from 3dparty/Sabre/DAV/Exception.php rename to 3rdparty/Sabre/DAV/Exception.php diff --git a/3dparty/Sabre/DAV/Exception/BadRequest.php b/3rdparty/Sabre/DAV/Exception/BadRequest.php similarity index 100% rename from 3dparty/Sabre/DAV/Exception/BadRequest.php rename to 3rdparty/Sabre/DAV/Exception/BadRequest.php diff --git a/3dparty/Sabre/DAV/Exception/Conflict.php b/3rdparty/Sabre/DAV/Exception/Conflict.php similarity index 100% rename from 3dparty/Sabre/DAV/Exception/Conflict.php rename to 3rdparty/Sabre/DAV/Exception/Conflict.php diff --git a/3dparty/Sabre/DAV/Exception/ConflictingLock.php b/3rdparty/Sabre/DAV/Exception/ConflictingLock.php similarity index 100% rename from 3dparty/Sabre/DAV/Exception/ConflictingLock.php rename to 3rdparty/Sabre/DAV/Exception/ConflictingLock.php diff --git a/3dparty/Sabre/DAV/Exception/FileNotFound.php b/3rdparty/Sabre/DAV/Exception/FileNotFound.php similarity index 100% rename from 3dparty/Sabre/DAV/Exception/FileNotFound.php rename to 3rdparty/Sabre/DAV/Exception/FileNotFound.php diff --git a/3dparty/Sabre/DAV/Exception/Forbidden.php b/3rdparty/Sabre/DAV/Exception/Forbidden.php similarity index 100% rename from 3dparty/Sabre/DAV/Exception/Forbidden.php rename to 3rdparty/Sabre/DAV/Exception/Forbidden.php diff --git a/3dparty/Sabre/DAV/Exception/InsufficientStorage.php b/3rdparty/Sabre/DAV/Exception/InsufficientStorage.php similarity index 100% rename from 3dparty/Sabre/DAV/Exception/InsufficientStorage.php rename to 3rdparty/Sabre/DAV/Exception/InsufficientStorage.php diff --git a/3dparty/Sabre/DAV/Exception/InvalidResourceType.php b/3rdparty/Sabre/DAV/Exception/InvalidResourceType.php similarity index 100% rename from 3dparty/Sabre/DAV/Exception/InvalidResourceType.php rename to 3rdparty/Sabre/DAV/Exception/InvalidResourceType.php diff --git a/3dparty/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php b/3rdparty/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php similarity index 100% rename from 3dparty/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php rename to 3rdparty/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php diff --git a/3dparty/Sabre/DAV/Exception/Locked.php b/3rdparty/Sabre/DAV/Exception/Locked.php similarity index 100% rename from 3dparty/Sabre/DAV/Exception/Locked.php rename to 3rdparty/Sabre/DAV/Exception/Locked.php diff --git a/3dparty/Sabre/DAV/Exception/MethodNotAllowed.php b/3rdparty/Sabre/DAV/Exception/MethodNotAllowed.php similarity index 100% rename from 3dparty/Sabre/DAV/Exception/MethodNotAllowed.php rename to 3rdparty/Sabre/DAV/Exception/MethodNotAllowed.php diff --git a/3dparty/Sabre/DAV/Exception/NotAuthenticated.php b/3rdparty/Sabre/DAV/Exception/NotAuthenticated.php similarity index 100% rename from 3dparty/Sabre/DAV/Exception/NotAuthenticated.php rename to 3rdparty/Sabre/DAV/Exception/NotAuthenticated.php diff --git a/3dparty/Sabre/DAV/Exception/NotImplemented.php b/3rdparty/Sabre/DAV/Exception/NotImplemented.php similarity index 100% rename from 3dparty/Sabre/DAV/Exception/NotImplemented.php rename to 3rdparty/Sabre/DAV/Exception/NotImplemented.php diff --git a/3dparty/Sabre/DAV/Exception/PreconditionFailed.php b/3rdparty/Sabre/DAV/Exception/PreconditionFailed.php similarity index 100% rename from 3dparty/Sabre/DAV/Exception/PreconditionFailed.php rename to 3rdparty/Sabre/DAV/Exception/PreconditionFailed.php diff --git a/3dparty/Sabre/DAV/Exception/ReportNotImplemented.php b/3rdparty/Sabre/DAV/Exception/ReportNotImplemented.php similarity index 100% rename from 3dparty/Sabre/DAV/Exception/ReportNotImplemented.php rename to 3rdparty/Sabre/DAV/Exception/ReportNotImplemented.php diff --git a/3dparty/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php b/3rdparty/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php similarity index 100% rename from 3dparty/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php rename to 3rdparty/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php diff --git a/3dparty/Sabre/DAV/Exception/UnsupportedMediaType.php b/3rdparty/Sabre/DAV/Exception/UnsupportedMediaType.php similarity index 100% rename from 3dparty/Sabre/DAV/Exception/UnsupportedMediaType.php rename to 3rdparty/Sabre/DAV/Exception/UnsupportedMediaType.php diff --git a/3dparty/Sabre/DAV/FS/Directory.php b/3rdparty/Sabre/DAV/FS/Directory.php similarity index 100% rename from 3dparty/Sabre/DAV/FS/Directory.php rename to 3rdparty/Sabre/DAV/FS/Directory.php diff --git a/3dparty/Sabre/DAV/FS/File.php b/3rdparty/Sabre/DAV/FS/File.php similarity index 100% rename from 3dparty/Sabre/DAV/FS/File.php rename to 3rdparty/Sabre/DAV/FS/File.php diff --git a/3dparty/Sabre/DAV/FS/Node.php b/3rdparty/Sabre/DAV/FS/Node.php similarity index 100% rename from 3dparty/Sabre/DAV/FS/Node.php rename to 3rdparty/Sabre/DAV/FS/Node.php diff --git a/3dparty/Sabre/DAV/FSExt/Directory.php b/3rdparty/Sabre/DAV/FSExt/Directory.php similarity index 100% rename from 3dparty/Sabre/DAV/FSExt/Directory.php rename to 3rdparty/Sabre/DAV/FSExt/Directory.php diff --git a/3dparty/Sabre/DAV/FSExt/File.php b/3rdparty/Sabre/DAV/FSExt/File.php similarity index 100% rename from 3dparty/Sabre/DAV/FSExt/File.php rename to 3rdparty/Sabre/DAV/FSExt/File.php diff --git a/3dparty/Sabre/DAV/FSExt/Node.php b/3rdparty/Sabre/DAV/FSExt/Node.php similarity index 100% rename from 3dparty/Sabre/DAV/FSExt/Node.php rename to 3rdparty/Sabre/DAV/FSExt/Node.php diff --git a/3dparty/Sabre/DAV/File.php b/3rdparty/Sabre/DAV/File.php similarity index 100% rename from 3dparty/Sabre/DAV/File.php rename to 3rdparty/Sabre/DAV/File.php diff --git a/3dparty/Sabre/DAV/ICollection.php b/3rdparty/Sabre/DAV/ICollection.php similarity index 100% rename from 3dparty/Sabre/DAV/ICollection.php rename to 3rdparty/Sabre/DAV/ICollection.php diff --git a/3dparty/Sabre/DAV/IExtendedCollection.php b/3rdparty/Sabre/DAV/IExtendedCollection.php similarity index 100% rename from 3dparty/Sabre/DAV/IExtendedCollection.php rename to 3rdparty/Sabre/DAV/IExtendedCollection.php diff --git a/3dparty/Sabre/DAV/IFile.php b/3rdparty/Sabre/DAV/IFile.php similarity index 100% rename from 3dparty/Sabre/DAV/IFile.php rename to 3rdparty/Sabre/DAV/IFile.php diff --git a/3dparty/Sabre/DAV/ILockable.php b/3rdparty/Sabre/DAV/ILockable.php similarity index 100% rename from 3dparty/Sabre/DAV/ILockable.php rename to 3rdparty/Sabre/DAV/ILockable.php diff --git a/3dparty/Sabre/DAV/INode.php b/3rdparty/Sabre/DAV/INode.php similarity index 100% rename from 3dparty/Sabre/DAV/INode.php rename to 3rdparty/Sabre/DAV/INode.php diff --git a/3dparty/Sabre/DAV/IProperties.php b/3rdparty/Sabre/DAV/IProperties.php similarity index 100% rename from 3dparty/Sabre/DAV/IProperties.php rename to 3rdparty/Sabre/DAV/IProperties.php diff --git a/3dparty/Sabre/DAV/IQuota.php b/3rdparty/Sabre/DAV/IQuota.php similarity index 100% rename from 3dparty/Sabre/DAV/IQuota.php rename to 3rdparty/Sabre/DAV/IQuota.php diff --git a/3dparty/Sabre/DAV/Locks/Backend/Abstract.php b/3rdparty/Sabre/DAV/Locks/Backend/Abstract.php similarity index 100% rename from 3dparty/Sabre/DAV/Locks/Backend/Abstract.php rename to 3rdparty/Sabre/DAV/Locks/Backend/Abstract.php diff --git a/3dparty/Sabre/DAV/Locks/Backend/FS.php b/3rdparty/Sabre/DAV/Locks/Backend/FS.php similarity index 100% rename from 3dparty/Sabre/DAV/Locks/Backend/FS.php rename to 3rdparty/Sabre/DAV/Locks/Backend/FS.php diff --git a/3dparty/Sabre/DAV/Locks/Backend/File.php b/3rdparty/Sabre/DAV/Locks/Backend/File.php similarity index 100% rename from 3dparty/Sabre/DAV/Locks/Backend/File.php rename to 3rdparty/Sabre/DAV/Locks/Backend/File.php diff --git a/3dparty/Sabre/DAV/Locks/Backend/PDO.php b/3rdparty/Sabre/DAV/Locks/Backend/PDO.php similarity index 100% rename from 3dparty/Sabre/DAV/Locks/Backend/PDO.php rename to 3rdparty/Sabre/DAV/Locks/Backend/PDO.php diff --git a/3dparty/Sabre/DAV/Locks/LockInfo.php b/3rdparty/Sabre/DAV/Locks/LockInfo.php similarity index 100% rename from 3dparty/Sabre/DAV/Locks/LockInfo.php rename to 3rdparty/Sabre/DAV/Locks/LockInfo.php diff --git a/3dparty/Sabre/DAV/Locks/Plugin.php b/3rdparty/Sabre/DAV/Locks/Plugin.php similarity index 100% rename from 3dparty/Sabre/DAV/Locks/Plugin.php rename to 3rdparty/Sabre/DAV/Locks/Plugin.php diff --git a/3dparty/Sabre/DAV/Mount/Plugin.php b/3rdparty/Sabre/DAV/Mount/Plugin.php similarity index 100% rename from 3dparty/Sabre/DAV/Mount/Plugin.php rename to 3rdparty/Sabre/DAV/Mount/Plugin.php diff --git a/3dparty/Sabre/DAV/Node.php b/3rdparty/Sabre/DAV/Node.php similarity index 100% rename from 3dparty/Sabre/DAV/Node.php rename to 3rdparty/Sabre/DAV/Node.php diff --git a/3dparty/Sabre/DAV/ObjectTree.php b/3rdparty/Sabre/DAV/ObjectTree.php similarity index 100% rename from 3dparty/Sabre/DAV/ObjectTree.php rename to 3rdparty/Sabre/DAV/ObjectTree.php diff --git a/3dparty/Sabre/DAV/Property.php b/3rdparty/Sabre/DAV/Property.php similarity index 100% rename from 3dparty/Sabre/DAV/Property.php rename to 3rdparty/Sabre/DAV/Property.php diff --git a/3dparty/Sabre/DAV/Property/GetLastModified.php b/3rdparty/Sabre/DAV/Property/GetLastModified.php similarity index 100% rename from 3dparty/Sabre/DAV/Property/GetLastModified.php rename to 3rdparty/Sabre/DAV/Property/GetLastModified.php diff --git a/3dparty/Sabre/DAV/Property/Href.php b/3rdparty/Sabre/DAV/Property/Href.php similarity index 100% rename from 3dparty/Sabre/DAV/Property/Href.php rename to 3rdparty/Sabre/DAV/Property/Href.php diff --git a/3dparty/Sabre/DAV/Property/HrefList.php b/3rdparty/Sabre/DAV/Property/HrefList.php similarity index 100% rename from 3dparty/Sabre/DAV/Property/HrefList.php rename to 3rdparty/Sabre/DAV/Property/HrefList.php diff --git a/3dparty/Sabre/DAV/Property/IHref.php b/3rdparty/Sabre/DAV/Property/IHref.php similarity index 100% rename from 3dparty/Sabre/DAV/Property/IHref.php rename to 3rdparty/Sabre/DAV/Property/IHref.php diff --git a/3dparty/Sabre/DAV/Property/LockDiscovery.php b/3rdparty/Sabre/DAV/Property/LockDiscovery.php similarity index 100% rename from 3dparty/Sabre/DAV/Property/LockDiscovery.php rename to 3rdparty/Sabre/DAV/Property/LockDiscovery.php diff --git a/3dparty/Sabre/DAV/Property/ResourceType.php b/3rdparty/Sabre/DAV/Property/ResourceType.php similarity index 100% rename from 3dparty/Sabre/DAV/Property/ResourceType.php rename to 3rdparty/Sabre/DAV/Property/ResourceType.php diff --git a/3dparty/Sabre/DAV/Property/Response.php b/3rdparty/Sabre/DAV/Property/Response.php similarity index 100% rename from 3dparty/Sabre/DAV/Property/Response.php rename to 3rdparty/Sabre/DAV/Property/Response.php diff --git a/3dparty/Sabre/DAV/Property/ResponseList.php b/3rdparty/Sabre/DAV/Property/ResponseList.php similarity index 100% rename from 3dparty/Sabre/DAV/Property/ResponseList.php rename to 3rdparty/Sabre/DAV/Property/ResponseList.php diff --git a/3dparty/Sabre/DAV/Property/SupportedLock.php b/3rdparty/Sabre/DAV/Property/SupportedLock.php similarity index 100% rename from 3dparty/Sabre/DAV/Property/SupportedLock.php rename to 3rdparty/Sabre/DAV/Property/SupportedLock.php diff --git a/3dparty/Sabre/DAV/Property/SupportedReportSet.php b/3rdparty/Sabre/DAV/Property/SupportedReportSet.php similarity index 100% rename from 3dparty/Sabre/DAV/Property/SupportedReportSet.php rename to 3rdparty/Sabre/DAV/Property/SupportedReportSet.php diff --git a/3dparty/Sabre/DAV/Server.php b/3rdparty/Sabre/DAV/Server.php similarity index 100% rename from 3dparty/Sabre/DAV/Server.php rename to 3rdparty/Sabre/DAV/Server.php diff --git a/3dparty/Sabre/DAV/ServerPlugin.php b/3rdparty/Sabre/DAV/ServerPlugin.php similarity index 100% rename from 3dparty/Sabre/DAV/ServerPlugin.php rename to 3rdparty/Sabre/DAV/ServerPlugin.php diff --git a/3dparty/Sabre/DAV/SimpleCollection.php b/3rdparty/Sabre/DAV/SimpleCollection.php similarity index 100% rename from 3dparty/Sabre/DAV/SimpleCollection.php rename to 3rdparty/Sabre/DAV/SimpleCollection.php diff --git a/3dparty/Sabre/DAV/SimpleDirectory.php b/3rdparty/Sabre/DAV/SimpleDirectory.php similarity index 100% rename from 3dparty/Sabre/DAV/SimpleDirectory.php rename to 3rdparty/Sabre/DAV/SimpleDirectory.php diff --git a/3dparty/Sabre/DAV/StringUtil.php b/3rdparty/Sabre/DAV/StringUtil.php similarity index 100% rename from 3dparty/Sabre/DAV/StringUtil.php rename to 3rdparty/Sabre/DAV/StringUtil.php diff --git a/3dparty/Sabre/DAV/TemporaryFileFilterPlugin.php b/3rdparty/Sabre/DAV/TemporaryFileFilterPlugin.php similarity index 100% rename from 3dparty/Sabre/DAV/TemporaryFileFilterPlugin.php rename to 3rdparty/Sabre/DAV/TemporaryFileFilterPlugin.php diff --git a/3dparty/Sabre/DAV/Tree.php b/3rdparty/Sabre/DAV/Tree.php similarity index 100% rename from 3dparty/Sabre/DAV/Tree.php rename to 3rdparty/Sabre/DAV/Tree.php diff --git a/3dparty/Sabre/DAV/Tree/Filesystem.php b/3rdparty/Sabre/DAV/Tree/Filesystem.php similarity index 100% rename from 3dparty/Sabre/DAV/Tree/Filesystem.php rename to 3rdparty/Sabre/DAV/Tree/Filesystem.php diff --git a/3dparty/Sabre/DAV/URLUtil.php b/3rdparty/Sabre/DAV/URLUtil.php similarity index 100% rename from 3dparty/Sabre/DAV/URLUtil.php rename to 3rdparty/Sabre/DAV/URLUtil.php diff --git a/3dparty/Sabre/DAV/UUIDUtil.php b/3rdparty/Sabre/DAV/UUIDUtil.php similarity index 100% rename from 3dparty/Sabre/DAV/UUIDUtil.php rename to 3rdparty/Sabre/DAV/UUIDUtil.php diff --git a/3dparty/Sabre/DAV/Version.php b/3rdparty/Sabre/DAV/Version.php similarity index 100% rename from 3dparty/Sabre/DAV/Version.php rename to 3rdparty/Sabre/DAV/Version.php diff --git a/3dparty/Sabre/DAV/XMLUtil.php b/3rdparty/Sabre/DAV/XMLUtil.php similarity index 100% rename from 3dparty/Sabre/DAV/XMLUtil.php rename to 3rdparty/Sabre/DAV/XMLUtil.php diff --git a/3dparty/Sabre/DAVACL/AbstractPrincipalCollection.php b/3rdparty/Sabre/DAVACL/AbstractPrincipalCollection.php similarity index 100% rename from 3dparty/Sabre/DAVACL/AbstractPrincipalCollection.php rename to 3rdparty/Sabre/DAVACL/AbstractPrincipalCollection.php diff --git a/3dparty/Sabre/DAVACL/Exception/AceConflict.php b/3rdparty/Sabre/DAVACL/Exception/AceConflict.php similarity index 100% rename from 3dparty/Sabre/DAVACL/Exception/AceConflict.php rename to 3rdparty/Sabre/DAVACL/Exception/AceConflict.php diff --git a/3dparty/Sabre/DAVACL/Exception/NeedPrivileges.php b/3rdparty/Sabre/DAVACL/Exception/NeedPrivileges.php similarity index 100% rename from 3dparty/Sabre/DAVACL/Exception/NeedPrivileges.php rename to 3rdparty/Sabre/DAVACL/Exception/NeedPrivileges.php diff --git a/3dparty/Sabre/DAVACL/Exception/NoAbstract.php b/3rdparty/Sabre/DAVACL/Exception/NoAbstract.php similarity index 100% rename from 3dparty/Sabre/DAVACL/Exception/NoAbstract.php rename to 3rdparty/Sabre/DAVACL/Exception/NoAbstract.php diff --git a/3dparty/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php b/3rdparty/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php similarity index 100% rename from 3dparty/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php rename to 3rdparty/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php diff --git a/3dparty/Sabre/DAVACL/Exception/NotSupportedPrivilege.php b/3rdparty/Sabre/DAVACL/Exception/NotSupportedPrivilege.php similarity index 100% rename from 3dparty/Sabre/DAVACL/Exception/NotSupportedPrivilege.php rename to 3rdparty/Sabre/DAVACL/Exception/NotSupportedPrivilege.php diff --git a/3dparty/Sabre/DAVACL/IACL.php b/3rdparty/Sabre/DAVACL/IACL.php similarity index 100% rename from 3dparty/Sabre/DAVACL/IACL.php rename to 3rdparty/Sabre/DAVACL/IACL.php diff --git a/3dparty/Sabre/DAVACL/IPrincipal.php b/3rdparty/Sabre/DAVACL/IPrincipal.php similarity index 100% rename from 3dparty/Sabre/DAVACL/IPrincipal.php rename to 3rdparty/Sabre/DAVACL/IPrincipal.php diff --git a/3dparty/Sabre/DAVACL/IPrincipalBackend.php b/3rdparty/Sabre/DAVACL/IPrincipalBackend.php similarity index 100% rename from 3dparty/Sabre/DAVACL/IPrincipalBackend.php rename to 3rdparty/Sabre/DAVACL/IPrincipalBackend.php diff --git a/3dparty/Sabre/DAVACL/Plugin.php b/3rdparty/Sabre/DAVACL/Plugin.php similarity index 100% rename from 3dparty/Sabre/DAVACL/Plugin.php rename to 3rdparty/Sabre/DAVACL/Plugin.php diff --git a/3dparty/Sabre/DAVACL/Principal.php b/3rdparty/Sabre/DAVACL/Principal.php similarity index 100% rename from 3dparty/Sabre/DAVACL/Principal.php rename to 3rdparty/Sabre/DAVACL/Principal.php diff --git a/3dparty/Sabre/DAVACL/PrincipalBackend/PDO.php b/3rdparty/Sabre/DAVACL/PrincipalBackend/PDO.php similarity index 100% rename from 3dparty/Sabre/DAVACL/PrincipalBackend/PDO.php rename to 3rdparty/Sabre/DAVACL/PrincipalBackend/PDO.php diff --git a/3dparty/Sabre/DAVACL/PrincipalCollection.php b/3rdparty/Sabre/DAVACL/PrincipalCollection.php similarity index 100% rename from 3dparty/Sabre/DAVACL/PrincipalCollection.php rename to 3rdparty/Sabre/DAVACL/PrincipalCollection.php diff --git a/3dparty/Sabre/DAVACL/Property/Acl.php b/3rdparty/Sabre/DAVACL/Property/Acl.php similarity index 100% rename from 3dparty/Sabre/DAVACL/Property/Acl.php rename to 3rdparty/Sabre/DAVACL/Property/Acl.php diff --git a/3dparty/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php b/3rdparty/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php similarity index 100% rename from 3dparty/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php rename to 3rdparty/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php diff --git a/3dparty/Sabre/DAVACL/Property/Principal.php b/3rdparty/Sabre/DAVACL/Property/Principal.php similarity index 100% rename from 3dparty/Sabre/DAVACL/Property/Principal.php rename to 3rdparty/Sabre/DAVACL/Property/Principal.php diff --git a/3dparty/Sabre/DAVACL/Property/SupportedPrivilegeSet.php b/3rdparty/Sabre/DAVACL/Property/SupportedPrivilegeSet.php similarity index 100% rename from 3dparty/Sabre/DAVACL/Property/SupportedPrivilegeSet.php rename to 3rdparty/Sabre/DAVACL/Property/SupportedPrivilegeSet.php diff --git a/3dparty/Sabre/DAVACL/Version.php b/3rdparty/Sabre/DAVACL/Version.php similarity index 100% rename from 3dparty/Sabre/DAVACL/Version.php rename to 3rdparty/Sabre/DAVACL/Version.php diff --git a/3dparty/Sabre/HTTP/AWSAuth.php b/3rdparty/Sabre/HTTP/AWSAuth.php similarity index 100% rename from 3dparty/Sabre/HTTP/AWSAuth.php rename to 3rdparty/Sabre/HTTP/AWSAuth.php diff --git a/3dparty/Sabre/HTTP/AbstractAuth.php b/3rdparty/Sabre/HTTP/AbstractAuth.php similarity index 100% rename from 3dparty/Sabre/HTTP/AbstractAuth.php rename to 3rdparty/Sabre/HTTP/AbstractAuth.php diff --git a/3dparty/Sabre/HTTP/BasicAuth.php b/3rdparty/Sabre/HTTP/BasicAuth.php similarity index 100% rename from 3dparty/Sabre/HTTP/BasicAuth.php rename to 3rdparty/Sabre/HTTP/BasicAuth.php diff --git a/3dparty/Sabre/HTTP/DigestAuth.php b/3rdparty/Sabre/HTTP/DigestAuth.php similarity index 100% rename from 3dparty/Sabre/HTTP/DigestAuth.php rename to 3rdparty/Sabre/HTTP/DigestAuth.php diff --git a/3dparty/Sabre/HTTP/Request.php b/3rdparty/Sabre/HTTP/Request.php similarity index 100% rename from 3dparty/Sabre/HTTP/Request.php rename to 3rdparty/Sabre/HTTP/Request.php diff --git a/3dparty/Sabre/HTTP/Response.php b/3rdparty/Sabre/HTTP/Response.php similarity index 100% rename from 3dparty/Sabre/HTTP/Response.php rename to 3rdparty/Sabre/HTTP/Response.php diff --git a/3dparty/Sabre/HTTP/Util.php b/3rdparty/Sabre/HTTP/Util.php similarity index 100% rename from 3dparty/Sabre/HTTP/Util.php rename to 3rdparty/Sabre/HTTP/Util.php diff --git a/3dparty/Sabre/HTTP/Version.php b/3rdparty/Sabre/HTTP/Version.php similarity index 100% rename from 3dparty/Sabre/HTTP/Version.php rename to 3rdparty/Sabre/HTTP/Version.php diff --git a/3dparty/Sabre/VObject/Component.php b/3rdparty/Sabre/VObject/Component.php similarity index 100% rename from 3dparty/Sabre/VObject/Component.php rename to 3rdparty/Sabre/VObject/Component.php diff --git a/3dparty/Sabre/VObject/Element.php b/3rdparty/Sabre/VObject/Element.php similarity index 100% rename from 3dparty/Sabre/VObject/Element.php rename to 3rdparty/Sabre/VObject/Element.php diff --git a/3dparty/Sabre/VObject/Element/DateTime.php b/3rdparty/Sabre/VObject/Element/DateTime.php similarity index 100% rename from 3dparty/Sabre/VObject/Element/DateTime.php rename to 3rdparty/Sabre/VObject/Element/DateTime.php diff --git a/3dparty/Sabre/VObject/Element/MultiDateTime.php b/3rdparty/Sabre/VObject/Element/MultiDateTime.php similarity index 100% rename from 3dparty/Sabre/VObject/Element/MultiDateTime.php rename to 3rdparty/Sabre/VObject/Element/MultiDateTime.php diff --git a/3dparty/Sabre/VObject/ElementList.php b/3rdparty/Sabre/VObject/ElementList.php similarity index 100% rename from 3dparty/Sabre/VObject/ElementList.php rename to 3rdparty/Sabre/VObject/ElementList.php diff --git a/3dparty/Sabre/VObject/Node.php b/3rdparty/Sabre/VObject/Node.php similarity index 100% rename from 3dparty/Sabre/VObject/Node.php rename to 3rdparty/Sabre/VObject/Node.php diff --git a/3dparty/Sabre/VObject/Parameter.php b/3rdparty/Sabre/VObject/Parameter.php similarity index 100% rename from 3dparty/Sabre/VObject/Parameter.php rename to 3rdparty/Sabre/VObject/Parameter.php diff --git a/3dparty/Sabre/VObject/ParseException.php b/3rdparty/Sabre/VObject/ParseException.php similarity index 100% rename from 3dparty/Sabre/VObject/ParseException.php rename to 3rdparty/Sabre/VObject/ParseException.php diff --git a/3dparty/Sabre/VObject/Property.php b/3rdparty/Sabre/VObject/Property.php similarity index 100% rename from 3dparty/Sabre/VObject/Property.php rename to 3rdparty/Sabre/VObject/Property.php diff --git a/3dparty/Sabre/VObject/Reader.php b/3rdparty/Sabre/VObject/Reader.php similarity index 100% rename from 3dparty/Sabre/VObject/Reader.php rename to 3rdparty/Sabre/VObject/Reader.php diff --git a/3dparty/Sabre/VObject/Version.php b/3rdparty/Sabre/VObject/Version.php similarity index 100% rename from 3dparty/Sabre/VObject/Version.php rename to 3rdparty/Sabre/VObject/Version.php diff --git a/3dparty/Sabre/VObject/includes.php b/3rdparty/Sabre/VObject/includes.php similarity index 100% rename from 3dparty/Sabre/VObject/includes.php rename to 3rdparty/Sabre/VObject/includes.php diff --git a/3dparty/Sabre/autoload.php b/3rdparty/Sabre/autoload.php similarity index 100% rename from 3dparty/Sabre/autoload.php rename to 3rdparty/Sabre/autoload.php diff --git a/3dparty/System.php b/3rdparty/System.php similarity index 100% rename from 3dparty/System.php rename to 3rdparty/System.php diff --git a/3dparty/XML/Parser.php b/3rdparty/XML/Parser.php similarity index 100% rename from 3dparty/XML/Parser.php rename to 3rdparty/XML/Parser.php diff --git a/3dparty/XML/RPC.php b/3rdparty/XML/RPC.php similarity index 100% rename from 3dparty/XML/RPC.php rename to 3rdparty/XML/RPC.php diff --git a/3dparty/XML/RPC/Server.php b/3rdparty/XML/RPC/Server.php similarity index 100% rename from 3dparty/XML/RPC/Server.php rename to 3rdparty/XML/RPC/Server.php From b2702c44061d73ef80b8e26d85f0921c170c3921 Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Sun, 7 Aug 2011 17:39:38 +0200 Subject: [PATCH 74/78] fix include path --- lib/base.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/base.php b/lib/base.php index 270e8c20c7..51dee60d67 100644 --- a/lib/base.php +++ b/lib/base.php @@ -97,7 +97,7 @@ if($WEBROOT!='' and $WEBROOT[0]!=='/'){ } // set the right include path -set_include_path($SERVERROOT.'/lib'.PATH_SEPARATOR.$SERVERROOT.'/config'.PATH_SEPARATOR.$SERVERROOT.'/3dparty'.PATH_SEPARATOR.get_include_path().PATH_SEPARATOR.$SERVERROOT); +set_include_path($SERVERROOT.'/lib'.PATH_SEPARATOR.$SERVERROOT.'/config'.PATH_SEPARATOR.$SERVERROOT.'/3rdparty'.PATH_SEPARATOR.get_include_path().PATH_SEPARATOR.$SERVERROOT); //Some libs we really depend on require_once('Sabre/autoload.php'); From 58c2d29f8c1dfb150d96037e3b09f29dedf3df25 Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Sun, 7 Aug 2011 17:58:56 +0200 Subject: [PATCH 75/78] report the right webserver user to simplify setup and debug --- lib/util.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/util.php b/lib/util.php index e07400fc1f..6518ca99df 100644 --- a/lib/util.php +++ b/lib/util.php @@ -28,8 +28,9 @@ class OC_Util { $success=@mkdir($CONFIG_DATADIRECTORY_ROOT); if(!$success) { $tmpl = new OC_Template( '', 'error', 'guest' ); - $tmpl->assign('errors',array(1=>array('error'=>"Can't create data directory ($CONFIG_DATADIRECTORY_ROOT)",'hint'=>"You can usually fix this by setting the owner of '$SERVERROOT' to the user that the web server uses (www-data for debian/ubuntu)"))); + $tmpl->assign('errors',array(1=>array('error'=>"Can't create data directory ($CONFIG_DATADIRECTORY_ROOT)",'hint'=>"You can usually fix this by setting the owner of '$SERVERROOT' to the user that the web server uses (".exec('whoami').")"))); $tmpl->printPage(); +phpinfo(); exit; } } From a0b7b85c5678d09504fa2d39e64a86b26ee25410 Mon Sep 17 00:00:00 2001 From: Frank Karlitschek Date: Sun, 7 Aug 2011 18:00:35 +0200 Subject: [PATCH 76/78] remove debug --- lib/util.php | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/util.php b/lib/util.php index 6518ca99df..8b8a27657b 100644 --- a/lib/util.php +++ b/lib/util.php @@ -30,7 +30,6 @@ class OC_Util { $tmpl = new OC_Template( '', 'error', 'guest' ); $tmpl->assign('errors',array(1=>array('error'=>"Can't create data directory ($CONFIG_DATADIRECTORY_ROOT)",'hint'=>"You can usually fix this by setting the owner of '$SERVERROOT' to the user that the web server uses (".exec('whoami').")"))); $tmpl->printPage(); -phpinfo(); exit; } } From acf7916e71f1e290aa12eb259d92aa8ab2ffcf23 Mon Sep 17 00:00:00 2001 From: Serge Martin Date: Sun, 7 Aug 2011 19:02:41 +0200 Subject: [PATCH 77/78] user is a reserved word in postgresql --- lib/log.php | 4 ++-- lib/ocs.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/log.php b/lib/log.php index d51b2ef078..1ed8e0e33c 100644 --- a/lib/log.php +++ b/lib/log.php @@ -51,7 +51,7 @@ class OC_Log { * This function adds another entry to the log database */ public static function add( $appid, $subject, $predicate, $object = ' ' ){ - $query=OC_DB::prepare("INSERT INTO `*PREFIX*log`(moment,appid,user,action,info) VALUES(NOW(),?,?,?,?)"); + $query=OC_DB::prepare("INSERT INTO `*PREFIX*log`(moment,appid,`user`,action,info) VALUES(NOW(),?,?,?,?)"); $result=$query->execute(array($appid,$subject,$predicate,$object)); // Die if we have an error if( PEAR::isError($result)) { @@ -90,7 +90,7 @@ class OC_Log { array_push($params,$filter('until')); } if(isset($filter['user'])){ - $queryString.='AND user=? '; + $queryString.='AND `user`=? '; array_push($params,$filter('user')); } if(isset($filter['app'])){ diff --git a/lib/ocs.php b/lib/ocs.php index 8c7556a173..bcacfe704c 100644 --- a/lib/ocs.php +++ b/lib/ocs.php @@ -407,7 +407,7 @@ class OC_OCS { $entry=$result->fetchRow(); $totalcount=$entry['co']; - $query=OC_DB::prepare('select id,timestamp,user,type,message from *PREFIX*log order by timestamp desc limit ?,?'); + $query=OC_DB::prepare('select id,timestamp,`user`,type,message from *PREFIX*log order by timestamp desc limit ?,?'); $result = $query->execute(array(($page*$pagesize),$pagesize))->fetchAll(); $itemscount=count($result); From 3e8ae8636cad91877c727c7b1ea77436816e7c3d Mon Sep 17 00:00:00 2001 From: Serge Martin Date: Sun, 7 Aug 2011 21:06:53 +0200 Subject: [PATCH 78/78] Add postgresql support REVIEW: 102101 --- core/js/setup.js | 14 ++++- core/templates/installation.php | 24 +++++++- lib/db.php | 4 ++ lib/setup.php | 100 ++++++++++++++++++++++++++++++++ 4 files changed, 138 insertions(+), 4 deletions(-) diff --git a/core/js/setup.js b/core/js/setup.js index b4616b8b14..3025a511c6 100644 --- a/core/js/setup.js +++ b/core/js/setup.js @@ -1,8 +1,13 @@ $(document).ready(function() { // Hide the MySQL config div if needed : - if(!$('#mysql').is(':checked') && $('#hasSQLite').val()=='true') { + if(!$('#mysql').is(':checked')) { $('#use_mysql').hide(); } + + // Hide the PostgreSQL config div if needed: + if(!$('#pgsql').is(':checked')) { + $('#use_postgresql').hide(); + } $('#datadirField').hide(250); if($('#hasSQLite').val()=='true'){ @@ -11,10 +16,17 @@ $(document).ready(function() { $('#sqlite').click(function() { $('#use_mysql').slideUp(250); + $('#use_postgresql').slideUp(250); }); $('#mysql').click(function() { $('#use_mysql').slideDown(250); + $('#use_postgresql').slideUp(250); + }); + + $('#pgsql').click(function() { + $('#use_postgresql').slideDown(250); + $('#use_mysql').slideUp(250); }); $('#showAdvanced').click(function() { diff --git a/core/templates/installation.php b/core/templates/installation.php index 8b36d14bbf..e2392778be 100644 --- a/core/templates/installation.php +++ b/core/templates/installation.php @@ -39,7 +39,7 @@ t( 'Configure the database.' ); ?> - +

    t( 'SQLite will be used for the database. You have nothing to do.' ); ?>

    @@ -49,11 +49,11 @@ - +

    t( 'MySQL will be used for the database.' ); ?>

    -

    />

    +

    />

    @@ -64,6 +64,24 @@
    + + + + +

    t( 'PostgreSQL will be used for the database.' ); ?>

    + + +

    />

    + +
    +

    +

    +

    +

    +

    + +
    +

    diff --git a/lib/db.php b/lib/db.php index 9b18bc4c97..76d3fe5efc 100644 --- a/lib/db.php +++ b/lib/db.php @@ -237,6 +237,7 @@ class OC_DB { public static function createDbFromStructure( $file ){ $CONFIG_DBNAME = OC_Config::getValue( "dbname", "owncloud" ); $CONFIG_DBTABLEPREFIX = OC_Config::getValue( "dbtableprefix", "oc_" ); + $CONFIG_DBTYPE = OC_Config::getValue( "dbtype", "sqlite" ); self::connectScheme(); @@ -247,6 +248,9 @@ class OC_DB { $file2 = tempnam( sys_get_temp_dir(), 'oc_db_scheme_' ); $content = str_replace( '*dbname*', $CONFIG_DBNAME, $content ); $content = str_replace( '*dbprefix*', $CONFIG_DBTABLEPREFIX, $content ); + if( $CONFIG_DBTYPE == 'pgsql' ){ //mysql support it too but sqlite don't + $content = str_replace( '0000-00-00 00:00:00', 'CURRENT_TIMESTAMP', $content ); + } file_put_contents( $file2, $content ); // Try to create tables diff --git a/lib/setup.php b/lib/setup.php index f295d69562..f87581d758 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -2,10 +2,12 @@ $hasSQLite = (is_callable('sqlite_open') or class_exists('SQLite3')); $hasMySQL = is_callable('mysql_connect'); +$hasPostgreSQL = is_callable('pg_connect'); $datadir = OC_Config::getValue('datadir', $SERVERROOT.'/data'); $opts = array( 'hasSQLite' => $hasSQLite, 'hasMySQL' => $hasMySQL, + 'hasPostgreSQL' => $hasPostgreSQL, 'directory' => $datadir, 'errors' => array(), ); @@ -43,6 +45,7 @@ class OC_Setup { if(empty($options['directory'])) { $error[] = 'STEP 2 : data directory path is not set.'; } + if($dbtype=='mysql') { //mysql needs more config options if(empty($options['dbuser'])) { $error[] = 'STEP 3 : MySQL database user is not set.'; @@ -61,6 +64,24 @@ class OC_Setup { } } + if($dbtype=='pgsql') { //postgresql needs more config options + if(empty($options['pg_dbuser'])) { + $error[] = 'STEP 3 : PostgreSQL database user is not set.'; + } + if(empty($options['pg_dbpass'])) { + $error[] = 'STEP 3 : PostgreSQL database password is not set.'; + } + if(empty($options['pg_dbname'])) { + $error[] = 'STEP 3 : PostgreSQL database name is not set.'; + } + if(empty($options['pg_dbhost'])) { + $error[] = 'STEP 3 : PostgreSQL database host is not set.'; + } + if(!isset($options['pg_dbtableprefix'])) { + $error[] = 'STEP 3 : PostgreSQL database table prefix is not set.'; + } + } + if(count($error) == 0) { //no errors, good $username = htmlspecialchars_decode($options['adminlogin']); $password = htmlspecialchars_decode($options['adminpass']); @@ -128,6 +149,62 @@ class OC_Setup { mysql_close($connection); } } + elseif($dbtype == 'pgsql') { + $dbuser = $options['pg_dbuser']; + $dbpass = $options['pg_dbpass']; + $dbname = $options['pg_dbname']; + $dbhost = $options['pg_dbhost']; + $dbtableprefix = $options['pg_dbtableprefix']; + OC_CONFIG::setValue('dbname', $dbname); + OC_CONFIG::setValue('dbhost', $dbhost); + OC_CONFIG::setValue('dbtableprefix', $dbtableprefix); + + //check if the database user has admin right + $connection_string = "host=$dbhost dbname=postgres user=$dbuser password=$dbpass"; + $connection = @pg_connect($connection_string); + if(!$connection) { + $error[] = array( + 'error' => 'postgresql username and/or password not valid', + 'hint' => 'you need to enter either an existing account, or the administrative account if you wish to create a new user for ownCloud' + ); + } + else { + //check for roles creation rights in postgresql + $query="SELECT 1 FROM pg_roles WHERE rolcreaterole=TRUE AND rolname='$dbuser'"; + $result = pg_query($connection, $query); + if($result and pg_num_rows($result) > 0) { + //use the admin login data for the new database user + + //add prefix to the postgresql user name to prevent collissions + $dbusername='oc_'.$username; + //hash the password so we don't need to store the admin config in the config file + $dbpassword=md5(time().$password); + + self::pg_createDBUser($dbusername, $dbpassword, $connection); + + OC_CONFIG::setValue('dbuser', $dbusername); + OC_CONFIG::setValue('dbpassword', $dbpassword); + + //create the database + self::pg_createDatabase($dbname, $dbusername, $connection); + } + else { + OC_CONFIG::setValue('dbuser', $dbuser); + OC_CONFIG::setValue('dbpassword', $dbpass); + + //create the database + self::pg_createDatabase($dbname, $dbuser, $connection); + } + + //fill the database if needed + $query="SELECT * FROM {$dbtableprefix}users"; + $result = pg_query($connection, $query); + if(!$result) { + OC_DB::createDbFromStructure('db_structure.xml'); + } + pg_close($connection); + } + } else { //delete the old sqlite database first, might cause infinte loops otherwise if(file_exists("$datadir/owncloud.db")){ @@ -179,6 +256,29 @@ class OC_Setup { $result = mysql_query($query, $connection); } + public static function pg_createDatabase($name,$user,$connection) { + //we cant user OC_BD functions here because we need to connect as the administrative user. + $query = "CREATE DATABASE $name OWNER $user"; + $result = pg_query($connection, $query); + if(!$result) { + $entry='DB Error: "'.pg_last_error($connection).'"
    '; + $entry.='Offending command was: '.$query.'
    '; + echo($entry); + } + $query = "REVOKE ALL PRIVILEGES ON DATABASE $name FROM PUBLIC"; + $result = pg_query($connection, $query); + } + + private static function pg_createDBUser($name,$password,$connection) { + $query = "CREATE USER $name CREATEDB PASSWORD '$password';"; + $result = pg_query($connection, $query); + if(!$result) { + $entry='DB Error: "'.pg_last_error($connection).'"
    '; + $entry.='Offending command was: '.$query.'
    '; + echo($entry); + } + } + /** * create .htaccess files for apache hosts */