diff --git a/.gitignore b/.gitignore index 33f8e0c524b5206b77d3abc976443ff851709b39..e9dbc1e3f62d7a75e9180cc4ed4969bddc8dfe3a 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,6 @@ RCS/* # eclipse .project .settings + +# netbeans +nbproject diff --git a/README b/README index 4ad4f82f304ad77bc4e9c5813b51d0d653d3ef9a..60b18defd593f61777ff3a329eb5ac3097f716ba 100644 --- a/README +++ b/README @@ -4,7 +4,7 @@ It is alpha software in development and should be treated accordingly. http://ownCloud.org -Installation instructions: http://owncloud.org/index.php/Installation +Installation instructions: http://owncloud.org/install Source code: http://gitorious.org/owncloud Mailing list: http://mail.kde.org/mailman/listinfo/owncloud diff --git a/apps/calendar/ajax/neweventform.php b/apps/calendar/ajax/neweventform.php index 7a4c6f469e55dd11e67bd83e7f717ded5ccf3833..7099ea718e97a9ba27322a30e52cba1849ecc87d 100644 --- a/apps/calendar/ajax/neweventform.php +++ b/apps/calendar/ajax/neweventform.php @@ -29,6 +29,9 @@ if($starttime != 'undefined' && !is_nan($starttime) && !$allday){ $startminutes = '00'; }else{ $starttime = date('H'); + if(strlen($starttime) == 2 && $starttime <= 9){ + $starttime = substr($starttime, 1, 1); + } $startminutes = date('i'); } @@ -38,7 +41,18 @@ $endyear = $startyear; $endtime = $starttime; $endminutes = $startminutes; if($endtime == 23) { - $endday++; + if($startday == date(t, mktime($starttime, $startminutes, 0, $startmonth, $startday, $startyear))){ + $datetimestamp = mktime(0, 0, 0, $startmonth, $startday, $startyear); + $datetimestamp = $datetimestamp + 86400; + $endmonth = date("m", $datetimestamp); + $endday = date("d", $datetimestamp); + $endyear = date("Y", $datetimestamp); + }else{ + $endday++; + if($endday <= 9){ + $endday = "0" . $endday; + } + } $endtime = 0; } else { $endtime++; diff --git a/apps/calendar/appinfo/info.xml b/apps/calendar/appinfo/info.xml index c846fc1eebcc708de14adeb9f30f63f3420e8d39..6b1ecd2337f02282988d3b4fbc6540a871d8917e 100644 --- a/apps/calendar/appinfo/info.xml +++ b/apps/calendar/appinfo/info.xml @@ -7,4 +7,5 @@ <author>Georg Ehrke (Userinterface), Jakob Sack</author> <require>2</require> <description>Calendar with CalDAV support</description> + <default_enable/> </info> diff --git a/apps/calendar/js/calendar.js b/apps/calendar/js/calendar.js index f8d1c8e650e1a37dbdf831c3b3bfa4579c836eb0..1b345452912968531ddc22edaad4472f5e54e26e 100644 --- a/apps/calendar/js/calendar.js +++ b/apps/calendar/js/calendar.js @@ -352,6 +352,10 @@ Calendar={ } },"json"); }, + showadvancedoptions:function(){ + $("#advanced_options").css("display", "block"); + $("#advanced_options_button").css("display", "none"); + }, createEventPopup:function(e){ var popup = $(this).data('popup'); if (!popup){ diff --git a/apps/calendar/templates/part.eventform.php b/apps/calendar/templates/part.eventform.php index 5bb072cc23ba14f5930c0461da194358474a8324..4c34b3e1fcc02cc316ee1c0912f8dff3f7f527be 100644 --- a/apps/calendar/templates/part.eventform.php +++ b/apps/calendar/templates/part.eventform.php @@ -5,12 +5,6 @@ <input type="text" style="width:350px;" size="100" placeholder="<?php echo $l->t("Title of the Event");?>" value="<?php echo isset($_['title']) ? $_['title'] : '' ?>" maxlength="100" name="title"/> </td> </tr> - <tr> - <th width="75px"><?php echo $l->t("Location");?>:</th> - <td> - <input type="text" style="width:350px;" size="100" placeholder="<?php echo $l->t("Location of the Event");?>" value="<?php echo isset($_['location']) ? $_['location'] : '' ?>" maxlength="100" name="location" /> - </td> - </tr> </table> <table> <tr> @@ -60,7 +54,12 @@ <input type="time" value="<?php echo $_['endtime'];?>" name="totime" id="totime"> </td><!--use jquery--> - </tr><!-- + </tr> + </table> + <input type="button" class="submit" value="<?php echo $l->t("Advanced options"); ?>" onclick="Calendar.UI.showadvancedoptions();" id="advanced_options_button"> + <div id="advanced_options" style="display: none;"> + <!-- + <table> <tr> <th width="75px"><?php echo $l->t("Repeat");?>:</th> <td> @@ -85,7 +84,16 @@ <hr>--> <table> <tr> - <th width="75px" style="vertical-align: top;"><?php echo $l->t("Description");?>:</th> + <th width="85px"><?php echo $l->t("Location");?>:</th> + <td> + <input type="text" style="width:350px;" size="100" placeholder="<?php echo $l->t("Location of the Event");?>" value="<?php echo isset($_['location']) ? $_['location'] : '' ?>" maxlength="100" name="location" /> + </td> + </tr> + </table> + <table> + <tr> + <th width="85px" style="vertical-align: top;"><?php echo $l->t("Description");?>:</th> <td><textarea style="width:350px;height: 150px;" placeholder="<?php echo $l->t("Description of the Event");?>" name="description"><?php echo isset($_['description']) ? $_['description'] : '' ?></textarea></td> </tr> </table> + </div> diff --git a/apps/contacts/appinfo/info.xml b/apps/contacts/appinfo/info.xml index 77c9dc91bfc7420bef0b45de8fbf708b155d3a46..d18a19c3aeab1a8fd646262289c5ee927acec45b 100644 --- a/apps/contacts/appinfo/info.xml +++ b/apps/contacts/appinfo/info.xml @@ -7,4 +7,5 @@ <author>Jakob Sack</author> <require>2</require> <description>Address book with CardDAV support.</description> + <default_enable/> </info> diff --git a/apps/files_imageviewer/appinfo/info.xml b/apps/files_imageviewer/appinfo/info.xml index f3b5a67960ebcb905942648d66dfd3b027dd2b66..00b55c254dd727fe189bcb6484eb238ce19a2dab 100644 --- a/apps/files_imageviewer/appinfo/info.xml +++ b/apps/files_imageviewer/appinfo/info.xml @@ -7,4 +7,5 @@ <licence>AGPL</licence> <author>Robin Appelman</author> <require>2</require> -</info> \ No newline at end of file + <default_enable/> +</info> diff --git a/apps/files_sharing/appinfo/info.xml b/apps/files_sharing/appinfo/info.xml index 2fbb3300f69f7b08671235b3efdc1dd94e0bd7ff..abf847b4483a2ccf6a8d747f2b5f9148608790fa 100644 --- a/apps/files_sharing/appinfo/info.xml +++ b/apps/files_sharing/appinfo/info.xml @@ -7,4 +7,5 @@ <licence>AGPL</licence> <author>Michael Gapczynski</author> <require>2</require> -</info> \ No newline at end of file + <default_enable/> +</info> diff --git a/apps/files_textviewer/appinfo/info.xml b/apps/files_textviewer/appinfo/info.xml index 209b414034639a609d82b535a9cd26bf6ab3a73b..becfd5e35c83255b76e95a65a1a7addaa8b9627a 100644 --- a/apps/files_textviewer/appinfo/info.xml +++ b/apps/files_textviewer/appinfo/info.xml @@ -6,4 +6,5 @@ <licence>AGPL</licence> <author>Robin Appelman</author> <require>2</require> + <default_enable/> </info> diff --git a/apps/media/appinfo/info.xml b/apps/media/appinfo/info.xml index 044abade53f5177f37b81aaaea53190fdb492115..795c9a4dd718f0c297255c38edaa173e455d95ac 100644 --- a/apps/media/appinfo/info.xml +++ b/apps/media/appinfo/info.xml @@ -7,4 +7,5 @@ <licence>AGPL</licence> <author>Robin Appelman</author> <require>2</require> -</info> \ No newline at end of file + <default_enable/> +</info> diff --git a/apps/media/css/music.css b/apps/media/css/music.css index ddfe342983008737c5fe55878166173716c527fc..c4db4e05855c6c9e6687222308f6d8ad79f58ee8 100644 --- a/apps/media/css/music.css +++ b/apps/media/css/music.css @@ -9,8 +9,9 @@ div.jp-progress { position:absolute; overflow:hidden; top:.5em; left:8em; width: div.jp-seek-bar { background:#eee; width:0; height:100%; cursor:pointer; } div.jp-play-bar { background:#ccc; width:0; height:100%; } div.jp-seeking-bg { background:url("../img/pbar-ani.gif"); } -div.jp-current-time,div.jp-duration { position:absolute; font-size:.64em; font-style:oblique; top:1em; left:13.5em; } -div.jp-duration { left:33em; } +div.jp-current-time,div.jp-duration { position:absolute; font-size:.64em; font-style:oblique; top:0.9em; left:13.5em; } +div.jp-duration { display: none } +div.jp-current-song { left: 33em; position: absolute; top: 0.9em; } div.jp-duration { text-align:right; } a.jp-mute,a.jp-unmute { left:24em; } @@ -21,9 +22,11 @@ div.jp-volume-bar-value { background:#ccc; width:0; height:0.4em; } #collection li.album,#collection li.song { margin-left:3em; } #leftcontent img.remove { display:none; float:right; cursor:pointer; } #leftcontent li:hover img.remove { display:inline; } +#leftcontent li {white-space: normal; } #collection li button { float:right; } #collection li,#playlist li { list-style-type:none; } .template { display:none; } +.collection_playing { background:#eee; } #collection li { padding-right:10px; } #searchresults input.play, #searchresults input.add { float:left; height:1em; width:1em; } @@ -34,6 +37,7 @@ tr td { border-top:1px solid #eee; height:2.2em; } tr .artist img { vertical-align:middle; } tr.album td.artist { padding-left:1em; } tr.song td.artist { padding-left:2em; } +.add {margin: 0 0.5em 0 0; } #scan { position:absolute; right:13em; top:0em; } #scan .start { position:relative; display:inline; float:right; } diff --git a/apps/media/js/music.js b/apps/media/js/music.js index c04c579d1ca04805d164a3f16b1d8f9c4b1cce98..cac16ac6ff7be9e943c528bf819a0f2d9d82c2e2 100644 --- a/apps/media/js/music.js +++ b/apps/media/js/music.js @@ -15,7 +15,7 @@ $(document).ready(function(){ PlayList.play(oldSize); PlayList.render(); }); - var button=$('<input type="button" title="'+t('media','Add to playlist')+'" class="add"></input>'); + var button=$('<input type="button" title="'+t('media','Add album to playlist')+'" class="add"></input>'); button.css('background-image','url('+OC.imagePath('core','actions/play-add')+')') button.click(function(event){ event.stopPropagation(); @@ -24,6 +24,7 @@ $(document).ready(function(){ }); row.find('div.name').append(button); } + $('.add').tipsy({gravity:'n', fade:true, delayIn: 400, live:true}); Collection.display(); }); diff --git a/apps/media/js/player.js b/apps/media/js/player.js index f696b87bbde5ec2bb2b0909440bd2021b2de84bb..693bf2d70bf6c41caa2e33a559509e82ee74da15 100644 --- a/apps/media/js/player.js +++ b/apps/media/js/player.js @@ -39,6 +39,7 @@ var PlayList={ PlayList.init(items[index].type,null); // init calls load that calls play }else{ PlayList.player.jPlayer("setMedia", items[PlayList.current]); + $(".jp-current-song").text(items[PlayList.current].name); items[index].playcount++; PlayList.player.jPlayer("play",time); if(index>0){ @@ -67,6 +68,8 @@ var PlayList={ PlayList.init(items[index].type,null); // init calls load that calls play } } + $(".song").removeClass("collection_playing"); + $(".jp-playlist-" + index).addClass("collection_playing"); }, init:function(type,ready){ if(!PlayList.player){ diff --git a/apps/media/js/playlist.js b/apps/media/js/playlist.js index cb7f24522a4751bda0d891cd04f47d1794399c7f..c6dc3db2dd40c3b75b9d7eb5e1ff0b0d3dd84aa9 100644 --- a/apps/media/js/playlist.js +++ b/apps/media/js/playlist.js @@ -5,6 +5,7 @@ PlayList.render=function(){ var item=PlayList.items[i]; var li=$('<li/>'); li.append(item.name); + li.attr('class', 'jp-playlist-' + i); var img=$('<img class="remove svg action" src="'+OC.imagePath('core','actions/delete')+'"/>'); img.click(function(event){ event.stopPropagation(); @@ -18,6 +19,7 @@ PlayList.render=function(){ li.addClass('song'); PlayList.parent.append(li); } + $(".jp-playlist-" + PlayList.current).addClass("collection_playing"); } PlayList.getSelected=function(){ return $('tbody td.name input:checkbox:checked').parent().parent(); diff --git a/apps/media/templates/music.php b/apps/media/templates/music.php index 6c8d740cc13f146d2ca8fd0e451b4fa4387ece82..2af18fb03c9f1ea27302b85237426ca789d44ae9 100644 --- a/apps/media/templates/music.php +++ b/apps/media/templates/music.php @@ -17,6 +17,7 @@ <div class="jp-volume-bar"> <div class="jp-volume-bar-value"></div> </div> + <div class="jp-current-song"></div> <div class="player" id="jp-player"></div> diff --git a/apps/user_openid/appinfo/info.xml b/apps/user_openid/appinfo/info.xml index 32525009d616ed7bbb31000dc0ba4723ecd7f05a..332d2199dd3c305e850785e481bbdaf5f485e98c 100644 --- a/apps/user_openid/appinfo/info.xml +++ b/apps/user_openid/appinfo/info.xml @@ -7,4 +7,5 @@ <licence>AGPL</licence> <author>Robin Appelman</author> <require>2</require> -</info> \ No newline at end of file + <default_enable/> +</info> diff --git a/lib/installer.php b/lib/installer.php index 9416a42c972ee8b4a5e2f2b06549527b61ab55bc..0febb2cab46ec84543281388edce92a953ae0b0f 100644 --- a/lib/installer.php +++ b/lib/installer.php @@ -243,13 +243,14 @@ class OC_Installer{ * If $enabled is true, apps are installed as enabled. * If $enabled is false, apps are installed as disabled. */ - public static function installShippedApps( $enabled ){ + public static function installShippedApps(){ $dir = opendir( OC::$SERVERROOT."/apps" ); while( false !== ( $filename = readdir( $dir ))){ if( substr( $filename, 0, 1 ) != '.' and is_dir(OC::$SERVERROOT."/apps/$filename") ){ if( file_exists( OC::$SERVERROOT."/apps/$filename/appinfo/app.php" )){ if(!OC_Installer::isInstalled($filename)){ - OC_Installer::installShippedApp($filename); + $info = OC_Installer::installShippedApp($filename); + $enabled = isset($info['default_enable']); if( $enabled ){ OC_Appconfig::setValue($filename,'enabled','yes'); }else{ @@ -265,7 +266,7 @@ class OC_Installer{ /** * install an app already placed in the app folder * @param string $app id of the app to install - * @return bool + * @returns array see OC_App::getAppInfo */ public static function installShippedApp($app){ //install the database @@ -279,5 +280,6 @@ class OC_Installer{ } $info=OC_App::getAppInfo(OC::$SERVERROOT."/apps/$app/appinfo/info.xml"); OC_Appconfig::setValue($app,'installed_version',$info['version']); + return $info; } } diff --git a/lib/setup.php b/lib/setup.php index 7b205acd705821ee4b1537a27f6e1edb961047fa..8d3079720ccc498373a30b430051b24bc223b34e 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -206,7 +206,7 @@ class OC_Setup { OC_User::login($username, $password); //guess what this does - OC_Installer::installShippedApps(true); + OC_Installer::installShippedApps(); //create htaccess files for apache hosts if (strstr($_SERVER['SERVER_SOFTWARE'], 'Apache')) { diff --git a/lib/util.php b/lib/util.php index dea3168e8fc9cc9fbf2d28ad1d045c58e4885ba5..66a781537eae2b822da61be720c112d5005b17d5 100644 --- a/lib/util.php +++ b/lib/util.php @@ -24,7 +24,7 @@ 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 '".OC::$SERVERROOT."' to the user that the web server uses (".exec('whoami').")"))); + $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 '".OC::$SERVERROOT."' to the user that the web server uses (".OC_Util::checkWebserverUser().")"))); $tmpl->printPage(); exit; } @@ -208,28 +208,21 @@ class OC_Util { } $CONFIG_DBTYPE = OC_Config::getValue( "dbtype", "sqlite" ); $CONFIG_DBNAME = OC_Config::getValue( "dbname", "owncloud" ); - - //try to get the username the httpd server runs on, used in hints - $stat=stat($_SERVER['DOCUMENT_ROOT']); - if(is_callable('posix_getpwuid')){ - $serverUser=posix_getpwuid($stat['uid']); - $serverUser='\''.$serverUser['name'].'\''; - }else{ - $serverUser='\'www-data\' for ubuntu/debian';//TODO: try to detect the distro and give a guess based on that - } + $serverUser=OC_Util::checkWebserverUser(); //common hint for all file permissons error messages $permissionsHint="Permissions can usually be fixed by setting the owner of the file or directory to the user the web server runs as ($serverUser)"; //check for correct file permissions if(!stristr(PHP_OS, 'WIN')){ + $permissionsModHint="Please change the permissions to 0770 so that the directory cannot be listed by other users."; $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); if(substr($prems,2,1)!='0'){ - $errors[]=array('error'=>'Data directory ('.$CONFIG_DATADIRECTORY_ROOT.') is readable from the web<br/>','hint'=>$permissionsHint); + $errors[]=array('error'=>'Data directory ('.$CONFIG_DATADIRECTORY_ROOT.') is readable for other users<br/>','hint'=>$permissionsModHint); } } if( OC_Config::getValue( "enablebackup", false )){ @@ -239,7 +232,7 @@ class OC_Util { clearstatcache(); $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<br/>','hint'=>$permissionsHint); + $errors[]=array('error'=>'Data directory ('.$CONFIG_BACKUPDIRECTORY.') is readable for other users<br/>','hint'=>$permissionsModHint); } } } @@ -250,11 +243,39 @@ class OC_Util { $errors[]=array('error'=>'Data directory ('.$CONFIG_DATADIRECTORY_ROOT.') not writable by ownCloud<br/>','hint'=>$permissionsHint); } - //TODO: check for php modules + // check if all required php modules are present + if(!class_exists('ZipArchive')){ + $errors[]=array('error'=>'PHP module ZipArchive not installed.<br/>','hint'=>'Please ask your server administrator to install the module.'); + } + + if(!function_exists('mb_detect_encoding')){ + $errors[]=array('error'=>'PHP module mb multibyte not installed.<br/>','hint'=>'Please ask your server administrator to install the module.'); + } + if(!function_exists('ctype_digit')){ + $errors[]=array('error'=>'PHP module ctype is not installed.<br/>','hint'=>'Please ask your server administrator to install the module.'); + } return $errors; } + + /** + * Try to get the username the httpd server runs on, used in hints + */ + public static function checkWebserverUser(){ + $stat=stat($_SERVER['DOCUMENT_ROOT']); + if(is_callable('posix_getpwuid')){ + $serverUser=posix_getpwuid($stat['uid']); + $serverUser='\''.$serverUser['name'].'\''; + }elseif(exec('whoami')){ + $serverUser=exec('whoami'); + }else{ + $serverUser='\'www-data\' for ubuntu/debian'; //TODO: try to detect the distro and give a guess based on that + } + return $serverUser; + } + + /** * Check if the user is logged in, redirects to home if not */