diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2014-05-19 20:52:25 +0200 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2014-05-19 20:52:25 +0200 |
commit | 51a6764f3180a258dc17a6744929866aeddb8779 (patch) | |
tree | 78452f7027ab7b71d48f1aedc736cd9617430ce8 /lib | |
parent | 2c483fdca21fc32bf6ef8eaf5835e8e4614acd3a (diff) | |
parent | b6d2d6329d99c47fa8a01a7a8db7f8f2de6b9f74 (diff) | |
download | nextcloud-server-51a6764f3180a258dc17a6744929866aeddb8779.tar.gz nextcloud-server-51a6764f3180a258dc17a6744929866aeddb8779.zip |
Merge branch 'master' into cleanup-list-code
Conflicts:
apps/files_sharing/ajax/list.php
Diffstat (limited to 'lib')
195 files changed, 3451 insertions, 1932 deletions
diff --git a/lib/autoloader.php b/lib/autoloader.php index 3451f799e18..2ce36385081 100644 --- a/lib/autoloader.php +++ b/lib/autoloader.php @@ -147,7 +147,7 @@ class Autoloader { } /** - * @brief Sets the optional low-latency cache for class to path mapping. + * Sets the optional low-latency cache for class to path mapping. * @param \OC\Memcache\Cache $memoryCache Instance of memory cache. */ public function setMemoryCache(\OC\Memcache\Cache $memoryCache = null) { diff --git a/lib/base.php b/lib/base.php index 1f7d0c0da65..abb76b94a5d 100644 --- a/lib/base.php +++ b/lib/base.php @@ -175,7 +175,7 @@ class OC { OC::$SERVERROOT . '/lib/private' . PATH_SEPARATOR . OC::$SERVERROOT . '/config' . PATH_SEPARATOR . OC::$THIRDPARTYROOT . '/3rdparty' . PATH_SEPARATOR . - implode($paths, PATH_SEPARATOR) . PATH_SEPARATOR . + implode(PATH_SEPARATOR, $paths) . PATH_SEPARATOR . get_include_path() . PATH_SEPARATOR . OC::$SERVERROOT ); @@ -212,34 +212,6 @@ class OC { } } - /* - * This function adds some security related headers to all requests served via base.php - * The implementation of this function has to happen here to ensure that all third-party - * components (e.g. SabreDAV) also benefit from this headers. - */ - public static function addSecurityHeaders() { - header('X-XSS-Protection: 1; mode=block'); // Enforce browser based XSS filters - header('X-Content-Type-Options: nosniff'); // Disable sniffing the content type for IE - - // iFrame Restriction Policy - $xFramePolicy = OC_Config::getValue('xframe_restriction', true); - if($xFramePolicy) { - header('X-Frame-Options: Sameorigin'); // Disallow iFraming from other domains - } - - // Content Security Policy - // If you change the standard policy, please also change it in config.sample.php - $policy = OC_Config::getValue('custom_csp_policy', - 'default-src \'self\'; ' - .'script-src \'self\' \'unsafe-eval\'; ' - .'style-src \'self\' \'unsafe-inline\'; ' - .'frame-src *; ' - .'img-src *; ' - .'font-src \'self\' data:; ' - .'media-src *'); - header('Content-Security-Policy:'.$policy); - } - public static function checkSSL() { // redirect to https site if configured if (OC_Config::getValue("forcessl", false)) { @@ -378,9 +350,17 @@ class OC { //set the session object to a dummy session so code relying on the session existing still works self::$session = new \OC\Session\Memory(''); + // Let the session name be changed in the initSession Hook + $sessionName = OC_Util::getInstanceId(); + try { - // set the session name to the instance id - which is unique - self::$session = new \OC\Session\Internal(OC_Util::getInstanceId()); + // Allow session apps to create a custom session object + $useCustomSession = false; + OC_Hook::emit('OC', 'initSession', array('session' => &self::$session, 'sessionName' => &$sessionName, 'useCustomSession' => &$useCustomSession)); + if(!$useCustomSession) { + // set the session name to the instance id - which is unique + self::$session = new \OC\Session\Internal($sessionName); + } // if session cant be started break with http 500 error } catch (Exception $e) { //show the user a detailed error page @@ -537,6 +517,7 @@ class OC { self::$server = new \OC\Server(); self::initTemplateEngine(); + OC_App::loadApps(array('session')); if (!self::$CLI) { self::initSession(); } else { @@ -545,7 +526,7 @@ class OC { self::checkConfig(); self::checkInstalled(); self::checkSSL(); - self::addSecurityHeaders(); + OC_Response::addSecurityHeaders(); $errors = OC_Util::checkServer(); if (count($errors) > 0) { @@ -613,7 +594,7 @@ class OC { if (!is_null(self::$REQUESTEDFILE)) { $subdir = OC_App::getAppPath(OC::$REQUESTEDAPP) . '/' . self::$REQUESTEDFILE; $parent = OC_App::getAppPath(OC::$REQUESTEDAPP); - if (!OC_Helper::issubdirectory($subdir, $parent)) { + if (!OC_Helper::isSubDirectory($subdir, $parent)) { self::$REQUESTEDFILE = null; header('HTTP/1.0 404 Not Found'); exit; @@ -685,7 +666,7 @@ class OC { } /** - * @brief Handle the request + * Handle the request */ public static function handleRequest() { $l = \OC_L10N::get('lib'); diff --git a/lib/l10n/ast.php b/lib/l10n/ast.php index 219317c19b9..4eaf734931f 100644 --- a/lib/l10n/ast.php +++ b/lib/l10n/ast.php @@ -1,5 +1,6 @@ <?php $TRANSLATIONS = array( +"Help" => "Ayuda", "Personal" => "Personal", "Settings" => "Axustes", "Users" => "Usuarios", diff --git a/lib/l10n/cs_CZ.php b/lib/l10n/cs_CZ.php index 6fef446d8c4..94d0fbe0697 100644 --- a/lib/l10n/cs_CZ.php +++ b/lib/l10n/cs_CZ.php @@ -1,6 +1,7 @@ <?php $TRANSLATIONS = array( "You are accessing the server from an untrusted domain." => "Přistupujete na server z nedůvěryhodné domény.", +"Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." => "Kontaktujte prosím správce. Pokud jste správce této instalace, nastavte \"trusted_domain\" v souboru config/config.php. Příklad konfigurace najdete v souboru config/config.sample.php.", "App \"%s\" can't be installed because it is not compatible with this version of ownCloud." => "Aplikace \"%s\" nemůže být nainstalována, protože není kompatibilní s touto verzí ownCloud.", "No app name specified" => "Nebyl zadan název aplikace", "Help" => "Nápověda", @@ -65,6 +66,7 @@ $TRANSLATIONS = array( "Sharing %s failed, because the group %s does not exist" => "Sdílení položky %s selhalo, protože skupina %s neexistuje", "Sharing %s failed, because %s is not a member of the group %s" => "Sdílení položky %s selhalo, protože uživatel %s není členem skupiny %s", "Sharing %s failed, because sharing with links is not allowed" => "Sdílení položky %s selhalo, protože sdílení pomocí linků není povoleno", +"Share type %s is not valid for %s" => "Sdílení typu %s není korektní pro %s", "Setting permissions for %s failed, because the item was not found" => "Nastavení práv pro %s selhalo, protože položka nebyla nalezena", "Could not find category \"%s\"" => "Nelze nalézt kategorii \"%s\"", "seconds ago" => "před pár sekundami", diff --git a/lib/l10n/de.php b/lib/l10n/de.php index 6c518a8b843..63e3aefb8e3 100644 --- a/lib/l10n/de.php +++ b/lib/l10n/de.php @@ -65,6 +65,7 @@ $TRANSLATIONS = array( "Sharing %s failed, because this item is already shared with %s" => "Freigabe von %s fehlgeschlagen, da dieses Objekt schon mit %s geteilt wird", "Sharing %s failed, because the group %s does not exist" => "Freigabe von %s fehlgeschlagen, da die Gruppe %s nicht existiert", "Sharing %s failed, because %s is not a member of the group %s" => "Freigabe von %s fehlgeschlagen, da %s kein Mitglied der Gruppe %s ist", +"You need to provide a password to create a public link, only protected links are allowed" => "Es sind nur geschützte Links zulässig, daher müssen Sie ein Passwort angeben, um einen öffentlichen Link zu generieren", "Sharing %s failed, because sharing with links is not allowed" => "Freigabe von %s fehlgeschlagen, da das Teilen von Verknüpfungen nicht erlaubt ist", "Share type %s is not valid for %s" => "Freigabetyp %s ist nicht gültig für %s", "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" => "Das Setzen der Berechtigungen für %s ist fehlgeschlagen, da die Berechtigungen, die erteilten Berechtigungen %s überschreiten", diff --git a/lib/l10n/de_DE.php b/lib/l10n/de_DE.php index 6e3ec141a21..e963bb2aa67 100644 --- a/lib/l10n/de_DE.php +++ b/lib/l10n/de_DE.php @@ -65,6 +65,7 @@ $TRANSLATIONS = array( "Sharing %s failed, because this item is already shared with %s" => "Freigabe von %s fehlgeschlagen, da dieses Objekt schon mit %s geteilt wird", "Sharing %s failed, because the group %s does not exist" => "Freigabe von %s fehlgeschlagen, da die Gruppe %s nicht existiert", "Sharing %s failed, because %s is not a member of the group %s" => "Freigabe von %s fehlgeschlagen, da %s kein Mitglied der Gruppe %s ist", +"You need to provide a password to create a public link, only protected links are allowed" => "Es sind nur geschützte Links zulässig, daher müssen Sie ein Passwort angeben, um einen öffentlichen Link zu generieren", "Sharing %s failed, because sharing with links is not allowed" => "Freigabe von %s fehlgeschlagen, da das Teilen von Verknüpfungen nicht erlaubt ist", "Share type %s is not valid for %s" => "Freigabetyp %s ist nicht gültig für %s", "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" => "Das Setzen der Berechtigungen für %s ist fehlgeschlagen, da die Berechtigungen, die erteilten Berechtigungen %s überschreiten", diff --git a/lib/l10n/el.php b/lib/l10n/el.php index 109104e4061..716b2694d45 100644 --- a/lib/l10n/el.php +++ b/lib/l10n/el.php @@ -1,5 +1,7 @@ <?php $TRANSLATIONS = array( +"You are accessing the server from an untrusted domain." => "Η προσπέλαση του διακομιστή γίνεται από μη έμπιστο τομέα.", +"Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." => "Παρακαλώ επικοινωνήστε με τον διαχειριστή συστημάτων σας. Αν είστε διαχειριστής αυτού του στιγμιοτύπο, ρυθμίστε το κλειδί \"trusted_domain\" στο αρχείο config/config.php. Ένα παράδειγμα παρέχεται στο αρχείο config/config.sample.php.", "App \"%s\" can't be installed because it is not compatible with this version of ownCloud." => "Η εφαρμογή \"%s\" δεν μπορεί να εγκατασταθεί επειδή δεν είναι συμβατή με αυτή την έκδοση του ownCloud.", "No app name specified" => "Δεν προδιορίστηκε όνομα εφαρμογής", "Help" => "Βοήθεια", @@ -56,6 +58,25 @@ $TRANSLATIONS = array( "Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Ο διακομιστής σας δεν έχει ρυθμιστεί κατάλληλα ώστε να επιτρέπει τον συγχρονισμό αρχείων γιατί η διεπαφή WebDAV πιθανόν να είναι κατεστραμμένη.", "Please double check the <a href='%s'>installation guides</a>." => "Ελέγξτε ξανά τις <a href='%s'>οδηγίες εγκατάστασης</a>.", "%s shared »%s« with you" => "Ο %s διαμοιράστηκε μαζί σας το »%s«", +"Sharing %s failed, because the file does not exist" => "Ο διαμοιρασμός του %s απέτυχε, γιατί το αρχείο δεν υπάρχει", +"Sharing %s failed, because the user %s is the item owner" => "Ο διαμοιρασμός του %s απέτυχε, γιατί ο χρήστης %s είναι ο ιδιοκτήτης του αντικειμένου", +"Sharing %s failed, because the user %s does not exist" => "Ο διαμοιρασμός του %s απέτυχε, γιατί ο χρήστης %s δεν υπάρχει", +"Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" => "Ο διαμοιρασμός του %s απέτυχε, γιατί ο χρήστης %s δεν είναι μέλος καμίας ομάδας στην οποία ο χρήστης %s είναι μέλος", +"Sharing %s failed, because this item is already shared with %s" => "Ο διαμοιρασμός του %s απέτυχε, γιατί το αντικείμενο είναι διαμοιρασμένο ήδη με τον χρήστη %s", +"Sharing %s failed, because the group %s does not exist" => "Ο διαμοιρασμός του %s απέτυχε, γιατί η ομάδα χρηστών %s δεν υπάρχει", +"Sharing %s failed, because %s is not a member of the group %s" => "Ο διαμοιρασμός του %s απέτυχε, γιατί ο χρήστης %s δεν είναι μέλος της ομάδας %s", +"Sharing %s failed, because sharing with links is not allowed" => "Ο διαμοιρασμός του %s απέτυχε, γιατί δεν επιτρέπεται ο διαμοιρασμός με συνδέσμους", +"Share type %s is not valid for %s" => "Ο τύπος διαμοιρασμού %s δεν είναι έγκυρος για το %s", +"Setting permissions for %s failed, because the permissions exceed permissions granted to %s" => "Ο ορισμός δικαιωμάτων για το %s απέτυχε, γιατί τα δικαιώματα υπερτερούν αυτά που είναι ορισμένα για το %s", +"Setting permissions for %s failed, because the item was not found" => "Ο ορισμός δικαιωμάτων για το %s απέτυχε, γιατί το αντικείμενο δεν βρέθηκε", +"Sharing backend %s must implement the interface OCP\\Share_Backend" => "Το σύστημα διαμοιρασμού %s πρέπει να υλοποιεί την διεπαφή OCP\\Share_Backend", +"Sharing backend %s not found" => "Το σύστημα διαμοιρασμού %s δεν βρέθηκε", +"Sharing backend for %s not found" => "Το σύστημα διαμοιρασμού για το %s δεν βρέθηκε", +"Sharing %s failed, because the user %s is the original sharer" => "Ο διαμοιρασμός του %s απέτυχε, γιατί το αντικείμενο είναι διαμοιρασμένο αρχικά από τον χρήστη %s", +"Sharing %s failed, because the permissions exceed permissions granted to %s" => "Ο διαμοιρασμός του %s απέτυχε, γιατί τα δικαιώματα υπερτερούν αυτά που είναι ορισμένα για το %s", +"Sharing %s failed, because resharing is not allowed" => "Ο διαμοιρασμός του %s απέτυχε, γιατί δεν επιτρέπεται ο επαναδιαμοιρασμός", +"Sharing %s failed, because the sharing backend for %s could not find its source" => "Ο διαμοιρασμός του %s απέτυχε, γιατί δεν ήταν δυνατό να εντοπίσει την πηγή το σύστημα διαμοιρασμού για το %s ", +"Sharing %s failed, because the file could not be found in the file cache" => "Ο διαμοιρασμός του %s απέτυχε, γιατί το αρχείο δεν βρέθηκε στην προσωρινή αποθήκευση αρχείων", "Could not find category \"%s\"" => "Αδυναμία εύρεσης κατηγορίας \"%s\"", "seconds ago" => "δευτερόλεπτα πριν", "_%n minute ago_::_%n minutes ago_" => array("","%n λεπτά πριν"), @@ -67,7 +88,9 @@ $TRANSLATIONS = array( "_%n month ago_::_%n months ago_" => array("","%n μήνες πριν"), "last year" => "τελευταίο χρόνο", "years ago" => "χρόνια πριν", +"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" => "Μόνο οι παρακάτων χαρακτήρες επιτρέπονται σε ένα όνομα χρήστη: \"a-z\", \"A-Z\", \"0-9\" και \"_.@-\"", "A valid username must be provided" => "Πρέπει να δοθεί έγκυρο όνομα χρήστη", -"A valid password must be provided" => "Πρέπει να δοθεί έγκυρο συνθηματικό" +"A valid password must be provided" => "Πρέπει να δοθεί έγκυρο συνθηματικό", +"The username is already being used" => "Το όνομα χρήστη είναι κατειλημμένο" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/lib/l10n/es.php b/lib/l10n/es.php index d1c04b09d38..c3484ad9de5 100644 --- a/lib/l10n/es.php +++ b/lib/l10n/es.php @@ -65,6 +65,7 @@ $TRANSLATIONS = array( "Sharing %s failed, because this item is already shared with %s" => "Compartiendo %s ha fallado, ya que este elemento ya está compartido con %s", "Sharing %s failed, because the group %s does not exist" => "Compartiendo %s ha fallado, ya que el grupo %s no existe", "Sharing %s failed, because %s is not a member of the group %s" => "Compartiendo %s ha fallado, ya que %s no es miembro del grupo %s", +"You need to provide a password to create a public link, only protected links are allowed" => "Es necesario definir una contraseña para crear un enlace publico. Solo los enlaces protegidos están permitidos", "Sharing %s failed, because sharing with links is not allowed" => "Compartiendo %s ha fallado, ya que compartir con enlaces no está permitido", "Share type %s is not valid for %s" => "Compartir tipo %s no es válido para %s", "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" => "Configuración de permisos para %s ha fallado, ya que los permisos superan los permisos dados a %s", diff --git a/lib/l10n/es_BO.php b/lib/l10n/es_BO.php new file mode 100644 index 00000000000..15f78e0bce6 --- /dev/null +++ b/lib/l10n/es_BO.php @@ -0,0 +1,8 @@ +<?php +$TRANSLATIONS = array( +"_%n minute ago_::_%n minutes ago_" => array("",""), +"_%n hour ago_::_%n hours ago_" => array("",""), +"_%n day go_::_%n days ago_" => array("",""), +"_%n month ago_::_%n months ago_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/lib/l10n/es_CO.php b/lib/l10n/es_CO.php new file mode 100644 index 00000000000..15f78e0bce6 --- /dev/null +++ b/lib/l10n/es_CO.php @@ -0,0 +1,8 @@ +<?php +$TRANSLATIONS = array( +"_%n minute ago_::_%n minutes ago_" => array("",""), +"_%n hour ago_::_%n hours ago_" => array("",""), +"_%n day go_::_%n days ago_" => array("",""), +"_%n month ago_::_%n months ago_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/lib/l10n/es_EC.php b/lib/l10n/es_EC.php new file mode 100644 index 00000000000..15f78e0bce6 --- /dev/null +++ b/lib/l10n/es_EC.php @@ -0,0 +1,8 @@ +<?php +$TRANSLATIONS = array( +"_%n minute ago_::_%n minutes ago_" => array("",""), +"_%n hour ago_::_%n hours ago_" => array("",""), +"_%n day go_::_%n days ago_" => array("",""), +"_%n month ago_::_%n months ago_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/lib/l10n/es_PE.php b/lib/l10n/es_PE.php new file mode 100644 index 00000000000..15f78e0bce6 --- /dev/null +++ b/lib/l10n/es_PE.php @@ -0,0 +1,8 @@ +<?php +$TRANSLATIONS = array( +"_%n minute ago_::_%n minutes ago_" => array("",""), +"_%n hour ago_::_%n hours ago_" => array("",""), +"_%n day go_::_%n days ago_" => array("",""), +"_%n month ago_::_%n months ago_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/lib/l10n/es_UY.php b/lib/l10n/es_UY.php new file mode 100644 index 00000000000..15f78e0bce6 --- /dev/null +++ b/lib/l10n/es_UY.php @@ -0,0 +1,8 @@ +<?php +$TRANSLATIONS = array( +"_%n minute ago_::_%n minutes ago_" => array("",""), +"_%n hour ago_::_%n hours ago_" => array("",""), +"_%n day go_::_%n days ago_" => array("",""), +"_%n month ago_::_%n months ago_" => array("","") +); +$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/lib/l10n/fa.php b/lib/l10n/fa.php index c1c16cf94b4..11912269ba4 100644 --- a/lib/l10n/fa.php +++ b/lib/l10n/fa.php @@ -5,6 +5,8 @@ $TRANSLATIONS = array( "Settings" => "تنظیمات", "Users" => "کاربران", "Admin" => "مدیر", +"Unknown filetype" => "نوع فایل ناشناخته", +"Invalid image" => "عکس نامعتبر", "web services under your control" => "سرویس های تحت وب در کنترل شما", "ZIP download is turned off." => "دانلود به صورت فشرده غیر فعال است", "Files need to be downloaded one by one." => "فایل ها باید به صورت یکی یکی دانلود شوند", @@ -34,13 +36,13 @@ $TRANSLATIONS = array( "%s shared »%s« with you" => "%s به اشتراک گذاشته شده است »%s« توسط شما", "Could not find category \"%s\"" => "دسته بندی %s یافت نشد", "seconds ago" => "ثانیهها پیش", -"_%n minute ago_::_%n minutes ago_" => array(""), -"_%n hour ago_::_%n hours ago_" => array(""), +"_%n minute ago_::_%n minutes ago_" => array("%n دقیقه قبل"), +"_%n hour ago_::_%n hours ago_" => array("%n ساعت قبل"), "today" => "امروز", "yesterday" => "دیروز", -"_%n day go_::_%n days ago_" => array(""), +"_%n day go_::_%n days ago_" => array("%n روز قبل"), "last month" => "ماه قبل", -"_%n month ago_::_%n months ago_" => array(""), +"_%n month ago_::_%n months ago_" => array("%n ماه قبل"), "last year" => "سال قبل", "years ago" => "سالهای قبل", "A valid username must be provided" => "نام کاربری صحیح باید وارد شود", diff --git a/lib/l10n/gl.php b/lib/l10n/gl.php index 3a437ce442d..c4b74f9fdee 100644 --- a/lib/l10n/gl.php +++ b/lib/l10n/gl.php @@ -65,6 +65,7 @@ $TRANSLATIONS = array( "Sharing %s failed, because this item is already shared with %s" => "Fallou a compartición de %s, este elemento xa está compartido con %s", "Sharing %s failed, because the group %s does not exist" => "Fallou a compartición de %s, o grupo %s non existe", "Sharing %s failed, because %s is not a member of the group %s" => "Fallou a compartición de %s, %s non é membro do grupo %s", +"You need to provide a password to create a public link, only protected links are allowed" => "Ten que fornecer un contrasinal para a ligazón pública, só se permiten ligazóns protexidas", "Sharing %s failed, because sharing with links is not allowed" => "Fallou a compartición de %s, non está permitido compartir con ligazóns", "Share type %s is not valid for %s" => "Non se admite a compartición do tipo %s para %s", "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" => "Non é posíbel estabelecer permisos para %s, os permisos superan os permisos concedidos a %s", diff --git a/lib/l10n/it.php b/lib/l10n/it.php index db0f99a8de9..b6b5f00d974 100644 --- a/lib/l10n/it.php +++ b/lib/l10n/it.php @@ -65,6 +65,7 @@ $TRANSLATIONS = array( "Sharing %s failed, because this item is already shared with %s" => "Condivisione di %s non riuscita, poiché l'oggetto è già condiviso con %s", "Sharing %s failed, because the group %s does not exist" => "Condivisione di %s non riuscita, poiché il gruppo %s non esiste", "Sharing %s failed, because %s is not a member of the group %s" => "Condivisione di %s non riuscita, poiché %s non appartiene al gruppo %s", +"You need to provide a password to create a public link, only protected links are allowed" => "Devi fornire una password per creare un collegamento pubblico, sono consentiti solo i collegamenti protetti", "Sharing %s failed, because sharing with links is not allowed" => "Condivisione di %s non riuscita, poiché i collegamenti non sono consentiti", "Share type %s is not valid for %s" => "Il tipo di condivisione %s non è valido per %s", "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" => "Impostazione permessi per %s non riuscita, poiché i permessi superano i permessi accordati a %s", diff --git a/lib/l10n/ja.php b/lib/l10n/ja.php index ec5352242d5..19cdb5f13cd 100644 --- a/lib/l10n/ja.php +++ b/lib/l10n/ja.php @@ -1,6 +1,7 @@ <?php $TRANSLATIONS = array( "You are accessing the server from an untrusted domain." => "あなたはサーバに、信用が付与されていないドメインからアクセスしています。", +"Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." => "管理者に連絡してください。このサーバーの管理者の場合は、\"trusted_domain\" の設定を config/config.php に設定してください。config/config.sample.php にサンプルの設定方法が記載してあります。", "App \"%s\" can't be installed because it is not compatible with this version of ownCloud." => " \"%s\" アプリは、このバージョンのownCloudと互換性がないためインストールできません。", "No app name specified" => "アプリ名が未指定", "Help" => "ヘルプ", @@ -58,11 +59,24 @@ $TRANSLATIONS = array( "Please double check the <a href='%s'>installation guides</a>." => "<a href='%s'>インストールガイド</a>をよく確認してください。", "%s shared »%s« with you" => "%sが あなたと »%s«を共有しました", "Sharing %s failed, because the file does not exist" => "%s の共有に失敗しました。そのようなファイルは存在しないからです。", +"Sharing %s failed, because the user %s is the item owner" => "%s の共有に失敗しました。ユーザー %s がアイテム所有者です。", +"Sharing %s failed, because the user %s does not exist" => "%s の共有に失敗しました。ユーザー %s が存在しません。", +"Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" => "%s の共有に失敗しました。ユーザー %s はどのグループにも属していません。%s は、??のメンバーです。", +"Sharing %s failed, because this item is already shared with %s" => "%s の共有に失敗しました。このアイテムは既に %s で共有されています。", +"Sharing %s failed, because the group %s does not exist" => "%s の共有に失敗しました。グループ %s は存在しません。", +"Sharing %s failed, because %s is not a member of the group %s" => "%s の共有に失敗しました。%s は、グループ %s のメンバーではありません。", +"Sharing %s failed, because sharing with links is not allowed" => "%s の共有に失敗しました。リンクでの共有は許可されていません。", +"Share type %s is not valid for %s" => "%s の共有方法は、%s には適用できません。", +"Setting permissions for %s failed, because the permissions exceed permissions granted to %s" => "%s の権限設定に失敗しました。%s に許可されている権限を越えています。", +"Setting permissions for %s failed, because the item was not found" => "%s の権限設定に失敗しました。アイテムが存在しません。", +"Sharing backend %s must implement the interface OCP\\Share_Backend" => "%s のバックエンドの共有には、OCP\\Share_Backend インターフェースを実装しなければなりません。", "Sharing backend %s not found" => "共有バックエンド %s が見つかりません", "Sharing backend for %s not found" => "%s のための共有バックエンドが見つかりません", "Sharing %s failed, because the user %s is the original sharer" => "%s の共有に失敗しました。ユーザ %s が元々の共有者であるからです。", "Sharing %s failed, because the permissions exceed permissions granted to %s" => "%s の共有に失敗しました。%s に付与されている許可を超えているからです。", "Sharing %s failed, because resharing is not allowed" => "%s の共有に失敗しました。再共有が許されていないからです。", +"Sharing %s failed, because the sharing backend for %s could not find its source" => "%s の共有に失敗しました。%s のバックエンド共有に必要なソースが見つかりませんでした。", +"Sharing %s failed, because the file could not be found in the file cache" => "%s の共有に失敗しました。ファイルキャッシュにファイルがありませんでした。", "Could not find category \"%s\"" => "カテゴリ \"%s\" が見つかりませんでした", "seconds ago" => "数秒前", "_%n minute ago_::_%n minutes ago_" => array("%n 分前"), @@ -74,6 +88,7 @@ $TRANSLATIONS = array( "_%n month ago_::_%n months ago_" => array("%nヶ月前"), "last year" => "1年前", "years ago" => "年前", +"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" => "ユーザー名で利用できる文字列は、次のものです: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" => "有効なユーザー名を指定する必要があります", "A valid password must be provided" => "有効なパスワードを指定する必要があります", "The username is already being used" => "ユーザ名はすでに使われています" diff --git a/lib/l10n/ko.php b/lib/l10n/ko.php index 2c94ebdcc22..977a491ad74 100644 --- a/lib/l10n/ko.php +++ b/lib/l10n/ko.php @@ -31,6 +31,7 @@ $TRANSLATIONS = array( "Application is not enabled" => "앱이 활성화되지 않았습니다", "Authentication error" => "인증 오류", "Token expired. Please reload page." => "토큰이 만료되었습니다. 페이지를 새로 고치십시오.", +"Unknown user" => "알려지지 않은 사용자", "Files" => "파일", "Text" => "텍스트", "Images" => "그림", @@ -39,8 +40,13 @@ $TRANSLATIONS = array( "%s you may not use dots in the database name" => "%s 데이터베이스 이름에는 마침표를 사용할 수 없습니다", "MS SQL username and/or password not valid: %s" => "MS SQL 사용자 이름이나 암호가 잘못되었습니다: %s", "You need to enter either an existing account or the administrator." => "기존 계정이나 administrator(관리자)를 입력해야 합니다.", +"MySQL/MariaDB username and/or password not valid" => "MySQL/MariaDB 사용자 명 혹은 비밀번호가 일치하지 않습니다", "DB Error: \"%s\"" => "DB 오류: \"%s\"", "Offending command was: \"%s\"" => "잘못된 명령: \"%s\"", +"MySQL/MariaDB user '%s'@'localhost' exists already." => "MySQL/MariaDB '%s'@'localhost' 사용자가 이미 존재합니다", +"Drop this user from MySQL/MariaDB" => "MySQL/MariaDB에서 이 사용자 제거하기", +"MySQL/MariaDB user '%s'@'%%' already exists" => "MySQL/MariaDB '%s'@'%%' 사용자가 이미 존재합니다", +"Drop this user from MySQL/MariaDB." => "MySQL/MariaDB에서 이 사용자 제거하기", "Oracle connection could not be established" => "Oracle 연결을 수립할 수 없습니다.", "Oracle username and/or password not valid" => "Oracle 사용자 이름이나 암호가 잘못되었습니다.", "Offending command was: \"%s\", name: %s, password: %s" => "잘못된 명령: \"%s\", 이름: %s, 암호: %s", @@ -61,7 +67,9 @@ $TRANSLATIONS = array( "_%n month ago_::_%n months ago_" => array("%n달 전 "), "last year" => "작년", "years ago" => "년 전", +"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" => "사용자 명에는 다음과 같은 문자만 사용이 가능합니다: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"", "A valid username must be provided" => "올바른 사용자 이름을 입력해야 함", -"A valid password must be provided" => "올바른 암호를 입력해야 함" +"A valid password must be provided" => "올바른 암호를 입력해야 함", +"The username is already being used" => "이 사용자명은 현재 사용중입니다" ); $PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/lib/l10n/pt_BR.php b/lib/l10n/pt_BR.php index ddb6934357a..d86b6862256 100644 --- a/lib/l10n/pt_BR.php +++ b/lib/l10n/pt_BR.php @@ -65,6 +65,7 @@ $TRANSLATIONS = array( "Sharing %s failed, because this item is already shared with %s" => "Compartilhamento %s falhou, porque este ítem já está compartilhado com %s", "Sharing %s failed, because the group %s does not exist" => "Compartilhamento %s falhou, porque o grupo %s não existe", "Sharing %s failed, because %s is not a member of the group %s" => "Compartilhamento %s falhou, porque %s não é membro do grupo %s", +"You need to provide a password to create a public link, only protected links are allowed" => "Você precisa fornecer uma senha para criar um link público, apenas links protegidos são permitidos", "Sharing %s failed, because sharing with links is not allowed" => "Compartilhamento %s falhou, porque compartilhamento com links não é permitido", "Share type %s is not valid for %s" => "Tipo de compartilhamento %s não é válido para %s", "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" => "Definir permissões para %s falhou, porque as permissões excedem as permissões concedidas a %s", diff --git a/lib/l10n/pt_PT.php b/lib/l10n/pt_PT.php index 8b3c003678d..d2257afc7bb 100644 --- a/lib/l10n/pt_PT.php +++ b/lib/l10n/pt_PT.php @@ -40,8 +40,13 @@ $TRANSLATIONS = array( "%s you may not use dots in the database name" => "%s não é permitido utilizar pontos (.) no nome da base de dados", "MS SQL username and/or password not valid: %s" => "Nome de utilizador/password do MySQL é inválido: %s", "You need to enter either an existing account or the administrator." => "Precisa de introduzir uma conta existente ou de administrador", +"MySQL/MariaDB username and/or password not valid" => "Nome de utilizador/password do MySQL/Maria DB inválida", "DB Error: \"%s\"" => "Erro na BD: \"%s\"", "Offending command was: \"%s\"" => "O comando gerador de erro foi: \"%s\"", +"MySQL/MariaDB user '%s'@'localhost' exists already." => "O utilizador '%s'@'localhost' do MySQL/MariaDB já existe.", +"Drop this user from MySQL/MariaDB" => "Eliminar este utilizador do MySQL/MariaDB", +"MySQL/MariaDB user '%s'@'%%' already exists" => "O utilizador '%s'@'%%' do MySQL/MariaDB já existe", +"Drop this user from MySQL/MariaDB." => "Eliminar este utilizador do MySQL/MariaDB", "Oracle connection could not be established" => "Não foi possível estabelecer a ligação Oracle", "Oracle username and/or password not valid" => "Nome de utilizador/password do Oracle inválida", "Offending command was: \"%s\", name: %s, password: %s" => "O comando gerador de erro foi: \"%s\", nome: %s, password: %s", @@ -50,7 +55,9 @@ $TRANSLATIONS = array( "Set an admin password." => "Definiar uma password de administrador", "Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "O seu servidor web não está configurado correctamente para autorizar sincronização de ficheiros, pois o interface WebDAV parece estar com problemas.", "Please double check the <a href='%s'>installation guides</a>." => "Por favor verifique <a href='%s'>installation guides</a>.", -"%s shared »%s« with you" => "%s partilhado »%s« contigo", +"%s shared »%s« with you" => "%s partilhado »%s« consigo", +"Sharing %s failed, because the user %s is the item owner" => "A partilha %s falhou, porque o utilizador %s é o proprietário", +"Sharing %s failed, because the user %s does not exist" => "A partilha %s falhou, porque o utilizador %s nao existe", "Could not find category \"%s\"" => "Não foi encontrado a categoria \"%s\"", "seconds ago" => "Minutos atrás", "_%n minute ago_::_%n minutes ago_" => array("","%n minutos atrás"), @@ -62,7 +69,9 @@ $TRANSLATIONS = array( "_%n month ago_::_%n months ago_" => array("","%n meses atrás"), "last year" => "ano passado", "years ago" => "anos atrás", +"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" => "Apenas os seguintes caracteres são permitidos no nome de utilizador: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-\"", "A valid username must be provided" => "Um nome de utilizador válido deve ser fornecido", -"A valid password must be provided" => "Uma password válida deve ser fornecida" +"A valid password must be provided" => "Uma password válida deve ser fornecida", +"The username is already being used" => "O nome de utilizador já está a ser usado" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/lib/l10n/ru.php b/lib/l10n/ru.php index 2611fcf7a6b..38532d0b3bc 100644 --- a/lib/l10n/ru.php +++ b/lib/l10n/ru.php @@ -31,6 +31,7 @@ $TRANSLATIONS = array( "Application is not enabled" => "Приложение не разрешено", "Authentication error" => "Ошибка аутентификации", "Token expired. Please reload page." => "Токен просрочен. Перезагрузите страницу.", +"Unknown user" => "Неизвестный пользователь", "Files" => "Файлы", "Text" => "Текст", "Images" => "Изображения", @@ -39,8 +40,13 @@ $TRANSLATIONS = array( "%s you may not use dots in the database name" => "%s Вы не можете использовать точки в имени базы данных", "MS SQL username and/or password not valid: %s" => "Имя пользователя и/или пароль MS SQL не подходит: %s", "You need to enter either an existing account or the administrator." => "Вы должны войти или в существующий аккаунт или под администратором.", +"MySQL/MariaDB username and/or password not valid" => " Имя пользователя и/или пароль MySQL/MariaDB не действительны.", "DB Error: \"%s\"" => "Ошибка БД: \"%s\"", "Offending command was: \"%s\"" => "Вызываемая команда была: \"%s\"", +"MySQL/MariaDB user '%s'@'localhost' exists already." => "Пользователь MySQL '%s'@'localhost' уже существует.", +"Drop this user from MySQL/MariaDB" => "Удалить данного участника из MySQL/MariaDB", +"MySQL/MariaDB user '%s'@'%%' already exists" => "Пользователь MySQL '%s'@'%%' уже существует.", +"Drop this user from MySQL/MariaDB." => "Удалить данного участника из MySQL/MariaDB.", "Oracle connection could not be established" => "соединение с Oracle не может быть установлено", "Oracle username and/or password not valid" => "Неверное имя пользователя и/или пароль Oracle", "Offending command was: \"%s\", name: %s, password: %s" => "Вызываемая команда была: \"%s\", имя: %s, пароль: %s", @@ -50,6 +56,15 @@ $TRANSLATIONS = array( "Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Ваш веб сервер до сих пор не настроен правильно для возможности синхронизации файлов, похоже что проблема в неисправности интерфейса WebDAV.", "Please double check the <a href='%s'>installation guides</a>." => "Пожалуйста, дважды просмотрите <a href='%s'>инструкции по установке</a>.", "%s shared »%s« with you" => "%s поделился »%s« с вами", +"Sharing %s failed, because the user %s is the item owner" => "Не удалось установить общий доступ для %s, пользователь %s уже является владельцем", +"Sharing %s failed, because the user %s does not exist" => "Не удалось установить общий доступ для %s, пользователь %s не существует.", +"Sharing %s failed, because this item is already shared with %s" => "Не удалось установить общий доступ для %s ,в виду того что, объект уже находиться в общем доступе с %s", +"Sharing %s failed, because the group %s does not exist" => "Не удалось установить общий доступ для %s, группа %s не существует.", +"Sharing %s failed, because %s is not a member of the group %s" => "Не удалось установить общий доступ для %s, %s не является членом группы %s", +"Sharing %s failed, because sharing with links is not allowed" => "Не удалось установить общий доступ для %s, потому что обмен со ссылками не допускается", +"Share type %s is not valid for %s" => "Такой втд общего доступа как %s не допустим для %s", +"Setting permissions for %s failed, because the permissions exceed permissions granted to %s" => "Настройка прав доступа для %s невозможна, поскольку права доступа превышают предоставленные права доступа %s", +"Setting permissions for %s failed, because the item was not found" => "Не удалось произвести настройку прав доступа для %s , элемент не был найден.", "Could not find category \"%s\"" => "Категория \"%s\" не найдена", "seconds ago" => "несколько секунд назад", "_%n minute ago_::_%n minutes ago_" => array("%n минута назад","%n минуты назад","%n минут назад"), @@ -61,7 +76,9 @@ $TRANSLATIONS = array( "_%n month ago_::_%n months ago_" => array("%n месяц назад","%n месяца назад","%n месяцев назад"), "last year" => "в прошлом году", "years ago" => "несколько лет назад", +"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" => "Только следующие символы допускаются в имени пользователя: \"a-z\", \"A-Z\", \"0-9\", и \"_.@-\"", "A valid username must be provided" => "Укажите правильное имя пользователя", -"A valid password must be provided" => "Укажите валидный пароль" +"A valid password must be provided" => "Укажите валидный пароль", +"The username is already being used" => "Имя пользователя уже используется" ); $PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"; diff --git a/lib/l10n/sl.php b/lib/l10n/sl.php index eeaa0ddf96b..083f966ded4 100644 --- a/lib/l10n/sl.php +++ b/lib/l10n/sl.php @@ -56,6 +56,7 @@ $TRANSLATIONS = array( "Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Spletni stražnik še ni ustrezno nastavljen in ne omogoča usklajevanja, saj je nastavitev WebDAV okvarjena.", "Please double check the <a href='%s'>installation guides</a>." => "Preverite <a href='%s'>navodila namestitve</a>.", "%s shared »%s« with you" => "%s je omogočil souporabo »%s«", +"Sharing %s failed, because the file does not exist" => "Souporaba %s je spodletela, ker ta datoteka ne obstaja", "Sharing %s failed, because the user %s is the item owner" => "Nastavljanje souporabe %s je spodletelo, ker je uporabnik %s lastnik predmeta.", "Sharing %s failed, because the user %s does not exist" => "Nastavljanje souporabe %s je spodletelo, ker uporabnik %s ne obstaja.", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" => "Nastavljanje souporabe %s je spodletelo, ker uporabnik %s ni član nobene skupine, v kateri je tudi uporabnik %s.", diff --git a/lib/l10n/sv.php b/lib/l10n/sv.php index ba63531ad76..799aa3dea47 100644 --- a/lib/l10n/sv.php +++ b/lib/l10n/sv.php @@ -1,5 +1,6 @@ <?php $TRANSLATIONS = array( +"You are accessing the server from an untrusted domain." => "Du ansluter till servern från en osäker domän.", "App \"%s\" can't be installed because it is not compatible with this version of ownCloud." => "Appen \"%s\" kan inte installeras eftersom att den inte är kompatibel med denna version av ownCloud.", "No app name specified" => "Inget appnamn angivet", "Help" => "Hjälp", @@ -56,6 +57,7 @@ $TRANSLATIONS = array( "Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Din webbserver är inte korrekt konfigurerad för att tillåta filsynkronisering eftersom WebDAV inte verkar fungera.", "Please double check the <a href='%s'>installation guides</a>." => "Var god kontrollera <a href='%s'>installationsguiden</a>.", "%s shared »%s« with you" => "%s delade »%s« med dig", +"Sharing %s failed, because the file does not exist" => "Delning av %s misslyckades på grund av att filen inte existerar", "Sharing %s failed, because the user %s is the item owner" => "Delning %s misslyckades därför att användaren %s är den som äger objektet", "Sharing %s failed, because the user %s does not exist" => "Delning %s misslyckades därför att användaren %s inte existerar", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" => "Delning %s misslyckades därför att användaren %s inte är medlem i någon utav de grupper som %s är medlem i", diff --git a/lib/l10n/tr.php b/lib/l10n/tr.php index 3ff2a70bdef..1a188dd4073 100644 --- a/lib/l10n/tr.php +++ b/lib/l10n/tr.php @@ -65,6 +65,7 @@ $TRANSLATIONS = array( "Sharing %s failed, because this item is already shared with %s" => "%s paylaşımı, %s ile zaten paylaşıldığından dolayı başarısız oldu", "Sharing %s failed, because the group %s does not exist" => "%s paylaşımı, %s grubu mevcut olmadığından başarısız oldu", "Sharing %s failed, because %s is not a member of the group %s" => "%s paylaşımı, %s kullanıcısı %s grup üyesi olmadığından başarısız oldu", +"You need to provide a password to create a public link, only protected links are allowed" => "Herkese açık bir bağlantı oluşturmak için bir parola belirtmeniz gerekiyor. Sadece korunmuş bağlantılara izin verilmektedir", "Sharing %s failed, because sharing with links is not allowed" => "%s paylaşımı, bağlantılar ile paylaşım izin verilmediğinden başarısız oldu", "Share type %s is not valid for %s" => "%s paylaşım türü %s için geçerli değil", "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" => "%s için izinler, izinler %s için verilen izinleri aştığından dolayı ayarlanamadı", diff --git a/lib/l10n/ur_PK.php b/lib/l10n/ur_PK.php index 7dc967ccd93..351e3fae14f 100644 --- a/lib/l10n/ur_PK.php +++ b/lib/l10n/ur_PK.php @@ -5,10 +5,18 @@ $TRANSLATIONS = array( "Settings" => "سیٹینگز", "Users" => "یوزرز", "Admin" => "ایڈمن", +"Unknown filetype" => "غیر معرروف قسم کی فائل", +"Invalid image" => "غلط تصویر", "web services under your control" => "آپ کے اختیار میں ویب سروسیز", +"seconds ago" => "سیکنڈز پہلے", "_%n minute ago_::_%n minutes ago_" => array("",""), "_%n hour ago_::_%n hours ago_" => array("",""), +"today" => "آج", +"yesterday" => "کل", "_%n day go_::_%n days ago_" => array("",""), -"_%n month ago_::_%n months ago_" => array("","") +"last month" => "پچھلے مہنیے", +"_%n month ago_::_%n months ago_" => array("",""), +"last year" => "پچھلے سال", +"years ago" => "سالوں پہلے" ); $PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/lib/l10n/zh_CN.php b/lib/l10n/zh_CN.php index 8fca52f3dbd..c5261a6aff0 100644 --- a/lib/l10n/zh_CN.php +++ b/lib/l10n/zh_CN.php @@ -1,5 +1,8 @@ <?php $TRANSLATIONS = array( +"You are accessing the server from an untrusted domain." => "您正在访问来自不信任域名的服务器。", +"App \"%s\" can't be installed because it is not compatible with this version of ownCloud." => "App “%s” 无法安装,因为它和当前 ownCloud 版本不兼容。", +"No app name specified" => "没有指定的 App 名称", "Help" => "帮助", "Personal" => "个人", "Settings" => "设置", @@ -13,12 +16,23 @@ $TRANSLATIONS = array( "Files need to be downloaded one by one." => "需要逐一下载文件", "Back to Files" => "回到文件", "Selected files too large to generate zip file." => "选择的文件太大,无法生成 zip 文件。", +"Please download the files separately in smaller chunks or kindly ask your administrator." => "请用较小的分块下载文件或者友好地询问您的管理员。", +"No source specified when installing app" => "安装 App 时未指定来源", +"No href specified when installing app from http" => "从 http 安装 App 时未指定链接", +"No path specified when installing app from local file" => "从本地文件安装 App 时未指定路径", +"Archives of type %s are not supported" => "不支持 %s 的压缩格式", +"Failed to open archive when installing app" => "安装 App 是打开归档失败", "App does not provide an info.xml file" => "应用未提供 info.xml 文件", +"App can't be installed because of not allowed code in the App" => "App 无法安装,因为 App 中有非法代码 ", +"App can't be installed because it is not compatible with this version of ownCloud" => "App 无法安装,因为和当前 ownCloud 版本不兼容", +"App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" => "App 无法安装,因为 App 包含不允许在非内置 App 中使用的 <shipped>true</shipped> 标签", +"App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" => "App 无法安装因为 info.xml/version 中的版本和 App 商店版本不同", "App directory already exists" => "应用程序目录已存在", "Can't create app folder. Please fix permissions. %s" => "无法创建应用程序文件夹。请修正权限。%s", "Application is not enabled" => "应用程序未启用", "Authentication error" => "认证出错", "Token expired. Please reload page." => "Token 过期,请刷新页面。", +"Unknown user" => "未知用户", "Files" => "文件", "Text" => "文本", "Images" => "图片", @@ -27,8 +41,13 @@ $TRANSLATIONS = array( "%s you may not use dots in the database name" => "%s 您不能在数据库名称中使用英文句号。", "MS SQL username and/or password not valid: %s" => "MS SQL 用户名和/或密码无效:%s", "You need to enter either an existing account or the administrator." => "你需要输入一个数据库中已有的账户或管理员账户。", +"MySQL/MariaDB username and/or password not valid" => "MySQL/MariaDB 数据库用户名和/或密码无效", "DB Error: \"%s\"" => "数据库错误:\"%s\"", "Offending command was: \"%s\"" => "冲突命令为:\"%s\"", +"MySQL/MariaDB user '%s'@'localhost' exists already." => "MySQL/MariaDB 用户 '%s'@'localhost' 已存在。", +"Drop this user from MySQL/MariaDB" => "建议从 MySQL/MariaDB 数据库中删除此用户", +"MySQL/MariaDB user '%s'@'%%' already exists" => "MySQL/MariaDB 用户 '%s'@'%%' 已存在", +"Drop this user from MySQL/MariaDB." => "建议从 MySQL/MariaDB 数据库中删除此用户。", "Oracle connection could not be established" => "不能建立甲骨文连接", "Oracle username and/or password not valid" => "Oracle 数据库用户名和/或密码无效", "Offending command was: \"%s\", name: %s, password: %s" => "冲突命令为:\"%s\",名称:%s,密码:%s", @@ -38,6 +57,25 @@ $TRANSLATIONS = array( "Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "您的Web服务器尚未正确设置以允许文件同步, 因为WebDAV的接口似乎已损坏.", "Please double check the <a href='%s'>installation guides</a>." => "请认真检查<a href='%s'>安装指南</a>.", "%s shared »%s« with you" => "%s 向您分享了 »%s«", +"Sharing %s failed, because the file does not exist" => "共享 %s 失败,因为文件不存在。", +"Sharing %s failed, because the user %s is the item owner" => "共享 %s 失败,因为用户 %s 是对象的拥有者", +"Sharing %s failed, because the user %s does not exist" => "共享 %s 失败,因为用户 %s 不存在", +"Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" => "共享 %s 失败,因为用户 %s 不是 %s 所属的任何组的用户", +"Sharing %s failed, because this item is already shared with %s" => "共享 %s 失败,因为它已经共享给 %s", +"Sharing %s failed, because the group %s does not exist" => "共享 %s 失败,因为 %s 组不存在", +"Sharing %s failed, because %s is not a member of the group %s" => "共享 %s 失败,因为 %s 不是 %s 组的成员", +"Sharing %s failed, because sharing with links is not allowed" => "共享 %s 失败,因为不允许用链接共享", +"Share type %s is not valid for %s" => "%s 不是 %s 的合法共享类型", +"Setting permissions for %s failed, because the permissions exceed permissions granted to %s" => "设置 %s 权限失败,因为权限超出了 %s 已有权限。", +"Setting permissions for %s failed, because the item was not found" => "设置 %s 的权限失败,因为未找到到对应项", +"Sharing backend %s must implement the interface OCP\\Share_Backend" => "共享后端 %s 必须实现 OCP\\Share_Backend 接口", +"Sharing backend %s not found" => "未找到共享后端 %s", +"Sharing backend for %s not found" => "%s 的共享后端未找到", +"Sharing %s failed, because the user %s is the original sharer" => "共享 %s 失败,因为用户 %s 不是原始共享者", +"Sharing %s failed, because the permissions exceed permissions granted to %s" => "共享 %s 失败,因为权限超过了 %s 已有权限", +"Sharing %s failed, because resharing is not allowed" => "共享 %s 失败,因为不允许二次共享", +"Sharing %s failed, because the sharing backend for %s could not find its source" => "共享 %s 失败,因为 %s 使用的共享后端未找到它的来源", +"Sharing %s failed, because the file could not be found in the file cache" => "共享 %s 失败,因为未在文件缓存中找到文件。", "Could not find category \"%s\"" => "无法找到分类 \"%s\"", "seconds ago" => "秒前", "_%n minute ago_::_%n minutes ago_" => array("%n 分钟前"), @@ -49,7 +87,9 @@ $TRANSLATIONS = array( "_%n month ago_::_%n months ago_" => array("%n 月前"), "last year" => "去年", "years ago" => "年前", +"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" => "用户名只允许使用以下字符:“a-z”,“A-Z”,“0-9”,和“_.@-”", "A valid username must be provided" => "必须提供合法的用户名", -"A valid password must be provided" => "必须提供合法的密码" +"A valid password must be provided" => "必须提供合法的密码", +"The username is already being used" => "用户名已被使用" ); $PLURAL_FORMS = "nplurals=1; plural=0;"; diff --git a/lib/private/app.php b/lib/private/app.php index 2f55b54b328..575cc9f41af 100644 --- a/lib/private/app.php +++ b/lib/private/app.php @@ -37,7 +37,7 @@ class OC_App{ static private $altLogin = array(); /** - * @brief clean the appid + * clean the appid * @param string|boolean $app Appid that needs to be cleaned * @return string */ @@ -46,7 +46,7 @@ class OC_App{ } /** - * @brief loads all apps + * loads all apps * @param array $types * @return bool * @@ -187,7 +187,7 @@ class OC_App{ } /** - * @brief checks whether or not an app is enabled + * checks whether or not an app is enabled * @param string $app app * @return bool * @@ -202,7 +202,7 @@ class OC_App{ } /** - * @brief enables an app + * enables an app * @param mixed $app app * @throws \Exception * @return void @@ -250,7 +250,7 @@ class OC_App{ } /** - * @brief disables an app + * disables an app * @param string $app app * @return boolean|null * @@ -269,7 +269,7 @@ class OC_App{ } /** - * @brief adds an entry to the navigation + * adds an entry to the navigation * @param array $data array containing the data * @return bool * @@ -291,7 +291,7 @@ class OC_App{ } /** - * @brief marks a navigation entry as active + * marks a navigation entry as active * @param string $id id of the entry * @return bool * @@ -305,9 +305,9 @@ class OC_App{ } /** - * @brief Get the navigation entries for the $app + * Get the navigation entries for the $app * @param string $app app - * @return array of the $data added with addNavigationEntry + * @return array an array of the $data added with addNavigationEntry * * Warning: destroys the existing entries */ @@ -321,7 +321,7 @@ class OC_App{ } /** - * @brief gets the active Menu entry + * gets the active Menu entry * @return string id or empty string * * This function returns the id of the active navigation entry (set by @@ -332,7 +332,7 @@ class OC_App{ } /** - * @brief Returns the Settings Navigation + * Returns the Settings Navigation * @return string * * This function returns an array containing all settings pages added. The @@ -500,7 +500,7 @@ class OC_App{ } /** - * @brief Read all app metadata from the info.xml file + * Read all app metadata from the info.xml file * @param string $appid id of the app or the path of the info.xml file * @param boolean $path (optional) * @return array @@ -567,7 +567,7 @@ class OC_App{ } /** - * @brief Returns the navigation + * Returns the navigation * @return array * * This function returns an array containing all entries added. The @@ -659,8 +659,8 @@ class OC_App{ } /** - * @brief: get a list of all apps in the apps folder - * @return array or app names (string IDs) + * get a list of all apps in the apps folder + * @return array an array of app names (string IDs) * @todo: change the name of this method to getInstalledApps, which is more accurate */ public static function getAllApps() { @@ -692,7 +692,7 @@ class OC_App{ } /** - * @brief: Lists all apps, this is used in apps.php + * Lists all apps, this is used in apps.php * @return array */ public static function listAllApps() { @@ -766,7 +766,7 @@ class OC_App{ } /** - * @brief: Internal custom sort funtion to bring the app into the right order. Should only be called by listAllApps + * Internal custom sort funtion to bring the app into the right order. Should only be called by listAllApps * @return array */ private static function customSort($a, $b) { @@ -796,7 +796,7 @@ class OC_App{ } /** - * @brief: get a list of all apps on apps.owncloud.com + * get a list of all apps on apps.owncloud.com * @return array, multi-dimensional array of apps. * Keys: id, name, type, typename, personid, license, detailpage, preview, changed, description */ diff --git a/lib/private/appconfig.php b/lib/private/appconfig.php index 0cd6b3bc35b..e2a961b1d6d 100644 --- a/lib/private/appconfig.php +++ b/lib/private/appconfig.php @@ -89,8 +89,8 @@ class AppConfig implements \OCP\IAppConfig { } /** - * @brief Get all apps using the config - * @return array with app ids + * Get all apps using the config + * @return array an array of app ids * * This function returns a list of all apps that have at least one * entry in the appconfig table. @@ -107,9 +107,9 @@ class AppConfig implements \OCP\IAppConfig { } /** - * @brief Get the available keys for an app + * Get the available keys for an app * @param string $app the app we are looking for - * @return array with key names + * @return array an array of key names * * This function gets all keys of an app. Please note that the values are * not returned. @@ -122,7 +122,7 @@ class AppConfig implements \OCP\IAppConfig { } /** - * @brief Gets the config value + * Gets the config value * @param string $app app * @param string $key key * @param string $default = null, default value if the key does not exist @@ -141,7 +141,7 @@ class AppConfig implements \OCP\IAppConfig { } /** - * @brief check if a key is set in the appconfig + * check if a key is set in the appconfig * @param string $app * @param string $key * @return bool @@ -152,7 +152,7 @@ class AppConfig implements \OCP\IAppConfig { } /** - * @brief sets a value in the appconfig + * sets a value in the appconfig * @param string $app app * @param string $key key * @param string $value value @@ -185,7 +185,7 @@ class AppConfig implements \OCP\IAppConfig { } /** - * @brief Deletes a key + * Deletes a key * @param string $app app * @param string $key key * @return boolean|null @@ -202,7 +202,7 @@ class AppConfig implements \OCP\IAppConfig { } /** - * @brief Remove app from appconfig + * Remove app from appconfig * @param string $app app * @return boolean|null * diff --git a/lib/private/appframework/app.php b/lib/private/appframework/app.php index 3b13194862d..baf52d02054 100644 --- a/lib/private/appframework/app.php +++ b/lib/private/appframework/app.php @@ -4,7 +4,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE diff --git a/lib/private/appframework/core/api.php b/lib/private/appframework/core/api.php index e7269373bb0..ba6b9f95cb2 100644 --- a/lib/private/appframework/core/api.php +++ b/lib/private/appframework/core/api.php @@ -4,7 +4,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -119,7 +119,7 @@ class API implements IApi{ } /** - * @brief connects a function to a hook + * connects a function to a hook * @param string $signalClass class name of emitter * @param string $signalName name of signal * @param string $slotClass class name of slot @@ -133,10 +133,10 @@ class API implements IApi{ } /** - * @brief Emits a signal. To get data from the slot use references! + * Emits a signal. To get data from the slot use references! * @param string $signalClass class name of emitter * @param string $signalName name of signal - * @param array $params defautl: array() array with additional data + * @param array $params default: array() array with additional data * @return bool, true if slots exists or false if not */ public function emitHook($signalClass, $signalName, $params = array()) { @@ -144,7 +144,7 @@ class API implements IApi{ } /** - * @brief clear hooks + * clear hooks * @param string $signalClass * @param string $signalName */ diff --git a/lib/private/appframework/db/db.php b/lib/private/appframework/db/db.php new file mode 100644 index 00000000000..fc77a38f814 --- /dev/null +++ b/lib/private/appframework/db/db.php @@ -0,0 +1,57 @@ +<?php + +/** + * ownCloud - App Framework + * + * @author Bernhard Posselt + * @copyright 2012 Bernhard Posselt dev@bernhard-posselt.com + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OC\AppFramework\Db; + +use \OCP\IDb; + + +/** + * Small Facade for being able to inject the database connection for tests + */ +class Db implements IDb { + + + /** + * Used to abstract the owncloud database access away + * @param string $sql the sql query with ? placeholder for params + * @param int $limit the maximum number of rows + * @param int $offset from which row we want to start + * @return \OC_DB_StatementWrapper prepared SQL query + */ + public function prepareQuery($sql, $limit=null, $offset=null){ + return \OCP\DB::prepare($sql, $limit, $offset); + } + + + /** + * Used to get the id of the just inserted element + * @param string $tableName the name of the table where we inserted the item + * @return int the id of the inserted element + */ + public function getInsertId($tableName){ + return \OCP\DB::insertid($tableName); + } + + +} diff --git a/lib/private/appframework/dependencyinjection/dicontainer.php b/lib/private/appframework/dependencyinjection/dicontainer.php index e478225a53d..ee492b8a9e5 100644 --- a/lib/private/appframework/dependencyinjection/dicontainer.php +++ b/lib/private/appframework/dependencyinjection/dicontainer.php @@ -4,7 +4,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -30,8 +30,10 @@ use OC\AppFramework\Http\Dispatcher; use OC\AppFramework\Core\API; use OC\AppFramework\Middleware\MiddlewareDispatcher; use OC\AppFramework\Middleware\Security\SecurityMiddleware; +use OC\AppFramework\Middleware\Security\CORSMiddleware; use OC\AppFramework\Utility\SimpleContainer; use OC\AppFramework\Utility\TimeFactory; +use OC\AppFramework\Utility\ControllerMethodReflector; use OCP\AppFramework\IApi; use OCP\AppFramework\IAppContainer; use OCP\AppFramework\Middleware; @@ -80,7 +82,12 @@ class DIContainer extends SimpleContainer implements IAppContainer{ }); $this['Dispatcher'] = $this->share(function($c) { - return new Dispatcher($c['Protocol'], $c['MiddlewareDispatcher']); + return new Dispatcher( + $c['Protocol'], + $c['MiddlewareDispatcher'], + $c['ControllerMethodReflector'], + $c['Request'] + ); }); @@ -89,13 +96,25 @@ class DIContainer extends SimpleContainer implements IAppContainer{ */ $app = $this; $this['SecurityMiddleware'] = $this->share(function($c) use ($app){ - return new SecurityMiddleware($app, $c['Request']); + return new SecurityMiddleware( + $app, + $c['Request'], + $c['ControllerMethodReflector'] + ); + }); + + $this['CORSMiddleware'] = $this->share(function($c) { + return new CORSMiddleware( + $c['Request'], + $c['ControllerMethodReflector'] + ); }); $middleWares = &$this->middleWares; $this['MiddlewareDispatcher'] = $this->share(function($c) use (&$middleWares) { $dispatcher = new MiddlewareDispatcher(); $dispatcher->registerMiddleware($c['SecurityMiddleware']); + $dispatcher->registerMiddleware($c['CORSMiddleware']); foreach($middleWares as $middleWare) { $dispatcher->registerMiddleware($c[$middleWare]); @@ -112,6 +131,9 @@ class DIContainer extends SimpleContainer implements IAppContainer{ return new TimeFactory(); }); + $this['ControllerMethodReflector'] = $this->share(function($c) { + return new ControllerMethodReflector(); + }); } @@ -168,8 +190,8 @@ class DIContainer extends SimpleContainer implements IAppContainer{ } /** - * @param $message - * @param $level + * @param string $message + * @param string $level * @return mixed */ function log($message, $level) { diff --git a/lib/private/appframework/http.php b/lib/private/appframework/http.php index 65d926105f1..2b1387af715 100644 --- a/lib/private/appframework/http.php +++ b/lib/private/appframework/http.php @@ -4,7 +4,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt, Thomas Tanghus, Bart Visscher - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -33,7 +33,7 @@ class Http extends BaseHttp { protected $headers; /** - * @param $_SERVER $server + * @param array $server $_SERVER * @param string $protocolVersion the http version to use defaults to HTTP/1.1 */ public function __construct($server, $protocolVersion='HTTP/1.1') { diff --git a/lib/private/appframework/http/dispatcher.php b/lib/private/appframework/http/dispatcher.php index a2afb53f0fa..442e33ee726 100644 --- a/lib/private/appframework/http/dispatcher.php +++ b/lib/private/appframework/http/dispatcher.php @@ -4,7 +4,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt, Thomas Tanghus, Bart Visscher - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -26,7 +26,11 @@ namespace OC\AppFramework\Http; use \OC\AppFramework\Middleware\MiddlewareDispatcher; use \OC\AppFramework\Http; +use \OC\AppFramework\Utility\ControllerMethodReflector; + use OCP\AppFramework\Controller; +use OCP\AppFramework\Http\Response; +use OCP\IRequest; /** @@ -36,17 +40,25 @@ class Dispatcher { private $middlewareDispatcher; private $protocol; - + private $reflector; + private $request; /** * @param Http $protocol the http protocol with contains all status headers * @param MiddlewareDispatcher $middlewareDispatcher the dispatcher which * runs the middleware + * @param ControllerMethodReflector the reflector that is used to inject + * the arguments for the controller + * @param IRequest $request the incoming request */ public function __construct(Http $protocol, - MiddlewareDispatcher $middlewareDispatcher) { + MiddlewareDispatcher $middlewareDispatcher, + ControllerMethodReflector $reflector, + IRequest $request) { $this->protocol = $protocol; $this->middlewareDispatcher = $middlewareDispatcher; + $this->reflector = $reflector; + $this->request = $request; } @@ -63,10 +75,13 @@ class Dispatcher { $out = array(null, array(), null); try { + // prefill reflector with everything thats needed for the + // middlewares + $this->reflector->reflect($controller, $methodName); $this->middlewareDispatcher->beforeController($controller, $methodName); - $response = $controller->$methodName(); + $response = $this->executeController($controller, $methodName); // if an exception appears, the middleware checks if it can handle the // exception and creates a response. If no response is created, it is @@ -98,4 +113,70 @@ class Dispatcher { } + /** + * Uses the reflected parameters, types and request parameters to execute + * the controller + * @param Controller $controller the controller to be executed + * @param string $methodName the method on the controller that should be executed + * @return Response + */ + private function executeController($controller, $methodName) { + $arguments = array(); + + // valid types that will be casted + $types = array('int', 'integer', 'bool', 'boolean', 'float'); + + foreach($this->reflector->getParameters() as $param => $default) { + + // try to get the parameter from the request object and cast + // it to the type annotated in the @param annotation + $value = $this->request->getParam($param, $default); + $type = $this->reflector->getType($param); + + // if this is submitted using GET or a POST form, 'false' should be + // converted to false + if(($type === 'bool' || $type === 'boolean') && + $value === 'false' && + ( + $this->request->method === 'GET' || + strpos($this->request->getHeader('Content-Type'), + 'application/x-www-form-urlencoded') !== false + ) + ) { + $value = false; + + } elseif(in_array($type, $types)) { + settype($value, $type); + } + + $arguments[] = $value; + } + + $response = call_user_func_array(array($controller, $methodName), $arguments); + + // format response if not of type response + if(!($response instanceof Response)) { + + // get format from the url format or request format parameter + $format = $this->request->getParam('format'); + + // if none is given try the first Accept header + if($format === null) { + $header = $this->request->getHeader('Accept'); + $formats = explode(',', $header); + + if($header !== null && count($formats) > 0) { + $accept = strtolower(trim($formats[0])); + $format = str_replace('application/', '', $accept); + } else { + $format = 'json'; + } + } + + $response = $controller->buildResponse($response, $format); + } + + return $response; + } + } diff --git a/lib/private/appframework/http/request.php b/lib/private/appframework/http/request.php index 643fa685adc..8b68ca486ff 100644 --- a/lib/private/appframework/http/request.php +++ b/lib/private/appframework/http/request.php @@ -3,7 +3,9 @@ * ownCloud - Request * * @author Thomas Tanghus + * @author Bernhard Posselt * @copyright 2013 Thomas Tanghus (thomas@tanghus.net) + * @copyright 2014 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE diff --git a/lib/private/appframework/middleware/middlewaredispatcher.php b/lib/private/appframework/middleware/middlewaredispatcher.php index 598743e523f..dcb63a8e552 100644 --- a/lib/private/appframework/middleware/middlewaredispatcher.php +++ b/lib/private/appframework/middleware/middlewaredispatcher.php @@ -4,7 +4,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE diff --git a/lib/private/appframework/middleware/security/corsmiddleware.php b/lib/private/appframework/middleware/security/corsmiddleware.php new file mode 100644 index 00000000000..dca3996ea2e --- /dev/null +++ b/lib/private/appframework/middleware/security/corsmiddleware.php @@ -0,0 +1,75 @@ +<?php +/** + * ownCloud - App Framework + * + * This file is licensed under the Affero General Public License version 3 or + * later. See the COPYING file. + * + * @author Bernhard Posselt <dev@bernhard-posselt.com> + * @copyright Bernhard Posselt 2014 + */ + +namespace OC\AppFramework\Middleware\Security; + +use OC\AppFramework\Utility\ControllerMethodReflector; +use OCP\IRequest; +use OCP\AppFramework\Http\Response; +use OCP\AppFramework\Middleware; + +/** + * This middleware sets the correct CORS headers on a response if the + * controller has the @CORS annotation. This is needed for webapps that want + * to access an API and dont run on the same domain, see + * https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS + */ +class CORSMiddleware extends Middleware { + + private $request; + private $reflector; + + /** + * @param IRequest $request + * @param ControllerMethodReflector $reflector + */ + public function __construct(IRequest $request, + ControllerMethodReflector $reflector) { + $this->request = $request; + $this->reflector = $reflector; + } + + + /** + * This is being run after a successful controllermethod call and allows + * the manipulation of a Response object. The middleware is run in reverse order + * + * @param Controller $controller the controller that is being called + * @param string $methodName the name of the method that will be called on + * the controller + * @param Response $response the generated response from the controller + * @return Response a Response object + */ + public function afterController($controller, $methodName, Response $response){ + // only react if its a CORS request and if the request sends origin and + + if(isset($this->request->server['HTTP_ORIGIN']) && + $this->reflector->hasAnnotation('CORS')) { + + // allow credentials headers must not be true or CSRF is possible + // otherwise + foreach($response->getHeaders() as $header => $value ) { + if(strtolower($header) === 'access-control-allow-credentials' && + strtolower(trim($value)) === 'true') { + $msg = 'Access-Control-Allow-Credentials must not be '. + 'set to true in order to prevent CSRF'; + throw new SecurityException($msg); + } + } + + $origin = $this->request->server['HTTP_ORIGIN']; + $response->addHeader('Access-Control-Allow-Origin', $origin); + } + return $response; + } + + +} diff --git a/lib/private/appframework/middleware/security/securityexception.php b/lib/private/appframework/middleware/security/securityexception.php index e551675acdf..df37d5e3275 100644 --- a/lib/private/appframework/middleware/security/securityexception.php +++ b/lib/private/appframework/middleware/security/securityexception.php @@ -4,7 +4,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE diff --git a/lib/private/appframework/middleware/security/securitymiddleware.php b/lib/private/appframework/middleware/security/securitymiddleware.php index 0f160d224ad..d7e398fe445 100644 --- a/lib/private/appframework/middleware/security/securitymiddleware.php +++ b/lib/private/appframework/middleware/security/securitymiddleware.php @@ -4,7 +4,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -25,7 +25,7 @@ namespace OC\AppFramework\Middleware\Security; use OC\AppFramework\Http; -use OC\AppFramework\Utility\MethodAnnotationReader; +use OC\AppFramework\Utility\ControllerMethodReflector; use OCP\AppFramework\Http\RedirectResponse; use OCP\AppFramework\Middleware; use OCP\AppFramework\Http\Response; @@ -53,12 +53,20 @@ class SecurityMiddleware extends Middleware { private $request; /** + * @var OC\AppFramework\Utility\ControllerMethodReflector + */ + private $reflector; + + /** * @param IAppContainer $app * @param IRequest $request + * @param ControllerMethodReflector $reflector */ - public function __construct(IAppContainer $app, IRequest $request){ + public function __construct(IAppContainer $app, IRequest $request, + ControllerMethodReflector $reflector){ $this->app = $app; $this->request = $request; + $this->reflector = $reflector; } @@ -72,28 +80,25 @@ class SecurityMiddleware extends Middleware { */ public function beforeController($controller, $methodName){ - // get annotations from comments - $annotationReader = new MethodAnnotationReader($controller, $methodName); - // this will set the current navigation entry of the app, use this only // for normal HTML requests and not for AJAX requests $this->app->getServer()->getNavigationManager()->setActiveEntry($this->app->getAppName()); // security checks - $isPublicPage = $annotationReader->hasAnnotation('PublicPage'); + $isPublicPage = $this->reflector->hasAnnotation('PublicPage'); if(!$isPublicPage) { if(!$this->app->isLoggedIn()) { throw new SecurityException('Current user is not logged in', Http::STATUS_UNAUTHORIZED); } - if(!$annotationReader->hasAnnotation('NoAdminRequired')) { + if(!$this->reflector->hasAnnotation('NoAdminRequired')) { if(!$this->app->isAdminUser()) { throw new SecurityException('Logged in user must be an admin', Http::STATUS_FORBIDDEN); } } } - if(!$annotationReader->hasAnnotation('NoCSRFRequired')) { + if(!$this->reflector->hasAnnotation('NoCSRFRequired')) { if(!$this->request->passesCSRFCheck()) { throw new SecurityException('CSRF check failed', Http::STATUS_PRECONDITION_FAILED); } diff --git a/lib/private/appframework/routing/routeconfig.php b/lib/private/appframework/routing/routeconfig.php index a3bbde6af53..91ea7778d08 100644 --- a/lib/private/appframework/routing/routeconfig.php +++ b/lib/private/appframework/routing/routeconfig.php @@ -61,7 +61,7 @@ class RouteConfig { /** * Creates one route base on the give configuration - * @param $routes + * @param array $routes * @throws \UnexpectedValueException */ private function processSimpleRoutes($routes) @@ -105,7 +105,7 @@ class RouteConfig { * - update * - destroy * - * @param $routes + * @param array $routes */ private function processResources($routes) { @@ -151,7 +151,7 @@ class RouteConfig { /** * Based on a given route name the controller name is generated - * @param $controller + * @param string $controller * @return string */ private function buildControllerName($controller) @@ -161,7 +161,7 @@ class RouteConfig { /** * Based on the action part of the route name the controller method name is generated - * @param $action + * @param string $action * @return string */ private function buildActionName($action) { @@ -170,7 +170,7 @@ class RouteConfig { /** * Generates the id used in the url part o the route url - * @param $resource + * @param string $resource * @return string */ private function buildResourceId($resource) { @@ -179,7 +179,7 @@ class RouteConfig { /** * Underscored strings are converted to camel case strings - * @param $str string + * @param string $str * @return string */ private function underScoreToCamelCase($str) { diff --git a/lib/private/appframework/utility/methodannotationreader.php b/lib/private/appframework/utility/controllermethodreflector.php index 42060a08529..a1519c72809 100644 --- a/lib/private/appframework/utility/methodannotationreader.php +++ b/lib/private/appframework/utility/controllermethodreflector.php @@ -4,7 +4,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2014 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -28,23 +28,68 @@ namespace OC\AppFramework\Utility; /** * Reads and parses annotations from doc comments */ -class MethodAnnotationReader { +class ControllerMethodReflector { private $annotations; + private $types; + private $parameters; + + public function __construct() { + $this->types = array(); + $this->parameters = array(); + $this->annotations = array(); + } + /** * @param object $object an object or classname - * @param string $method the method which we want to inspect for annotations + * @param string $method the method which we want to inspect */ - public function __construct($object, $method){ - $this->annotations = array(); - + public function reflect($object, $method){ $reflection = new \ReflectionMethod($object, $method); $docs = $reflection->getDocComment(); // extract everything prefixed by @ and first letter uppercase preg_match_all('/@([A-Z]\w+)/', $docs, $matches); $this->annotations = $matches[1]; + + // extract type parameter information + preg_match_all('/@param (?<type>\w+) \$(?<var>\w+)/', $docs, $matches); + $this->types = array_combine($matches['var'], $matches['type']); + + // get method parameters + foreach ($reflection->getParameters() as $param) { + if($param->isOptional()) { + $default = $param->getDefaultValue(); + } else { + $default = null; + } + $this->parameters[$param->name] = $default; + } + } + + + /** + * Inspects the PHPDoc parameters for types + * @param string $parameter the parameter whose type comments should be + * parsed + * @return string|null type in the type parameters (@param int $something) + * would return int or null if not existing + */ + public function getType($parameter) { + if(array_key_exists($parameter, $this->types)) { + return $this->types[$parameter]; + } else { + return null; + } + } + + + /** + * @return array the arguments of the method with key => default value + */ + public function getParameters() { + return $this->parameters; } diff --git a/lib/private/appframework/utility/timefactory.php b/lib/private/appframework/utility/timefactory.php index 2c3dd6cf5e3..a9b07a356e3 100644 --- a/lib/private/appframework/utility/timefactory.php +++ b/lib/private/appframework/utility/timefactory.php @@ -4,7 +4,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE diff --git a/lib/private/archive/tar.php b/lib/private/archive/tar.php index cbdb565ba35..21a995d9e50 100644 --- a/lib/private/archive/tar.php +++ b/lib/private/archive/tar.php @@ -154,7 +154,7 @@ class OC_Archive_TAR extends OC_Archive{ } /** * get the last modified time of a file in the archive - * @param string path + * @param string $path * @return int */ function mtime($path) { diff --git a/lib/private/avatar.php b/lib/private/avatar.php index e97f55eecaf..2286b896878 100644 --- a/lib/private/avatar.php +++ b/lib/private/avatar.php @@ -15,16 +15,16 @@ class OC_Avatar implements \OCP\IAvatar { private $view; /** - * @brief constructor - * @param $user string user to do avatar-management with + * constructor + * @param string $user user to do avatar-management with */ public function __construct ($user) { $this->view = new \OC\Files\View('/'.$user); } /** - * @brief get the users avatar - * @param $size integer size in px of the avatar, avatars are square, defaults to 64 + * get the users avatar + * @param int $size size in px of the avatar, avatars are square, defaults to 64 * @return boolean|\OC_Image containing the avatar or false if there's no image */ public function get ($size = 64) { @@ -43,8 +43,8 @@ class OC_Avatar implements \OCP\IAvatar { } /** - * @brief sets the users avatar - * @param $data mixed OC_Image, imagedata or path to set a new avatar + * sets the users avatar + * @param \OC_Image|resource|string $data OC_Image, imagedata or path to set a new avatar * @throws Exception if the provided file is not a jpg or png image * @throws Exception if the provided image is not valid * @throws \OC\NotSquareException if the image is not square @@ -81,7 +81,7 @@ class OC_Avatar implements \OCP\IAvatar { } /** - * @brief remove the users avatar + * remove the users avatar * @return void */ public function remove () { diff --git a/lib/private/avatarmanager.php b/lib/private/avatarmanager.php index 3ca46868ea6..6abe87c4f41 100644 --- a/lib/private/avatarmanager.php +++ b/lib/private/avatarmanager.php @@ -15,9 +15,9 @@ use OCP\IAvatarManager; class AvatarManager implements IAvatarManager { /** - * @brief return a user specific instance of \OCP\IAvatar + * return a user specific instance of \OCP\IAvatar * @see \OCP\IAvatar - * @param $user string the ownCloud user id + * @param string $user the ownCloud user id * @return \OCP\IAvatar */ function getAvatar($user) { diff --git a/lib/private/backgroundjob.php b/lib/private/backgroundjob.php index afc3c270405..922824753b0 100644 --- a/lib/private/backgroundjob.php +++ b/lib/private/backgroundjob.php @@ -25,7 +25,7 @@ */ class OC_BackgroundJob{ /** - * @brief get the execution type of background jobs + * get the execution type of background jobs * @return string * * This method returns the type how background jobs are executed. If the user @@ -36,7 +36,7 @@ class OC_BackgroundJob{ } /** - * @brief sets the background jobs execution type + * sets the background jobs execution type * @param string $type execution type * @return false|null * diff --git a/lib/private/backgroundjob/joblist.php b/lib/private/backgroundjob/joblist.php index 26c90269349..9fa13c25851 100644 --- a/lib/private/backgroundjob/joblist.php +++ b/lib/private/backgroundjob/joblist.php @@ -31,7 +31,7 @@ class JobList implements IJobList { } /** - * @param \Test\BackgroundJob\TestJob $job + * @param Job|string $job * @param mixed $argument */ public function add($job, $argument = null) { @@ -48,7 +48,7 @@ class JobList implements IJobList { } /** - * @param Job $job + * @param Job|string $job * @param mixed $argument */ public function remove($job, $argument = null) { @@ -70,7 +70,7 @@ class JobList implements IJobList { /** * check if a job is in the list * - * @param $job + * @param Job|string $job * @param mixed $argument * @return bool */ @@ -126,7 +126,7 @@ class JobList implements IJobList { /** * @param int $id - * @return Job + * @return Job|null */ public function getById($id) { $query = $this->conn->prepare('SELECT `id`, `class`, `last_run`, `argument` FROM `*PREFIX*jobs` WHERE `id` = ?'); diff --git a/lib/private/cache/file.php b/lib/private/cache/file.php index feee9cc32b6..4e7c065678e 100644 --- a/lib/private/cache/file.php +++ b/lib/private/cache/file.php @@ -48,7 +48,7 @@ class File { /** * Returns the size of the stored/cached data * - * @param $key + * @param string $key * @return int */ public function size($key) { diff --git a/lib/private/config.php b/lib/private/config.php index 6701ca0532b..82a1c46c9d5 100644 --- a/lib/private/config.php +++ b/lib/private/config.php @@ -64,8 +64,8 @@ class Config { } /** - * @brief Lists all available config keys - * @return array with key names + * Lists all available config keys + * @return array an array of key names * * This function returns all keys saved in config.php. Please note that it * does not return the values. @@ -75,10 +75,10 @@ class Config { } /** - * @brief Gets a value from config.php + * Gets a value from config.php * @param string $key key - * @param array|bool|string|null $default = null default value - * @return string the value or $default + * @param mixed $default = null default value + * @return mixed the value or $default * * This function gets the value from config.php. If it does not exist, * $default will be returned. @@ -92,9 +92,9 @@ class Config { } /** - * @brief Sets a value + * Sets a value * @param string $key key - * @param string $value value + * @param mixed $value value * * This function sets the value and writes the config.php. * @@ -108,7 +108,7 @@ class Config { } /** - * @brief Removes a key from the config + * Removes a key from the config * @param string $key key * * This function removes a key from the config.php. @@ -125,7 +125,7 @@ class Config { } /** - * @brief Loads the config file + * Loads the config file * * Reads the config file and saves it to the cache */ @@ -153,7 +153,7 @@ class Config { } /** - * @brief Writes the config file + * Writes the config file * * Saves the config to the config file. * diff --git a/lib/private/connector/sabre/auth.php b/lib/private/connector/sabre/auth.php index 5577273df8c..9ebf5fc05cf 100644 --- a/lib/private/connector/sabre/auth.php +++ b/lib/private/connector/sabre/auth.php @@ -69,6 +69,8 @@ class OC_Connector_Sabre_Auth extends Sabre_DAV_Auth_Backend_AbstractBasic { * even if there are no HTTP Basic Auth headers. * In other case, just fallback to the parent implementation. * + * @param Sabre_DAV_Server $server + * @param $realm * @return bool */ public function authenticate(Sabre_DAV_Server $server, $realm) { diff --git a/lib/private/connector/sabre/exceptionloggerplugin.php b/lib/private/connector/sabre/exceptionloggerplugin.php index 8e77afaf207..5eaf1e87621 100644 --- a/lib/private/connector/sabre/exceptionloggerplugin.php +++ b/lib/private/connector/sabre/exceptionloggerplugin.php @@ -11,6 +11,17 @@ class OC_Connector_Sabre_ExceptionLoggerPlugin extends Sabre_DAV_ServerPlugin { + private $nonFatalExceptions = array( + 'Sabre_DAV_Exception_NotAuthenticated' => true, + // the sync client uses this to find out whether files exist, + // so it is not always an error, log it as debug + 'Sabre_DAV_Exception_NotFound' => true, + // this one mostly happens when the same file is uploaded at + // exactly the same time from two clients, only one client + // wins, the second one gets "Precondition failed" + 'Sabre_DAV_Exception_PreconditionFailed' => true, + ); + private $appName; /** @@ -43,8 +54,10 @@ class OC_Connector_Sabre_ExceptionLoggerPlugin extends Sabre_DAV_ServerPlugin */ public function logException($e) { $exceptionClass = get_class($e); - if ($exceptionClass !== 'Sabre_DAV_Exception_NotAuthenticated') { - \OCP\Util::logException($this->appName, $e); + $level = \OCP\Util::FATAL; + if (isset($this->nonFatalExceptions[$exceptionClass])) { + $level = \OCP\Util::DEBUG; } + \OCP\Util::logException($this->appName, $e, $level); } } diff --git a/lib/private/connector/sabre/file.php b/lib/private/connector/sabre/file.php index 66b50a87552..ab9d3e47d0e 100644 --- a/lib/private/connector/sabre/file.php +++ b/lib/private/connector/sabre/file.php @@ -123,7 +123,7 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D /** * Returns the data * - * @return string | resource + * @return string|resource */ public function get() { diff --git a/lib/private/connector/sabre/filesplugin.php b/lib/private/connector/sabre/filesplugin.php index 65231040fb5..25d7fd53343 100644 --- a/lib/private/connector/sabre/filesplugin.php +++ b/lib/private/connector/sabre/filesplugin.php @@ -37,6 +37,7 @@ class OC_Connector_Sabre_FilesPlugin extends Sabre_DAV_ServerPlugin $server->xmlNamespaces[self::NS_OWNCLOUD] = 'oc'; $server->protectedProperties[] = '{' . self::NS_OWNCLOUD . '}id'; + $server->protectedProperties[] = '{' . self::NS_OWNCLOUD . '}perm'; $this->server = $server; $this->server->subscribeEvent('beforeGetProperties', array($this, 'beforeGetProperties')); @@ -57,15 +58,24 @@ class OC_Connector_Sabre_FilesPlugin extends Sabre_DAV_ServerPlugin if ($node instanceof OC_Connector_Sabre_Node) { - $fileid_propertyname = '{' . self::NS_OWNCLOUD . '}id'; - if (array_search($fileid_propertyname, $requestedProperties)) { - unset($requestedProperties[array_search($fileid_propertyname, $requestedProperties)]); + $fileIdPropertyName = '{' . self::NS_OWNCLOUD . '}id'; + $permissionsPropertyName = '{' . self::NS_OWNCLOUD . '}permissions'; + if (array_search($fileIdPropertyName, $requestedProperties)) { + unset($requestedProperties[array_search($fileIdPropertyName, $requestedProperties)]); + } + if (array_search($permissionsPropertyName, $requestedProperties)) { + unset($requestedProperties[array_search($permissionsPropertyName, $requestedProperties)]); } /** @var $node OC_Connector_Sabre_Node */ $fileId = $node->getFileId(); if (!is_null($fileId)) { - $returnedProperties[200][$fileid_propertyname] = $fileId; + $returnedProperties[200][$fileIdPropertyName] = $fileId; + } + + $permissions = $node->getDavPermissions(); + if (!is_null($fileId)) { + $returnedProperties[200][$permissionsPropertyName] = $permissions; } } @@ -73,7 +83,7 @@ class OC_Connector_Sabre_FilesPlugin extends Sabre_DAV_ServerPlugin } /** - * @param $filePath + * @param string $filePath * @param Sabre_DAV_INode $node * @throws Sabre_DAV_Exception_BadRequest */ diff --git a/lib/private/connector/sabre/node.php b/lib/private/connector/sabre/node.php index eede39cba8b..f124b754443 100644 --- a/lib/private/connector/sabre/node.php +++ b/lib/private/connector/sabre/node.php @@ -56,7 +56,7 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr protected $info; /** - * @brief Sets up the node, expects a full path name + * Sets up the node, expects a full path name * @param \OC\Files\View $view * @param \OCP\Files\FileInfo $info */ @@ -71,7 +71,7 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr } /** - * @brief Returns the name of the node + * Returns the name of the node * @return string */ public function getName() { @@ -79,7 +79,7 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr } /** - * @brief Renames the node + * Renames the node * @param string $name The new name * @throws Sabre_DAV_Exception_BadRequest * @throws Sabre_DAV_Exception_Forbidden @@ -116,7 +116,7 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr } /** - * @brief Returns the last modification time, as a unix timestamp + * Returns the last modification time, as a unix timestamp * @return int timestamp as integer */ public function getLastModified() { @@ -138,7 +138,7 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr } /** - * @brief Updates properties on this node, + * Updates properties on this node, * @see Sabre_DAV_IProperties::updateProperties * @param array $properties * @return boolean @@ -188,7 +188,7 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr } /** - * @brief Returns a list of properties for this nodes.; + * Returns a list of properties for this nodes.; * @param array $properties * @return array * @note The properties list is a list of propertynames the client @@ -237,4 +237,36 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr return null; } + + /** + * @return string|null + */ + public function getDavPermissions() { + $p =''; + if ($this->info->isShared()) { + $p .= 'S'; + } + if ($this->info->isShareable()) { + $p .= 'R'; + } + if ($this->info->isMounted()) { + $p .= 'M'; + } + if ($this->info->isDeletable()) { + $p .= 'D'; + } + if ($this->info->isDeletable()) { + $p .= 'N'; + } + if ($this->info->getType() === \OCP\Files\FileInfo::TYPE_FILE) { + if ($this->info->isUpdateable()) { + $p .= 'W'; + } + } else { + if ($this->info->isUpdateable()) { + $p .= 'CK'; + } + } + return $p; + } } diff --git a/lib/private/connector/sabre/quotaplugin.php b/lib/private/connector/sabre/quotaplugin.php index 1e73e1645c3..c9b8336b57b 100644 --- a/lib/private/connector/sabre/quotaplugin.php +++ b/lib/private/connector/sabre/quotaplugin.php @@ -97,7 +97,7 @@ class OC_Connector_Sabre_QuotaPlugin extends Sabre_DAV_ServerPlugin { } /** - * @param $parentUri + * @param string $parentUri * @return mixed */ public function getFreeSpace($parentUri) { diff --git a/lib/private/contactsmanager.php b/lib/private/contactsmanager.php index 4299d88017a..26264d4e988 100644 --- a/lib/private/contactsmanager.php +++ b/lib/private/contactsmanager.php @@ -31,7 +31,7 @@ namespace OC { * @param string $pattern which should match within the $searchProperties * @param array $searchProperties defines the properties within the query pattern should match * @param array $options - for future use. One should always have options! - * @return array of contacts which are arrays of key-value-pairs + * @return array an array of contacts which are arrays of key-value-pairs */ public function search($pattern, $searchProperties = array(), $options = array()) { $result = array(); @@ -72,7 +72,7 @@ namespace OC { * * @param array $properties this array if key-value-pairs defines a contact * @param string $address_book_key identifier of the address book in which the contact shall be created or updated - * @return array representing the contact just created or updated + * @return array an array representing the contact just created or updated */ public function createOrUpdate($properties, $address_book_key) { diff --git a/lib/private/davclient.php b/lib/private/davclient.php index 916dc11d17a..a7bf0486519 100644 --- a/lib/private/davclient.php +++ b/lib/private/davclient.php @@ -32,7 +32,7 @@ class OC_DAVClient extends \Sabre_DAV_Client { protected $verifyHost; /** - * @brief Sets the request timeout or 0 to disable timeout. + * Sets the request timeout or 0 to disable timeout. * @param integer $timeout in seconds or 0 to disable */ public function setRequestTimeout($timeout) { @@ -40,7 +40,7 @@ class OC_DAVClient extends \Sabre_DAV_Client { } /** - * @brief Sets the CURLOPT_SSL_VERIFYHOST setting + * Sets the CURLOPT_SSL_VERIFYHOST setting * @param integer $value value to set CURLOPT_SSL_VERIFYHOST to */ public function setVerifyHost($value) { diff --git a/lib/private/db.php b/lib/private/db.php index 322a13642ae..df9d1aeca3a 100644 --- a/lib/private/db.php +++ b/lib/private/db.php @@ -50,7 +50,7 @@ class OC_DB { static private $type=null; /** - * @brief connects to the database + * connects to the database * @return boolean|null true if connection can be established or false on error * * Connects to the database as specified in config.php @@ -72,102 +72,45 @@ class OC_DB { $port=false; } - // do nothing if the connection already has been established - if (!self::$connection) { - $config = new \Doctrine\DBAL\Configuration(); - $eventManager = new \Doctrine\Common\EventManager(); - switch($type) { - case 'sqlite': - case 'sqlite3': - $datadir=OC_Config::getValue( "datadirectory", OC::$SERVERROOT.'/data' ); - $connectionParams = array( - 'user' => $user, - 'password' => $pass, - 'path' => $datadir.'/'.$name.'.db', - 'driver' => 'pdo_sqlite', - ); - $connectionParams['adapter'] = '\OC\DB\AdapterSqlite'; - $connectionParams['wrapperClass'] = 'OC\DB\Connection'; - break; - case 'mysql': - $connectionParams = array( - 'user' => $user, - 'password' => $pass, - 'host' => $host, - 'port' => $port, - 'dbname' => $name, - 'charset' => 'UTF8', - 'driver' => 'pdo_mysql', - ); - $connectionParams['adapter'] = '\OC\DB\Adapter'; - $connectionParams['wrapperClass'] = 'OC\DB\Connection'; - // Send "SET NAMES utf8". Only required on PHP 5.3 below 5.3.6. - // See http://stackoverflow.com/questions/4361459/php-pdo-charset-set-names#4361485 - $eventManager->addEventSubscriber(new \Doctrine\DBAL\Event\Listeners\MysqlSessionInit); - break; - case 'pgsql': - $connectionParams = array( - 'user' => $user, - 'password' => $pass, - 'host' => $host, - 'port' => $port, - 'dbname' => $name, - 'driver' => 'pdo_pgsql', - ); - $connectionParams['adapter'] = '\OC\DB\AdapterPgSql'; - $connectionParams['wrapperClass'] = 'OC\DB\Connection'; - break; - case 'oci': - $connectionParams = array( - 'user' => $user, - 'password' => $pass, - 'host' => $host, - 'dbname' => $name, - 'charset' => 'AL32UTF8', - 'driver' => 'oci8', - ); - if (!empty($port)) { - $connectionParams['port'] = $port; - } - $connectionParams['adapter'] = '\OC\DB\AdapterOCI8'; - $connectionParams['wrapperClass'] = 'OC\DB\OracleConnection'; - $eventManager->addEventSubscriber(new \Doctrine\DBAL\Event\Listeners\OracleSessionInit); - break; - case 'mssql': - $connectionParams = array( - 'user' => $user, - 'password' => $pass, - 'host' => $host, - 'port' => $port, - 'dbname' => $name, - 'charset' => 'UTF8', - 'driver' => 'pdo_sqlsrv', - ); - $connectionParams['adapter'] = '\OC\DB\AdapterSQLSrv'; - $connectionParams['wrapperClass'] = 'OC\DB\Connection'; - break; - default: - return false; - } - $connectionParams['tablePrefix'] = OC_Config::getValue('dbtableprefix', 'oc_' ); - try { - self::$connection = \Doctrine\DBAL\DriverManager::getConnection($connectionParams, $config, $eventManager); - if ($type === 'sqlite' || $type === 'sqlite3') { - // Sqlite doesn't handle query caching and schema changes - // TODO: find a better way to handle this - self::$connection->disableQueryStatementCaching(); - } - } catch(\Doctrine\DBAL\DBALException $e) { - OC_Log::write('core', $e->getMessage(), OC_Log::FATAL); - OC_User::setUserId(null); - - // send http status 503 - header('HTTP/1.1 503 Service Temporarily Unavailable'); - header('Status: 503 Service Temporarily Unavailable'); - OC_Template::printErrorPage('Failed to connect to database'); - die(); + $factory = new \OC\DB\ConnectionFactory(); + if (!$factory->isValidType($type)) { + return false; + } + + if ($factory->normalizeType($type) === 'sqlite3') { + $datadir = OC_Config::getValue("datadirectory", OC::$SERVERROOT.'/data'); + $connectionParams = array( + 'user' => $user, + 'password' => $pass, + 'path' => $datadir.'/'.$name.'.db', + ); + } else { + $connectionParams = array( + 'user' => $user, + 'password' => $pass, + 'host' => $host, + 'dbname' => $name, + ); + if (!empty($port)) { + $connectionParams['port'] = $port; } } + + $connectionParams['tablePrefix'] = OC_Config::getValue('dbtableprefix', 'oc_'); + + try { + self::$connection = $factory->getConnection($type, $connectionParams); + } catch(\Doctrine\DBAL\DBALException $e) { + OC_Log::write('core', $e->getMessage(), OC_Log::FATAL); + OC_User::setUserId(null); + + // send http status 503 + header('HTTP/1.1 503 Service Temporarily Unavailable'); + header('Status: 503 Service Temporarily Unavailable'); + OC_Template::printErrorPage('Failed to connect to database'); + die(); + } + return true; } @@ -190,7 +133,7 @@ class OC_DB { } /** - * @brief Prepare a SQL query + * Prepare a SQL query * @param string $query Query string * @param int $limit * @param int $offset @@ -202,12 +145,12 @@ class OC_DB { */ static public function prepare( $query , $limit = null, $offset = null, $isManipulation = null) { self::connect(); - + if ($isManipulation === null) { //try to guess, so we return the number of rows on manipulations $isManipulation = self::isManipulation($query); } - + // return the result try { $result = self::$connection->prepare($query, $limit, $offset); @@ -222,7 +165,7 @@ class OC_DB { /** * tries to guess the type of statement based on the first 10 characters * the current check allows some whitespace but does not work with IF EXISTS or other more complex statements - * + * * @param string $sql * @return bool */ @@ -245,9 +188,9 @@ class OC_DB { } return false; } - + /** - * @brief execute a prepared statement, on error write log and throw exception + * execute a prepared statement, on error write log and throw exception * @param mixed $stmt OC_DB_StatementWrapper, * an array with 'sql' and optionally 'limit' and 'offset' keys * .. or a simple sql query string @@ -296,7 +239,7 @@ class OC_DB { } /** - * @brief gets last value of autoincrement + * gets last value of autoincrement * @param string $table The optional table name (will replace *PREFIX*) and add sequence suffix * @return string id * @throws DatabaseException @@ -312,7 +255,7 @@ class OC_DB { } /** - * @brief Insert a row if a matching row doesn't exists. + * Insert a row if a matching row doesn't exists. * @param string $table The table to insert into in the form '*PREFIX*tableName' * @param array $input An array of fieldname/value pairs * @return boolean number of updated rows @@ -339,7 +282,7 @@ class OC_DB { } /** - * @brief saves database schema to xml file + * saves database schema to xml file * @param string $file name of file * @param int $mode * @return bool @@ -352,7 +295,7 @@ class OC_DB { } /** - * @brief Creates tables from XML file + * Creates tables from XML file * @param string $file file to read structure from * @return bool * @@ -365,7 +308,7 @@ class OC_DB { } /** - * @brief update the database schema + * update the database schema * @param string $file file to read structure from * @throws Exception * @return string|boolean @@ -382,7 +325,7 @@ class OC_DB { } /** - * @brief drop a table + * drop a table * @param string $tableName the table to drop */ public static function dropTable($tableName) { @@ -400,8 +343,8 @@ class OC_DB { } /** - * @brief replaces the ownCloud tables with a new set - * @param $file string path to the MDB2 xml db export file + * replaces the ownCloud tables with a new set + * @param string $file path to the MDB2 xml db export file */ public static function replaceDB( $file ) { $schemaManager = self::getMDB2SchemaManager(); diff --git a/lib/private/db/adapter.php b/lib/private/db/adapter.php index 6b31f37dd98..975b9432286 100644 --- a/lib/private/db/adapter.php +++ b/lib/private/db/adapter.php @@ -40,7 +40,7 @@ class Adapter { } /** - * @brief insert the @input values when they do not exist yet + * insert the @input values when they do not exist yet * @param string $table name * @param array $input key->value pairs * @return int count of inserted rows diff --git a/lib/private/db/connection.php b/lib/private/db/connection.php index 2bd7b093020..b7981fcd691 100644 --- a/lib/private/db/connection.php +++ b/lib/private/db/connection.php @@ -152,7 +152,7 @@ class Connection extends \Doctrine\DBAL\Connection { } /** - * @brief Insert a row if a matching row doesn't exists. + * Insert a row if a matching row doesn't exists. * @param string $table. The table to insert into in the form '*PREFIX*tableName' * @param array $input. An array of fieldname/value pairs * @return bool The return value from execute() diff --git a/lib/private/db/connectionfactory.php b/lib/private/db/connectionfactory.php new file mode 100644 index 00000000000..8f852cf7127 --- /dev/null +++ b/lib/private/db/connectionfactory.php @@ -0,0 +1,118 @@ +<?php +/** + * Copyright (c) 2014 Andreas Fischer <bantu@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\DB; + +/** +* Takes care of creating and configuring Doctrine connections. +*/ +class ConnectionFactory { + /** + * @var array + * + * Array mapping DBMS type to default connection parameters passed to + * \Doctrine\DBAL\DriverManager::getConnection(). + */ + protected $defaultConnectionParams = array( + 'mssql' => array( + 'adapter' => '\OC\DB\AdapterSQLSrv', + 'charset' => 'UTF8', + 'driver' => 'pdo_sqlsrv', + 'wrapperClass' => 'OC\DB\Connection', + ), + 'mysql' => array( + 'adapter' => '\OC\DB\Adapter', + 'charset' => 'UTF8', + 'driver' => 'pdo_mysql', + 'wrapperClass' => 'OC\DB\Connection', + ), + 'oci' => array( + 'adapter' => '\OC\DB\AdapterOCI8', + 'charset' => 'AL32UTF8', + 'driver' => 'oci8', + 'wrapperClass' => 'OC\DB\OracleConnection', + ), + 'pgsql' => array( + 'adapter' => '\OC\DB\AdapterPgSql', + 'driver' => 'pdo_pgsql', + 'wrapperClass' => 'OC\DB\Connection', + ), + 'sqlite3' => array( + 'adapter' => '\OC\DB\AdapterSqlite', + 'driver' => 'pdo_sqlite', + 'wrapperClass' => 'OC\DB\Connection', + ), + ); + + /** + * @brief Get default connection parameters for a given DBMS. + * @param string $type DBMS type + * @throws \InvalidArgumentException If $type is invalid + * @return array Default connection parameters. + */ + public function getDefaultConnectionParams($type) { + $normalizedType = $this->normalizeType($type); + if (!isset($this->defaultConnectionParams[$normalizedType])) { + throw new \InvalidArgumentException("Unsupported type: $type"); + } + return $this->defaultConnectionParams[$normalizedType]; + } + + /** + * @brief Get default connection parameters for a given DBMS. + * @param string $type DBMS type + * @param array $additionalConnectionParams Additional connection parameters + * @return \OC\DB\Connection + */ + public function getConnection($type, $additionalConnectionParams) { + $normalizedType = $this->normalizeType($type); + $eventManager = new \Doctrine\Common\EventManager(); + switch ($normalizedType) { + case 'mysql': + // Send "SET NAMES utf8". Only required on PHP 5.3 below 5.3.6. + // See http://stackoverflow.com/questions/4361459/php-pdo-charset-set-names#4361485 + $eventManager->addEventSubscriber(new \Doctrine\DBAL\Event\Listeners\MysqlSessionInit); + break; + case 'oci': + $eventManager->addEventSubscriber(new \Doctrine\DBAL\Event\Listeners\OracleSessionInit); + break; + } + $connection = \Doctrine\DBAL\DriverManager::getConnection( + array_merge($this->getDefaultConnectionParams($type), $additionalConnectionParams), + new \Doctrine\DBAL\Configuration(), + $eventManager + ); + switch ($normalizedType) { + case 'sqlite3': + // Sqlite doesn't handle query caching and schema changes + // TODO: find a better way to handle this + /** @var $connection \OC\DB\Connection */ + $connection->disableQueryStatementCaching(); + break; + } + return $connection; + } + + /** + * @brief Normalize DBMS type + * @param string $type DBMS type + * @return string Normalized DBMS type + */ + public function normalizeType($type) { + return $type === 'sqlite' ? 'sqlite3' : $type; + } + + /** + * @brief Checks whether the specified DBMS type is valid. + * @return bool + */ + public function isValidType($type) { + $normalizedType = $this->normalizeType($type); + return isset($this->defaultConnectionParams[$normalizedType]); + } +} diff --git a/lib/private/db/connectionwrapper.php b/lib/private/db/connectionwrapper.php index c2cfc21d204..132e76666ab 100644 --- a/lib/private/db/connectionwrapper.php +++ b/lib/private/db/connectionwrapper.php @@ -41,8 +41,8 @@ class ConnectionWrapper implements \OCP\IDBConnection { /** * Insert a row if a matching row doesn't exists. - * @param string The table name (will replace *PREFIX*) to perform the replace on. - * @param array + * @param string $table The table name (will replace *PREFIX*) to perform the replace on. + * @param array $input * * The input array if in the form: * diff --git a/lib/private/db/mdb2schemamanager.php b/lib/private/db/mdb2schemamanager.php index aaf2ea543b9..1e90c8bda5c 100644 --- a/lib/private/db/mdb2schemamanager.php +++ b/lib/private/db/mdb2schemamanager.php @@ -24,7 +24,7 @@ class MDB2SchemaManager { } /** - * @brief saves database scheme to xml file + * saves database scheme to xml file * @param string $file name of file * @param int|string $mode * @return bool @@ -38,7 +38,7 @@ class MDB2SchemaManager { } /** - * @brief Creates tables from XML file + * Creates tables from XML file * @param string $file file to read structure from * @return bool * @@ -51,7 +51,7 @@ class MDB2SchemaManager { } /** - * @brief update the database scheme + * update the database scheme * @param string $file file to read structure from * @return string|boolean */ @@ -86,7 +86,7 @@ class MDB2SchemaManager { $column->oldColumnName = $platform->quoteIdentifier($column->oldColumnName); } } - + if ($generateSql) { return $this->generateChangeScript($schemaDiff); } @@ -95,7 +95,7 @@ class MDB2SchemaManager { } /** - * @brief drop a table + * drop a table * @param string $tableName the table to drop */ public function dropTable($tableName) { @@ -125,8 +125,8 @@ class MDB2SchemaManager { } /** - * @brief replaces the ownCloud tables with a new set - * @param $file string path to the MDB2 xml db export file + * replaces the ownCloud tables with a new set + * @param string $file path to the MDB2 xml db export file */ public function replaceDB( $file ) { $apps = \OC_App::getAllApps(); diff --git a/lib/private/db/mdb2schemareader.php b/lib/private/db/mdb2schemareader.php index 1c16d03eab2..597650985fa 100644 --- a/lib/private/db/mdb2schemareader.php +++ b/lib/private/db/mdb2schemareader.php @@ -66,7 +66,7 @@ class MDB2SchemaReader { } /** - * @param\Doctrine\DBAL\Schema\Schema $schema + * @param \Doctrine\DBAL\Schema\Schema $schema * @param \SimpleXMLElement $xml * @throws \DomainException */ @@ -303,7 +303,7 @@ class MDB2SchemaReader { } /** - * @param \SimpleXMLElement | string $xml + * @param \SimpleXMLElement|string $xml * @return bool */ private function asBool($xml) { diff --git a/lib/private/db/pgsqltools.php b/lib/private/db/pgsqltools.php new file mode 100644 index 00000000000..c3ac140594d --- /dev/null +++ b/lib/private/db/pgsqltools.php @@ -0,0 +1,40 @@ +<?php +/** + * Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl> + * Copyright (c) 2014 Andreas Fischer <bantu@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\DB; + +/** +* Various PostgreSQL specific helper functions. +*/ +class PgSqlTools { + /** + * @brief Resynchronizes all sequences of a database after using INSERTs + * without leaving out the auto-incremented column. + * @param \OC\DB\Connection $conn + * @return null + */ + public function resynchronizeDatabaseSequences(Connection $conn) { + $databaseName = $conn->getDatabase(); + foreach ($conn->getSchemaManager()->listSequences() as $sequence) { + $sequenceName = $sequence->getName(); + $sqlInfo = 'SELECT table_schema, table_name, column_name + FROM information_schema.columns + WHERE column_default = ? AND table_catalog = ?'; + $sequenceInfo = $conn->fetchAssoc($sqlInfo, array( + "nextval('$sequenceName'::regclass)", + $databaseName + )); + $tableName = $sequenceInfo['table_name']; + $columnName = $sequenceInfo['column_name']; + $sqlMaxId = "SELECT MAX($columnName) FROM $tableName"; + $sqlSetval = "SELECT setval('$sequenceName', ($sqlMaxId))"; + $conn->executeQuery($sqlSetval); + } + } +} diff --git a/lib/private/db/statementwrapper.php b/lib/private/db/statementwrapper.php index 492209b883b..70d1f985a41 100644 --- a/lib/private/db/statementwrapper.php +++ b/lib/private/db/statementwrapper.php @@ -41,7 +41,7 @@ class OC_DB_StatementWrapper { * make execute return the result instead of a bool * * @param array $input - * @return \OC_DB_StatementWrapper | int + * @return \OC_DB_StatementWrapper|int */ public function execute($input=array()) { if(OC_Config::getValue( "log_query", false)) { diff --git a/lib/private/defaults.php b/lib/private/defaults.php index fca798568c5..663c327a3b0 100644 --- a/lib/private/defaults.php +++ b/lib/private/defaults.php @@ -185,7 +185,7 @@ class OC_Defaults { /** * Returns mail header color - * @return mail header color + * @return string */ public function getMailHeaderColor() { if ($this->themeExist('getMailHeaderColor')) { diff --git a/lib/private/fileproxy.php b/lib/private/fileproxy.php index 88976c1b8e5..2835e974642 100644 --- a/lib/private/fileproxy.php +++ b/lib/private/fileproxy.php @@ -47,7 +47,7 @@ class OC_FileProxy{ /** * fallback function when a proxy operation is not implemented * @param string $function the name of the proxy operation - * @param mixed + * @param mixed $arguments * * this implements a dummy proxy for all operations */ diff --git a/lib/private/files.php b/lib/private/files.php index 3affcf10449..7c437a16a98 100644 --- a/lib/private/files.php +++ b/lib/private/files.php @@ -152,7 +152,7 @@ class OC_Files { /** @var $storage \OC\Files\Storage\Storage */ list($storage) = $view->resolvePath($filename); if ($storage->isLocal()) { - self::addSendfileHeader(\OC\Files\Filesystem::getLocalFile($filename)); + self::addSendfileHeader($filename); } else { \OC\Files\Filesystem::readfile($filename); } @@ -167,9 +167,11 @@ class OC_Files { */ private static function addSendfileHeader($filename) { if (isset($_SERVER['MOD_X_SENDFILE_ENABLED'])) { + $filename = \OC\Files\Filesystem::getLocalFile($filename); header("X-Sendfile: " . $filename); } if (isset($_SERVER['MOD_X_SENDFILE2_ENABLED'])) { + $filename = \OC\Files\Filesystem::getLocalFile($filename); if (isset($_SERVER['HTTP_RANGE']) && preg_match("/^bytes=([0-9]+)-([0-9]*)$/", $_SERVER['HTTP_RANGE'], $range)) { $filelength = filesize($filename); @@ -185,6 +187,7 @@ class OC_Files { } if (isset($_SERVER['MOD_X_ACCEL_REDIRECT_ENABLED'])) { + $filename = \OC::$WEBROOT . '/data' . \OC\Files\Filesystem::getRoot() . $filename; header("X-Accel-Redirect: " . $filename); } } @@ -222,7 +225,7 @@ class OC_Files { * checks if the selected files are within the size constraint. If not, outputs an error page. * * @param string $dir - * @param array | string $files + * @param array|string $files */ static function validateZipDownload($dir, $files) { if (!OC_Config::getValue('allowZipDownload', true)) { diff --git a/lib/private/files/cache/cache.php b/lib/private/files/cache/cache.php index 1c9de56f8c5..3e4f6dfb132 100644 --- a/lib/private/files/cache/cache.php +++ b/lib/private/files/cache/cache.php @@ -109,7 +109,7 @@ class Cache { * get the stored metadata of a file or folder * * @param string/int $file - * @return array | false + * @return array|false */ public function get($file) { if (is_string($file) or $file == '') { @@ -450,7 +450,7 @@ class Cache { * search for files matching $pattern * * @param string $pattern - * @return array of file data + * @return array an array of file data */ public function search($pattern) { @@ -597,12 +597,16 @@ class Cache { * get the path of a file on this storage by it's id * * @param int $id - * @return string | null + * @return string|null */ public function getPathById($id) { $sql = 'SELECT `path` FROM `*PREFIX*filecache` WHERE `fileid` = ? AND `storage` = ?'; $result = \OC_DB::executeAudited($sql, array($id, $this->getNumericStorageId())); if ($row = $result->fetchRow()) { + // Oracle stores empty strings as null... + if ($row['path'] === null) { + return ''; + } return $row['path']; } else { return null; @@ -636,7 +640,7 @@ class Cache { /** * normalize the given path - * @param $path + * @param string $path * @return string */ public function normalize($path) { diff --git a/lib/private/files/cache/scanner.php b/lib/private/files/cache/scanner.php index c0bdde06a75..b3ab94f4599 100644 --- a/lib/private/files/cache/scanner.php +++ b/lib/private/files/cache/scanner.php @@ -61,7 +61,7 @@ class Scanner extends BasicEmitter { * * * * @param string $path - * @return array with metadata of the file + * @return array an array of metadata of the file */ public function getData($path) { if (!$this->storage->isReadable($path)) { @@ -88,7 +88,7 @@ class Scanner extends BasicEmitter { * @param string $file * @param int $reuseExisting * @param bool $parentExistsInCache - * @return array with metadata of the scanned file + * @return array an array of metadata of the scanned file */ public function scanFile($file, $reuseExisting = 0, $parentExistsInCache = false) { if (!self::isPartialFile($file) @@ -174,7 +174,7 @@ class Scanner extends BasicEmitter { * @param string $path * @param bool $recursive * @param int $reuse - * @return array with the meta data of the scanned file or folder + * @return array an array of the meta data of the scanned file or folder */ public function scan($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1) { if ($reuse === -1) { @@ -270,10 +270,10 @@ class Scanner extends BasicEmitter { } /** - * @brief check if the file should be ignored when scanning + * check if the file should be ignored when scanning * NOTE: files with a '.part' extension are ignored as well! * prevents unfinished put requests to be scanned - * @param String $file + * @param string $file * @return boolean */ public static function isPartialFile($file) { diff --git a/lib/private/files/cache/updater.php b/lib/private/files/cache/updater.php index 199ce5dee78..f6feb6624b2 100644 --- a/lib/private/files/cache/updater.php +++ b/lib/private/files/cache/updater.php @@ -17,7 +17,7 @@ class Updater { * resolve a path to a storage and internal path * * @param string $path the relative path - * @return array consisting of the storage and the internal path + * @return array an array consisting of the storage and the internal path */ static public function resolvePath($path) { $view = \OC\Files\Filesystem::getView(); @@ -108,7 +108,7 @@ class Updater { } /** - * @brief get file owner and path + * get file owner and path * @param string $filename * @return string[] with the oweners uid and the owners path */ diff --git a/lib/private/files/cache/watcher.php b/lib/private/files/cache/watcher.php index 48aa6f853ce..599752a6eff 100644 --- a/lib/private/files/cache/watcher.php +++ b/lib/private/files/cache/watcher.php @@ -55,7 +55,7 @@ class Watcher { * check $path for updates * * @param string $path - * @return boolean | array true if path was updated, otherwise the cached data is returned + * @return boolean|array true if path was updated, otherwise the cached data is returned */ public function checkUpdate($path) { if ($this->watchPolicy === self::CHECK_ALWAYS or ($this->watchPolicy === self::CHECK_ONCE and array_search($path, $this->checkedPaths) === false)) { diff --git a/lib/private/files/fileinfo.php b/lib/private/files/fileinfo.php index d6940f50bf1..e7afeb4ccce 100644 --- a/lib/private/files/fileinfo.php +++ b/lib/private/files/fileinfo.php @@ -147,7 +147,7 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { } /** - * @return \OCP\Files\FileInfo::TYPE_FILE | \OCP\Files\FileInfo::TYPE_FOLDER + * @return \OCP\Files\FileInfo::TYPE_FILE|\OCP\Files\FileInfo::TYPE_FOLDER */ public function getType() { if (isset($this->data['type'])) { @@ -196,4 +196,28 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { public function isShareable() { return $this->checkPermissions(\OCP\PERMISSION_SHARE); } + + /** + * Check if a file or folder is shared + * @return bool + */ + public function isShared() { + $sid = $this->getStorage()->getId(); + if (!is_null($sid)) { + $sid = explode(':', $sid); + return ($sid[0] === 'shared'); + } + + return false; + } + + public function isMounted() { + $sid = $this->getStorage()->getId(); + if (!is_null($sid)) { + $sid = explode(':', $sid); + return ($sid[0] !== 'local' and $sid[0] !== 'home'); + } + + return false; + } } diff --git a/lib/private/files/filesystem.php b/lib/private/files/filesystem.php index 52df1bec611..ad7213d2368 100644 --- a/lib/private/files/filesystem.php +++ b/lib/private/files/filesystem.php @@ -245,7 +245,7 @@ class Filesystem { } /** - * @param $id + * @param string $id * @return Mount\Mount[] */ public static function getMountByStorageId($id) { @@ -256,7 +256,7 @@ class Filesystem { } /** - * @param $id + * @param int $id * @return Mount\Mount[] */ public static function getMountByNumericId($id) { @@ -270,7 +270,7 @@ class Filesystem { * resolve a path to a storage and internal path * * @param string $path - * @return array consisting of the storage and the internal path + * @return array an array consisting of the storage and the internal path */ static public function resolvePath($path) { if (!self::$mounts) { @@ -384,7 +384,7 @@ class Filesystem { } /** - * @brief get the relative path of the root data directory for the current user + * get the relative path of the root data directory for the current user * @return string * * Returns path like /admin/files @@ -502,7 +502,7 @@ class Filesystem { } /** - * @brief check if the directory should be ignored when scanning + * check if the directory should be ignored when scanning * NOTE: the special directories . and .. would cause never ending recursion * @param String $dir * @return boolean @@ -662,7 +662,7 @@ class Filesystem { } /** - * @brief Fix common problems with a file path + * Fix common problems with a file path * @param string $path * @param bool $stripTrailingSlash * @return string diff --git a/lib/private/files/mapper.php b/lib/private/files/mapper.php index 833d4bd8d1c..666719da12d 100644 --- a/lib/private/files/mapper.php +++ b/lib/private/files/mapper.php @@ -97,8 +97,8 @@ class Mapper } /** - * @param $path - * @param $root + * @param string $path + * @param string $root * @return false|string */ public function stripRootFolder($path, $root) { diff --git a/lib/private/files/mount/manager.php b/lib/private/files/mount/manager.php index 91460b72730..db1f4600c74 100644 --- a/lib/private/files/mount/manager.php +++ b/lib/private/files/mount/manager.php @@ -33,7 +33,7 @@ class Manager { /** * Find the mount for $path * - * @param $path + * @param string $path * @return Mount */ public function find($path) { @@ -61,7 +61,7 @@ class Manager { /** * Find all mounts in $path * - * @param $path + * @param string $path * @return Mount[] */ public function findIn($path) { @@ -112,7 +112,7 @@ class Manager { /** * Find mounts by numeric storage id * - * @param string $id + * @param int $id * @return Mount[] */ public function findByNumericId($id) { diff --git a/lib/private/files/mount/mount.php b/lib/private/files/mount/mount.php index 08d5ddf348b..256630726d2 100644 --- a/lib/private/files/mount/mount.php +++ b/lib/private/files/mount/mount.php @@ -28,7 +28,7 @@ class Mount { private $loader; /** - * @param string | \OC\Files\Storage\Storage $storage + * @param string|\OC\Files\Storage\Storage $storage * @param string $mountpoint * @param array $arguments (optional)\ * @param \OC\Files\Storage\Loader $loader diff --git a/lib/private/files/node/folder.php b/lib/private/files/node/folder.php index d9e0ddc2d61..1af34fc2be6 100644 --- a/lib/private/files/node/folder.php +++ b/lib/private/files/node/folder.php @@ -296,7 +296,7 @@ class Folder extends Node implements \OCP\Files\Folder { } /** - * @param $id + * @param int $id * @return \OC\Files\Node\Node[] */ public function getById($id) { diff --git a/lib/private/files/storage/common.php b/lib/private/files/storage/common.php index 8a263d4ce1e..fef33cabd87 100644 --- a/lib/private/files/storage/common.php +++ b/lib/private/files/storage/common.php @@ -317,7 +317,7 @@ abstract class Common implements \OC\Files\Storage\Storage { * clean a path, i.e. remove all redundant '.' and '..' * making sure that it can't point to higher than '/' * - * @param $path The path to clean + * @param string $path The path to clean * @return string cleaned path */ public function cleanPath($path) { @@ -347,7 +347,7 @@ abstract class Common implements \OC\Files\Storage\Storage { /** * get the free space in the storage * - * @param $path + * @param string $path * @return int */ public function free_space($path) { diff --git a/lib/private/files/storage/home.php b/lib/private/files/storage/home.php index 1c2a682f197..f66096f6d9c 100644 --- a/lib/private/files/storage/home.php +++ b/lib/private/files/storage/home.php @@ -23,7 +23,7 @@ class Home extends Local { protected $user; /** - * @brief Construct a Home storage instance + * Construct a Home storage instance * @param array $arguments array with "user" containing the * storage owner and "legacy" containing "true" if the storage is * a legacy storage with "local::" URL instead of the new "home::" one. @@ -57,7 +57,7 @@ class Home extends Local { } /** - * @brief Returns the owner of this home storage + * Returns the owner of this home storage * @return \OC\User\User owner of this home storage */ public function getUser() { diff --git a/lib/private/files/storage/wrapper/quota.php b/lib/private/files/storage/wrapper/quota.php index a878b2c5cf6..c57c797f87a 100644 --- a/lib/private/files/storage/wrapper/quota.php +++ b/lib/private/files/storage/wrapper/quota.php @@ -30,7 +30,7 @@ class Quota extends Wrapper { } /** - * @return quota value + * @return int quota value */ public function getQuota() { return $this->quota; diff --git a/lib/private/files/stream/oc.php b/lib/private/files/stream/oc.php index 88e7e062df9..c206b41f55e 100644 --- a/lib/private/files/stream/oc.php +++ b/lib/private/files/stream/oc.php @@ -18,7 +18,15 @@ class OC { static private $rootView; private $path; + + /** + * @var resource + */ private $dirSource; + + /** + * @var resource + */ private $fileSource; private $meta; diff --git a/lib/private/files/type/templatemanager.php b/lib/private/files/type/templatemanager.php index cd1536d2732..e693e7079a5 100644 --- a/lib/private/files/type/templatemanager.php +++ b/lib/private/files/type/templatemanager.php @@ -19,7 +19,7 @@ class TemplateManager { * get the path of the template for a mimetype * * @param string $mimetype - * @return string | null + * @return string|null */ public function getTemplatePath($mimetype) { if (isset($this->templates[$mimetype])) { diff --git a/lib/private/files/view.php b/lib/private/files/view.php index 47fc04c937d..940f31fe420 100644 --- a/lib/private/files/view.php +++ b/lib/private/files/view.php @@ -11,7 +11,7 @@ * working with files within that view (e.g. read, write, delete, etc.). Each * view is restricted to a set of directories via a virtual root. The default view * uses the currently logged in user's data directory as root (parts of - * OC_Filesystem are merely a wrapper for OC_FilesystemView). + * OC_Filesystem are merely a wrapper for OC\Files\View). * * Apps that need to access files outside of the user data folders (to modify files * belonging to a user other than the one currently logged in, for example) should @@ -37,7 +37,7 @@ class View { } public function getAbsolutePath($path = '/') { - if (!$path) { + if ($path === '') { $path = '/'; } if ($path[0] !== '/') { @@ -109,7 +109,7 @@ class View { * resolve a path to a storage and internal path * * @param string $path - * @return array consisting of the storage and the internal path + * @return array an array consisting of the storage and the internal path */ public function resolvePath($path) { $a = $this->getAbsolutePath($path); @@ -168,6 +168,10 @@ class View { } } + /** + * @param string $path + * @return resource + */ public function opendir($path) { return $this->basicOperation('opendir', $path, array('read')); } @@ -552,6 +556,11 @@ class View { } } + /** + * @param string $path + * @param string $mode + * @return resource + */ public function fopen($path, $mode) { $hooks = array(); switch ($mode) { @@ -664,7 +673,7 @@ class View { } /** - * @brief abstraction layer for basic filesystem functions: wrapper for \OC\Files\Storage\Storage + * abstraction layer for basic filesystem functions: wrapper for \OC\Files\Storage\Storage * @param string $operation * @param string $path * @param array $hooks (optional) @@ -796,7 +805,7 @@ class View { * @param string $path * @param boolean $includeMountPoints whether to add mountpoint sizes, * defaults to true - * @return \OC\Files\FileInfo | false + * @return \OC\Files\FileInfo|false */ public function getFileInfo($path, $includeMountPoints = true) { $data = array(); @@ -991,7 +1000,7 @@ class View { * change file metadata * * @param string $path - * @param array | \OCP\Files\FileInfo $data + * @param array|\OCP\Files\FileInfo $data * @return int * * returns the fileid of the updated file diff --git a/lib/private/geo.php b/lib/private/geo.php index cd62511f0c1..bd9253bc0dd 100644 --- a/lib/private/geo.php +++ b/lib/private/geo.php @@ -7,9 +7,9 @@ */ class OC_Geo{ /** - * @brief returns the closest timezone to coordinates - * @param $latitude - * @param $longitude + * returns the closest timezone to coordinates + * @param float $latitude + * @param float $longitude * @return mixed Closest timezone */ public static function timezone($latitude, $longitude) { diff --git a/lib/private/group.php b/lib/private/group.php index d9f430f833b..8dc38129205 100644 --- a/lib/private/group.php +++ b/lib/private/group.php @@ -57,8 +57,8 @@ class OC_Group { } /** - * @brief set the group backend - * @param \OC_Group_Backend $backend The backend to use for user managment + * set the group backend + * @param \OC_Group_Backend $backend The backend to use for user managment * @return bool */ public static function useBackend($backend) { @@ -74,7 +74,7 @@ class OC_Group { } /** - * @brief Try to create a new group + * Try to create a new group * @param string $gid The name of the group to create * @return bool * @@ -93,7 +93,7 @@ class OC_Group { } /** - * @brief delete a group + * delete a group * @param string $gid gid of the group to delete * @return bool * @@ -118,7 +118,7 @@ class OC_Group { } /** - * @brief is user in group? + * is user in group? * @param string $uid uid of the user * @param string $gid gid of the group * @return bool @@ -135,7 +135,7 @@ class OC_Group { } /** - * @brief Add a user to a group + * Add a user to a group * @param string $uid Name of the user to add to group * @param string $gid Name of the group in which add the user * @return bool @@ -156,7 +156,7 @@ class OC_Group { } /** - * @brief Removes a user from a group + * Removes a user from a group * @param string $uid Name of the user to remove from group * @param string $gid Name of the group from which remove the user * @return bool @@ -177,9 +177,9 @@ class OC_Group { } /** - * @brief Get all groups a user belongs to + * Get all groups a user belongs to * @param string $uid Name of the user - * @return array with group names + * @return array an array of group names * * This function fetches all groups a user belongs to. It does not check * if the user exists at all. @@ -199,11 +199,11 @@ class OC_Group { } /** - * @brief get a list of all groups + * get a list of all groups * @param string $search * @param int|null $limit * @param int|null $offset - * @returns array with group names + * @return array an array of group names * * Returns a list with all groups */ @@ -227,12 +227,12 @@ class OC_Group { } /** - * @brief get a list of all users in a group + * get a list of all users in a group * @param string $gid * @param string $search * @param int $limit * @param int $offset - * @returns array with user ids + * @return array an array of user ids */ public static function usersInGroup($gid, $search = '', $limit = -1, $offset = 0) { $group = self::getManager()->get($gid); @@ -249,12 +249,12 @@ class OC_Group { } /** - * @brief get a list of all users in several groups + * get a list of all users in several groups * @param string[] $gids * @param string $search * @param int $limit * @param int $offset - * @return array with user ids + * @return array an array of user ids */ public static function usersInGroups($gids, $search = '', $limit = -1, $offset = 0) { $users = array(); @@ -266,34 +266,24 @@ class OC_Group { } /** - * @brief get a list of all display names in a group + * get a list of all display names in a group * @param string $gid * @param string $search * @param int $limit * @param int $offset - * @returns array with display names (value) and user ids(key) + * @return array an array of display names (value) and user ids(key) */ public static function displayNamesInGroup($gid, $search = '', $limit = -1, $offset = 0) { - $group = self::getManager()->get($gid); - if ($group) { - $users = $group->searchDisplayName($search, $limit, $offset); - $displayNames = array(); - foreach ($users as $user) { - $displayNames[$user->getUID()] = $user->getDisplayName(); - } - return $displayNames; - } else { - return array(); - } + return self::getManager()->displayNamesInGroup($gid, $search, $limit, $offset); } /** - * @brief get a list of all display names in several groups + * get a list of all display names in several groups * @param array $gids * @param string $search * @param int $limit * @param int $offset - * @return array with display names (Key) user ids (value) + * @return array an array of display names (Key) user ids (value) */ public static function displayNamesInGroups($gids, $search = '', $limit = -1, $offset = 0) { $displayNames = array(); diff --git a/lib/private/group/backend.php b/lib/private/group/backend.php index b0ed0d90d76..ab694268bb3 100644 --- a/lib/private/group/backend.php +++ b/lib/private/group/backend.php @@ -33,7 +33,7 @@ define('OC_GROUP_BACKEND_CREATE_GROUP', 0x00000001); define('OC_GROUP_BACKEND_DELETE_GROUP', 0x00000010); define('OC_GROUP_BACKEND_ADD_TO_GROUP', 0x00000100); define('OC_GROUP_BACKEND_REMOVE_FROM_GOUP', 0x00001000); -define('OC_GROUP_BACKEND_GET_DISPLAYNAME', 0x00010000); +define('OC_GROUP_BACKEND_GET_DISPLAYNAME', 0x00010000); //OBSOLETE define('OC_GROUP_BACKEND_COUNT_USERS', 0x00100000); /** @@ -45,12 +45,11 @@ abstract class OC_Group_Backend implements OC_Group_Interface { OC_GROUP_BACKEND_DELETE_GROUP => 'deleteGroup', OC_GROUP_BACKEND_ADD_TO_GROUP => 'addToGroup', OC_GROUP_BACKEND_REMOVE_FROM_GOUP => 'removeFromGroup', - OC_GROUP_BACKEND_GET_DISPLAYNAME => 'displayNamesInGroup', OC_GROUP_BACKEND_COUNT_USERS => 'countUsersInGroup', ); /** - * @brief Get all supported actions + * Get all supported actions * @return int bitwise-or'ed actions * * Returns the supported actions as int to be @@ -68,9 +67,9 @@ abstract class OC_Group_Backend implements OC_Group_Interface { } /** - * @brief Check if backend implements actions + * Check if backend implements actions * @param int $actions bitwise-or'ed actions - * @return boolean + * @return bool * * Returns the supported actions as int to be * compared with OC_GROUP_BACKEND_CREATE_GROUP etc. @@ -80,7 +79,7 @@ abstract class OC_Group_Backend implements OC_Group_Interface { } /** - * @brief is user in group? + * is user in group? * @param string $uid uid of the user * @param string $gid gid of the group * @return bool @@ -92,9 +91,9 @@ abstract class OC_Group_Backend implements OC_Group_Interface { } /** - * @brief Get all groups a user belongs to + * Get all groups a user belongs to * @param string $uid Name of the user - * @return array with group names + * @return array an array of group names * * This function fetches all groups a user belongs to. It does not check * if the user exists at all. @@ -104,11 +103,11 @@ abstract class OC_Group_Backend implements OC_Group_Interface { } /** - * @brief get a list of all groups + * get a list of all groups * @param string $search * @param int $limit * @param int $offset - * @return array with group names + * @return array an array of group names * * Returns a list with all groups */ @@ -127,33 +126,14 @@ abstract class OC_Group_Backend implements OC_Group_Interface { } /** - * @brief get a list of all users in a group + * get a list of all users in a group * @param string $gid * @param string $search * @param int $limit * @param int $offset - * @return array with user ids + * @return array an array of user ids */ public function usersInGroup($gid, $search = '', $limit = -1, $offset = 0) { return array(); } - - /** - * @brief get a list of all display names in a group - * @param string $gid - * @param string $search - * @param int $limit - * @param int $offset - * @return array with display names (value) and user ids (key) - */ - public function displayNamesInGroup($gid, $search = '', $limit = -1, $offset = 0) { - $displayNames = array(); - $users = $this->usersInGroup($gid, $search, $limit, $offset); - foreach ($users as $user) { - $displayNames[$user] = $user; - } - - return $displayNames; - } - } diff --git a/lib/private/group/database.php b/lib/private/group/database.php index 3815dcff2e5..baaf2cf2739 100644 --- a/lib/private/group/database.php +++ b/lib/private/group/database.php @@ -43,7 +43,7 @@ class OC_Group_Database extends OC_Group_Backend { /** - * @brief Try to create a new group + * Try to create a new group * @param string $gid The name of the group to create * @return bool * @@ -69,7 +69,7 @@ class OC_Group_Database extends OC_Group_Backend { } /** - * @brief delete a group + * delete a group * @param string $gid gid of the group to delete * @return bool * @@ -88,7 +88,7 @@ class OC_Group_Database extends OC_Group_Backend { } /** - * @brief is user in group? + * is user in group? * @param string $uid uid of the user * @param string $gid gid of the group * @return bool @@ -104,7 +104,7 @@ class OC_Group_Database extends OC_Group_Backend { } /** - * @brief Add a user to a group + * Add a user to a group * @param string $uid Name of the user to add to group * @param string $gid Name of the group in which add the user * @return bool @@ -123,7 +123,7 @@ class OC_Group_Database extends OC_Group_Backend { } /** - * @brief Removes a user from a group + * Removes a user from a group * @param string $uid Name of the user to remove from group * @param string $gid Name of the group from which remove the user * @return bool @@ -138,9 +138,9 @@ class OC_Group_Database extends OC_Group_Backend { } /** - * @brief Get all groups a user belongs to + * Get all groups a user belongs to * @param string $uid Name of the user - * @return array with group names + * @return array an array of group names * * This function fetches all groups a user belongs to. It does not check * if the user exists at all. @@ -159,11 +159,11 @@ class OC_Group_Database extends OC_Group_Backend { } /** - * @brief get a list of all groups + * get a list of all groups * @param string $search * @param int $limit * @param int $offset - * @return array with group names + * @return array an array of group names * * Returns a list with all groups */ @@ -192,12 +192,12 @@ class OC_Group_Database extends OC_Group_Backend { } /** - * @brief get a list of all users in a group + * get a list of all users in a group * @param string $gid * @param string $search * @param int $limit * @param int $offset - * @return array with user ids + * @return array an array of user ids */ public function usersInGroup($gid, $search = '', $limit = null, $offset = null) { $stmt = OC_DB::prepare('SELECT `uid` FROM `*PREFIX*group_user` WHERE `gid` = ? AND `uid` LIKE ?', @@ -212,12 +212,11 @@ class OC_Group_Database extends OC_Group_Backend { } /** - * @brief get the number of all users matching the search string in a group + * get the number of all users matching the search string in a group * @param string $gid * @param string $search - * @param int $limit - * @param int $offset - * @return int | false + * @return int|false + * @throws DatabaseException */ public function countUsersInGroup($gid, $search = '') { $stmt = OC_DB::prepare('SELECT COUNT(`uid`) AS `count` FROM `*PREFIX*group_user` WHERE `gid` = ? AND `uid` LIKE ?'); @@ -225,29 +224,4 @@ class OC_Group_Database extends OC_Group_Backend { return $result->fetchOne(); } - /** - * @brief get a list of all display names in a group - * @param string $gid - * @param string $search - * @param int $limit - * @param int $offset - * @return array with display names (value) and user ids (key) - */ - public function displayNamesInGroup($gid, $search = '', $limit = -1, $offset = 0) { - $displayNames = array(); - - $stmt = OC_DB::prepare('SELECT `*PREFIX*users`.`uid`, `*PREFIX*users`.`displayname`' - .' FROM `*PREFIX*users`' - .' INNER JOIN `*PREFIX*group_user` ON `*PREFIX*group_user`.`uid` = `*PREFIX*users`.`uid`' - .' WHERE `gid` = ? AND `*PREFIX*group_user`.`uid` LIKE ?', - $limit, - $offset); - $result = $stmt->execute(array($gid, $search.'%')); - $users = array(); - while ($row = $result->fetchRow()) { - $displayName = trim($row['displayname'], ' '); - $displayNames[$row['uid']] = empty($displayName) ? $row['uid'] : $displayName; - } - return $displayNames; - } } diff --git a/lib/private/group/dummy.php b/lib/private/group/dummy.php index 94cbb607ad1..e48c6a0e266 100644 --- a/lib/private/group/dummy.php +++ b/lib/private/group/dummy.php @@ -27,11 +27,11 @@ class OC_Group_Dummy extends OC_Group_Backend { private $groups=array(); /** - * @brief Try to create a new group + * Try to create a new group * @param string $gid The name of the group to create - * @returns true/false + * @return bool * - * Trys to create a new group. If the group name already exists, false will + * Tries to create a new group. If the group name already exists, false will * be returned. */ public function createGroup($gid) { @@ -44,9 +44,9 @@ class OC_Group_Dummy extends OC_Group_Backend { } /** - * @brief delete a group - * @param $gid gid of the group to delete - * @returns true/false + * delete a group + * @param string $gid gid of the group to delete + * @return bool * * Deletes a group and removes it from the group_user-table */ @@ -60,10 +60,10 @@ class OC_Group_Dummy extends OC_Group_Backend { } /** - * @brief is user in group? - * @param $uid uid of the user - * @param $gid gid of the group - * @returns true/false + * is user in group? + * @param string $uid uid of the user + * @param string $gid gid of the group + * @return bool * * Checks whether the user is member of a group or not. */ @@ -76,10 +76,10 @@ class OC_Group_Dummy extends OC_Group_Backend { } /** - * @brief Add a user to a group - * @param $uid Name of the user to add to group - * @param $gid Name of the group in which add the user - * @returns true/false + * Add a user to a group + * @param string $uid Name of the user to add to group + * @param string $gid Name of the group in which add the user + * @return bool * * Adds a user to a group. */ @@ -97,10 +97,10 @@ class OC_Group_Dummy extends OC_Group_Backend { } /** - * @brief Removes a user from a group - * @param $uid NameUSER of the user to remove from group - * @param $gid Name of the group from which remove the user - * @returns true/false + * Removes a user from a group + * @param string $uid Name of the user to remove from group + * @param string $gid Name of the group from which remove the user + * @return bool * * removes the user from a group. */ @@ -117,9 +117,9 @@ class OC_Group_Dummy extends OC_Group_Backend { } /** - * @brief Get all groups a user belongs to - * @param $uid Name of the user - * @returns array with group names + * Get all groups a user belongs to + * @param string $uid Name of the user + * @return array an array of group names * * This function fetches all groups a user belongs to. It does not check * if the user exists at all. @@ -136,18 +136,23 @@ class OC_Group_Dummy extends OC_Group_Backend { } /** - * @brief get a list of all groups - * @returns array with group names - * - * Returns a list with all groups + * Get a list of all groups + * @param string $search + * @param int $limit + * @param int $offset + * @return array an array of group names */ public function getGroups($search = '', $limit = -1, $offset = 0) { return array_keys($this->groups); } /** - * @brief get a list of all users in a group - * @returns array with user ids + * Get a list of all users in a group + * @param string $gid + * @param string $search + * @param int $limit + * @param int $offset + * @return array an array of user IDs */ public function usersInGroup($gid, $search = '', $limit = -1, $offset = 0) { if(isset($this->groups[$gid])) { @@ -158,8 +163,12 @@ class OC_Group_Dummy extends OC_Group_Backend { } /** - * @brief get the number of all users in a group - * @returns int | bool + * get the number of all users in a group + * @param string $gid + * @param string $search + * @param int $limit + * @param int $offset + * @return int */ public function countUsersInGroup($gid, $search = '', $limit = -1, $offset = 0) { if(isset($this->groups[$gid])) { diff --git a/lib/private/group/example.php b/lib/private/group/example.php index 3519b9ed92f..8c1e22866f2 100644 --- a/lib/private/group/example.php +++ b/lib/private/group/example.php @@ -27,58 +27,58 @@ */ abstract class OC_Group_Example { /** - * @brief Try to create a new group - * @param $gid The name of the group to create - * @returns true/false + * Try to create a new group + * @param string $gid The name of the group to create + * @return bool * - * Trys to create a new group. If the group name already exists, false will + * Tries to create a new group. If the group name already exists, false will * be returned. */ abstract public static function createGroup($gid); /** - * @brief delete a group - * @param $gid gid of the group to delete - * @returns true/false + * delete a group + * @param string $gid gid of the group to delete + * @return bool * * Deletes a group and removes it from the group_user-table */ abstract public static function deleteGroup($gid); /** - * @brief is user in group? - * @param $uid uid of the user - * @param $gid gid of the group - * @returns true/false + * is user in group? + * @param string $uid uid of the user + * @param string $gid gid of the group + * @return bool * * Checks whether the user is member of a group or not. */ abstract public static function inGroup($uid, $gid); /** - * @brief Add a user to a group - * @param $uid Name of the user to add to group - * @param $gid Name of the group in which add the user - * @returns true/false + * Add a user to a group + * @param string $uid Name of the user to add to group + * @param string $gid Name of the group in which add the user + * @return bool * * Adds a user to a group. */ abstract public static function addToGroup($uid, $gid); /** - * @brief Removes a user from a group - * @param $uid NameUSER of the user to remove from group - * @param $gid Name of the group from which remove the user - * @returns true/false + * Removes a user from a group + * @param string $uid Name of the user to remove from group + * @param string $gid Name of the group from which remove the user + * @return bool * * removes the user from a group. */ abstract public static function removeFromGroup($uid, $gid); /** - * @brief Get all groups a user belongs to - * @param $uid Name of the user - * @returns array with group names + * Get all groups a user belongs to + * @param string $uid Name of the user + * @return array an array of group names * * This function fetches all groups a user belongs to. It does not check * if the user exists at all. @@ -86,24 +86,28 @@ abstract class OC_Group_Example { abstract public static function getUserGroups($uid); /** - * @brief get a list of all groups - * @returns array with group names - * - * Returns a list with all groups + * get a list of all groups + * @param string $search + * @param int $limit + * @param int $offset + * @return array an array of group names */ abstract public static function getGroups($search = '', $limit = -1, $offset = 0); /** - * check if a group exists + * Check if a group exists * @param string $gid * @return bool */ abstract public function groupExists($gid); /** - * @brief get a list of all users in a group - * @returns array with user ids + * get a list of all users in a group + * @param string $gid + * @param string $search + * @param int $limit + * @param int $offset + * @return array an array of user ids */ abstract public static function usersInGroup($gid, $search = '', $limit = -1, $offset = 0); - } diff --git a/lib/private/group/group.php b/lib/private/group/group.php index 3efbb6e7023..3e245ab6bbe 100644 --- a/lib/private/group/group.php +++ b/lib/private/group/group.php @@ -26,7 +26,7 @@ class Group { private $usersLoaded; /** - * @var \OC_Group_Backend[] | \OC_Group_Database[] $backend + * @var \OC_Group_Backend[]|\OC_Group_Database[] $backend */ private $backends; @@ -184,7 +184,7 @@ class Group { * returns the number of users matching the search string * * @param string $search - * @return int | bool + * @return int|bool */ public function count($search) { $users = false; @@ -212,11 +212,7 @@ class Group { public function searchDisplayName($search, $limit = null, $offset = null) { $users = array(); foreach ($this->backends as $backend) { - if ($backend->implementsActions(OC_GROUP_BACKEND_GET_DISPLAYNAME)) { - $userIds = array_keys($backend->displayNamesInGroup($this->gid, $search, $limit, $offset)); - } else { - $userIds = $backend->usersInGroup($this->gid, $search, $limit, $offset); - } + $userIds = $backend->usersInGroup($this->gid, $search, $limit, $offset); $users = $this->getVerifiedUsers($userIds); if (!is_null($limit) and $limit <= 0) { return array_values($users); @@ -248,7 +244,7 @@ class Group { } /** - * @brief returns all the Users from an array that really exists + * returns all the Users from an array that really exists * @param string[] $userIds an array containing user IDs * @return \OC\User\User[] an Array with the userId as Key and \OC\User\User as value */ diff --git a/lib/private/group/interface.php b/lib/private/group/interface.php index 4ef3663837f..ee5c2d635d6 100644 --- a/lib/private/group/interface.php +++ b/lib/private/group/interface.php @@ -23,7 +23,7 @@ interface OC_Group_Interface { /** - * @brief Check if backend implements actions + * Check if backend implements actions * @param int $actions bitwise-or'ed actions * @return boolean * @@ -33,7 +33,7 @@ interface OC_Group_Interface { public function implementsActions($actions); /** - * @brief is user in group? + * is user in group? * @param string $uid uid of the user * @param string $gid gid of the group * @return bool @@ -43,9 +43,9 @@ interface OC_Group_Interface { public function inGroup($uid, $gid); /** - * @brief Get all groups a user belongs to + * Get all groups a user belongs to * @param string $uid Name of the user - * @return array with group names + * @return array an array of group names * * This function fetches all groups a user belongs to. It does not check * if the user exists at all. @@ -53,11 +53,11 @@ interface OC_Group_Interface { public function getUserGroups($uid); /** - * @brief get a list of all groups + * get a list of all groups * @param string $search * @param int $limit * @param int $offset - * @return array with group names + * @return array an array of group names * * Returns a list with all groups */ @@ -71,12 +71,12 @@ interface OC_Group_Interface { public function groupExists($gid); /** - * @brief get a list of all users in a group + * get a list of all users in a group * @param string $gid * @param string $search * @param int $limit * @param int $offset - * @return array with user ids + * @return array an array of user ids */ public function usersInGroup($gid, $search = '', $limit = -1, $offset = 0); diff --git a/lib/private/group/manager.php b/lib/private/group/manager.php index f591bd32aba..dae6443e9d4 100644 --- a/lib/private/group/manager.php +++ b/lib/private/group/manager.php @@ -28,7 +28,7 @@ use OC\Hooks\PublicEmitter; */ class Manager extends PublicEmitter { /** - * @var \OC_Group_Backend[] | \OC_Group_Database[] $backends + * @var \OC_Group_Backend[]|\OC_Group_Database[] $backends */ private $backends = array(); @@ -40,19 +40,38 @@ class Manager extends PublicEmitter { /** * @var \OC\Group\Group[] */ - private $cachedGroups; + private $cachedGroups = array(); + + /** + * @var \OC\Group\Group[] + */ + private $cachedUserGroups = array(); /** * @param \OC\User\Manager $userManager */ public function __construct($userManager) { $this->userManager = $userManager; - $cache = & $this->cachedGroups; - $this->listen('\OC\Group', 'postDelete', function ($group) use (&$cache) { + $cachedGroups = & $this->cachedGroups; + $cachedUserGroups = & $this->cachedUserGroups; + $this->listen('\OC\Group', 'postDelete', function ($group) use (&$cachedGroups, &$cachedUserGroups) { + /** + * @var \OC\Group\Group $group + */ + unset($cachedGroups[$group->getGID()]); + $cachedUserGroups = array(); + }); + $this->listen('\OC\Group', 'postAddUser', function ($group) use (&$cachedUserGroups) { /** * @var \OC\Group\Group $group */ - unset($cache[$group->getGID()]); + $cachedUserGroups = array(); + }); + $this->listen('\OC\Group', 'postRemoveUser', function ($group) use (&$cachedUserGroups) { + /** + * @var \OC\Group\Group $group + */ + $cachedUserGroups = array(); }); } @@ -135,7 +154,7 @@ class Manager extends PublicEmitter { foreach ($this->backends as $backend) { $groupIds = $backend->getGroups($search, $limit, $offset); foreach ($groupIds as $groupId) { - $groups[$groupId] = $this->getGroupObject($groupId); + $groups[$groupId] = $this->get($groupId); } if (!is_null($limit) and $limit <= 0) { return array_values($groups); @@ -149,13 +168,52 @@ class Manager extends PublicEmitter { * @return \OC\Group\Group[] */ public function getUserGroups($user) { + $uid = $user->getUID(); + if (isset($this->cachedUserGroups[$uid])) { + return $this->cachedUserGroups[$uid]; + } $groups = array(); foreach ($this->backends as $backend) { - $groupIds = $backend->getUserGroups($user->getUID()); + $groupIds = $backend->getUserGroups($uid); foreach ($groupIds as $groupId) { - $groups[$groupId] = $this->getGroupObject($groupId); + $groups[$groupId] = $this->get($groupId); } } - return array_values($groups); + $this->cachedUserGroups[$uid] = array_values($groups); + return $this->cachedUserGroups[$uid]; + } + + /** + * get a list of all display names in a group + * @param string $gid + * @param string $search + * @param int $limit + * @param int $offset + * @return array an array of display names (value) and user ids (key) + */ + public function displayNamesInGroup($gid, $search = '', $limit = -1, $offset = 0) { + $group = $this->get($gid); + if(is_null($group)) { + return array(); + } + // only user backends have the capability to do a complex search for users + $groupUsers = $group->searchUsers('', $limit, $offset); + $search = trim($search); + if(!empty($search)) { + //TODO: for OC 7 earliest: user backend should get a method to check selected users against a pattern + $filteredUsers = $this->userManager->search($search); + $testUsers = true; + } else { + $filteredUsers = array(); + $testUsers = false; + } + + $matchingUsers = array(); + foreach($groupUsers as $user) { + if(!$testUsers || isset($filteredUsers[$user->getUID()])) { + $matchingUsers[$user->getUID()] = $user->getDisplayName(); + } + } + return $matchingUsers; } } diff --git a/lib/private/helper.php b/lib/private/helper.php index 4058ec199a7..4ad792dfb13 100644 --- a/lib/private/helper.php +++ b/lib/private/helper.php @@ -31,12 +31,12 @@ class OC_Helper { private static $templateManager; /** - * @brief Creates an url using a defined route - * @param $route + * Creates an url using a defined route + * @param string $route * @param array $parameters * @return * @internal param array $args with param=>value, will be appended to the returned url - * @returns string the url + * @return string the url * * Returns a url to the given app and file. */ @@ -45,7 +45,7 @@ class OC_Helper { } /** - * @brief Creates an url + * Creates an url * @param string $app app * @param string $file file * @param array $args array with param=>value, will be appended to the returned url @@ -68,7 +68,7 @@ class OC_Helper { } /** - * @brief Creates an absolute url + * Creates an absolute url * @param string $app app * @param string $file file * @param array $args array with param=>value, will be appended to the returned url @@ -78,11 +78,13 @@ class OC_Helper { * Returns a absolute url to the given app and file. */ public static function linkToAbsolute($app, $file, $args = array()) { - return self::linkTo($app, $file, $args); + return OC::$server->getURLGenerator()->getAbsoluteURL( + self::linkTo($app, $file, $args) + ); } /** - * @brief Makes an $url absolute + * Makes an $url absolute * @param string $url the url * @return string the absolute url * @@ -93,7 +95,7 @@ class OC_Helper { } /** - * @brief Creates an url for remote use + * Creates an url for remote use * @param string $service id * @return string the url * @@ -104,7 +106,7 @@ class OC_Helper { } /** - * @brief Creates an absolute url for remote use + * Creates an absolute url for remote use * @param string $service id * @param bool $add_slash * @return string the url @@ -112,12 +114,14 @@ class OC_Helper { * Returns a absolute url to the given service. */ public static function linkToRemote($service, $add_slash = true) { - return self::makeURLAbsolute(self::linkToRemoteBase($service)) - . (($add_slash && $service[strlen($service) - 1] != '/') ? '/' : ''); + return OC::$server->getURLGenerator()->getAbsoluteURL( + self::linkToRemoteBase($service) + . (($add_slash && $service[strlen($service) - 1] != '/') ? '/' : '') + ); } /** - * @brief Creates an absolute url for public use + * Creates an absolute url for public use * @param string $service id * @param bool $add_slash * @return string the url @@ -125,12 +129,16 @@ class OC_Helper { * Returns a absolute url to the given service. */ public static function linkToPublic($service, $add_slash = false) { - return self::linkToAbsolute('', 'public.php') . '?service=' . $service - . (($add_slash && $service[strlen($service) - 1] != '/') ? '/' : ''); + return OC::$server->getURLGenerator()->getAbsoluteURL( + self::linkTo( + '', 'public.php') . '?service=' . $service + . (($add_slash && $service[strlen($service) - 1] != '/') ? '/' : '' + ) + ); } /** - * @brief Creates path to an image + * Creates path to an image * @param string $app app * @param string $image image name * @return string the url @@ -142,7 +150,7 @@ class OC_Helper { } /** - * @brief get path to icon of file type + * get path to icon of file type * @param string $mimetype mimetype * @return string the url * @@ -256,7 +264,7 @@ class OC_Helper { } /** - * @brief get path to preview of file + * get path to preview of file * @param string $path path * @return string the url * @@ -271,7 +279,7 @@ class OC_Helper { } /** - * @brief Make a human file size + * Make a human file size * @param int $bytes file size in bytes * @return string a human readable file size * @@ -306,7 +314,7 @@ class OC_Helper { } /** - * @brief Make a php file size + * Make a php file size * @param int $bytes file size in bytes * @return string a php parseable file size * @@ -332,7 +340,7 @@ class OC_Helper { } /** - * @brief Make a computer file size + * Make a computer file size * @param string $str file size in human readable format * @return int a file size in bytes * @@ -369,7 +377,7 @@ class OC_Helper { } /** - * @brief Recursive copying of folders + * Recursive copying of folders * @param string $src source folder * @param string $dest target folder * @@ -391,7 +399,7 @@ class OC_Helper { } /** - * @brief Recursive deletion of folders + * Recursive deletion of folders * @param string $dir path to the folder * @return bool */ @@ -477,7 +485,7 @@ class OC_Helper { } /** - * @brief Checks $_REQUEST contains a var for the $s key. If so, returns the html-escaped value of this var; otherwise returns the default value provided by $d. + * Checks $_REQUEST contains a var for the $s key. If so, returns the html-escaped value of this var; otherwise returns the default value provided by $d. * @param string $s name of the var to escape, if set. * @param string $d default value. * @return string the print-safe value. @@ -487,7 +495,7 @@ class OC_Helper { /** * detect if a given program is found in the search PATH * - * @param $name + * @param string $name * @param bool $path * @internal param string $program name * @internal param string $optional search path, defaults to $PATH @@ -662,8 +670,8 @@ class OC_Helper { /** * Adds a suffix to the name in case the file exists * - * @param $path - * @param $filename + * @param string $path + * @param string $filename * @return string */ public static function buildNotExistingFileName($path, $filename) { @@ -674,8 +682,8 @@ class OC_Helper { /** * Adds a suffix to the name in case the file exists * - * @param $path - * @param $filename + * @param string $path + * @param string $filename * @return string */ public static function buildNotExistingFileNameForView($path, $filename, \OC\Files\View $view) { @@ -718,21 +726,33 @@ class OC_Helper { } /** - * @brief Checks if $sub is a subdirectory of $parent + * Checks if $sub is a subdirectory of $parent * * @param string $sub * @param string $parent * @return bool */ - public static function issubdirectory($sub, $parent) { - if (strpos(realpath($sub), realpath($parent)) === 0) { + public static function isSubDirectory($sub, $parent) { + $realpathSub = realpath($sub); + $realpathParent = realpath($parent); + + // realpath() may return false in case the directory does not exist + // since we can not be sure how different PHP versions may behave here + // we do an additional check whether realpath returned false + if($realpathSub === false || $realpathParent === false) { + return false; + } + + // Check whether $sub is a subdirectory of $parent + if (strpos($realpathSub, $realpathParent) === 0) { return true; } + return false; } /** - * @brief Returns an array with all keys from input lowercased or uppercased. Numbered indices are left as is. + * Returns an array with all keys from input lowercased or uppercased. Numbered indices are left as is. * * @param array $input The array to work on * @param int $case Either MB_CASE_UPPER or MB_CASE_LOWER (default) @@ -753,9 +773,9 @@ class OC_Helper { } /** - * @brief replaces a copy of string delimited by the start and (optionally) length parameters with the string given in replacement. + * replaces a copy of string delimited by the start and (optionally) length parameters with the string given in replacement. * - * @param $string + * @param string $string * @param string $replacement The replacement string. * @param int $start If start is positive, the replacing will begin at the start'th offset into string. If start is negative, the replacing will begin at the start'th character from the end of string. * @param int $length Length of the part to be replaced @@ -774,7 +794,7 @@ class OC_Helper { } /** - * @brief Replace all occurrences of the search string with the replacement string + * Replace all occurrences of the search string with the replacement string * * @param string $search The value being searched for, otherwise known as the needle. * @param string $replace The replacement @@ -796,7 +816,7 @@ class OC_Helper { } /** - * @brief performs a search in a nested array + * performs a search in a nested array * @param array $haystack the array to be searched * @param string $needle the search string * @param string $index optional, only search this key name @@ -838,7 +858,7 @@ class OC_Helper { } /** - * @brief calculates the maximum upload size respecting system settings, free space and user quota + * calculates the maximum upload size respecting system settings, free space and user quota * * @param string $dir the current folder where the user currently operates * @param int $freeSpace the number of bytes free on the storage holding $dir, if not set this will be received from the storage directly @@ -853,7 +873,7 @@ class OC_Helper { /** * Calculate free space left within user quota - * + * * @param string $dir the current folder where the user currently operates * @return int number of bytes representing */ diff --git a/lib/private/hook.php b/lib/private/hook.php index b63b442c31b..30e22847c7f 100644 --- a/lib/private/hook.php +++ b/lib/private/hook.php @@ -8,7 +8,7 @@ class OC_Hook{ static private $registered = array(); /** - * @brief connects a function to a hook + * connects a function to a hook * @param string $signalclass class name of emitter * @param string $signalname name of signal * @param string $slotclass class name of slot @@ -42,10 +42,10 @@ class OC_Hook{ } /** - * @brief emits a signal + * emits a signal * @param string $signalclass class name of emitter * @param string $signalname name of signal - * @param array $params defautl: array() array with additional data + * @param mixed $params default: array() array with additional data * @return bool, true if slots exists or false if not * * Emits a signal. To get data from the slot use references! diff --git a/lib/private/image.php b/lib/private/image.php index 14aa64d12da..5331c399159 100644 --- a/lib/private/image.php +++ b/lib/private/image.php @@ -33,7 +33,7 @@ class OC_Image { private $fileInfo; /** - * @brief Get mime type for an image file. + * Get mime type for an image file. * @param string|null $filePath The path to a local image file. * @return string The mime type if the it could be determined, otherwise an empty string. */ @@ -48,7 +48,7 @@ class OC_Image { } /** - * @brief Constructor. + * Constructor. * @param resource|string $imageRef The path to a local file, a base64 encoded string or a resource created by * an imagecreate* function. * @return \OC_Image False on error @@ -70,7 +70,7 @@ class OC_Image { } /** - * @brief Determine whether the object contains an image resource. + * Determine whether the object contains an image resource. * @return bool */ public function valid() { // apparently you can't name a method 'empty'... @@ -78,7 +78,7 @@ class OC_Image { } /** - * @brief Returns the MIME type of the image or an empty string if no image is loaded. + * Returns the MIME type of the image or an empty string if no image is loaded. * @return string */ public function mimeType() { @@ -86,7 +86,7 @@ class OC_Image { } /** - * @brief Returns the width of the image or -1 if no image is loaded. + * Returns the width of the image or -1 if no image is loaded. * @return int */ public function width() { @@ -94,7 +94,7 @@ class OC_Image { } /** - * @brief Returns the height of the image or -1 if no image is loaded. + * Returns the height of the image or -1 if no image is loaded. * @return int */ public function height() { @@ -102,7 +102,7 @@ class OC_Image { } /** - * @brief Returns the width when the image orientation is top-left. + * Returns the width when the image orientation is top-left. * @return int */ public function widthTopLeft() { @@ -125,7 +125,7 @@ class OC_Image { } /** - * @brief Returns the height when the image orientation is top-left. + * Returns the height when the image orientation is top-left. * @return int */ public function heightTopLeft() { @@ -148,7 +148,7 @@ class OC_Image { } /** - * @brief Outputs the image. + * Outputs the image. * @param string $mimeType * @return bool */ @@ -161,7 +161,7 @@ class OC_Image { } /** - * @brief Saves the image. + * Saves the image. * @param string $filePath * @param string $mimeType * @return bool @@ -181,7 +181,7 @@ class OC_Image { } /** - * @brief Outputs/saves the image. + * Outputs/saves the image. * @param string $filePath * @param string $mimeType * @return bool @@ -259,7 +259,7 @@ class OC_Image { } /** - * @brief Prints the image when called as $image(). + * Prints the image when called as $image(). */ public function __invoke() { return $this->show(); @@ -307,7 +307,7 @@ class OC_Image { /** * (I'm open for suggestions on better method name ;) - * @brief Get the orientation based on EXIF data. + * Get the orientation based on EXIF data. * @return int The orientation or -1 if no EXIF data is available. */ public function getOrientation() { @@ -335,7 +335,7 @@ class OC_Image { /** * (I'm open for suggestions on better method name ;) - * @brief Fixes orientation based on EXIF data. + * Fixes orientation based on EXIF data. * @return bool. */ public function fixOrientation() { @@ -396,7 +396,7 @@ class OC_Image { } /** - * @brief Loads an image from a local file, a base64 encoded string or a resource created by an imagecreate* function. + * Loads an image from a local file, a base64 encoded string or a resource created by an imagecreate* function. * @param resource|string $imageRef The path to a local file, a base64 encoded string or a resource created by an imagecreate* function or a file resource (file handle ). * @return resource|false An image resource or false on error */ @@ -421,10 +421,10 @@ class OC_Image { } /** - * @brief Loads an image from an open file handle. + * Loads an image from an open file handle. * It is the responsibility of the caller to position the pointer at the correct place and to close the handle again. * @param resource $handle - * @return An image resource or false on error + * @return resource|false An image resource or false on error */ public function loadFromFileHandle($handle) { OC_Log::write('core', __METHOD__.'(): Trying', OC_Log::DEBUG); @@ -435,7 +435,7 @@ class OC_Image { } /** - * @brief Loads an image from a local file. + * Loads an image from a local file. * @param bool|string $imagePath The path to a local file. * @return bool|resource An image resource or false on error */ @@ -536,7 +536,7 @@ class OC_Image { } /** - * @brief Loads an image from a string of data. + * Loads an image from a string of data. * @param string $str A string of image data as read from a file. * @return bool|resource An image resource or false on error */ @@ -561,7 +561,7 @@ class OC_Image { } /** - * @brief Loads an image from a base64 encoded string. + * Loads an image from a base64 encoded string. * @param string $str A string base64 encoded string of image data. * @return bool|resource An image resource or false on error */ @@ -729,7 +729,7 @@ class OC_Image { } /** - * @brief Resizes the image preserving ratio. + * Resizes the image preserving ratio. * @param integer $maxSize The maximum size of either the width or height. * @return bool */ @@ -793,7 +793,7 @@ class OC_Image { } /** - * @brief Crops the image to the middle square. If the image is already square it just returns. + * Crops the image to the middle square. If the image is already square it just returns. * @param int $size maximum size for the result (optional) * @return bool for success or failure */ @@ -852,7 +852,7 @@ class OC_Image { } /** - * @brief Crops the image from point $x$y with dimension $wx$h. + * Crops the image from point $x$y with dimension $wx$h. * @param int $x Horizontal position * @param int $y Vertical position * @param int $w Width @@ -882,7 +882,7 @@ class OC_Image { } /** - * @brief Resizes the image to fit within a boundry while preserving ratio. + * Resizes the image to fit within a boundry while preserving ratio. * @param integer $maxWidth * @param integer $maxHeight * @return bool diff --git a/lib/private/installer.php b/lib/private/installer.php index 64e8e3a5e7a..667c05c9c16 100644 --- a/lib/private/installer.php +++ b/lib/private/installer.php @@ -52,7 +52,7 @@ class OC_Installer{ * It is the task of oc_app_install to create the tables and do whatever is * needed to get the app working. * - * @brief Installs an app + * Installs an app * @param array $data with all information * @throws \Exception * @return integer @@ -219,9 +219,9 @@ class OC_Installer{ } /** - * @brief checks whether or not an app is installed + * checks whether or not an app is installed * @param string $app app - * @returns true/false + * @return bool * * Checks whether or not an app is installed, i.e. registered in apps table. */ @@ -235,7 +235,7 @@ class OC_Installer{ } /** - * @brief Update an application + * Update an application * * This function installs an app. All information needed are passed in the * associative array $data. @@ -268,7 +268,7 @@ class OC_Installer{ } /** - * @brief Check if an update for the app is available + * Check if an update for the app is available * @return string|false false or the version number of the update * * The function will check if an update for a version is available @@ -295,7 +295,7 @@ class OC_Installer{ } /** - * @brief Check if app is already downloaded + * Check if app is already downloaded * @param string $name name of the application to remove * @return boolean * @@ -311,9 +311,9 @@ class OC_Installer{ } /** - * @brief Removes an app + * Removes an app * @param string $name name of the application to remove - * @param $options array with options + * @param array $options options * @return boolean|null * * This function removes an app. $options is an associative array. The @@ -364,7 +364,7 @@ class OC_Installer{ } /** - * @brief Installs shipped apps + * Installs shipped apps * * This function installs all apps found in the 'apps' directory that should be enabled by default; */ diff --git a/lib/private/l10n.php b/lib/private/l10n.php index c7e4328161e..3e44be88150 100644 --- a/lib/private/l10n.php +++ b/lib/private/l10n.php @@ -86,7 +86,7 @@ class OC_L10N implements \OCP\IL10N { } /** - * @brief The constructor + * The constructor * @param string $app app requesting l10n * @param string $lang default: null Language * @@ -134,10 +134,10 @@ class OC_L10N implements \OCP\IL10N { $i18ndir = self::findI18nDir($app); // Localization is in /l10n, Texts are in $i18ndir // (Just no need to define date/time format etc. twice) - if((OC_Helper::issubdirectory($i18ndir.$lang.'.php', OC::$SERVERROOT.'/core/l10n/') - || OC_Helper::issubdirectory($i18ndir.$lang.'.php', OC::$SERVERROOT.'/lib/l10n/') - || OC_Helper::issubdirectory($i18ndir.$lang.'.php', OC::$SERVERROOT.'/settings') - || OC_Helper::issubdirectory($i18ndir.$lang.'.php', OC_App::getAppPath($app).'/l10n/') + if((OC_Helper::isSubDirectory($i18ndir.$lang.'.php', OC::$SERVERROOT.'/core/l10n/') + || OC_Helper::isSubDirectory($i18ndir.$lang.'.php', OC::$SERVERROOT.'/lib/l10n/') + || OC_Helper::isSubDirectory($i18ndir.$lang.'.php', OC::$SERVERROOT.'/settings') + || OC_Helper::isSubDirectory($i18ndir.$lang.'.php', OC_App::getAppPath($app).'/l10n/') ) && file_exists($i18ndir.$lang.'.php')) { // Include the file, save the data from $CONFIG @@ -162,7 +162,7 @@ class OC_L10N implements \OCP\IL10N { } } - if(file_exists(OC::$SERVERROOT.'/core/l10n/l10n-'.$lang.'.php') && OC_Helper::issubdirectory(OC::$SERVERROOT.'/core/l10n/l10n-'.$lang.'.php', OC::$SERVERROOT.'/core/l10n/')) { + if(file_exists(OC::$SERVERROOT.'/core/l10n/l10n-'.$lang.'.php') && OC_Helper::isSubDirectory(OC::$SERVERROOT.'/core/l10n/l10n-'.$lang.'.php', OC::$SERVERROOT.'/core/l10n/')) { // Include the file, save the data from $CONFIG include OC::$SERVERROOT.'/core/l10n/l10n-'.$lang.'.php'; if(isset($LOCALIZATIONS) && is_array($LOCALIZATIONS)) { @@ -176,14 +176,14 @@ class OC_L10N implements \OCP\IL10N { } /** - * @brief Creates a function that The constructor + * Creates a function that The constructor * * If language is not set, the constructor tries to find the right * language. * * Parts of the code is copied from Habari: * https://github.com/habari/system/blob/master/classes/locale.php - * @param $string string + * @param string $string * @return string */ protected function createPluralFormFunction($string){ @@ -235,7 +235,7 @@ class OC_L10N implements \OCP\IL10N { } /** - * @brief Translating + * Translating * @param string $text The text we need a translation for * @param array $parameters default:array() Parameters for sprintf * @return \OC_L10N_String Translation or the same text @@ -248,7 +248,7 @@ class OC_L10N implements \OCP\IL10N { } /** - * @brief Translating + * Translating * @param string $text_singular the string to translate for exactly one object * @param string $text_plural the string to translate for n objects * @param integer $count Number of objects @@ -277,8 +277,8 @@ class OC_L10N implements \OCP\IL10N { } /** - * @brief getTranslations - * @returns array Fetch all translations + * getTranslations + * @return array Fetch all translations * * Returns an associative array with all translations */ @@ -288,8 +288,8 @@ class OC_L10N implements \OCP\IL10N { } /** - * @brief getPluralFormString - * @returns string containing the gettext "Plural-Forms"-string + * getPluralFormString + * @return string containing the gettext "Plural-Forms"-string * * Returns a string like "nplurals=2; plural=(n != 1);" */ @@ -299,8 +299,8 @@ class OC_L10N implements \OCP\IL10N { } /** - * @brief getPluralFormFunction - * @returns string the plural form function + * getPluralFormFunction + * @return string the plural form function * * returned function accepts the argument $n */ @@ -313,8 +313,8 @@ class OC_L10N implements \OCP\IL10N { } /** - * @brief get localizations - * @returns array Fetch all localizations + * get localizations + * @return array Fetch all localizations * * Returns an associative array with all localizations */ @@ -324,10 +324,10 @@ class OC_L10N implements \OCP\IL10N { } /** - * @brief Localization + * Localization * @param string $type Type of localization - * @param array $data parameters for this localization - * @returns String or false + * @param array|int|string $data parameters for this localization + * @return String or false * * Returns the localized data. * @@ -379,9 +379,9 @@ class OC_L10N implements \OCP\IL10N { } /** - * @brief Choose a language + * Choose a language * @param array $text Associative Array with possible strings - * @returns String + * @return String * * $text is an array 'de' => 'hallo welt', 'en' => 'hello world', ... * @@ -401,10 +401,27 @@ class OC_L10N implements \OCP\IL10N { self::$language = $lang; } + + /** + * find the best language + * @param array|string $app details below + * string language + * + * If $app is an array, ownCloud assumes that these are the available + * languages. Otherwise ownCloud tries to find the files in the l10n + * folder. + * + * If nothing works it returns 'en' + */ + public function getLanguageCode($app=null) { + return self::findLanguage($app); + } + + /** - * @brief find the best language + * find the best language * @param array|string $app details below - * @returns string language + * @return string language * * If $app is an array, ownCloud assumes that these are the available * languages. Otherwise ownCloud tries to find the files in the l10n @@ -475,9 +492,9 @@ class OC_L10N implements \OCP\IL10N { } /** - * @brief find the l10n directory + * find the l10n directory * @param string $app App that needs to be translated - * @returns directory + * @return directory */ protected static function findI18nDir($app) { // find the i18n dir @@ -495,9 +512,9 @@ class OC_L10N implements \OCP\IL10N { } /** - * @brief find all available languages for an app + * find all available languages for an app * @param string $app App that needs to be translated - * @returns array an array of available languages + * @return array an array of available languages */ public static function findAvailableLanguages($app=null) { $available=array('en');//english is always available @@ -517,7 +534,7 @@ class OC_L10N implements \OCP\IL10N { /** * @param string $app * @param string $lang - * @returns bool + * @return bool */ public static function languageExists($app, $lang) { if ($lang == 'en') {//english is always available diff --git a/lib/private/l10n/factory.php b/lib/private/l10n/factory.php index 8c65f368171..d0c3799b9c2 100644 --- a/lib/private/l10n/factory.php +++ b/lib/private/l10n/factory.php @@ -20,8 +20,8 @@ class Factory { /** * get an L10N instance - * @param $app string - * @param $lang string|null + * @param string $app + * @param string|null $lang * @return \OC_L10N */ public function get($app) { diff --git a/lib/private/legacy/appconfig.php b/lib/private/legacy/appconfig.php index cb5cef7e350..4634f2c695d 100644 --- a/lib/private/legacy/appconfig.php +++ b/lib/private/legacy/appconfig.php @@ -34,8 +34,8 @@ class OC_Appconfig { } /** - * @brief Get all apps using the config - * @return array with app ids + * Get all apps using the config + * @return array an array of app ids * * This function returns a list of all apps that have at least one * entry in the appconfig table. @@ -45,9 +45,9 @@ class OC_Appconfig { } /** - * @brief Get the available keys for an app + * Get the available keys for an app * @param string $app the app we are looking for - * @return array with key names + * @return array an array of key names * * This function gets all keys of an app. Please note that the values are * not returned. @@ -57,7 +57,7 @@ class OC_Appconfig { } /** - * @brief Gets the config value + * Gets the config value * @param string $app app * @param string $key key * @param string $default = null, default value if the key does not exist @@ -71,7 +71,7 @@ class OC_Appconfig { } /** - * @brief check if a key is set in the appconfig + * check if a key is set in the appconfig * @param string $app * @param string $key * @return bool @@ -81,7 +81,7 @@ class OC_Appconfig { } /** - * @brief sets a value in the appconfig + * sets a value in the appconfig * @param string $app app * @param string $key key * @param string $value value @@ -93,7 +93,7 @@ class OC_Appconfig { } /** - * @brief Deletes a key + * Deletes a key * @param string $app app * @param string $key key * @@ -104,7 +104,7 @@ class OC_Appconfig { } /** - * @brief Remove app from appconfig + * Remove app from appconfig * @param string $app app * * Removes all keys in appconfig belonging to the app. diff --git a/lib/private/legacy/cache.php b/lib/private/legacy/cache.php deleted file mode 100644 index f915eb516b1..00000000000 --- a/lib/private/legacy/cache.php +++ /dev/null @@ -1,10 +0,0 @@ -<?php -/** - * Copyright (c) 2013 Thomas Tanghus (thomas@tanghus.net) - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -class OC_Cache extends \OC\Cache { -}
\ No newline at end of file diff --git a/lib/private/legacy/cache/fileglobalgc.php b/lib/private/legacy/cache/fileglobalgc.php deleted file mode 100644 index 385f6406673..00000000000 --- a/lib/private/legacy/cache/fileglobalgc.php +++ /dev/null @@ -1,4 +0,0 @@ -<?php - -class OC_Cache_FileGlobalGC extends OC\Cache\FileGlobalGC{ -} diff --git a/lib/private/legacy/config.php b/lib/private/legacy/config.php index 6c2103179ab..899c19532f0 100644 --- a/lib/private/legacy/config.php +++ b/lib/private/legacy/config.php @@ -50,8 +50,8 @@ class OC_Config { } /** - * @brief Lists all available config keys - * @return array with key names + * Lists all available config keys + * @return array an array of key names * * This function returns all keys saved in config.php. Please note that it * does not return the values. @@ -61,7 +61,7 @@ class OC_Config { } /** - * @brief Gets a value from config.php + * Gets a value from config.php * @param string $key key * @param mixed $default = null default value * @return mixed the value or $default @@ -74,7 +74,7 @@ class OC_Config { } /** - * @brief Sets a value + * Sets a value * @param string $key key * @param mixed $value value * @@ -86,7 +86,7 @@ class OC_Config { } /** - * @brief Removes a key from the config + * Removes a key from the config * @param string $key key * * This function removes a key from the config.php. diff --git a/lib/private/legacy/filesystem.php b/lib/private/legacy/filesystem.php deleted file mode 100644 index 34f92b357ca..00000000000 --- a/lib/private/legacy/filesystem.php +++ /dev/null @@ -1,415 +0,0 @@ -<?php - -/** - * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -/** - * Class for abstraction of filesystem functions - * This class won't call any filesystem functions for itself but but will pass them to the correct OC_Filestorage object - * this class should also handle all the file permission related stuff - * - * Hooks provided: - * read(path) - * write(path, &run) - * post_write(path) - * create(path, &run) (when a file is created, both create and write will be emitted in that order) - * post_create(path) - * delete(path, &run) - * post_delete(path) - * rename(oldpath,newpath, &run) - * post_rename(oldpath,newpath) - * copy(oldpath,newpath, &run) (if the newpath doesn't exists yes, copy, create and write will be emitted in that order) - * post_rename(oldpath,newpath) - * - * the &run parameter can be set to false to prevent the operation from occurring - */ - -/** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ -class OC_Filesystem { - /** - * get the mountpoint of the storage object for a path - * ( note: because a storage is not always mounted inside the fakeroot, the - * returned mountpoint is relative to the absolute root of the filesystem - * and doesn't take the chroot into account ) - * - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - * @param string $path - * @return string - */ - static public function getMountPoint($path) { - return \OC\Files\Filesystem::getMountPoint($path); - } - - /** - * resolve a path to a storage and internal path - * - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - * @param string $path - * @return array consisting of the storage and the internal path - */ - static public function resolvePath($path) { - return \OC\Files\Filesystem::resolvePath($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function init($user, $root) { - return \OC\Files\Filesystem::init($user, $root); - } - - /** - * get the default filesystem view - * - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - * @return \OC\Files\View - */ - static public function getView() { - return \OC\Files\Filesystem::getView(); - } - - /** - * tear down the filesystem, removing all storage providers - * - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function tearDown() { - \OC\Files\Filesystem::tearDown(); - } - - /** - * @brief get the relative path of the root data directory for the current user - * @return string - * - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - * Returns path like /admin/files - */ - static public function getRoot() { - return \OC\Files\Filesystem::getRoot(); - } - - /** - * clear all mounts and storage backends - * - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - public static function clearMounts() { - \OC\Files\Filesystem::clearMounts(); - } - - /** - * mount an \OC\Files\Storage\Storage in our virtual filesystem - * - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - * @param \OC\Files\Storage\Storage $class - * @param array $arguments - * @param string $mountpoint - */ - static public function mount($class, $arguments, $mountpoint) { - \OC\Files\Filesystem::mount($class, $arguments, $mountpoint); - } - - /** - * return the path to a local version of the file - * we need this because we can't know if a file is stored local or not from - * outside the filestorage and for some purposes a local file is needed - * - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - * @param string $path - * @return string - */ - static public function getLocalFile($path) { - return \OC\Files\Filesystem::getLocalFile($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - * @param string $path - * @return string - */ - static public function getLocalFolder($path) { - return \OC\Files\Filesystem::getLocalFolder($path); - } - - /** - * return path to file which reflects one visible in browser - * - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - * @param string $path - * @return string - */ - static public function getLocalPath($path) { - return \OC\Files\Filesystem::getLocalPath($path); - } - - /** - * check if the requested path is valid - * - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - * @param string $path - * @return bool - */ - static public function isValidPath($path) { - return \OC\Files\Filesystem::isValidPath($path); - } - - /** - * checks if a file is blacklisted for storage in the filesystem - * Listens to write and rename hooks - * - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - * @param array $data from hook - */ - static public function isBlacklisted($data) { - \OC\Files\Filesystem::isBlacklisted($data); - } - - /** - * following functions are equivalent to their php builtin equivalents for arguments/return values. - * - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function mkdir($path) { - return \OC\Files\Filesystem::mkdir($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function rmdir($path) { - return \OC\Files\Filesystem::rmdir($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function opendir($path) { - return \OC\Files\Filesystem::opendir($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function readdir($path) { - return \OC\Files\Filesystem::readdir($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function is_dir($path) { - return \OC\Files\Filesystem::is_dir($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function is_file($path) { - return \OC\Files\Filesystem::is_file($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function stat($path) { - return \OC\Files\Filesystem::stat($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function filetype($path) { - return \OC\Files\Filesystem::filetype($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function filesize($path) { - return \OC\Files\Filesystem::filesize($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function readfile($path) { - return \OC\Files\Filesystem::readfile($path); - } - - /** - * @deprecated Replaced by isReadable() as part of CRUDS - */ - static public function is_readable($path) { - return \OC\Files\Filesystem::isReadable($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function isCreatable($path) { - return \OC\Files\Filesystem::isCreatable($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function isReadable($path) { - return \OC\Files\Filesystem::isReadable($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function isUpdatable($path) { - return \OC\Files\Filesystem::isUpdatable($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function isDeletable($path) { - return \OC\Files\Filesystem::isDeletable($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function isSharable($path) { - return \OC\Files\Filesystem::isSharable($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function file_exists($path) { - return \OC\Files\Filesystem::file_exists($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function filemtime($path) { - return \OC\Files\Filesystem::filemtime($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function touch($path, $mtime = null) { - return \OC\Files\Filesystem::touch($path, $mtime); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function file_get_contents($path) { - return \OC\Files\Filesystem::file_get_contents($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function file_put_contents($path, $data) { - return \OC\Files\Filesystem::file_put_contents($path, $data); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function unlink($path) { - return \OC\Files\Filesystem::unlink($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function rename($path1, $path2) { - return \OC\Files\Filesystem::rename($path1, $path2); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function copy($path1, $path2) { - return \OC\Files\Filesystem::copy($path1, $path2); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function fopen($path, $mode) { - return \OC\Files\Filesystem::fopen($path, $mode); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function toTmpFile($path) { - return \OC\Files\Filesystem::toTmpFile($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function fromTmpFile($tmpFile, $path) { - return \OC\Files\Filesystem::fromTmpFile($tmpFile, $path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function getMimeType($path) { - return \OC\Files\Filesystem::getMimeType($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function hash($type, $path, $raw = false) { - return \OC\Files\Filesystem::hash($type, $path, $raw); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function free_space($path = '/') { - return \OC\Files\Filesystem::free_space($path); - } - - /** - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - */ - static public function search($query) { - return \OC\Files\Filesystem::search($query); - } - - /** - * check if a file or folder has been updated since $time - * - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - * @param string $path - * @param int $time - * @return bool - */ - static public function hasUpdated($path, $time) { - return \OC\Files\Filesystem::hasUpdated($path, $time); - } - - /** - * normalize a path - * - * @deprecated OC_Filesystem is replaced by \OC\Files\Filesystem - * @param string $path - * @param bool $stripTrailingSlash - * @return string - */ - public static function normalizePath($path, $stripTrailingSlash = true) { - return \OC\Files\Filesystem::normalizePath($path, $stripTrailingSlash); - } -} diff --git a/lib/private/legacy/filesystemview.php b/lib/private/legacy/filesystemview.php deleted file mode 100644 index d6bca62e06a..00000000000 --- a/lib/private/legacy/filesystemview.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php - -/** - * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. */ - -class OC_FilesystemView extends \OC\Files\View {} diff --git a/lib/private/legacy/preferences.php b/lib/private/legacy/preferences.php index fcde12796ca..71d0b749f43 100644 --- a/lib/private/legacy/preferences.php +++ b/lib/private/legacy/preferences.php @@ -28,8 +28,8 @@ OC_Preferences::$object = new \OC\Preferences(OC_DB::getConnection()); class OC_Preferences{ public static $object; /** - * @brief Get all users using the preferences - * @return array with user ids + * Get all users using the preferences + * @return array an array of user ids * * This function returns a list of all users that have at least one entry * in the preferences table. @@ -39,7 +39,7 @@ class OC_Preferences{ } /** - * @brief Get all apps of a user + * Get all apps of a user * @param string $user user * @return integer[] with app ids * @@ -51,10 +51,10 @@ class OC_Preferences{ } /** - * @brief Get the available keys for an app + * Get the available keys for an app * @param string $user user * @param string $app the app we are looking for - * @return array with key names + * @return array an array of key names * * This function gets all keys of an app of an user. Please note that the * values are not returned. @@ -64,7 +64,7 @@ class OC_Preferences{ } /** - * @brief Gets the preference + * Gets the preference * @param string $user user * @param string $app app * @param string $key key @@ -79,7 +79,7 @@ class OC_Preferences{ } /** - * @brief sets a value in the preferences + * sets a value in the preferences * @param string $user user * @param string $app app * @param string $key key @@ -95,7 +95,7 @@ class OC_Preferences{ } /** - * @brief Deletes a key + * Deletes a key * @param string $user user * @param string $app app * @param string $key key @@ -108,7 +108,7 @@ class OC_Preferences{ } /** - * @brief Remove app of user from preferences + * Remove app of user from preferences * @param string $user user * @param string $app app * @return bool @@ -121,7 +121,7 @@ class OC_Preferences{ } /** - * @brief Remove user from preferences + * Remove user from preferences * @param string $user user * @return bool * @@ -133,7 +133,7 @@ class OC_Preferences{ } /** - * @brief Remove app from all users + * Remove app from all users * @param string $app app * @return bool * diff --git a/lib/private/log.php b/lib/private/log.php index e0b9fe3c696..98465ec40ea 100644 --- a/lib/private/log.php +++ b/lib/private/log.php @@ -8,6 +8,8 @@ namespace OC; +use \OCP\ILogger; + /** * logging utilities * @@ -18,8 +20,24 @@ namespace OC; * MonoLog is an example implementing this interface. */ -class Log { - private $logClass; +class Log implements ILogger { + + private $logger; + + /** + * @param string $logger The logger that should be used + */ + public function __construct($logger=null) { + // FIXME: Add this for backwards compatibility, should be fixed at some point probably + if($logger === null) { + $this->logger = 'OC_Log_'.ucfirst(\OC_Config::getValue('log_type', 'owncloud')); + call_user_func(array($this->logger, 'init')); + } else { + $this->logger = $logger; + } + + } + /** * System is unusable. @@ -112,10 +130,6 @@ class Log { $this->log(\OC_Log::DEBUG, $message, $context); } - public function __construct() { - $this->logClass = 'OC_Log_'.ucfirst(\OC_Config::getValue('log_type', 'owncloud')); - call_user_func(array($this->logClass, 'init')); - } /** * Logs with an arbitrary level. @@ -130,7 +144,16 @@ class Log { } else { $app = 'no app in context'; } - $logClass=$this->logClass; - $logClass::write($app, $message, $level); + // interpolate $message as defined in PSR-3 + $replace = array(); + foreach ($context as $key => $val) { + $replace['{' . $key . '}'] = $val; + } + + // interpolate replacement values into the message and return + $message = strtr($message, $replace); + + $logger = $this->logger; + $logger::write($app, $message, $level); } } diff --git a/lib/private/log/errorhandler.php b/lib/private/log/errorhandler.php index 1dde6b507fc..4345b3f6b70 100644 --- a/lib/private/log/errorhandler.php +++ b/lib/private/log/errorhandler.php @@ -15,7 +15,7 @@ class ErrorHandler { private static $logger; /** - * @brief remove password in URLs + * remove password in URLs * @param string $msg * @return string */ diff --git a/lib/private/memcache/memcached.php b/lib/private/memcache/memcached.php index 075828eebad..cd8e2e8d0b6 100644 --- a/lib/private/memcache/memcached.php +++ b/lib/private/memcache/memcached.php @@ -57,7 +57,7 @@ class Memcached extends Cache { public function hasKey($key) { self::$cache->get($this->getNamespace() . $key); - return self::$cache->getResultCode() !== \Memcached::RES_NOTFOUND; + return self::$cache->getResultCode() === \Memcached::RES_SUCCESS; } public function remove($key) { diff --git a/lib/private/migrate.php b/lib/private/migrate.php index 5bcc11b061b..8d88181ca19 100644 --- a/lib/private/migrate.php +++ b/lib/private/migrate.php @@ -53,7 +53,7 @@ class OC_Migrate{ } /** - * @brief finds and loads the providers + * finds and loads the providers */ static private function findProviders() { // Find the providers @@ -68,7 +68,7 @@ class OC_Migrate{ } /** - * @brief exports a user, or owncloud instance + * exports a user, or owncloud instance * @param string $uid user id of user to export if export type is user, defaults to current * @param string $type type of export, defualts to user * @param string $path path to zip output folder @@ -192,7 +192,7 @@ class OC_Migrate{ } /** - * @brief imports a user, or owncloud instance + * imports a user, or owncloud instance * @param string $path path to zip * @param string $type type of import (user or instance) * @param string|null|int $uid userid of new user @@ -307,7 +307,7 @@ class OC_Migrate{ } /** - * @brief recursively deletes a directory + * recursively deletes a directory * @param string $dir path of dir to delete * @param bool $deleteRootToo delete the root directory * @return bool @@ -332,8 +332,8 @@ class OC_Migrate{ } /** - * @brief tries to extract the import zip - * @param $path string path to the zip + * tries to extract the import zip + * @param string $path path to the zip * @return string path to extract location (with a trailing slash) or false on failure */ static private function extractZip( $path ) { @@ -356,7 +356,7 @@ class OC_Migrate{ } /** - * @brief creates a migration.db in the users data dir with their app data in + * creates a migration.db in the users data dir with their app data in * @return bool whether operation was successfull */ private static function exportAppData( ) { @@ -406,7 +406,7 @@ class OC_Migrate{ /** - * @brief generates json containing export info, and merges any data supplied + * generates json containing export info, and merges any data supplied * @param array $array of data to include in the returned json * @return string */ @@ -430,7 +430,7 @@ class OC_Migrate{ } /** - * @brief connects to migration.db, or creates if not found + * connects to migration.db, or creates if not found * @param string $path to migration.db, defaults to user data dir * @return bool whether the operation was successful */ @@ -460,7 +460,7 @@ class OC_Migrate{ } /** - * @brief creates the tables in migration.db from an apps database.xml + * creates the tables in migration.db from an apps database.xml * @param string $appid id of the app * @return bool whether the operation was successful */ @@ -498,7 +498,7 @@ class OC_Migrate{ } /** - * @brief tries to create the zip + * tries to create the zip * @return bool */ static private function createZip() { @@ -519,7 +519,7 @@ class OC_Migrate{ } /** - * @brief returns an array of apps that support migration + * returns an array of apps that support migration * @return array */ static public function getApps() { @@ -534,11 +534,11 @@ class OC_Migrate{ } /** - * @brief imports a new user + * imports a new user * @param string $db string path to migration.db - * @param $info object of migration info + * @param object $info object of migration info * @param string|null|int $uid uid to use - * @return array of apps with import statuses, or false on failure. + * @return array an array of apps with import statuses, or false on failure. */ public static function importAppData( $db, $info, $uid=null ) { // Check if the db exists diff --git a/lib/private/migration/content.php b/lib/private/migration/content.php index b0e7a4e9528..cb5d9ad1472 100644 --- a/lib/private/migration/content.php +++ b/lib/private/migration/content.php @@ -33,9 +33,9 @@ class OC_Migration_Content{ private $tmpfiles=array(); /** - * @brief sets up the + * sets up the * @param ZipArchive $zip ZipArchive object - * @param $db a database object (required for exporttype user) + * @param object $db a database object (required for exporttype user) * @return bool|null */ public function __construct( $zip, $db=null ) { @@ -45,11 +45,9 @@ class OC_Migration_Content{ } - // @brief prepares the db - // @param $query the sql query to prepare - /** - * @param string $query + * prepares the db + * @param string $query the sql query to prepare */ public function prepare( $query ) { @@ -73,7 +71,7 @@ class OC_Migration_Content{ } /** - * @brief processes the db query + * processes the db query * @param string $query the query to process * @return string of processed query */ @@ -87,8 +85,8 @@ class OC_Migration_Content{ } /** - * @brief copys rows to migration.db from the main database - * @param $options array of options. + * copys rows to migration.db from the main database + * @param array $options array of options. * @return bool */ public function copyRows( $options ) { @@ -129,9 +127,9 @@ class OC_Migration_Content{ } /** - * @brief saves a sql data set into migration.db + * saves a sql data set into migration.db * @param OC_DB_StatementWrapper $data a sql data set returned from self::prepare()->query() - * @param $options array of copyRows options + * @param array $options array of copyRows options * @return void */ private function insertData( $data, $options ) { @@ -168,10 +166,10 @@ class OC_Migration_Content{ } /** - * @brief adds a directory to the zip object + * adds a directory to the zip object * @param boolean|string $dir string path of the directory to add - * @param $recursive bool - * @param $internaldir string path of folder to add dir to in zip + * @param bool $recursive + * @param string $internaldir path of folder to add dir to in zip * @return bool */ public function addDir( $dir, $recursive=true, $internaldir='' ) { @@ -203,7 +201,7 @@ class OC_Migration_Content{ } /** - * @brief adds a file to the zip from a given string + * adds a file to the zip from a given string * @param string $data string of data to add * @param string $path the relative path inside of the zip to save the file to * @return bool @@ -222,7 +220,7 @@ class OC_Migration_Content{ } /** - * @brief closes the zip, removes temp files + * closes the zip, removes temp files * @return bool */ public function finish() { @@ -237,7 +235,7 @@ class OC_Migration_Content{ } /** - * @brief cleans up after the zip + * cleans up after the zip */ private function cleanup() { // Delete tmp files diff --git a/lib/private/migration/provider.php b/lib/private/migration/provider.php index 2829a97a776..a7c611dcdd4 100644 --- a/lib/private/migration/provider.php +++ b/lib/private/migration/provider.php @@ -17,19 +17,19 @@ abstract class OC_Migration_Provider{ } /** - * @brief exports data for apps + * exports data for apps * @return array appdata to be exported */ abstract function export( ); /** - * @brief imports data for the app + * imports data for the app * @return void */ abstract function import( ); /** - * @brief sets the OC_Migration_Content object to $this->content + * sets the OC_Migration_Content object to $this->content * @param OC_Migration_Content $content a OC_Migration_Content object */ public function setData( $uid, $content, $info=null ) { @@ -43,7 +43,7 @@ abstract class OC_Migration_Provider{ } /** - * @brief returns the appid of the provider + * returns the appid of the provider * @return string */ public function getID() { diff --git a/lib/private/navigationmanager.php b/lib/private/navigationmanager.php index 1f657b9ad80..8ad2f4c8f63 100644 --- a/lib/private/navigationmanager.php +++ b/lib/private/navigationmanager.php @@ -29,15 +29,15 @@ class NavigationManager implements \OCP\INavigationManager { } /** - * @brief returns all the added Menu entries - * @return array of the added entries + * returns all the added Menu entries + * @return array an array of the added entries */ public function getAll() { return $this->entries; } /** - * @brief removes all the entries + * removes all the entries */ public function clear() { $this->entries = array(); @@ -52,7 +52,7 @@ class NavigationManager implements \OCP\INavigationManager { } /** - * @brief gets the active Menu entry + * gets the active Menu entry * @return string id or empty string * * This function returns the id of the active navigation entry (set by diff --git a/lib/private/ocs.php b/lib/private/ocs.php index 211e8222145..aeb3d259b30 100644 --- a/lib/private/ocs.php +++ b/lib/private/ocs.php @@ -213,8 +213,8 @@ class OC_OCS { } /** - * @param $writer - * @param $data + * @param resource $writer + * @param array $data * @param string $node */ public static function toXml($writer, $data, $node) { diff --git a/lib/private/ocs/cloud.php b/lib/private/ocs/cloud.php index c8bb9425f1a..3ced0af8ee1 100644 --- a/lib/private/ocs/cloud.php +++ b/lib/private/ocs/cloud.php @@ -57,8 +57,8 @@ class OC_OCS_Cloud { * </quota> * </data> * - * @param $parameters object should contain parameter 'userid' which identifies - * the user from whom the information will be returned + * @param array $parameters should contain parameter 'userid' which identifies + * the user from whom the information will be returned */ public static function getUser($parameters) { $return = array(); diff --git a/lib/private/ocs/result.php b/lib/private/ocs/result.php index 0e3b85d5905..567fe7f87fe 100644 --- a/lib/private/ocs/result.php +++ b/lib/private/ocs/result.php @@ -26,7 +26,7 @@ class OC_OCS_Result{ /** * create the OCS_Result object - * @param $data mixed the data to return + * @param mixed $data the data to return */ public function __construct($data=null, $code=100, $message=null) { if ($data === null) { @@ -42,7 +42,7 @@ class OC_OCS_Result{ /** * optionally set the total number of items available - * @param $items int + * @param int $items */ public function setTotalItems(int $items) { $this->items = $items; @@ -50,7 +50,7 @@ class OC_OCS_Result{ /** * optionally set the the number of items per page - * @param $items int + * @param int $items */ public function setItemsPerPage(int $items) { $this->perPage = $items; diff --git a/lib/private/ocsclient.php b/lib/private/ocsclient.php index b0480caf028..39d7e9ccccd 100644 --- a/lib/private/ocsclient.php +++ b/lib/private/ocsclient.php @@ -29,8 +29,8 @@ class OC_OCSClient{ /** - * @brief Get the url of the OCS AppStore server. - * @returns string of the AppStore server + * Get the url of the OCS AppStore server. + * @return string of the AppStore server * * This function returns the url of the OCS AppStore server. It´s possible * to set it in the config file or it will fallback to the default @@ -47,8 +47,8 @@ class OC_OCSClient{ /** - * @brief Get the content of an OCS url call. - * @returns string of the response + * Get the content of an OCS url call. + * @return string of the response * This function calls an OCS server and returns the response. It also sets a sane timeout * @param string $url */ @@ -58,8 +58,8 @@ class OC_OCSClient{ } /** - * @brief Get all the categories from the OCS server - * @returns array with category ids + * Get all the categories from the OCS server + * @return array an array of category ids * @note returns NULL if config value appstoreenabled is set to false * This function returns a list of all the application categories on the OCS server */ @@ -91,11 +91,11 @@ class OC_OCSClient{ } /** - * @brief Get all the applications from the OCS server - * @returns array with application data + * Get all the applications from the OCS server + * @return array an array of application data * * This function returns a list of all the applications on the OCS server - * @param $categories + * @param array|string $categories * @param int $page * @param string $filter */ @@ -148,9 +148,9 @@ class OC_OCSClient{ /** - * @brief Get an the applications from the OCS server + * Get an the applications from the OCS server * @param string $id - * @returns array with application data + * @return array an array of application data * * This function returns an applications from the OCS server */ @@ -191,8 +191,8 @@ class OC_OCSClient{ } /** - * @brief Get the download url for an application from the OCS server - * @returns array with application data + * Get the download url for an application from the OCS server + * @return array an array of application data * * This function returns an download url for an applications from the OCS server * @param string $id diff --git a/lib/private/preferences.php b/lib/private/preferences.php index d45e6e77089..e6d9f28b1d6 100644 --- a/lib/private/preferences.php +++ b/lib/private/preferences.php @@ -68,8 +68,8 @@ class Preferences { } /** - * @brief Get all users using the preferences - * @return array with user ids + * Get all users using the preferences + * @return array an array of user ids * * This function returns a list of all users that have at least one entry * in the preferences table. @@ -109,7 +109,7 @@ class Preferences { } /** - * @brief Get all apps of an user + * Get all apps of an user * @param string $user user * @return integer[] with app ids * @@ -122,10 +122,10 @@ class Preferences { } /** - * @brief Get the available keys for an app + * Get the available keys for an app * @param string $user user * @param string $app the app we are looking for - * @return array with key names + * @return array an array of key names * * This function gets all keys of an app of an user. Please note that the * values are not returned. @@ -140,7 +140,7 @@ class Preferences { } /** - * @brief Gets the preference + * Gets the preference * @param string $user user * @param string $app app * @param string $key key @@ -160,7 +160,7 @@ class Preferences { } /** - * @brief sets a value in the preferences + * sets a value in the preferences * @param string $user user * @param string $app app * @param string $key key @@ -206,7 +206,7 @@ class Preferences { } /** - * @brief Deletes a key + * Deletes a key * @param string $user user * @param string $app app * @param string $key key @@ -227,7 +227,7 @@ class Preferences { } /** - * @brief Remove app of user from preferences + * Remove app of user from preferences * @param string $user user * @param string $app app * @@ -246,7 +246,7 @@ class Preferences { } /** - * @brief Remove user from preferences + * Remove user from preferences * @param string $user user * * Removes all keys in preferences belonging to the user. @@ -261,7 +261,7 @@ class Preferences { } /** - * @brief Remove app from all users + * Remove app from all users * @param string $app app * * Removes all keys in preferences belonging to the app. diff --git a/lib/private/preview.php b/lib/private/preview.php index cdf22240382..8089379bde5 100755 --- a/lib/private/preview.php +++ b/lib/private/preview.php @@ -43,6 +43,7 @@ class Preview { private $maxY; private $scalingUp; private $mimeType; + private $keepAspect = false; //filemapper used for deleting previews // index is path, value is fileinfo @@ -65,7 +66,7 @@ class Preview { protected $info; /** - * @brief check if thumbnail or bigger version of thumbnail of file is cached + * check if thumbnail or bigger version of thumbnail of file is cached * @param string $user userid - if no user is given, OC_User::getUser will be used * @param string $root path of root * @param string $file The path to the file where you want a thumbnail from @@ -110,7 +111,7 @@ class Preview { } /** - * @brief returns the path of the file you want a thumbnail from + * returns the path of the file you want a thumbnail from * @return string */ public function getFile() { @@ -118,7 +119,7 @@ class Preview { } /** - * @brief returns the max width of the preview + * returns the max width of the preview * @return integer */ public function getMaxX() { @@ -126,7 +127,7 @@ class Preview { } /** - * @brief returns the max height of the preview + * returns the max height of the preview * @return integer */ public function getMaxY() { @@ -134,7 +135,7 @@ class Preview { } /** - * @brief returns whether or not scalingup is enabled + * returns whether or not scalingup is enabled * @return bool */ public function getScalingUp() { @@ -142,7 +143,7 @@ class Preview { } /** - * @brief returns the name of the thumbnailfolder + * returns the name of the thumbnailfolder * @return string */ public function getThumbnailsFolder() { @@ -150,7 +151,7 @@ class Preview { } /** - * @brief returns the max scale factor + * returns the max scale factor * @return string */ public function getMaxScaleFactor() { @@ -158,7 +159,7 @@ class Preview { } /** - * @brief returns the max width set in ownCloud's config + * returns the max width set in ownCloud's config * @return string */ public function getConfigMaxX() { @@ -166,7 +167,7 @@ class Preview { } /** - * @brief returns the max height set in ownCloud's config + * returns the max height set in ownCloud's config * @return string */ public function getConfigMaxY() { @@ -188,9 +189,9 @@ class Preview { } /** - * @brief set the path of the file you want a thumbnail from + * set the path of the file you want a thumbnail from * @param string $file - * @return $this + * @return \OC\Preview $this */ public function setFile($file) { $this->file = $file; @@ -205,7 +206,7 @@ class Preview { } /** - * @brief set mime type explicitly + * set mime type explicitly * @param string $mimeType */ public function setMimetype($mimeType) { @@ -213,10 +214,10 @@ class Preview { } /** - * @brief set the the max width of the preview + * set the the max width of the preview * @param int $maxX * @throws \Exception - * @return $this + * @return \OC\Preview $this */ public function setMaxX($maxX = 1) { if ($maxX <= 0) { @@ -234,10 +235,10 @@ class Preview { } /** - * @brief set the the max height of the preview + * set the the max height of the preview * @param int $maxY * @throws \Exception - * @return $this + * @return \OC\Preview $this */ public function setMaxY($maxY = 1) { if ($maxY <= 0) { @@ -255,9 +256,9 @@ class Preview { } /** - * @brief set whether or not scalingup is enabled + * set whether or not scalingup is enabled * @param bool $scalingUp - * @return $this + * @return \OC\Preview $this */ public function setScalingup($scalingUp) { if ($this->getMaxScaleFactor() === 1) { @@ -267,8 +268,13 @@ class Preview { return $this; } + public function setKeepAspect($keepAspect) { + $this->keepAspect = $keepAspect; + return $this; + } + /** - * @brief check if all parameters are valid + * check if all parameters are valid * @return bool */ public function isFileValid() { @@ -287,7 +293,7 @@ class Preview { } /** - * @brief deletes previews of a file with specific x and y + * deletes previews of a file with specific x and y * @return bool */ public function deletePreview() { @@ -297,14 +303,14 @@ class Preview { if($fileInfo !== null && $fileInfo !== false) { $fileId = $fileInfo->getId(); - $previewPath = $this->getThumbnailsFolder() . '/' . $fileId . '/' . $this->getMaxX() . '-' . $this->getMaxY() . '.png'; + $previewPath = $this->buildCachePath($fileId); return $this->userView->unlink($previewPath); } return false; } /** - * @brief deletes all previews of a file + * deletes all previews of a file * @return bool */ public function deleteAllPreviews() { @@ -322,7 +328,7 @@ class Preview { } /** - * @brief check if thumbnail or bigger version of thumbnail of file is cached + * check if thumbnail or bigger version of thumbnail of file is cached * @param int $fileId fileId of the original image * @return string|false path to thumbnail if it exists or false */ @@ -330,22 +336,19 @@ class Preview { if (is_null($fileId)) { return false; } - - $maxX = $this->getMaxX(); - $maxY = $this->getMaxY(); - $previewPath = $this->getThumbnailsFolder() . '/' . $fileId . '/'; + $preview = $this->buildCachePath($fileId); //does a preview with the wanted height and width already exist? - if ($this->userView->file_exists($previewPath . $maxX . '-' . $maxY . '.png')) { - return $previewPath . $maxX . '-' . $maxY . '.png'; + if ($this->userView->file_exists($preview)) { + return $preview; } return $this->isCachedBigger($fileId); } /** - * @brief check if a bigger version of thumbnail of file is cached + * check if a bigger version of thumbnail of file is cached * @param int $fileId fileId of the original image * @return string|false path to bigger thumbnail if it exists or false */ @@ -355,6 +358,11 @@ class Preview { return false; } + // in order to not loose quality we better generate aspect preserving previews from the original file + if ($this->keepAspect) { + return false; + } + $maxX = $this->getMaxX(); //array for usable cached thumbnails @@ -372,9 +380,9 @@ class Preview { } /** - * @brief get possible bigger thumbnails of the given image + * get possible bigger thumbnails of the given image * @param int $fileId fileId of the original image - * @return array of paths to bigger thumbnails + * @return array an array of paths to bigger thumbnails */ private function getPossibleThumbnails($fileId) { @@ -425,12 +433,12 @@ class Preview { * @return bool */ private function unscalable($x, $y) { - + $maxX = $this->getMaxX(); $maxY = $this->getMaxY(); $scalingUp = $this->getScalingUp(); $maxScaleFactor = $this->getMaxScaleFactor(); - + if ($x < $maxX || $y < $maxY) { if ($scalingUp) { $scalefactor = $maxX / $x; @@ -445,7 +453,7 @@ class Preview { } /** - * @brief return a preview of a file + * return a preview of a file * @return \OC_Image */ public function getPreview() { @@ -466,12 +474,12 @@ class Preview { $fileId = $fileInfo->getId(); $cached = $this->isCached($fileId); - if ($cached) { $stream = $this->userView->fopen($cached, 'r'); $image = new \OC_Image(); $image->loadFromFileHandle($stream); $this->preview = $image->valid() ? $image : null; + $this->resizeAndCrop(); fclose($stream); } @@ -497,7 +505,7 @@ class Preview { $this->resizeAndCrop(); $previewPath = $this->getThumbnailsFolder() . '/' . $fileId . '/'; - $cachePath = $previewPath . $maxX . '-' . $maxY . '.png'; + $cachePath = $this->buildCachePath($fileId); if ($this->userView->is_dir($this->getThumbnailsFolder() . '/') === false) { $this->userView->mkdir($this->getThumbnailsFolder() . '/'); @@ -521,27 +529,19 @@ class Preview { } /** - * @brief show preview + * show preview * @return void */ - public function showPreview() { + public function showPreview($mimeType = null) { \OCP\Response::enableCaching(3600 * 24); // 24 hours if (is_null($this->preview)) { $this->getPreview(); } - $this->preview->show('image/png'); - } - - /** - * @brief show preview - * @return void - */ - public function show() { - $this->showPreview(); + $this->preview->show($mimeType); } /** - * @brief resize, crop and fix orientation + * resize, crop and fix orientation * @return void */ private function resizeAndCrop() { @@ -561,6 +561,11 @@ class Preview { $realX = (int)$image->width(); $realY = (int)$image->height(); + // compute $maxY using the aspect of the generated preview + if ($this->keepAspect) { + $y = $x / ($realX / $realY); + } + if ($x === $realX && $y === $realY) { $this->preview = $image; return; @@ -610,7 +615,7 @@ class Preview { return; } - if ($newXSize < $x || $newYSize < $y) { + if (($newXSize < $x || $newYSize < $y) && $scalingUp) { if ($newXSize > $x) { $cropX = floor(($newXSize - $x) * 0.5); $image->crop($cropX, 0, $x, $newYSize); @@ -647,7 +652,7 @@ class Preview { } /** - * @brief register a new preview provider to be used + * register a new preview provider to be used * @param array $options * @return void */ @@ -656,7 +661,7 @@ class Preview { } /** - * @brief create instances of all the registered preview providers + * create instances of all the registered preview providers * @return void */ private static function initProviders() { @@ -743,4 +748,21 @@ class Preview { } return false; } + + /** + * @param int $fileId + * @return string + */ + private function buildCachePath($fileId) { + $maxX = $this->getMaxX(); + $maxY = $this->getMaxY(); + + $previewPath = $this->getThumbnailsFolder() . '/' . $fileId . '/'; + $preview = $previewPath . $maxX . '-' . $maxY . '.png'; + if ($this->keepAspect) { + $preview = $previewPath . $maxX . '-with-aspect.png'; + return $preview; + } + return $preview; + } } diff --git a/lib/private/preview/image.php b/lib/private/preview/image.php index 84343df2608..cec5d7c0170 100644 --- a/lib/private/preview/image.php +++ b/lib/private/preview/image.php @@ -22,15 +22,17 @@ class Image extends Provider { } $image = new \OC_Image(); - //check if file is encrypted + if($fileInfo['encrypted'] === true) { - $image->loadFromData(stream_get_contents($fileview->fopen($path, 'r'))); - }else{ - $image->loadFromFile($fileview->getLocalFile($path)); + $fileName = $fileview->toTmpFile($path); + } else { + $fileName = $fileview->getLocalFile($path); } + $image->loadFromFile($fileName); return $image->valid() ? $image : false; } + } -\OC\Preview::registerProvider('OC\Preview\Image');
\ No newline at end of file +\OC\Preview::registerProvider('OC\Preview\Image'); diff --git a/lib/private/preview/mp3.php b/lib/private/preview/mp3.php index 3fc0ab0490c..21f160fd50f 100644 --- a/lib/private/preview/mp3.php +++ b/lib/private/preview/mp3.php @@ -47,4 +47,4 @@ class MP3 extends Provider { } -\OC\Preview::registerProvider('OC\Preview\MP3');
\ No newline at end of file +\OC\Preview::registerProvider('OC\Preview\MP3'); diff --git a/lib/private/preview/pdf.php b/lib/private/preview/pdf.php index 064a5a3b3d1..4b88b1a31e2 100644 --- a/lib/private/preview/pdf.php +++ b/lib/private/preview/pdf.php @@ -40,6 +40,7 @@ if (extension_loaded('imagick')) { //check if image object is valid return $image->valid() ? $image : false; } + } \OC\Preview::registerProvider('OC\Preview\PDF'); diff --git a/lib/private/preview/provider.php b/lib/private/preview/provider.php index 88337d64e4b..f769823f6e6 100644 --- a/lib/private/preview/provider.php +++ b/lib/private/preview/provider.php @@ -22,4 +22,5 @@ abstract class Provider { * OC_Image object of the preview */ abstract public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview); + } diff --git a/lib/private/preview/svg.php b/lib/private/preview/svg.php index 505122fddbf..82ef3cdebf6 100644 --- a/lib/private/preview/svg.php +++ b/lib/private/preview/svg.php @@ -45,8 +45,9 @@ if (extension_loaded('imagick')) { //check if image object is valid return $image->valid() ? $image : false; } + } \OC\Preview::registerProvider('OC\Preview\SVG'); } -}
\ No newline at end of file +} diff --git a/lib/private/previewmanager.php b/lib/private/previewmanager.php index ac9a866a75b..23dbee13c7d 100755 --- a/lib/private/previewmanager.php +++ b/lib/private/previewmanager.php @@ -13,7 +13,7 @@ use OCP\IPreview; class PreviewManager implements IPreview { /** - * @brief return a preview of a file + * return a preview of a file * @param string $file The path to the file where you want a thumbnail from * @param int $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image * @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image @@ -27,7 +27,7 @@ class PreviewManager implements IPreview { } /** - * @brief returns true if the passed mime type is supported + * returns true if the passed mime type is supported * @param string $mimeType * @return boolean */ diff --git a/lib/private/request.php b/lib/private/request.php index 90f7488eea5..09928021a7f 100755 --- a/lib/private/request.php +++ b/lib/private/request.php @@ -16,9 +16,9 @@ class OC_Request { const REGEX_LOCALHOST = '/^(127\.0\.0\.1|localhost)(:[0-9]+|)$/'; /** - * @brief Check overwrite condition + * Check overwrite condition * @param string $type - * @returns bool + * @return bool */ private static function isOverwriteCondition($type = '') { $regex = '/' . OC_Config::getValue('overwritecondaddr', '') . '/'; @@ -27,7 +27,7 @@ class OC_Request { } /** - * @brief Checks whether a domain is considered as trusted from the list + * Checks whether a domain is considered as trusted from the list * of trusted domains. If no trusted domains have been configured, returns * true. * This is used to prevent Host Header Poisoning. @@ -47,9 +47,9 @@ class OC_Request { } /** - * @brief Returns the unverified server host from the headers without checking + * Returns the unverified server host from the headers without checking * whether it is a trusted domain - * @returns string the server host + * @return string the server host * * Returns the server host, even if the website uses one or more * reverse proxies @@ -87,9 +87,9 @@ class OC_Request { } /** - * @brief Returns the server host from the headers, or the first configured + * Returns the server host from the headers, or the first configured * trusted domain if the host isn't in the trusted list - * @returns string the server host + * @return string the server host * * Returns the server host, even if the website uses one or more * reverse proxies @@ -120,8 +120,8 @@ class OC_Request { } /** - * @brief Returns the server protocol - * @returns string the server protocol + * Returns the server protocol + * @return string the server protocol * * Returns the server protocol. It respects reverse proxy servers and load balancers */ @@ -142,8 +142,8 @@ class OC_Request { } /** - * @brief Returns the request uri - * @returns string the request uri + * Returns the request uri + * @return string the request uri * * Returns the request uri, even if the website uses one or more * reverse proxies @@ -158,7 +158,7 @@ class OC_Request { } /** - * @brief Returns the script name + * Returns the script name * @return string the script name * * Returns the script name, even if the website uses one or more @@ -176,7 +176,7 @@ class OC_Request { } /** - * @brief get Path info from request + * get Path info from request * @return string Path info or false when not found */ public static function getPathInfo() { @@ -200,7 +200,7 @@ class OC_Request { } /** - * @brief get Path info from request, not urldecoded + * get Path info from request, not urldecoded * @throws Exception * @return string Path info or false when not found */ @@ -242,7 +242,7 @@ class OC_Request { } /** - * @brief Check if the requester sent along an mtime + * Check if the requester sent along an mtime * @return false or an mtime */ static public function hasModificationTime () { diff --git a/lib/private/response.php b/lib/private/response.php index 19df9719dee..caa382af776 100644 --- a/lib/private/response.php +++ b/lib/private/response.php @@ -16,7 +16,7 @@ class OC_Response { const STATUS_SERVICE_UNAVAILABLE = 503; /** - * @brief Enable response caching by sending correct HTTP headers + * Enable response caching by sending correct HTTP headers * @param integer $cache_time time to cache the response * >0 cache time in seconds * 0 and <0 enable default browser caching @@ -42,7 +42,7 @@ class OC_Response { } /** - * @brief disable browser caching + * disable browser caching * @see enableCaching with cache_time = 0 */ static public function disableCaching() { @@ -50,7 +50,7 @@ class OC_Response { } /** - * @brief Set response status + * Set response status * @param int $status a HTTP status code, see also the STATUS constants */ static public function setStatus($status) { @@ -84,7 +84,7 @@ class OC_Response { } /** - * @brief Send redirect response + * Send redirect response * @param string $location to redirect to */ static public function redirect($location) { @@ -93,8 +93,8 @@ class OC_Response { } /** - * @brief Set reponse expire time - * @param $expires date-time when the response expires + * Set reponse expire time + * @param string|DateTime $expires date-time when the response expires * string for DateInterval from now * DateTime object when to expire response */ @@ -114,7 +114,7 @@ class OC_Response { /** * Checks and set ETag header, when the request matches sends a * 'not modified' response - * @param $etag token to use for modification check + * @param string $etag token to use for modification check */ static public function setETagHeader($etag) { if (empty($etag)) { @@ -132,7 +132,7 @@ class OC_Response { /** * Checks and set Last-Modified header, when the request matches sends a * 'not modified' response - * @param $lastModified time when the reponse was last modified + * @param int|DateTime|string $lastModified time when the reponse was last modified */ static public function setLastModifiedHeader($lastModified) { if (empty($lastModified)) { @@ -171,7 +171,7 @@ class OC_Response { } /** - * @brief Send file as response, checking and setting caching headers + * Send file as response, checking and setting caching headers * @param string $filepath of file to send */ static public function sendFile($filepath) { @@ -187,4 +187,36 @@ class OC_Response { self::setStatus(self::STATUS_NOT_FOUND); } } + + /* + * This function adds some security related headers to all requests served via base.php + * The implementation of this function has to happen here to ensure that all third-party + * components (e.g. SabreDAV) also benefit from this headers. + */ + public static function addSecurityHeaders() { + header('X-XSS-Protection: 1; mode=block'); // Enforce browser based XSS filters + header('X-Content-Type-Options: nosniff'); // Disable sniffing the content type for IE + + // iFrame Restriction Policy + $xFramePolicy = OC_Config::getValue('xframe_restriction', true); + if ($xFramePolicy) { + header('X-Frame-Options: Sameorigin'); // Disallow iFraming from other domains + } + + // Content Security Policy + // If you change the standard policy, please also change it in config.sample.php + $policy = OC_Config::getValue('custom_csp_policy', + 'default-src \'self\'; ' + . 'script-src \'self\' \'unsafe-eval\'; ' + . 'style-src \'self\' \'unsafe-inline\'; ' + . 'frame-src *; ' + . 'img-src *; ' + . 'font-src \'self\' data:; ' + . 'media-src *'); + header('Content-Security-Policy:' . $policy); + + // https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag + header('X-Robots-Tag: none'); + } + } diff --git a/lib/private/route/route.php b/lib/private/route/route.php index df80facf9c1..87030ad7853 100644 --- a/lib/private/route/route.php +++ b/lib/private/route/route.php @@ -124,7 +124,7 @@ class Route extends SymfonyRoute implements IRoute { /** * The action to execute when this route matches, includes a file like * it is called directly - * @param $file + * @param string $file * @return void */ public function actionInclude($file) { diff --git a/lib/private/route/router.php b/lib/private/route/router.php index f7900362bec..a72ac2bb3f1 100644 --- a/lib/private/route/router.php +++ b/lib/private/route/router.php @@ -90,7 +90,7 @@ class Router implements IRouter { $files[] = 'settings/routes.php'; $files[] = 'core/routes.php'; $files[] = 'ocs/routes.php'; - $this->cacheKey = \OC_Cache::generateCacheKeyFromFiles($files); + $this->cacheKey = \OC\Cache::generateCacheKeyFromFiles($files); } return $this->cacheKey; } @@ -239,7 +239,7 @@ class Router implements IRouter { /** * To isolate the variable scope used inside the $file it is required in it's own method - * @param $file + * @param string $file */ private function requireRouteFile($file) { require_once $file; diff --git a/lib/private/server.php b/lib/private/server.php index 5d90a0b19fc..47bdee4b0f8 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -3,6 +3,7 @@ namespace OC; use OC\AppFramework\Http\Request; +use OC\AppFramework\Db\Db; use OC\AppFramework\Utility\SimpleContainer; use OC\Cache\UserCache; use OC\DB\ConnectionWrapper; @@ -30,9 +31,9 @@ class Server extends SimpleContainer implements IServerContainer { } if (\OC::$session->exists('requesttoken')) { - $requesttoken = \OC::$session->get('requesttoken'); + $requestToken = \OC::$session->get('requesttoken'); } else { - $requesttoken = false; + $requestToken = false; } if (defined('PHPUNIT_RUN') && PHPUNIT_RUN @@ -54,7 +55,7 @@ class Server extends SimpleContainer implements IServerContainer { ? $_SERVER['REQUEST_METHOD'] : null, 'urlParams' => $urlParams, - 'requesttoken' => $requesttoken, + 'requesttoken' => $requestToken, ), $stream ); }); @@ -158,6 +159,14 @@ class Server extends SimpleContainer implements IServerContainer { $this->registerService('AvatarManager', function($c) { return new AvatarManager(); }); + $this->registerService('Logger', function($c) { + /** @var $c SimpleContainer */ + $logClass = $c->query('AllConfig')->getSystemValue('log_type', 'owncloud'); + $logger = 'OC_Log_' . ucfirst($logClass); + call_user_func(array($logger, 'init')); + + return new Log($logger); + }); $this->registerService('JobList', function ($c) { /** * @var Server $c @@ -177,6 +186,9 @@ class Server extends SimpleContainer implements IServerContainer { } return $router; }); + $this->registerService('Db', function($c){ + return new Db(); + }); } /** @@ -240,15 +252,23 @@ class Server extends SimpleContainer implements IServerContainer { * @return \OCP\Files\Folder */ function getUserFolder() { - - $dir = '/files'; + $dir = '/' . \OCP\User::getUser(); $root = $this->getRootFolder(); $folder = null; + if(!$root->nodeExists($dir)) { $folder = $root->newFolder($dir); } else { $folder = $root->get($dir); } + + $dir = '/files'; + if(!$folder->nodeExists($dir)) { + $folder = $folder->newFolder($dir); + } else { + $folder = $folder->get($dir); + } + return $folder; } @@ -317,14 +337,14 @@ class Server extends SimpleContainer implements IServerContainer { } /** - * @return \OC\URLGenerator + * @return \OCP\IURLGenerator */ function getURLGenerator() { return $this->query('URLGenerator'); } /** - * @return \OC\Helper + * @return \OCP\IHelper */ function getHelper() { return $this->query('AppHelper'); @@ -385,6 +405,15 @@ class Server extends SimpleContainer implements IServerContainer { } /** + * Returns a logger instance + * + * @return \OCP\ILogger + */ + function getLogger() { + return $this->query('Logger'); + } + + /** * Returns a router for generating and matching urls * * @return \OCP\Route\IRouter @@ -392,4 +421,13 @@ class Server extends SimpleContainer implements IServerContainer { function getRouter(){ return $this->query('Router'); } + + + /** + * Returns an instance of the db facade + * @return \OCP\IDb + */ + function getDb() { + return $this->query('Db'); + } } diff --git a/lib/private/setup.php b/lib/private/setup.php index 4889f603332..7a08816c4b1 100644 --- a/lib/private/setup.php +++ b/lib/private/setup.php @@ -152,7 +152,7 @@ class OC_Setup { } /** - * @brief Post installation checks + * Post installation checks */ public static function postSetupCheck($params) { // setup was successful -> webdav testing now diff --git a/lib/private/share/helper.php b/lib/private/share/helper.php index 515ec85909a..ab9e0ca4926 100644 --- a/lib/private/share/helper.php +++ b/lib/private/share/helper.php @@ -25,13 +25,14 @@ class Helper extends \OC\Share\Constants { /** * Generate a unique target for the item - * @param string Item type - * @param string Item source - * @param int SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK - * @param string User or group the item is being shared with - * @param string User that is the owner of shared item - * @param string The suggested target originating from a reshare (optional) - * @param int The id of the parent group share (optional) + * @param string $itemType + * @param string $itemSource + * @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK + * @param string $shareWith User or group the item is being shared with + * @param string $uidOwner User that is the owner of shared item + * @param string $suggestedTarget The suggested target originating from a reshare (optional) + * @param int $groupParent The id of the parent group share (optional) + * @throws \Exception * @return string Item target */ public static function generateTarget($itemType, $itemSource, $shareType, $shareWith, $uidOwner, @@ -142,9 +143,9 @@ class Helper extends \OC\Share\Constants { /** * Delete all reshares of an item - * @param int Id of item to delete - * @param bool If true, exclude the parent from the delete (optional) - * @param string The user that the parent was shared with (optinal) + * @param int $parent Id of item to delete + * @param bool $excludeParent If true, exclude the parent from the delete (optional) + * @param string $uidOwner The user that the parent was shared with (optional) */ public static function delete($parent, $excludeParent = false, $uidOwner = null) { $ids = array($parent); @@ -201,7 +202,7 @@ class Helper extends \OC\Share\Constants { } /** - * @brief get default expire settings defined by the admin + * get default expire settings defined by the admin * @return array contains 'defaultExpireDateSet', 'enforceExpireDate', 'expireAfterDays' */ public static function getDefaultExpireSetting() { @@ -221,7 +222,7 @@ class Helper extends \OC\Share\Constants { } /** - * @brief calculate expire date + * calculate expire date * @param array $defaultExpireSettings contains 'defaultExpireDateSet', 'enforceExpireDate', 'expireAfterDays' * @param int $creationTime timestamp when the share was created * @param int $userExpireDate expire timestamp set by the user @@ -231,7 +232,7 @@ class Helper extends \OC\Share\Constants { $expires = false; - if (isset($defaultExpireSettings['defaultExpireDateSet']) && $defaultExpireSettings['defaultExpireDateSet']) { + if (!empty($defaultExpireSettings['defaultExpireDateSet'])) { $expires = $creationTime + $defaultExpireSettings['expireAfterDays'] * 86400; } @@ -239,8 +240,8 @@ class Helper extends \OC\Share\Constants { if (isset($userExpireDate)) { // if the admin decided to enforce the default expire date then we only take // the user defined expire date of it is before the default expire date - if ($expires && isset($defaultExpireSettings['enforceExpireDate']) && $defaultExpireSettings['enforceExpireDate']) { - $expires = ($userExpireDate < $expires) ? $userExpireDate : $expires; + if ($expires && !empty($defaultExpireSettings['enforceExpireDate'])) { + $expires = min($userExpireDate, $expires); } else { $expires = $userExpireDate; } diff --git a/lib/private/share/hooks.php b/lib/private/share/hooks.php index a33c71eedd2..9ac64d888ea 100644 --- a/lib/private/share/hooks.php +++ b/lib/private/share/hooks.php @@ -22,9 +22,9 @@ namespace OC\Share; class Hooks extends \OC\Share\Constants { - /** + /** * Function that is called after a user is deleted. Cleans up the shares of that user. - * @param array arguments + * @param array $arguments */ public static function post_deleteUser($arguments) { // Delete any items shared with the deleted user @@ -42,7 +42,7 @@ class Hooks extends \OC\Share\Constants { /** * Function that is called after a user is added to a group. * TODO what does it do? - * @param array arguments + * @param array $arguments */ public static function post_addToGroup($arguments) { // Find the group shares and check if the user needs a unique target @@ -76,7 +76,7 @@ class Hooks extends \OC\Share\Constants { /** * Function that is called after a user is removed from a group. Shares are cleaned up. - * @param array arguments + * @param array $arguments */ public static function post_removeFromGroup($arguments) { $sql = 'SELECT `id`, `share_type` FROM `*PREFIX*share`' @@ -95,7 +95,7 @@ class Hooks extends \OC\Share\Constants { /** * Function that is called after a group is removed. Cleans up the shares to that group. - * @param array arguments + * @param array $arguments */ public static function post_deleteGroup($arguments) { $sql = 'SELECT `id` FROM `*PREFIX*share` WHERE `share_type` = ? AND `share_with` = ?'; diff --git a/lib/private/share/mailnotifications.php b/lib/private/share/mailnotifications.php index 4799db52330..cb74dcf8b90 100644 --- a/lib/private/share/mailnotifications.php +++ b/lib/private/share/mailnotifications.php @@ -21,11 +21,30 @@ namespace OC\Share; +use DateTime; + class MailNotifications { - private $senderId; // sender userId - private $from; // sender email address + /** + * sender userId + * @var null|string + */ + private $senderId; + + /** + * sender email address + * @var string + */ + private $from; + + /** + * @var string + */ private $senderDisplayName; + + /** + * @var \OC_L10N + */ private $l; /** @@ -47,11 +66,11 @@ class MailNotifications { } /** - * @brief inform users if a file was shared with them + * inform users if a file was shared with them * * @param array $recipientList list of recipients - * @param type $itemSource shared item source - * @param type $itemType shared item type + * @param string $itemSource shared item source + * @param string $itemType shared item type * @return array list of user to whom the mail send operation failed */ public function sendInternalShareMail($recipientList, $itemSource, $itemType) { @@ -106,7 +125,7 @@ class MailNotifications { } /** - * @brief inform recipient about public link share + * inform recipient about public link share * * @param string $recipient recipient email address * @param string $filename the shared file @@ -131,12 +150,12 @@ class MailNotifications { } /** - * @brief create mail body for plain text and html mail + * create mail body for plain text and html mail * * @param string $filename the shared file * @param string $link link to the shared file * @param int $expiration expiration date (timestamp) - * @return array with the html mail body and the plain text mail body + * @return array an array of the html mail body and the plain text mail body */ private function createMailBody($filename, $link, $expiration) { diff --git a/lib/private/share/searchresultsorter.php b/lib/private/share/searchresultsorter.php index 76abbf30846..91709902fff 100644 --- a/lib/private/share/searchresultsorter.php +++ b/lib/private/share/searchresultsorter.php @@ -18,8 +18,8 @@ class SearchResultSorter { * @param string $search the search term as was given by the user * @param string $key the array key containing the value that should be compared * against - * @param $encoding optional, encoding to use, defaults to UTF-8 - * @param $log optional, an \OC\Log instance + * @param string $encoding optional, encoding to use, defaults to UTF-8 + * @param \OC\Log $log optional */ public function __construct($search, $key, \OC\Log $log = null, $encoding = 'UTF-8') { $this->encoding = $encoding; diff --git a/lib/private/share/share.php b/lib/private/share/share.php index b12d62e8439..16bc492d383 100644 --- a/lib/private/share/share.php +++ b/lib/private/share/share.php @@ -48,11 +48,11 @@ class Share extends \OC\Share\Constants { /** * Register a sharing backend class that implements OCP\Share_Backend for an item type - * @param string Item type - * @param string Backend class - * @param string (optional) Depends on item type - * @param array (optional) List of supported file extensions if this item type depends on files - * @return Returns true if backend is registered or false if error + * @param string $itemType Item type + * @param string $class Backend class + * @param string $collectionOf (optional) Depends on item type + * @param array $supportedFileExtensions (optional) List of supported file extensions if this item type depends on files + * @return boolean true if backend is registered or false if error */ public static function registerBackend($itemType, $class, $collectionOf = null, $supportedFileExtensions = null) { if (self::isEnabled()) { @@ -78,7 +78,7 @@ class Share extends \OC\Share\Constants { /** * Check if the Share API is enabled - * @return Returns true if enabled or false + * @return boolean true if enabled or false * * The Share API is enabled by default if not configured */ @@ -93,8 +93,8 @@ class Share extends \OC\Share\Constants { * Find which users can access a shared item * @param string $path to the file * @param string $ownerUser owner of the file - * @param bool $includeOwner include owner to the list of users with access to the file - * @param bool $returnUserPaths Return an array with the user => path map + * @param boolean $includeOwner include owner to the list of users with access to the file + * @param boolean $returnUserPaths Return an array with the user => path map * @return array * @note $path needs to be relative to user data dir, e.g. 'file.txt' * not '/admin/data/file.txt' @@ -239,12 +239,12 @@ class Share extends \OC\Share\Constants { /** * Get the items of item type shared with the current user - * @param string Item type - * @param int Format (optional) Format type must be defined by the backend - * @param mixed Parameters (optional) - * @param int Number of items to return (optional) Returns all by default - * @param bool include collections (optional) - * @return Return depends on format + * @param string $itemType + * @param int $format (optional) Format type must be defined by the backend + * @param mixed $parameters (optional) + * @param int $limit Number of items to return (optional) Returns all by default + * @param boolean $includeCollections (optional) + * @return mixed Return depends on format */ public static function getItemsSharedWith($itemType, $format = self::FORMAT_NONE, $parameters = null, $limit = -1, $includeCollections = false) { @@ -254,13 +254,13 @@ class Share extends \OC\Share\Constants { /** * Get the items of item type shared with a user - * @param string Item type - * @param sting user id for which user we want the shares - * @param int Format (optional) Format type must be defined by the backend - * @param mixed Parameters (optional) - * @param int Number of items to return (optional) Returns all by default - * @param bool include collections (optional) - * @return Return depends on format + * @param string $itemType + * @param string $user id for which user we want the shares + * @param int $format (optional) Format type must be defined by the backend + * @param mixed $parameters (optional) + * @param int $limit Number of items to return (optional) Returns all by default + * @param boolean $includeCollections (optional) + * @return mixed Return depends on format */ public static function getItemsSharedWithUser($itemType, $user, $format = self::FORMAT_NONE, $parameters = null, $limit = -1, $includeCollections = false) { @@ -273,9 +273,9 @@ class Share extends \OC\Share\Constants { * @param string $itemType * @param string $itemTarget * @param int $format (optional) Format type must be defined by the backend - * @param mixed Parameters (optional) - * @param bool include collections (optional) - * @return Return depends on format + * @param mixed $parameters (optional) + * @param boolean $includeCollections (optional) + * @return mixed Return depends on format */ public static function getItemSharedWith($itemType, $itemTarget, $format = self::FORMAT_NONE, $parameters = null, $includeCollections = false) { @@ -334,12 +334,12 @@ class Share extends \OC\Share\Constants { /** * Get the item of item type shared with the current user by source - * @param string Item type - * @param string Item source - * @param int Format (optional) Format type must be defined by the backend - * @param mixed Parameters - * @param bool include collections - * @return Return depends on format + * @param string $itemType + * @param string $itemSource + * @param int $format (optional) Format type must be defined by the backend + * @param mixed $parameters + * @param boolean $includeCollections + * @return mixed Return depends on format */ public static function getItemSharedWithBySource($itemType, $itemSource, $format = self::FORMAT_NONE, $parameters = null, $includeCollections = false) { @@ -349,10 +349,10 @@ class Share extends \OC\Share\Constants { /** * Get the item of item type shared by a link - * @param string Item type - * @param string Item source - * @param string Owner of link - * @return Item + * @param string $itemType + * @param string $itemSource + * @param string $uidOwner Owner of link + * @return array */ public static function getItemSharedWithByLink($itemType, $itemSource, $uidOwner) { return self::getItems($itemType, $itemSource, self::SHARE_TYPE_LINK, null, $uidOwner, self::FORMAT_NONE, @@ -362,7 +362,7 @@ class Share extends \OC\Share\Constants { /** * Based on the given token the share information will be returned - password protected shares will be verified * @param string $token - * @return array | bool false will be returned in case the token is unknown or unauthorized + * @return array|boolean false will be returned in case the token is unknown or unauthorized */ public static function getShareByToken($token, $checkPasswordProtection = true) { $query = \OC_DB::prepare('SELECT * FROM `*PREFIX*share` WHERE `token` = ?', 1); @@ -388,8 +388,8 @@ class Share extends \OC\Share\Constants { /** * resolves reshares down to the last real share - * @param $linkItem - * @return $fileOwner + * @param array $linkItem + * @return array file owner */ public static function resolveReShare($linkItem) { @@ -411,12 +411,12 @@ class Share extends \OC\Share\Constants { /** * Get the shared items of item type owned by the current user - * @param string Item type - * @param int Format (optional) Format type must be defined by the backend - * @param mixed Parameters - * @param int Number of items to return (optional) Returns all by default - * @param bool include collections - * @return Return depends on format + * @param string $itemType + * @param int $format (optional) Format type must be defined by the backend + * @param mixed $parameters + * @param int $limit Number of items to return (optional) Returns all by default + * @param boolean $includeCollections + * @return mixed Return depends on format */ public static function getItemsShared($itemType, $format = self::FORMAT_NONE, $parameters = null, $limit = -1, $includeCollections = false) { @@ -426,12 +426,12 @@ class Share extends \OC\Share\Constants { /** * Get the shared item of item type owned by the current user - * @param string Item type - * @param string Item source - * @param int Format (optional) Format type must be defined by the backend - * @param mixed Parameters - * @param bool include collections - * @return Return depends on format + * @param string $itemType + * @param string $itemSource + * @param int $format (optional) Format type must be defined by the backend + * @param mixed $parameters + * @param boolean $includeCollections + * @return mixed Return depends on format */ public static function getItemShared($itemType, $itemSource, $format = self::FORMAT_NONE, $parameters = null, $includeCollections = false) { @@ -441,12 +441,12 @@ class Share extends \OC\Share\Constants { /** * Get all users an item is shared with - * @param string Item type - * @param string Item source - * @param string Owner - * @param bool Include collections - * @praram bool check expire date - * @return Return array of users + * @param string $itemType + * @param string $itemSource + * @param string $uidOwner + * @param boolean $includeCollections + * @param boolean $checkExpireDate + * @return array Return array of users */ public static function getUsersItemShared($itemType, $itemSource, $uidOwner, $includeCollections = false, $checkExpireDate = true) { @@ -471,16 +471,12 @@ class Share extends \OC\Share\Constants { * @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK * @param string $shareWith User or group the item is being shared with * @param int $permissions CRUDS - * @param null $itemSourceName + * @param string $itemSourceName + * @param \DateTime $expirationDate + * @return boolean|string Returns true on success or false on failure, Returns token on success for links * @throws \Exception - * @internal param \OCP\Item $string type - * @internal param \OCP\Item $string source - * @internal param \OCP\SHARE_TYPE_USER $int , SHARE_TYPE_GROUP, or SHARE_TYPE_LINK - * @internal param \OCP\User $string or group the item is being shared with - * @internal param \OCP\CRUDS $int permissions - * @return bool|string Returns true on success or false on failure, Returns token on success for links */ - public static function shareItem($itemType, $itemSource, $shareType, $shareWith, $permissions, $itemSourceName = null) { + public static function shareItem($itemType, $itemSource, $shareType, $shareWith, $permissions, $itemSourceName = null, \DateTime $expirationDate = null) { $uidOwner = \OC_User::getUser(); $sharingPolicy = \OC_Appconfig::getValue('core', 'shareapi_share_policy', 'global'); $l = \OC_L10N::get('lib'); @@ -489,7 +485,6 @@ class Share extends \OC\Share\Constants { $itemSourceName = $itemSource; } - // verify that the file exists before we try to share it if ($itemType === 'file' or $itemType === 'folder') { $path = \OC\Files\Filesystem::getPath($itemSource); @@ -588,7 +583,9 @@ class Share extends \OC\Share\Constants { $shareWith['users'] = array_diff(\OC_Group::usersInGroup($group), array($uidOwner)); } else if ($shareType === self::SHARE_TYPE_LINK) { if (\OC_Appconfig::getValue('core', 'shareapi_allow_links', 'yes') == 'yes') { + // when updating a link share + // FIXME Don't delete link if we update it if ($checkExists = self::getItems($itemType, $itemSource, self::SHARE_TYPE_LINK, null, $uidOwner, self::FORMAT_NONE, null, 1)) { // remember old token @@ -599,7 +596,7 @@ class Share extends \OC\Share\Constants { } // Generate hash of password - same method as user passwords - if (isset($shareWith)) { + if (!empty($shareWith)) { $forcePortable = (CRYPT_BLOWFISH != 1); $hasher = new \PasswordHash(8, $forcePortable); $shareWith = $hasher->HashPassword($shareWith.\OC_Config::getValue('passwordsalt', '')); @@ -611,6 +608,13 @@ class Share extends \OC\Share\Constants { } } + if (\OCP\Util::isPublicLinkPasswordRequired() && empty($shareWith)) { + $message = 'You need to provide a password to create a public link, only protected links are allowed'; + $message_t = $l->t('You need to provide a password to create a public link, only protected links are allowed'); + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message_t); + } + // Generate token if (isset($oldToken)) { $token = $oldToken; @@ -618,7 +622,7 @@ class Share extends \OC\Share\Constants { $token = \OC_Util::generateRandomBytes(self::TOKEN_LENGTH); } $result = self::put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions, - null, $token, $itemSourceName); + null, $token, $itemSourceName, $expirationDate); if ($result) { return $token; } else { @@ -637,17 +641,18 @@ class Share extends \OC\Share\Constants { \OC_Log::write('OCP\Share', sprintf($message, $shareType, $itemSource), \OC_Log::ERROR); throw new \Exception($message_t); } - // Put the item into the database - return self::put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions, null, null, $itemSourceName); + + // Put the item into the database + return self::put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions, null, null, $itemSourceName, $expirationDate); } /** * Unshare an item from a user, group, or delete a private link - * @param string Item type - * @param string Item source - * @param int SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK - * @param string User or group the item is being shared with - * @return Returns true on success or false on failure + * @param string $itemType + * @param string $itemSource + * @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK + * @param string $shareWith User or group the item is being shared with + * @return boolean true on success or false on failure */ public static function unshare($itemType, $itemSource, $shareType, $shareWith) { $item = self::getItems($itemType, $itemSource, $shareType, $shareWith, \OC_User::getUser(),self::FORMAT_NONE, null, 1); @@ -660,9 +665,9 @@ class Share extends \OC\Share\Constants { /** * Unshare an item from all users, groups, and remove all links - * @param string Item type - * @param string Item source - * @return Returns true on success or false on failure + * @param string $itemType + * @param string $itemSource + * @return boolean true on success or false on failure */ public static function unshareAll($itemType, $itemSource) { // Get all of the owners of shares of this item. @@ -692,9 +697,9 @@ class Share extends \OC\Share\Constants { /** * Unshare an item shared with the current user - * @param string Item type - * @param string Item target - * @return Returns true on success or false on failure + * @param string $itemType + * @param string $itemTarget + * @return boolean true on success or false on failure * * Unsharing from self is not allowed for items inside collections */ @@ -727,12 +732,13 @@ class Share extends \OC\Share\Constants { } return false; } + /** * sent status if users got informed by mail about share * @param string $itemType * @param string $itemSource * @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK - * @param bool $status + * @param boolean $status */ public static function setSendMailStatus($itemType, $itemSource, $shareType, $status) { $status = $status ? 1 : 0; @@ -751,12 +757,12 @@ class Share extends \OC\Share\Constants { /** * Set the permissions of an item for a specific user or group - * @param string Item type - * @param string Item source - * @param int SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK - * @param string User or group the item is being shared with - * @param int CRUDS permissions - * @return Returns true on success or false on failure + * @param string $itemType + * @param string $itemSource + * @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK + * @param string $shareWith User or group the item is being shared with + * @param int $permissions CRUDS permissions + * @return boolean true on success or false on failure */ public static function setPermissions($itemType, $itemSource, $shareType, $shareWith, $permissions) { $l = \OC_L10N::get('lib'); @@ -842,7 +848,7 @@ class Share extends \OC\Share\Constants { * @param string $itemType * @param string $itemSource * @param string $date expiration date - * @return \OCP\Share_Backend + * @return boolean */ public static function setExpirationDate($itemType, $itemSource, $date) { $user = \OC_User::getUser(); @@ -873,20 +879,24 @@ class Share extends \OC\Share\Constants { /** * Checks whether a share has expired, calls unshareItem() if yes. * @param array $item Share data (usually database row) - * @return bool True if item was expired, false otherwise. + * @return boolean True if item was expired, false otherwise. */ protected static function expireItem(array $item) { - // get default expire settings - $defaultSettings = Helper::getDefaultExpireSetting(); // calculate expire date if (!empty($item['expiration'])) { $userDefinedExpire = new \DateTime($item['expiration']); - $userDefinedExpireTimestamp = $userDefinedExpire->getTimestamp(); + $expires = $userDefinedExpire->getTimestamp(); } else { - $userDefinedExpireTimestamp = null; + $expires = null; + } + + // only use default expire date for link shares + if((int)$item['share_type'] === self::SHARE_TYPE_LINK) { + // get default expire settings + $defaultSettings = Helper::getDefaultExpireSetting(); + $expires = Helper::calculateExpireDate($defaultSettings, $item['stime'], $expires); } - $expires = Helper::calculateExpireDate($defaultSettings, $item['stime'], $userDefinedExpireTimestamp); if (is_int($expires)) { $now = time(); @@ -925,6 +935,7 @@ class Share extends \OC\Share\Constants { /** * Get the backend class for the specified item type * @param string $itemType + * @throws \Exception * @return \OCP\Share_Backend */ public static function getBackend($itemType) { @@ -957,7 +968,7 @@ class Share extends \OC\Share\Constants { /** * Check if resharing is allowed - * @return Returns true if allowed or false + * @return boolean true if allowed or false * * Resharing is allowed by default if not configured */ @@ -974,7 +985,7 @@ class Share extends \OC\Share\Constants { /** * Get a list of collection item types for the specified item type - * @param string Item type + * @param string $itemType * @return array */ private static function getCollectionItemTypes($itemType) { @@ -998,17 +1009,17 @@ class Share extends \OC\Share\Constants { /** * Get shared items from the database - * @param string Item type - * @param string Item source or target (optional) - * @param int SHARE_TYPE_USER, SHARE_TYPE_GROUP, SHARE_TYPE_LINK, $shareTypeUserAndGroups, or $shareTypeGroupUserUnique - * @param string User or group the item is being shared with - * @param string User that is the owner of shared items (optional) - * @param int Format to convert items to with formatItems() - * @param mixed Parameters to pass to formatItems() - * @param int Number of items to return, -1 to return all matches (optional) - * @param bool Include collection item types (optional) - * @param bool TODO (optional) - * @prams bool check expire date + * @param string $itemType + * @param string $item Item source or target (optional) + * @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, SHARE_TYPE_LINK, $shareTypeUserAndGroups, or $shareTypeGroupUserUnique + * @param string $shareWith User or group the item is being shared with + * @param string $uidOwner User that is the owner of shared items (optional) + * @param int $format Format to convert items to with formatItems() (optional) + * @param mixed $parameters to pass to formatItems() (optional) + * @param int $limit Number of items to return, -1 to return all matches (optional) + * @param boolean $includeCollections Include collection item types (optional) + * @param boolean $itemShareWithBySource (optional) + * @param boolean $checkExpireDate * @return array * * See public functions getItem(s)... for parameter usage @@ -1343,19 +1354,21 @@ class Share extends \OC\Share\Constants { /** * Put shared item into the database - * @param string Item type - * @param string Item source - * @param int SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK - * @param string User or group the item is being shared with - * @param string User that is the owner of shared item - * @param int CRUDS permissions - * @param bool|array Parent folder target (optional) - * @param string token (optional) - * @param string name of the source item (optional) - * @return bool Returns true on success or false on failure + * @param string $itemType Item type + * @param string $itemSource Item source + * @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK + * @param string $shareWith User or group the item is being shared with + * @param string $uidOwner User that is the owner of shared item + * @param int $permissions CRUDS permissions + * @param boolean|array $parentFolder Parent folder target (optional) + * @param string $token (optional) + * @param string $itemSourceName name of the source item (optional) + * @param \DateTime $expirationDate (optional) + * @throws \Exception + * @return boolean Returns true on success or false on failure */ private static function put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, - $permissions, $parentFolder = null, $token = null, $itemSourceName = null) { + $permissions, $parentFolder = null, $token = null, $itemSourceName = null, \DateTime $expirationDate = null) { $backend = self::getBackend($itemType); $l = \OC_L10N::get('lib'); // Check if this is a reshare @@ -1385,6 +1398,7 @@ class Share extends \OC\Share\Constants { $suggestedItemTarget = $checkReshare['item_target']; $suggestedFileTarget = $checkReshare['file_target']; $filePath = $checkReshare['file_target']; + $expirationDate = min($expirationDate, $checkReshare['expiration']); } } else { $message = 'Sharing %s failed, because resharing is not allowed'; @@ -1424,9 +1438,7 @@ class Share extends \OC\Share\Constants { $fileSource = null; } } - $query = \OC_DB::prepare('INSERT INTO `*PREFIX*share` (`item_type`, `item_source`, `item_target`,' - .' `share_type`, `share_with`, `uid_owner`, `permissions`, `stime`, `file_source`,' - .' `file_target`, `token`, `parent`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)'); + // Share with a group if ($shareType == self::SHARE_TYPE_GROUP) { $groupItemTarget = Helper::generateTarget($itemType, $itemSource, $shareType, $shareWith['group'], @@ -1442,6 +1454,7 @@ class Share extends \OC\Share\Constants { 'uidOwner' => $uidOwner, 'permissions' => $permissions, 'fileSource' => $fileSource, + 'expiration' => $expirationDate, 'token' => $token, 'run' => &$run, 'error' => &$error @@ -1471,8 +1484,21 @@ class Share extends \OC\Share\Constants { $groupFileTarget = null; } $queriesToExecute = array(); - $queriesToExecute['groupShare'] = array($itemType, $itemSource, $groupItemTarget, $shareType, - $shareWith['group'], $uidOwner, $permissions, time(), $fileSource, $groupFileTarget, $token, $parent); + $queriesToExecute['groupShare'] = array( + 'itemType' => $itemType, + 'itemSource' => $itemSource, + 'itemTarget' => $groupItemTarget, + 'shareType' => $shareType, + 'shareWith' => $shareWith['group'], + 'uidOwner' => $uidOwner, + 'permissions' => $permissions, + 'shareTime' => time(), + 'fileSource' => $fileSource, + 'fileTarget' => $groupFileTarget, + 'token' => $token, + 'parent' => $parent, + 'expiration' => $expirationDate, + ); // Loop through all users of this group in case we need to add an extra row foreach ($shareWith['users'] as $uid) { $itemTarget = Helper::generateTarget($itemType, $itemSource, self::SHARE_TYPE_USER, $uid, @@ -1498,19 +1524,32 @@ class Share extends \OC\Share\Constants { } // Insert an extra row for the group share if the item or file target is unique for this user if ($itemTarget != $groupItemTarget || (isset($fileSource) && $fileTarget != $groupFileTarget)) { - $queriesToExecute[] = array($itemType, $itemSource, $itemTarget, - self::$shareTypeGroupUserUnique, $uid, $uidOwner, $permissions, time(), - $fileSource, $fileTarget, $token); - $id = \OC_DB::insertid('*PREFIX*share'); + $queriesToExecute[] = array( + 'itemType' => $itemType, + 'itemSource' => $itemSource, + 'itemTarget' => $itemTarget, + 'shareType' => self::$shareTypeGroupUserUnique, + 'shareWith' => $uid, + 'uidOwner' => $uidOwner, + 'permissions' => $permissions, + 'shareTime' => time(), + 'fileSource' => $fileSource, + 'fileTarget' => $fileTarget, + 'token' => $token, + //'parent' => $parent, + 'expiration' => $expirationDate, + ); } } - $query->execute($queriesToExecute['groupShare']); + + self::insertShare($queriesToExecute['groupShare']); // Save this id, any extra rows for this group share will need to reference it $parent = \OC_DB::insertid('*PREFIX*share'); unset($queriesToExecute['groupShare']); - foreach ($queriesToExecute as $qe) { - $qe[] = $parent; - $query->execute($qe); + + foreach ($queriesToExecute as $shareQuery) { + $shareQuery['parent'] = $parent; + self::insertShare($shareQuery); } \OC_Hook::emit('OCP\Share', 'post_shared', array( @@ -1525,7 +1564,8 @@ class Share extends \OC\Share\Constants { 'fileSource' => $fileSource, 'fileTarget' => $groupFileTarget, 'id' => $parent, - 'token' => $token + 'token' => $token, + 'expirationDate' => $expirationDate, )); if ($parentFolder === true) { @@ -1547,8 +1587,9 @@ class Share extends \OC\Share\Constants { 'permissions' => $permissions, 'fileSource' => $fileSource, 'token' => $token, + 'expirationDate' => $expirationDate, 'run' => &$run, - 'error' => &$error + 'error' => &$error, )); if ($run === false) { @@ -1572,8 +1613,23 @@ class Share extends \OC\Share\Constants { } else { $fileTarget = null; } - $query->execute(array($itemType, $itemSource, $itemTarget, $shareType, $shareWith, $uidOwner, - $permissions, time(), $fileSource, $fileTarget, $token, $parent)); + + self::insertShare(array( + 'itemType' => $itemType, + 'itemSource' => $itemSource, + 'itemTarget' => $itemTarget, + 'shareType' => $shareType, + 'shareWith' => $shareWith, + 'uidOwner' => $uidOwner, + 'permissions' => $permissions, + 'shareTime' => time(), + 'fileSource' => $fileSource, + 'fileTarget' => $fileTarget, + 'token' => $token, + 'parent' => $parent, + 'expiration' => $expirationDate, + )); + $id = \OC_DB::insertid('*PREFIX*share'); \OC_Hook::emit('OCP\Share', 'post_shared', array( 'itemType' => $itemType, @@ -1587,7 +1643,8 @@ class Share extends \OC\Share\Constants { 'fileSource' => $fileSource, 'fileTarget' => $fileTarget, 'id' => $id, - 'token' => $token + 'token' => $token, + 'expirationDate' => $expirationDate, )); if ($parentFolder === true) { $parentFolders['id'] = $id; @@ -1598,6 +1655,27 @@ class Share extends \OC\Share\Constants { return true; } + private static function insertShare(array $shareData) + { + $query = \OC_DB::prepare('INSERT INTO `*PREFIX*share` (' + .' `item_type`, `item_source`, `item_target`, `share_type`,' + .' `share_with`, `uid_owner`, `permissions`, `stime`, `file_source`,' + .' `file_target`, `token`, `parent`, `expiration`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)'); + $query->bindValue(1, $shareData['itemType']); + $query->bindValue(2, $shareData['itemSource']); + $query->bindValue(3, $shareData['itemTarget']); + $query->bindValue(4, $shareData['shareType']); + $query->bindValue(5, $shareData['shareWith']); + $query->bindValue(6, $shareData['uidOwner']); + $query->bindValue(7, $shareData['permissions']); + $query->bindValue(8, $shareData['shareTime']); + $query->bindValue(9, $shareData['fileSource']); + $query->bindValue(10, $shareData['fileTarget']); + $query->bindValue(11, $shareData['token']); + $query->bindValue(12, $shareData['parent']); + $query->bindValue(13, $shareData['expiration'], 'datetime'); + $query->execute(); + } /** * Delete all shares with type SHARE_TYPE_LINK */ @@ -1614,7 +1692,7 @@ class Share extends \OC\Share\Constants { * In case a password protected link is not yet authenticated this function will return false * * @param array $linkItem - * @return bool + * @return boolean */ public static function checkPasswordProtectedShare(array $linkItem) { if (!isset($linkItem['share_with'])) { @@ -1640,9 +1718,9 @@ class Share extends \OC\Share\Constants { } /** - * @breif construct select statement + * construct select statement * @param int $format - * @param bool $fileDependent ist it a file/folder share or a generla share + * @param boolean $fileDependent ist it a file/folder share or a generla share * @param string $uidOwner * @return string select statement */ @@ -1684,7 +1762,7 @@ class Share extends \OC\Share\Constants { /** - * @brief transform db results + * transform db results * @param array $row result */ private static function transformDBResults(&$row) { @@ -1715,13 +1793,13 @@ class Share extends \OC\Share\Constants { } /** - * @brief format result + * format result * @param array $items result - * @prams string $column is it a file share or a general share ('file_target' or 'item_target') - * @params \OCP\Share_Backend $backend sharing backend + * @param string $column is it a file share or a general share ('file_target' or 'item_target') + * @param \OCP\Share_Backend $backend sharing backend * @param int $format - * @param array additional format parameters - * @return array formate result + * @param array $parameters additional format parameters + * @return array format result */ private static function formatResult($items, $column, $backend, $format = self::FORMAT_NONE , $parameters = null) { if ($format === self::FORMAT_NONE) { diff --git a/lib/private/subadmin.php b/lib/private/subadmin.php index 5b6072987ad..f5ef00ce4fe 100644 --- a/lib/private/subadmin.php +++ b/lib/private/subadmin.php @@ -31,7 +31,7 @@ OC_Hook::connect('OC_User', 'post_deleteGroup', 'OC_SubAdmin', 'post_deleteGroup class OC_SubAdmin{ /** - * @brief add a SubAdmin + * add a SubAdmin * @param string $uid uid of the SubAdmin * @param string $gid gid of the group * @return boolean @@ -44,7 +44,7 @@ class OC_SubAdmin{ } /** - * @brief delete a SubAdmin + * delete a SubAdmin * @param string $uid uid of the SubAdmin * @param string $gid gid of the group * @return boolean @@ -57,7 +57,7 @@ class OC_SubAdmin{ } /** - * @brief get groups of a SubAdmin + * get groups of a SubAdmin * @param string $uid uid of the SubAdmin * @return array */ @@ -72,7 +72,7 @@ class OC_SubAdmin{ } /** - * @brief get SubAdmins of a group + * get SubAdmins of a group * @param string $gid gid of the group * @return array */ @@ -87,7 +87,7 @@ class OC_SubAdmin{ } /** - * @brief get all SubAdmins + * get all SubAdmins * @return array */ public static function getAllSubAdmins() { @@ -101,7 +101,7 @@ class OC_SubAdmin{ } /** - * @brief checks if a user is a SubAdmin of a group + * checks if a user is a SubAdmin of a group * @param string $uid uid of the subadmin * @param string $gid gid of the group * @return bool @@ -117,7 +117,7 @@ class OC_SubAdmin{ } /** - * @brief checks if a user is a SubAdmin + * checks if a user is a SubAdmin * @param string $uid uid of the subadmin * @return bool */ @@ -137,7 +137,7 @@ class OC_SubAdmin{ } /** - * @brief checks if a user is a accessible by a subadmin + * checks if a user is a accessible by a subadmin * @param string $subadmin uid of the subadmin * @param string $user uid of the user * @return bool @@ -159,15 +159,15 @@ class OC_SubAdmin{ } /* - * @brief alias for self::isSubAdminofGroup() + * alias for self::isSubAdminofGroup() */ public static function isGroupAccessible($subadmin, $group) { return self::isSubAdminofGroup($subadmin, $group); } /** - * @brief delete all SubAdmins by uid - * @param $parameters + * delete all SubAdmins by uid + * @param array $parameters * @return boolean */ public static function post_deleteUser($parameters) { @@ -177,8 +177,8 @@ class OC_SubAdmin{ } /** - * @brief delete all SubAdmins by gid - * @param $parameters + * delete all SubAdmins by gid + * @param array $parameters * @return boolean */ public static function post_deleteGroup($parameters) { diff --git a/lib/private/tags.php b/lib/private/tags.php index 06550068f76..0b62caf2dd8 100644 --- a/lib/private/tags.php +++ b/lib/private/tags.php @@ -121,21 +121,7 @@ class Tags implements \OCP\ITags { * @return boolean. */ public function isEmpty() { - $sql = 'SELECT COUNT(*) FROM `' . self::TAG_TABLE . '` ' - . 'WHERE `uid` = ? AND `type` = ?'; - try { - $stmt = \OCP\DB::prepare($sql); - $result = $stmt->execute(array($this->user, $this->type)); - if (\OCP\DB::isError($result)) { - \OCP\Util::writeLog('core', __METHOD__. ', DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR); - return false; - } - return ((int)$result->fetchOne() === 0); - } catch(\Exception $e) { - \OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(), - \OCP\Util::ERROR); - return false; - } + return count($this->tags) === 0; } /** @@ -184,6 +170,10 @@ class Tags implements \OCP\ITags { $tagId = $tag; } elseif(is_string($tag)) { $tag = trim($tag); + if($tag === '') { + \OCP\Util::writeLog('core', __METHOD__.', Cannot use empty tag names', \OCP\Util::DEBUG); + return false; + } $tagId = $this->array_searchi($tag, $this->tags); } @@ -234,11 +224,15 @@ class Tags implements \OCP\ITags { * Add a new tag. * * @param string $name A string with a name of the tag - * @return false|string the id of the added tag or false if it already exists. + * @return false|string the id of the added tag or false on error. */ public function add($name) { $name = trim($name); + if($name === '') { + \OCP\Util::writeLog('core', __METHOD__.', Cannot add an empty tag', \OCP\Util::DEBUG); + return false; + } if($this->hasTag($name)) { \OCP\Util::writeLog('core', __METHOD__.', name: ' . $name. ' exists already', \OCP\Util::DEBUG); return false; @@ -280,6 +274,12 @@ class Tags implements \OCP\ITags { public function rename($from, $to) { $from = trim($from); $to = trim($to); + + if($to === '' || $from === '') { + \OCP\Util::writeLog('core', __METHOD__.', Cannot use empty tag names', \OCP\Util::DEBUG); + return false; + } + $id = $this->array_searchi($from, $this->tags); if($id === false) { \OCP\Util::writeLog('core', __METHOD__.', tag: ' . $from. ' does not exist', \OCP\Util::DEBUG); @@ -318,6 +318,8 @@ class Tags implements \OCP\ITags { $names = array($names); } $names = array_map('trim', $names); + array_filter($names); + $newones = array(); foreach($names as $name) { if(($this->in_arrayi( @@ -391,7 +393,7 @@ class Tags implements \OCP\ITags { * * For hooking up on post_deleteUser * - * @param array + * @param array $arguments */ public static function post_deleteUser($arguments) { // Find all objectid/tagId pairs. @@ -492,9 +494,9 @@ class Tags implements \OCP\ITags { */ public function addToFavorites($objid) { if(!$this->hasTag(self::TAG_FAVORITE)) { - $this->add(self::TAG_FAVORITE, true); + $this->add(self::TAG_FAVORITE); } - return $this->tagAs($objid, self::TAG_FAVORITE, $this->type); + return $this->tagAs($objid, self::TAG_FAVORITE); } /** @@ -504,7 +506,7 @@ class Tags implements \OCP\ITags { * @return boolean */ public function removeFromFavorites($objid) { - return $this->unTag($objid, self::TAG_FAVORITE, $this->type); + return $this->unTag($objid, self::TAG_FAVORITE); } /** @@ -512,13 +514,17 @@ class Tags implements \OCP\ITags { * * @param int $objid The id of the object * @param string $tag The id or name of the tag - * @return boolean Returns false on database error. + * @return boolean Returns false on error. */ public function tagAs($objid, $tag) { if(is_string($tag) && !is_numeric($tag)) { $tag = trim($tag); + if($tag === '') { + \OCP\Util::writeLog('core', __METHOD__.', Cannot add an empty tag', \OCP\Util::DEBUG); + return false; + } if(!$this->hasTag($tag)) { - $this->add($tag, true); + $this->add($tag); } $tagId = $this->array_searchi($tag, $this->tags); } else { @@ -549,6 +555,10 @@ class Tags implements \OCP\ITags { public function unTag($objid, $tag) { if(is_string($tag) && !is_numeric($tag)) { $tag = trim($tag); + if($tag === '') { + \OCP\Util::writeLog('core', __METHOD__.', Tag name is empty', \OCP\Util::DEBUG); + return false; + } $tagId = $this->array_searchi($tag, $this->tags); } else { $tagId = $tag; @@ -579,6 +589,7 @@ class Tags implements \OCP\ITags { } $names = array_map('trim', $names); + array_filter($names); \OCP\Util::writeLog('core', __METHOD__ . ', before: ' . print_r($this->tags, true), \OCP\Util::DEBUG); diff --git a/lib/private/template.php b/lib/private/template.php index 3d18b52bac9..eaa58b769d7 100644 --- a/lib/private/template.php +++ b/lib/private/template.php @@ -30,9 +30,10 @@ class OC_Template extends \OC\Template\Base { private $renderas; // Create a full page? private $path; // The path to the template private $headers=array(); //custom headers + protected $app; // app id /** - * @brief Constructor + * Constructor * @param string $app app providing the template * @param string $name of the template file (without suffix) * @param string $renderas = ""; produce a full page @@ -62,6 +63,7 @@ class OC_Template extends \OC\Template\Base { // Set the private data $this->renderas = $renderas; $this->path = $path; + $this->app = $app; parent::__construct($template, $requesttoken, $l10n, $themeDefaults); } @@ -95,7 +97,7 @@ class OC_Template extends \OC\Template\Base { } /** - * @brief Returns the formfactor extension for current formfactor + * Returns the formfactor extension for current formfactor */ static public function getFormFactorExtension() { @@ -128,7 +130,7 @@ class OC_Template extends \OC\Template\Base { } /** - * @brief find the template with the given name + * find the template with the given name * @param string $name of the template file (without suffix) * * Will select the template file for the selected theme and formfactor. @@ -152,7 +154,7 @@ class OC_Template extends \OC\Template\Base { } /** - * @brief Add a custom element to the header + * Add a custom element to the header * @param string $tag tag name of the element * @param array $attributes array of attributes for the element * @param string $text the text content for the element @@ -162,7 +164,7 @@ class OC_Template extends \OC\Template\Base { } /** - * @brief Process the template + * Process the template * @return boolean|string * * This function process the template. If $this->renderas is set, it @@ -172,7 +174,7 @@ class OC_Template extends \OC\Template\Base { $data = parent::fetchPage(); if( $this->renderas ) { - $page = new OC_TemplateLayout($this->renderas); + $page = new OC_TemplateLayout($this->renderas, $this->app); // Add custom headers $page->assign('headers', $this->headers, false); @@ -189,7 +191,7 @@ class OC_Template extends \OC\Template\Base { } /** - * @brief Include template + * Include template * @return string returns content of included template * * Includes another template. use <?php echo $this->inc('template'); ?> to @@ -200,7 +202,7 @@ class OC_Template extends \OC\Template\Base { } /** - * @brief Shortcut to print a simple page for users + * Shortcut to print a simple page for users * @param string $application The application we render the template for * @param string $name Name of the template * @param array $parameters Parameters for the template @@ -215,7 +217,7 @@ class OC_Template extends \OC\Template\Base { } /** - * @brief Shortcut to print a simple page for admins + * Shortcut to print a simple page for admins * @param string $application The application we render the template for * @param string $name Name of the template * @param array $parameters Parameters for the template @@ -230,7 +232,7 @@ class OC_Template extends \OC\Template\Base { } /** - * @brief Shortcut to print a simple page for guests + * Shortcut to print a simple page for guests * @param string $application The application we render the template for * @param string $name Name of the template * @param array|string $parameters Parameters for the template @@ -245,7 +247,7 @@ class OC_Template extends \OC\Template\Base { } /** - * @brief Print a fatal error page and terminates the script + * Print a fatal error page and terminates the script * @param string $error_msg The error message to show * @param string $hint An optional hint message * Warning: All data passed to $hint needs to get sanitized using OC_Util::sanitizeHTML @@ -257,7 +259,7 @@ class OC_Template extends \OC\Template\Base { $content->printPage(); die(); } - + /** * print error page using Exception details * @param Exception $exception diff --git a/lib/private/template/base.php b/lib/private/template/base.php index 3d7c685c1cf..dbdfce24324 100644 --- a/lib/private/template/base.php +++ b/lib/private/template/base.php @@ -59,7 +59,7 @@ class Base { } /** - * @brief Assign variables + * Assign variables * @param string $key key * @param array|bool|integer|string $value value * @return bool @@ -75,7 +75,7 @@ class Base { } /** - * @brief Appends a variable + * Appends a variable * @param string $key key * @param mixed $value value * @return boolean|null @@ -94,7 +94,7 @@ class Base { } /** - * @brief Prints the proceeded template + * Prints the proceeded template * @return bool * * This function proceeds the template and prints its output. @@ -111,7 +111,7 @@ class Base { } /** - * @brief Process the template + * Process the template * @return string * * This function processes the template. @@ -121,7 +121,7 @@ class Base { } /** - * @brief doing the actual work + * doing the actual work * @param string $file * @return string content * diff --git a/lib/private/template/functions.php b/lib/private/template/functions.php index 3c42d441efa..46e48274001 100644 --- a/lib/private/template/functions.php +++ b/lib/private/template/functions.php @@ -24,7 +24,7 @@ function print_unescaped($string) { } /** - * @brief make OC_Helper::linkTo available as a simple function + * make OC_Helper::linkTo available as a simple function * @param string $app app * @param string $file file * @param array $args array with param=>value, will be appended to the returned url @@ -45,7 +45,7 @@ function link_to_docs($key) { } /** - * @brief make OC_Helper::imagePath available as a simple function + * make OC_Helper::imagePath available as a simple function * @param string $app app * @param string $image image * @return string link to the image @@ -57,7 +57,7 @@ function image_path( $app, $image ) { } /** - * @brief make OC_Helper::mimetypeIcon available as a simple function + * make OC_Helper::mimetypeIcon available as a simple function * @param string $mimetype mimetype * @return string link to the image * @@ -68,10 +68,10 @@ function mimetype_icon( $mimetype ) { } /** - * @brief make preview_icon available as a simple function + * make preview_icon available as a simple function * Returns the path to the preview of the image. - * @param $path path of file - * @returns link to the preview + * @param string $path path of file + * @return link to the preview * * For further information have a look at OC_Helper::previewIcon */ @@ -87,7 +87,7 @@ function publicPreview_icon ( $path, $token ) { } /** - * @brief make OC_Helper::humanFileSize available as a simple function + * make OC_Helper::humanFileSize available as a simple function * @param int $bytes size in bytes * @return string size as string * @@ -98,7 +98,7 @@ function human_file_size( $bytes ) { } /** - * @brief Strips the timestamp of its time value + * Strips the timestamp of its time value * @param int $timestamp UNIX timestamp to strip * @return $timestamp without time value */ @@ -109,7 +109,7 @@ function strip_time($timestamp){ } /** - * @brief Formats timestamp relatively to the current time using + * Formats timestamp relatively to the current time using * a human-friendly format like "x minutes ago" or "yesterday" * @param int $timestamp timestamp to format * @param int $fromTime timestamp to compare from, defaults to current time diff --git a/lib/private/template/resourcelocator.php b/lib/private/template/resourcelocator.php index 8a3dd5e7fa9..7976c415922 100644 --- a/lib/private/template/resourcelocator.php +++ b/lib/private/template/resourcelocator.php @@ -52,14 +52,10 @@ abstract class ResourceLocator { } /* - * @brief append the $file resource if exist at $root - * @param $root path to check - * @param $file the filename - * @param $web base for path, default map $root to $webroot - */ - /** - * @param string $file - * @param string|false $webroot + * append the $file resource if exist at $root + * @param string $root path to check + * @param string $file the filename + * @param string|null $webroot base for path, default map $root to $webroot */ protected function appendIfExist($root, $file, $webroot = null) { if (is_file($root.'/'.$file)) { diff --git a/lib/private/templatelayout.php b/lib/private/templatelayout.php index b7ac02a753d..a5dd9a0c614 100644 --- a/lib/private/templatelayout.php +++ b/lib/private/templatelayout.php @@ -15,8 +15,9 @@ class OC_TemplateLayout extends OC_Template { /** * @param string $renderas + * @param string $appid application id */ - public function __construct( $renderas ) { + public function __construct( $renderas, $appid = '' ) { // Decide which page we show if( $renderas == 'user' ) { @@ -43,6 +44,7 @@ class OC_TemplateLayout extends OC_Template { // Add navigation entry $this->assign( 'application', '', false ); + $this->assign( 'appid', $appid ); $navigation = OC_App::getNavigation(); $this->assign( 'navigation', $navigation); $this->assign( 'settingsnavigation', OC_App::getSettingsNavigation()); @@ -98,7 +100,7 @@ class OC_TemplateLayout extends OC_Template { } /** - * @param $styles + * @param array $styles * @return array */ static public function findStylesheetFiles($styles) { @@ -116,7 +118,7 @@ class OC_TemplateLayout extends OC_Template { } /** - * @param $scripts + * @param array $scripts * @return array */ static public function findJavascriptFiles($scripts) { @@ -175,7 +177,7 @@ class OC_TemplateLayout extends OC_Template { } /** - * @param $files + * @param array $files * @return string */ private static function hashScriptNames($files) diff --git a/lib/private/updater.php b/lib/private/updater.php index 7b09f580176..d8694ac6ed5 100644 --- a/lib/private/updater.php +++ b/lib/private/updater.php @@ -35,7 +35,7 @@ class Updater extends BasicEmitter { /** * Check if a new version is available * @param string $updaterUrl the url to check, i.e. 'http://apps.owncloud.com/updater.php' - * @return array | bool + * @return array|bool */ public function check($updaterUrl) { diff --git a/lib/private/urlgenerator.php b/lib/private/urlgenerator.php index a56b0fe3378..af5d977eeab 100644 --- a/lib/private/urlgenerator.php +++ b/lib/private/urlgenerator.php @@ -29,8 +29,8 @@ class URLGenerator implements IURLGenerator { } /** - * @brief Creates an url using a defined route - * @param $route + * Creates an url using a defined route + * @param string $route * @param array $parameters * @internal param array $args with param=>value, will be appended to the returned url * @return string the url @@ -43,7 +43,7 @@ class URLGenerator implements IURLGenerator { } /** - * @brief Creates an url + * Creates an url * @param string $app app * @param string $file file * @param array $args array with param=>value, will be appended to the returned url @@ -92,7 +92,7 @@ class URLGenerator implements IURLGenerator { } /** - * @brief Creates path to an image + * Creates path to an image * @param string $app app * @param string $image image name * @throws \RuntimeException If the image does not exist diff --git a/lib/private/user.php b/lib/private/user.php index 7106d664aca..9276d7923c9 100644 --- a/lib/private/user.php +++ b/lib/private/user.php @@ -62,7 +62,7 @@ class OC_User { private static $incognitoMode = false; /** - * @brief registers backend + * registers backend * @param string $backend name of the backend * @deprecated Add classes by calling useBackend with a class instance instead * @return bool @@ -75,9 +75,9 @@ class OC_User { } /** - * @brief gets available backends + * gets available backends * @deprecated - * @returns array of backends + * @return array an array of backends * * Returns the names of all backends. */ @@ -86,9 +86,9 @@ class OC_User { } /** - * @brief gets used backends + * gets used backends * @deprecated - * @returns array of backends + * @return array an array of backends * * Returns the names of all used backends. */ @@ -97,8 +97,8 @@ class OC_User { } /** - * @brief Adds the backend to the list of used backends - * @param string | OC_User_Backend $backend default: database The backend to use for user management + * Adds the backend to the list of used backends + * @param string|OC_User_Interface $backend default: database The backend to use for user management * @return bool * * Set the User Authentication Module @@ -169,7 +169,7 @@ class OC_User { } /** - * @brief Create a new user + * Create a new user * @param string $uid The username of the user to create * @param string $password The password of the new user * @throws Exception @@ -185,7 +185,7 @@ class OC_User { } /** - * @brief delete a user + * delete a user * @param string $uid The username of the user to delete * @return bool * @@ -223,7 +223,7 @@ class OC_User { } /** - * @brief Try to login a user + * Try to login a user * @param string $uid The username of the user to log in * @param string $password The password of the user * @return boolean|null @@ -236,7 +236,7 @@ class OC_User { } /** - * @brief Try to login a user, assuming authentication + * Try to login a user, assuming authentication * has already happened (e.g. via Single Sign On). * * Log in a user and regenerate a new session. @@ -262,7 +262,7 @@ class OC_User { } /** - * @brief Verify with Apache whether user is authenticated. + * Verify with Apache whether user is authenticated. * * @return boolean|null * true: authenticated @@ -286,14 +286,14 @@ class OC_User { /** - * @brief Sets user id for session and triggers emit + * Sets user id for session and triggers emit */ public static function setUserId($uid) { OC::$session->set('user_id', $uid); } /** - * @brief Sets user display name for session + * Sets user display name for session * @param string $uid * @param null $displayName * @return bool Whether the display name could get set @@ -311,7 +311,7 @@ class OC_User { } /** - * @brief Logs the current user out and kills all the session data + * Logs the current user out and kills all the session data * * Logout, destroys session */ @@ -320,8 +320,8 @@ class OC_User { } /** - * @brief Check if the user is logged in - * @returns bool + * Check if the user is logged in + * @return bool * * Checks if the user is logged in */ @@ -333,7 +333,7 @@ class OC_User { } /** - * @brief set incognito mode, e.g. if a user wants to open a public link + * set incognito mode, e.g. if a user wants to open a public link * @param bool $status */ public static function setIncognitoMode($status) { @@ -358,7 +358,7 @@ class OC_User { } /** - * @brief Check if the user is an admin user + * Check if the user is an admin user * @param string $uid uid of the admin * @return bool */ @@ -371,7 +371,7 @@ class OC_User { /** - * @brief get the user id of the user currently logged in. + * get the user id of the user currently logged in. * @return string uid or false */ public static function getUser() { @@ -384,7 +384,7 @@ class OC_User { } /** - * @brief get the display name of the user currently logged in. + * get the display name of the user currently logged in. * @param string $uid * @return string uid or false */ @@ -407,7 +407,7 @@ class OC_User { } /** - * @brief Autogenerate a password + * Autogenerate a password * @return string * * generates a password @@ -417,7 +417,7 @@ class OC_User { } /** - * @brief Set password + * Set password * @param string $uid The username * @param string $password The new password * @param string $recoveryPassword for the encryption app to reset encryption keys @@ -435,7 +435,7 @@ class OC_User { } /** - * @brief Check whether user can change his avatar + * Check whether user can change his avatar * @param string $uid The username * @return bool * @@ -451,7 +451,7 @@ class OC_User { } /** - * @brief Check whether user can change his password + * Check whether user can change his password * @param string $uid The username * @return bool * @@ -467,7 +467,7 @@ class OC_User { } /** - * @brief Check whether user can change his display name + * Check whether user can change his display name * @param string $uid The username * @return bool * @@ -483,7 +483,7 @@ class OC_User { } /** - * @brief Check if the password is correct + * Check if the password is correct * @param string $uid The username * @param string $password The password * @return string|false user id a string on success, false otherwise @@ -516,8 +516,8 @@ class OC_User { } /** - * @brief Get a list of all users - * @returns array with all uids + * Get a list of all users + * @return array an array of all uids * * Get a list of all users. * @param string $search @@ -534,7 +534,7 @@ class OC_User { } /** - * @brief Get a list of all users display name + * Get a list of all users display name * @param string $search * @param int $limit * @param int $offset @@ -552,7 +552,7 @@ class OC_User { } /** - * @brief check if a user exists + * check if a user exists * @param string $uid the username * @return boolean */ @@ -600,7 +600,7 @@ class OC_User { } /** - * @brief Set cookie value to use in next page load + * Set cookie value to use in next page load * @param string $username username to be set * @param string $token */ @@ -609,14 +609,14 @@ class OC_User { } /** - * @brief Remove cookie for "remember username" + * Remove cookie for "remember username" */ public static function unsetMagicInCookie() { self::getUserSession()->unsetMagicInCookie(); } /** - * @brief Returns the first active backend from self::$_usedBackends. + * Returns the first active backend from self::$_usedBackends. * @return OCP\Authentication\IApacheBackend|null if no backend active, otherwise OCP\Authentication\IApacheBackend */ private static function findFirstActiveUsedBackend() { diff --git a/lib/private/user/backend.php b/lib/private/user/backend.php index f4e5618e04a..56c63085f18 100644 --- a/lib/private/user/backend.php +++ b/lib/private/user/backend.php @@ -61,7 +61,7 @@ abstract class OC_User_Backend implements OC_User_Interface { ); /** - * @brief Get all supported actions + * Get all supported actions * @return int bitwise-or'ed actions * * Returns the supported actions as int to be @@ -79,7 +79,7 @@ abstract class OC_User_Backend implements OC_User_Interface { } /** - * @brief Check if backend implements actions + * Check if backend implements actions * @param int $actions bitwise-or'ed actions * @return boolean * @@ -91,7 +91,7 @@ abstract class OC_User_Backend implements OC_User_Interface { } /** - * @brief delete a user + * delete a user * @param string $uid The username of the user to delete * @return bool * @@ -102,8 +102,8 @@ abstract class OC_User_Backend implements OC_User_Interface { } /** - * @brief Get a list of all users - * @returns array with all uids + * Get a list of all users + * @return array an array of all uids * * Get a list of all users. */ @@ -112,7 +112,7 @@ abstract class OC_User_Backend implements OC_User_Interface { } /** - * @brief check if a user exists + * check if a user exists * @param string $uid the username * @return boolean */ @@ -121,7 +121,7 @@ abstract class OC_User_Backend implements OC_User_Interface { } /** - * @brief get the user's home directory + * get the user's home directory * @param string $uid the username * @return boolean */ @@ -130,7 +130,7 @@ abstract class OC_User_Backend implements OC_User_Interface { } /** - * @brief get display name of the user + * get display name of the user * @param string $uid user ID of the user * @return string display name */ @@ -139,8 +139,8 @@ abstract class OC_User_Backend implements OC_User_Interface { } /** - * @brief Get a list of all display names - * @returns array with all displayNames (value) and the corresponding uids (key) + * Get a list of all display names + * @return array an array of all displayNames (value) and the corresponding uids (key) * * Get a list of all display names and user ids. */ @@ -154,7 +154,7 @@ abstract class OC_User_Backend implements OC_User_Interface { } /** - * @brief Check if a user list is available or not + * Check if a user list is available or not * @return boolean if users can be listed or not */ public function hasUserListings() { diff --git a/lib/private/user/database.php b/lib/private/user/database.php index 681f03981f5..d9263f6b5de 100644 --- a/lib/private/user/database.php +++ b/lib/private/user/database.php @@ -56,10 +56,10 @@ class OC_User_Database extends OC_User_Backend { } /** - * @brief Create a new user - * @param $uid The username of the user to create - * @param $password The password of the new user - * @returns true/false + * Create a new user + * @param string $uid The username of the user to create + * @param string $password The password of the new user + * @return bool * * Creates a new user. Basic checking of username is done in OC_User * itself, not in its subclasses. @@ -78,9 +78,9 @@ class OC_User_Database extends OC_User_Backend { } /** - * @brief delete a user - * @param $uid The username of the user to delete - * @returns true/false + * delete a user + * @param string $uid The username of the user to delete + * @return bool * * Deletes a user */ @@ -97,10 +97,10 @@ class OC_User_Database extends OC_User_Backend { } /** - * @brief Set password - * @param $uid The username - * @param $password The new password - * @returns true/false + * Set password + * @param string $uid The username + * @param string $password The new password + * @return bool * * Change the password of a user */ @@ -118,10 +118,10 @@ class OC_User_Database extends OC_User_Backend { } /** - * @brief Set display name - * @param $uid The username - * @param $displayName The new display name - * @returns true/false + * Set display name + * @param string $uid The username + * @param string $displayName The new display name + * @return bool * * Change the display name of a user */ @@ -138,8 +138,8 @@ class OC_User_Database extends OC_User_Backend { } /** - * @brief get display name of the user - * @param $uid user ID of the user + * get display name of the user + * @param string $uid user ID of the user * @return string display name */ public function getDisplayName($uid) { @@ -148,8 +148,8 @@ class OC_User_Database extends OC_User_Backend { } /** - * @brief Get a list of all display names - * @returns array with all displayNames (value) and the correspondig uids (key) + * Get a list of all display names + * @return array an array of all displayNames (value) and the correspondig uids (key) * * Get a list of all display names and user ids. */ @@ -168,10 +168,10 @@ class OC_User_Database extends OC_User_Backend { } /** - * @brief Check if the password is correct - * @param $uid The username - * @param $password The password - * @returns string + * Check if the password is correct + * @param string $uid The username + * @param string $password The password + * @return string * * Check if the password is correct without logging in the user * returns the user id or false @@ -183,14 +183,14 @@ class OC_User_Database extends OC_User_Backend { $row = $result->fetchRow(); if ($row) { $storedHash = $row['password']; - if ($storedHash[0] == '$') { //the new phpass based hashing + if ($storedHash[0] === '$') { //the new phpass based hashing $hasher = $this->getHasher(); if ($hasher->CheckPassword($password . OC_Config::getValue('passwordsalt', ''), $storedHash)) { return $row['uid']; } //old sha1 based hashing - } elseif (sha1($password) == $storedHash) { + } elseif (sha1($password) === $storedHash) { //upgrade to new hashing $this->setPassword($row['uid'], $password); return $row['uid']; @@ -201,9 +201,9 @@ class OC_User_Database extends OC_User_Backend { } /** - * @brief Load an user in the cache + * Load an user in the cache * @param string $uid the username - * @returns boolean + * @return boolean */ private function loadUser($uid) { if (empty($this->cache[$uid])) { @@ -225,8 +225,8 @@ class OC_User_Database extends OC_User_Backend { } /** - * @brief Get a list of all users - * @returns array with all uids + * Get a list of all users + * @return array an array of all uids * * Get a list of all users. */ @@ -241,7 +241,7 @@ class OC_User_Database extends OC_User_Backend { } /** - * @brief check if a user exists + * check if a user exists * @param string $uid the username * @return boolean */ @@ -251,7 +251,7 @@ class OC_User_Database extends OC_User_Backend { } /** - * @brief get the user's home directory + * get the user's home directory * @param string $uid the username * @return string|false */ @@ -273,7 +273,7 @@ class OC_User_Database extends OC_User_Backend { /** * counts the users in the database * - * @return int | bool + * @return int|bool */ public function countUsers() { $query = OC_DB::prepare('SELECT COUNT(*) FROM `*PREFIX*users`'); diff --git a/lib/private/user/dummy.php b/lib/private/user/dummy.php index 2fb51d02de3..776168048f6 100644 --- a/lib/private/user/dummy.php +++ b/lib/private/user/dummy.php @@ -28,7 +28,7 @@ class OC_User_Dummy extends OC_User_Backend { private $users = array(); /** - * @brief Create a new user + * Create a new user * @param string $uid The username of the user to create * @param string $password The password of the new user * @return bool @@ -46,7 +46,7 @@ class OC_User_Dummy extends OC_User_Backend { } /** - * @brief delete a user + * delete a user * @param string $uid The username of the user to delete * @return bool * @@ -62,7 +62,7 @@ class OC_User_Dummy extends OC_User_Backend { } /** - * @brief Set password + * Set password * @param string $uid The username * @param string $password The new password * @return bool @@ -79,7 +79,7 @@ class OC_User_Dummy extends OC_User_Backend { } /** - * @brief Check if the password is correct + * Check if the password is correct * @param string $uid The username * @param string $password The password * @return string @@ -96,7 +96,7 @@ class OC_User_Dummy extends OC_User_Backend { } /** - * @brief Get a list of all users + * Get a list of all users * @param string $search * @param int $limit * @param int $offset @@ -109,7 +109,7 @@ class OC_User_Dummy extends OC_User_Backend { } /** - * @brief check if a user exists + * check if a user exists * @param string $uid the username * @return boolean */ @@ -127,7 +127,7 @@ class OC_User_Dummy extends OC_User_Backend { /** * counts the users in the database * - * @return int | bool + * @return int|bool */ public function countUsers() { return 0; diff --git a/lib/private/user/example.php b/lib/private/user/example.php index b2d0dc25410..db21d6f9e52 100644 --- a/lib/private/user/example.php +++ b/lib/private/user/example.php @@ -27,10 +27,10 @@ */ abstract class OC_User_Example extends OC_User_Backend { /** - * @brief Create a new user - * @param $uid The username of the user to create - * @param $password The password of the new user - * @returns true/false + * Create a new user + * @param string $uid The username of the user to create + * @param string $password The password of the new user + * @return bool * * Creates a new user. Basic checking of username is done in OC_User * itself, not in its subclasses. @@ -38,20 +38,20 @@ abstract class OC_User_Example extends OC_User_Backend { abstract public function createUser($uid, $password); /** - * @brief Set password - * @param $uid The username - * @param $password The new password - * @returns true/false + * Set password + * @param string $uid The username + * @param string $password The new password + * @return bool * * Change the password of a user */ abstract public function setPassword($uid, $password); /** - * @brief Check if the password is correct - * @param $uid The username - * @param $password The password - * @returns string + * Check if the password is correct + * @param string $uid The username + * @param string $password The password + * @return string * * Check if the password is correct without logging in the user * returns the user id or false @@ -59,9 +59,9 @@ abstract class OC_User_Example extends OC_User_Backend { abstract public function checkPassword($uid, $password); /** - * @brief get the user's home directory - * @param $uid The username - * @returns string + * get the user's home directory + * @param string $uid The username + * @return string * * get the user's home directory * returns the path or false diff --git a/lib/private/user/http.php b/lib/private/user/http.php index a0394521012..2bb8b4c864a 100644 --- a/lib/private/user/http.php +++ b/lib/private/user/http.php @@ -27,7 +27,7 @@ class OC_User_HTTP extends OC_User_Backend { /** * split http://user@host/path into a user and url part - * @param string path + * @param string $url * @return array */ private function parseUrl($url) { @@ -46,7 +46,7 @@ class OC_User_HTTP extends OC_User_Backend { /** * check if an url is a valid login - * @param string url + * @param string $url * @return boolean */ private function matchUrl($url) { @@ -54,10 +54,10 @@ class OC_User_HTTP extends OC_User_Backend { } /** - * @brief Check if the password is correct - * @param $uid The username - * @param $password The password - * @returns string + * Check if the password is correct + * @param string $uid The username + * @param string $password The password + * @return string * * Check if the password is correct without logging in the user * returns the user id or false @@ -87,7 +87,7 @@ class OC_User_HTTP extends OC_User_Backend { } /** - * @brief check if a user exists + * check if a user exists * @param string $uid the username * @return boolean */ @@ -96,7 +96,7 @@ class OC_User_HTTP extends OC_User_Backend { } /** - * @brief get the user's home directory + * get the user's home directory * @param string $uid the username * @return string|false */ diff --git a/lib/private/user/interface.php b/lib/private/user/interface.php index cdcab3e5d00..4cdc47479a3 100644 --- a/lib/private/user/interface.php +++ b/lib/private/user/interface.php @@ -24,58 +24,54 @@ interface OC_User_Interface { /** - * @brief Check if backend implements actions + * Check if backend implements actions * @param $actions bitwise-or'ed actions - * @returns boolean + * @return boolean * * Returns the supported actions as int to be * compared with OC_USER_BACKEND_CREATE_USER etc. - * @return boolean */ public function implementsActions($actions); /** - * @brief delete a user - * @param $uid The username of the user to delete - * @returns true/false - * - * Deletes a user - * @return boolean + * delete a user + * @param string $uid The username of the user to delete + * @return bool */ public function deleteUser($uid); /** - * @brief Get a list of all users - * @returns array with all uids + * Get a list of all users + * @return array an array of all uids * * Get a list of all users. */ public function getUsers($search = '', $limit = null, $offset = null); /** - * @brief check if a user exists + * check if a user exists * @param string $uid the username * @return boolean */ public function userExists($uid); /** - * @brief get display name of the user - * @param $uid user ID of the user - * @return display name + * get display name of the user + * @param string $uid user ID of the user + * @return string display name */ public function getDisplayName($uid); /** - * @brief Get a list of all display names - * @returns array with all displayNames (value) and the corresponding uids (key) + * Get a list of all display names + * @return array an array of all displayNames (value) and the corresponding uids (key) * * Get a list of all display names and user ids. */ public function getDisplayNames($search = '', $limit = null, $offset = null); /** - * @brief Check if a user list is available or not + * Check if a user list is available or not * @return boolean if users can be listed or not */ public function hasUserListings(); diff --git a/lib/private/user/manager.php b/lib/private/user/manager.php index 14698452e88..0fcf1ceb6ab 100644 --- a/lib/private/user/manager.php +++ b/lib/private/user/manager.php @@ -26,7 +26,7 @@ use OC\Hooks\PublicEmitter; */ class Manager extends PublicEmitter { /** - * @var \OC_User_Backend[] $backends + * @var \OC_User_Interface[] $backends */ private $backends = array(); @@ -57,7 +57,7 @@ class Manager extends PublicEmitter { /** * register a user backend * - * @param \OC_User_Backend $backend + * @param \OC_User_Interface $backend */ public function registerBackend($backend) { $this->backends[] = $backend; @@ -66,7 +66,7 @@ class Manager extends PublicEmitter { /** * remove a user backend * - * @param \OC_User_Backend $backend + * @param \OC_User_Interface $backend */ public function removeBackend($backend) { $this->cachedUsers = array(); @@ -105,7 +105,7 @@ class Manager extends PublicEmitter { * get or construct the user object * * @param string $uid - * @param \OC_User_Backend $backend + * @param \OC_User_Interface $backend * @return \OC\User\User */ protected function getUserObject($uid, $backend) { @@ -174,12 +174,12 @@ class Manager extends PublicEmitter { $backendUsers = $backend->getUsers($pattern, $limit, $offset); if (is_array($backendUsers)) { foreach ($backendUsers as $uid) { - $users[] = $this->getUserObject($uid, $backend); + $users[$uid] = $this->getUserObject($uid, $backend); } } } - usort($users, function ($a, $b) { + uasort($users, function ($a, $b) { /** * @var \OC\User\User $a * @var \OC\User\User $b @@ -222,7 +222,7 @@ class Manager extends PublicEmitter { * @param string $uid * @param string $password * @throws \Exception - * @return bool | \OC\User\User the created user of false + * @return bool|\OC\User\User the created user of false */ public function createUser($uid, $password) { $l = \OC_L10N::get('lib'); @@ -261,7 +261,7 @@ class Manager extends PublicEmitter { /** * returns how many users per backend exist (if supported by backend) * - * @return array with backend class as key and count number as value + * @return array an array of backend class as key and count number as value */ public function countUsers() { $userCountStatistics = array(); diff --git a/lib/private/user/session.php b/lib/private/user/session.php index 1740bad5abe..3d10b134b83 100644 --- a/lib/private/user/session.php +++ b/lib/private/user/session.php @@ -82,7 +82,7 @@ class Session implements Emitter, \OCP\IUserSession { /** * set the currently active user * - * @param \OC\User\User $user + * @param \OC\User\User|null $user */ public function setUser($user) { if (is_null($user)) { @@ -115,7 +115,7 @@ class Session implements Emitter, \OCP\IUserSession { /** * set the login name * - * @param string $loginName for the logged in user + * @param string|null $loginName for the logged in user */ public function setLoginName($loginName) { if (is_null($loginName)) { @@ -191,7 +191,7 @@ class Session implements Emitter, \OCP\IUserSession { $expires = time() + \OC_Config::getValue('remember_login_cookie_lifetime', 60 * 60 * 24 * 15); setcookie("oc_username", $username, $expires, \OC::$WEBROOT, '', $secure_cookie); setcookie("oc_token", $token, $expires, \OC::$WEBROOT, '', $secure_cookie, true); - setcookie("oc_remember_login", true, $expires, \OC::$WEBROOT, '', $secure_cookie); + setcookie("oc_remember_login", "1", $expires, \OC::$WEBROOT, '', $secure_cookie); } /** diff --git a/lib/private/user/user.php b/lib/private/user/user.php index ef5364cbf7b..bc5c541e521 100644 --- a/lib/private/user/user.php +++ b/lib/private/user/user.php @@ -23,7 +23,7 @@ class User { private $displayName; /** - * @var \OC_User_Backend $backend + * @var \OC_User_Interface $backend */ private $backend; @@ -33,7 +33,7 @@ class User { private $enabled; /** - * @var Emitter | Manager $emitter + * @var Emitter|Manager $emitter */ private $emitter; @@ -49,17 +49,12 @@ class User { /** * @param string $uid - * @param \OC_User_Backend $backend + * @param \OC_User_Interface $backend * @param \OC\Hooks\Emitter $emitter * @param \OC\AllConfig $config */ public function __construct($uid, $backend, $emitter = null, $config = null) { $this->uid = $uid; - if ($backend and $backend->implementsActions(OC_USER_BACKEND_GET_DISPLAYNAME)) { - $this->displayName = $backend->getDisplayName($uid); - } else { - $this->displayName = $uid; - } $this->backend = $backend; $this->emitter = $emitter; $this->config = $config; @@ -86,6 +81,13 @@ class User { * @return string */ public function getDisplayName() { + if (!isset($this->displayName)) { + if ($this->backend and $this->backend->implementsActions(OC_USER_BACKEND_GET_DISPLAYNAME)) { + $this->displayName = $this->backend->getDisplayName($this->uid); + } else { + $this->displayName = $this->uid; + } + } return $this->displayName; } diff --git a/lib/private/util.php b/lib/private/util.php index e6aa7b061b5..c018721afe3 100755 --- a/lib/private/util.php +++ b/lib/private/util.php @@ -13,7 +13,7 @@ class OC_Util { private static $fsSetup=false; /** - * @brief Can be set up + * Can be set up * @param string $user * @return boolean * @description configure the initial filesystem based on the configuration @@ -87,6 +87,16 @@ class OC_Util { } /** + * check if a password is required for each public link + * @return boolean + */ + public static function isPublicLinkPasswordRequired() { + $appConfig = \OC::$server->getAppConfig(); + $enforcePassword = $appConfig->getValue('core', 'shareapi_enforce_links_password', 'no'); + return ($enforcePassword === 'yes') ? true : false; + } + + /** * Get the quota of a user * @param string $user * @return int Quota bytes @@ -105,7 +115,7 @@ class OC_Util { } /** - * @brief copies the user skeleton files into the fresh user home files + * copies the user skeleton files into the fresh user home files * @param string $userDirectory */ public static function copySkeleton($userDirectory) { @@ -113,7 +123,7 @@ class OC_Util { } /** - * @brief copies a directory recursively + * copies a directory recursively * @param string $source * @param string $target * @return void @@ -143,7 +153,7 @@ class OC_Util { } /** - * @brief get the current installed version of ownCloud + * get the current installed version of ownCloud * @return array */ public static function getVersion() { @@ -152,7 +162,7 @@ class OC_Util { } /** - * @brief get the current installed version string of ownCloud + * get the current installed version string of ownCloud * @return string */ public static function getVersionString() { @@ -213,7 +223,7 @@ class OC_Util { } /** - * @brief add a javascript file + * add a javascript file * * @param string $application * @param string|null $file filename @@ -232,7 +242,7 @@ class OC_Util { } /** - * @brief add a css file + * add a css file * * @param string $application * @param string|null $file filename @@ -251,7 +261,7 @@ class OC_Util { } /** - * @brief Add a custom element to the header + * Add a custom element to the header * @param string $tag tag name of the element * @param array $attributes array of attributes for the element * @param string $text the text content for the element @@ -266,7 +276,7 @@ class OC_Util { } /** - * @brief formats a timestamp in the "right" way + * formats a timestamp in the "right" way * * @param int $timestamp * @param bool $dateOnly option to omit time from the result @@ -286,7 +296,7 @@ class OC_Util { } /** - * @brief check if the current server configuration is suitable for ownCloud + * check if the current server configuration is suitable for ownCloud * @return array arrays with error messages and hints */ public static function checkServer() { @@ -299,7 +309,7 @@ class OC_Util { } // Assume that if checkServer() succeeded before in this session, then all is fine. - if(\OC::$session->exists('checkServer_suceeded') && \OC::$session->get('checkServer_suceeded')) { + if(\OC::$session->exists('checkServer_succeeded') && \OC::$session->get('checkServer_succeeded')) { return $errors; } @@ -491,7 +501,7 @@ class OC_Util { $errors = array_merge($errors, self::checkDatabaseVersion()); // Cache the result of this function - \OC::$session->set('checkServer_suceeded', count($errors) == 0); + \OC::$session->set('checkServer_succeeded', count($errors) == 0); return $errors; } @@ -530,7 +540,7 @@ class OC_Util { /** - * @brief check if there are still some encrypted files stored + * check if there are still some encrypted files stored * @return boolean */ public static function encryptedFiles() { @@ -551,7 +561,28 @@ class OC_Util { } /** - * @brief Check for correct file permissions of data directory + * check if a backup from the encryption keys exists + * @return boolean + */ + public static function backupKeysExists() { + //check if encryption was enabled in the past + $backupExists = false; + if (OC_App::isEnabled('files_encryption') === false) { + $view = new OC\Files\View('/' . OCP\User::getUser()); + $backupPath = '/files_encryption/keyfiles.backup'; + if ($view->is_dir($backupPath)) { + $dircontent = $view->getDirectoryContent($backupPath); + if (!empty($dircontent)) { + $backupExists = true; + } + } + } + + return $backupExists; + } + + /** + * Check for correct file permissions of data directory * @param string $dataDirectory * @return array arrays with error messages and hints */ @@ -624,7 +655,7 @@ class OC_Util { /** - * @brief Check if the app is enabled, redirects to home if not + * Check if the app is enabled, redirects to home if not * @param string $app * @return void */ @@ -651,7 +682,7 @@ class OC_Util { } /** - * @brief Check if the user is a admin, redirects to home if not + * Check if the user is a admin, redirects to home if not * @return void */ public static function checkAdminUser() { @@ -684,7 +715,7 @@ class OC_Util { } /** - * @brief Check if the user is a subadmin, redirects to home if not + * Check if the user is a subadmin, redirects to home if not * @return null|boolean $groups where the current user is subadmin */ public static function checkSubAdminUser() { @@ -697,7 +728,7 @@ class OC_Util { } /** - * @brief Redirect to the user default page + * Redirect to the user default page * @return void */ public static function redirectToDefaultPage() { @@ -721,7 +752,7 @@ class OC_Util { } /** - * @brief get an id unique for this instance + * get an id unique for this instance * @return string */ public static function getInstanceId() { @@ -735,7 +766,7 @@ class OC_Util { } /** - * @brief Static lifespan (in seconds) when a request token expires. + * Static lifespan (in seconds) when a request token expires. * @see OC_Util::callRegister() * @see OC_Util::isCallRegistered() * @description @@ -746,9 +777,9 @@ class OC_Util { public static $callLifespan = 3600; // 3600 secs = 1 hour /** - * @brief Register an get/post call. Important to prevent CSRF attacks. + * Register an get/post call. Important to prevent CSRF attacks. * @todo Write howto: CSRF protection guide - * @return $token Generated token. + * @return string Generated token. * @description * Creates a 'request token' (random) and stores it inside the session. * Ever subsequent (ajax) request must use such a valid token to succeed, @@ -771,7 +802,7 @@ class OC_Util { } /** - * @brief Check an ajax get/post call if the request token is valid. + * Check an ajax get/post call if the request token is valid. * @return boolean False if request token is not set or is invalid. * @see OC_Util::$callLifespan * @see OC_Util::callRegister() @@ -781,7 +812,7 @@ class OC_Util { } /** - * @brief Check an ajax get/post call if the request token is valid. exit if not. + * Check an ajax get/post call if the request token is valid. Exit if not. * @todo Write howto * @return void */ @@ -792,13 +823,13 @@ class OC_Util { } /** - * @brief Public function to sanitize HTML + * Public function to sanitize HTML * * This function is used to sanitize HTML and should be applied on any * string or array of strings before displaying it on a web page. * - * @param string|array of strings - * @return array with sanitized strings or a single sanitized string, depends on the input parameter. + * @param string|array &$value + * @return string|array an array of sanitized strings or a single sanitized string, depends on the input parameter. */ public static function sanitizeHTML( &$value ) { if (is_array($value)) { @@ -811,7 +842,7 @@ class OC_Util { } /** - * @brief Public function to encode url parameters + * Public function to encode url parameters * * This function is used to encode path to file before output. * Encoding is done according to RFC 3986 with one exception: @@ -827,7 +858,7 @@ class OC_Util { } /** - * @brief Check if the .htaccess file is working + * Check if the .htaccess file is working * @throws OC\HintException If the testfile can't get written. * @return bool * @description Check if the .htaccess file is working by creating a test @@ -837,7 +868,7 @@ class OC_Util { if (!\OC_Config::getValue("check_for_working_htaccess", true)) { return true; } - + // testdata $fileName = '/htaccesstest.txt'; $testContent = 'testcontent'; @@ -875,7 +906,7 @@ class OC_Util { } /** - * @brief test if webDAV is working properly + * test if webDAV is working properly * @return bool * @description * The basic assumption is that if the server returns 401/Not Authenticated for an unauthenticated PROPFIND @@ -939,7 +970,7 @@ class OC_Util { } /** - * @brief Check if the PHP module fileinfo is loaded. + * Check if the PHP module fileinfo is loaded. * @return bool */ public static function fileInfoLoaded() { @@ -947,7 +978,7 @@ class OC_Util { } /** - * @brief Check if a PHP version older then 5.3.8 is installed. + * Check if a PHP version older then 5.3.8 is installed. * @return bool */ public static function isPHPoutdated() { @@ -955,7 +986,7 @@ class OC_Util { } /** - * @brief Check if the ownCloud server can connect to the internet + * Check if the ownCloud server can connect to the internet * @return bool */ public static function isInternetConnectionWorking() { @@ -987,7 +1018,7 @@ class OC_Util { } /** - * @brief Check if the connection to the internet is disabled on purpose + * Check if the connection to the internet is disabled on purpose * @return string */ public static function isInternetConnectionEnabled(){ @@ -995,7 +1026,7 @@ class OC_Util { } /** - * @brief clear all levels of output buffering + * clear all levels of output buffering * @return void */ public static function obEnd(){ @@ -1006,9 +1037,9 @@ class OC_Util { /** - * @brief Generates a cryptographic secure pseudo-random string - * @param Int $length of the random string - * @return String + * Generates a cryptographic secure pseudo-random string + * @param int $length of the random string + * @return string * Please also update secureRNGAvailable if you change something here */ public static function generateRandomBytes($length = 30) { @@ -1043,7 +1074,7 @@ class OC_Util { } /** - * @brief Checks if a secure random number generator is available + * Checks if a secure random number generator is available * @return bool */ public static function secureRNGAvailable() { @@ -1082,7 +1113,7 @@ class OC_Util { curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($curl, CURLOPT_URL, $url); - + curl_setopt($curl, CURLOPT_USERAGENT, "ownCloud Server Crawler"); if(OC_Config::getValue('proxy', '') != '') { @@ -1091,24 +1122,23 @@ class OC_Util { if(OC_Config::getValue('proxyuserpwd', '') != '') { curl_setopt($curl, CURLOPT_PROXYUSERPWD, OC_Config::getValue('proxyuserpwd')); } - - if (ini_get('open_basedir') === '' && ini_get('safe_mode' === 'Off')) { + + if (ini_get('open_basedir') === '' && ini_get('safe_mode') === 'Off') { curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_MAXREDIRS, $max_redirects); $data = curl_exec($curl); } else { curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false); $mr = $max_redirects; - if ($mr > 0) { - $newurl = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL); - + if ($mr > 0) { + $newURL = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL); $rcurl = curl_copy_handle($curl); curl_setopt($rcurl, CURLOPT_HEADER, true); curl_setopt($rcurl, CURLOPT_NOBODY, true); curl_setopt($rcurl, CURLOPT_FORBID_REUSE, false); curl_setopt($rcurl, CURLOPT_RETURNTRANSFER, true); do { - curl_setopt($rcurl, CURLOPT_URL, $newurl); + curl_setopt($rcurl, CURLOPT_URL, $newURL); $header = curl_exec($rcurl); if (curl_errno($rcurl)) { $code = 0; @@ -1116,7 +1146,7 @@ class OC_Util { $code = curl_getinfo($rcurl, CURLINFO_HTTP_CODE); if ($code == 301 || $code == 302) { preg_match('/Location:(.*?)\n/', $header, $matches); - $newurl = trim(array_pop($matches)); + $newURL = trim(array_pop($matches)); } else { $code = 0; } @@ -1124,10 +1154,10 @@ class OC_Util { } while ($code && --$mr); curl_close($rcurl); if ($mr > 0) { - curl_setopt($curl, CURLOPT_URL, $newurl); - } + curl_setopt($curl, CURLOPT_URL, $newURL); + } } - + if($mr == 0 && $max_redirects > 0) { $data = false; } else { @@ -1196,7 +1226,7 @@ class OC_Util { } /** - * @brief Clear the opcode cache if one exists + * Clear the opcode cache if one exists * This is necessary for writing to the config file * in case the opcode cache does not re-validate files * @return void @@ -1267,7 +1297,7 @@ class OC_Util { /** * Returns whether the given file name is valid - * @param $file string file name to check + * @param string $file file name to check * @return bool true if the file name is valid, false otherwise */ public static function isValidFileName($file) { diff --git a/lib/private/vobject.php b/lib/private/vobject.php index a3e9f7ef790..94e3470ff08 100644 --- a/lib/private/vobject.php +++ b/lib/private/vobject.php @@ -25,28 +25,28 @@ */ class OC_VObject{ /** @var Sabre\VObject\Component */ - protected $vobject; + protected $vObject; /** - * @returns Sabre\VObject\Component + * @return Sabre\VObject\Component */ public function getVObject() { - return $this->vobject; + return $this->vObject; } /** - * @brief Parses the VObject + * Parses the VObject * @param string $data VObject as string - * @returns Sabre\VObject\Reader|null + * @return Sabre\VObject\Reader|null */ public static function parse($data) { try { Sabre\VObject\Property::$classMap['LAST-MODIFIED'] = 'Sabre\VObject\Property\DateTime'; - $vobject = Sabre\VObject\Reader::read($data); - if ($vobject instanceof Sabre\VObject\Component) { - $vobject = new OC_VObject($vobject); + $vObject = Sabre\VObject\Reader::read($data); + if ($vObject instanceof Sabre\VObject\Component) { + $vObject = new OC_VObject($vObject); } - return $vobject; + return $vObject; } catch (Exception $e) { OC_Log::write('vobject', $e->getMessage(), OC_Log::ERROR); return null; @@ -54,7 +54,7 @@ class OC_VObject{ } /** - * @brief Escapes semicolons + * Escapes semicolons * @param array $value * @return string */ @@ -66,7 +66,7 @@ class OC_VObject{ } /** - * @brief Creates an array out of a multivalue property + * Creates an array out of a multivalue property * @param string $value * @return array */ @@ -89,34 +89,34 @@ class OC_VObject{ /** * Constructor - * @param Sabre\VObject\Component or string + * @param Sabre\VObject\Component|string $vobject_or_name */ public function __construct($vobject_or_name) { if (is_object($vobject_or_name)) { - $this->vobject = $vobject_or_name; + $this->vObject = $vobject_or_name; } else { - $this->vobject = new Sabre\VObject\Component($vobject_or_name); + $this->vObject = new Sabre\VObject\Component($vobject_or_name); } } /** * @todo Write documentation - * @param $item + * @param \OC_VObject|\Sabre\VObject\Component $item * @param null $itemValue */ public function add($item, $itemValue = null) { if ($item instanceof OC_VObject) { $item = $item->getVObject(); } - $this->vobject->add($item, $itemValue); + $this->vObject->add($item, $itemValue); } /** - * @brief Add property to vobject + * Add property to vobject * @param object $name of property * @param object $value of property * @param array|object $parameters of property - * @returns Sabre\VObject\Property newly created + * @return Sabre\VObject\Property newly created */ public function addProperty($name, $value, $parameters=array()) { if(is_array($value)) { @@ -127,26 +127,26 @@ class OC_VObject{ $property->parameters[] = new Sabre\VObject\Parameter($name, $value); } - $this->vobject->add($property); + $this->vObject->add($property); return $property; } public function setUID() { $uid = substr(md5(rand().time()), 0, 10); - $this->vobject->add('UID', $uid); + $this->vObject->add('UID', $uid); } /** * @todo Write documentation - * @param mixed $name + * @param mixed $name * @param string $string */ public function setString($name, $string) { if ($string != '') { $string = strtr($string, array("\r\n"=>"\n")); - $this->vobject->__set($name, $string); + $this->vObject->__set($name, $string); }else{ - $this->vobject->__unset($name); + $this->vObject->__unset($name); } } @@ -167,31 +167,31 @@ class OC_VObject{ if ($datetime instanceof DateTime) { $datetime_element = new Sabre\VObject\Property\DateTime($name); $datetime_element->setDateTime($datetime, $dateType); - $this->vobject->__set($name, $datetime_element); + $this->vObject->__set($name, $datetime_element); }else{ - $this->vobject->__unset($name); + $this->vObject->__unset($name); } } /** * @todo Write documentation - * @param $name + * @param string $name * @return string */ public function getAsString($name) { - return $this->vobject->__isset($name) ? - $this->vobject->__get($name)->value : + return $this->vObject->__isset($name) ? + $this->vObject->__get($name)->value : ''; } /** * @todo Write documentation - * @param $name + * @param string $name * @return array */ public function getAsArray($name) { $values = array(); - if ($this->vobject->__isset($name)) { + if ($this->vObject->__isset($name)) { $values = explode(',', $this->getAsString($name)); $values = array_map('trim', $values); } @@ -200,14 +200,14 @@ class OC_VObject{ /** * @todo Write documentation - * @param $name + * @param string $name * @return array|OC_VObject|\Sabre\VObject\Property */ public function &__get($name) { if ($name == 'children') { - return $this->vobject->children; + return $this->vObject->children; } - $return = $this->vobject->__get($name); + $return = $this->vObject->__get($name); if ($return instanceof Sabre\VObject\Component) { $return = new OC_VObject($return); } @@ -220,7 +220,7 @@ class OC_VObject{ * @param string $value */ public function __set($name, $value) { - return $this->vobject->__set($name, $value); + return $this->vObject->__set($name, $value); } /** @@ -228,7 +228,7 @@ class OC_VObject{ * @param string $name */ public function __unset($name) { - return $this->vobject->__unset($name); + return $this->vObject->__unset($name); } /** @@ -237,16 +237,16 @@ class OC_VObject{ * @return bool */ public function __isset($name) { - return $this->vobject->__isset($name); + return $this->vObject->__isset($name); } /** * @todo Write documentation - * @param $function - * @param $arguments + * @param callable $function + * @param array $arguments * @return mixed */ public function __call($function, $arguments) { - return call_user_func_array(array($this->vobject, $function), $arguments); + return call_user_func_array(array($this->vObject, $function), $arguments); } } diff --git a/lib/public/app.php b/lib/public/app.php index 96162299ec4..bef4e96ae02 100644 --- a/lib/public/app.php +++ b/lib/public/app.php @@ -36,7 +36,7 @@ namespace OCP; class App { /** * Makes ownCloud aware of this app - * @param array with all information + * @param array $data with all information * @return boolean * * @deprecated This method is deprecated. Do not call it anymore. @@ -49,7 +49,7 @@ class App { /** * Adds an entry to the navigation - * @param array containing the data + * @param array $data containing the data * @return boolean * * This function adds a new entry to the navigation visible to users. $data @@ -70,7 +70,7 @@ class App { /** * Marks a navigation entry as active - * @param string id of the entry + * @param string $id id of the entry * @return boolean * * This function sets a navigation entry as active and removes the 'active' @@ -83,8 +83,8 @@ class App { /** * Register a Configuration Screen that should appear in the personal settings section. - * @param $app string appid - * @param $page string page to be included + * @param string $app appid + * @param string $page page to be included * @return void */ public static function registerPersonal( $app, $page ) { diff --git a/lib/public/appframework/apicontroller.php b/lib/public/appframework/apicontroller.php new file mode 100644 index 00000000000..5272f3ed529 --- /dev/null +++ b/lib/public/appframework/apicontroller.php @@ -0,0 +1,93 @@ +<?php +/** + * ownCloud - App Framework + * + * @author Bernhard Posselt + * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +/** + * Public interface of ownCloud for apps to use. + * AppFramework\Controller class + */ + +namespace OCP\AppFramework; + +use OCP\AppFramework\Http\Response; +use OCP\IRequest; + + +/** + * Base class to inherit your controllers from that are used for RESTful APIs + */ +abstract class ApiController extends Controller { + + private $corsMethods; + private $corsAllowedHeaders; + private $corsMaxAge; + + /** + * constructor of the controller + * @param string $appName the name of the app + * @param IRequest $request an instance of the request + * @param string $corsMethods: comma seperated string of HTTP verbs which + * should be allowed for websites or webapps when calling your API, defaults to + * 'PUT, POST, GET, DELETE, PATCH' + * @param string $corsAllowedHeaders: comma seperated string of HTTP headers + * which should be allowed for websites or webapps when calling your API, + * defaults to 'Authorization, Content-Type, Accept' + * @param int $corsMaxAge number in seconds how long a preflighted OPTIONS + * request should be cached, defaults to 1728000 seconds + */ + public function __construct($appName, + IRequest $request, + $corsMethods='PUT, POST, GET, DELETE, PATCH', + $corsAllowedHeaders='Authorization, Content-Type, Accept', + $corsMaxAge=1728000){ + parent::__construct($appName, $request); + $this->corsMethods = $corsMethods; + $this->corsAllowedHeaders = $corsAllowedHeaders; + $this->corsMaxAge = $corsMaxAge; + } + + + /** + * This method implements a preflighted cors response for you that you can + * link to for the options request + * + * @NoAdminRequired + * @NoCSRFRequired + * @PublicPage + */ + public function preflightedCors() { + if(isset($this->request->server['HTTP_ORIGIN'])) { + $origin = $this->request->server['HTTP_ORIGIN']; + } else { + $origin = '*'; + } + + $response = new Response(); + $response->addHeader('Access-Control-Allow-Origin', $origin); + $response->addHeader('Access-Control-Allow-Methods', $this->corsMethods); + $response->addHeader('Access-Control-Max-Age', $this->corsMaxAge); + $response->addHeader('Access-Control-Allow-Headers', $this->corsAllowedHeaders); + $response->addHeader('Access-Control-Allow-Credentials', 'false'); + return $response; + } + + +} diff --git a/lib/public/appframework/controller.php b/lib/public/appframework/controller.php index 758f0a80083..50b5ed3a80d 100644 --- a/lib/public/appframework/controller.php +++ b/lib/public/appframework/controller.php @@ -3,7 +3,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012, 2014 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -28,7 +28,8 @@ namespace OCP\AppFramework; use OCP\AppFramework\Http\TemplateResponse; -use OCP\AppFramework\IAppContainer; +use OCP\AppFramework\Http\JSONResponse; +use OCP\AppFramework\Http\IResponseSerializer; use OCP\IRequest; @@ -49,19 +50,86 @@ abstract class Controller { */ protected $request; + private $serializer; + private $responders; + /** * constructor of the controller * @param string $appName the name of the app * @param IRequest $request an instance of the request + * @param string $corsMethods: comma seperated string of HTTP verbs which + * should be allowed for websites or webapps when calling your API, defaults to + * 'PUT, POST, GET, DELETE, PATCH' + * @param string $corsAllowedHeaders: comma seperated string of HTTP headers + * which should be allowed for websites or webapps when calling your API, + * defaults to 'Authorization, Content-Type, Accept' + * @param int $corsMaxAge number in seconds how long a preflighted OPTIONS + * request should be cached, defaults to 1728000 seconds */ - public function __construct($appName, IRequest $request){ + public function __construct($appName, + IRequest $request){ $this->appName = $appName; $this->request = $request; + + // default responders + $this->responders = array( + 'json' => function ($response) { + return new JSONResponse($response); + } + ); + } + + + /** + * Registers a serializer that is executed before a formatter is being + * called, useful for turning any data into PHP arrays that can be used + * by a JSONResponse for instance + * @param IResponseSerializer $serializer + */ + protected function registerSerializer(IResponseSerializer $serializer) { + $this->serializer = $serializer; + } + + + /** + * Registers a formatter for a type + * @param string $format + * @param \Closure $responder + */ + protected function registerResponder($format, \Closure $responder) { + $this->responders[$format] = $responder; + } + + + /** + * Serializes and formats a response + * @param mixed $response the value that was returned from a controller and + * is not a Response instance + * @param string $format the format for which a formatter has been registered + * @throws \DomainException if format does not match a registered formatter + * @return Response + */ + public function buildResponse($response, $format='json') { + if(array_key_exists($format, $this->responders)) { + + if ($this->serializer) { + $response = $this->serializer->serialize($response); + } + + $responder = $this->responders[$format]; + + return $responder($response); + + } else { + throw new \DomainException('No responder registered for format ' . + $format . '!'); + } } /** * Lets you access post and get parameters by the index + * @deprecated write your parameters as method arguments instead * @param string $key the key which you want to access in the URL Parameter * placeholder, $_POST or $_GET array. * The priority how they're returned is the following: @@ -79,6 +147,7 @@ abstract class Controller { /** * Returns all params that were received, be it from the request * (as GET or POST) or throuh the URL by the route + * @deprecated use $this->request instead * @return array the array with all parameters */ public function getParams() { @@ -88,6 +157,7 @@ abstract class Controller { /** * Returns the method of the request + * @deprecated use $this->request instead * @return string the method of the request (POST, GET, etc) */ public function method() { @@ -97,6 +167,7 @@ abstract class Controller { /** * Shortcut for accessing an uploaded file through the $_FILES array + * @deprecated use $this->request instead * @param string $key the key that will be taken from the $_FILES array * @return array the file in the $_FILES element */ @@ -107,6 +178,7 @@ abstract class Controller { /** * Shortcut for getting env variables + * @deprecated use $this->request instead * @param string $key the key that will be taken from the $_ENV array * @return array the value in the $_ENV element */ @@ -117,6 +189,7 @@ abstract class Controller { /** * Shortcut for getting cookie variables + * @deprecated use $this->request instead * @param string $key the key that will be taken from the $_COOKIE array * @return array the value in the $_COOKIE element */ @@ -127,6 +200,7 @@ abstract class Controller { /** * Shortcut for rendering a template + * @deprecated return a template response instead * @param string $templateName the name of the template * @param array $params the template parameters in key => value structure * @param string $renderAs user renders a full page, blank only your template diff --git a/lib/public/appframework/db/doesnotexistexception.php b/lib/public/appframework/db/doesnotexistexception.php new file mode 100644 index 00000000000..5861e74f6c8 --- /dev/null +++ b/lib/public/appframework/db/doesnotexistexception.php @@ -0,0 +1,42 @@ +<?php + +/** + * ownCloud - App Framework + * + * @author Bernhard Posselt + * @copyright 2012 Bernhard Posselt dev@bernhard-posselt.com + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + + +namespace OCP\AppFramework\Db; + + +/** + * This is returned or should be returned when a find request does not find an + * entry in the database + */ +class DoesNotExistException extends \Exception { + + /** + * Constructor + * @param string $msg the error message + */ + public function __construct($msg){ + parent::__construct($msg); + } + +}
\ No newline at end of file diff --git a/lib/public/appframework/db/entity.php b/lib/public/appframework/db/entity.php new file mode 100644 index 00000000000..8ab42bd9153 --- /dev/null +++ b/lib/public/appframework/db/entity.php @@ -0,0 +1,236 @@ +<?php + +/** +* ownCloud - App Framework +* +* @author Bernhard Posselt +* @copyright 2012 Bernhard Posselt dev@bernhard-posselt.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Affero General Public +* License along with this library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +namespace OCP\AppFramework\Db; + + +/** + * @method integer getId() + * @method void setId(integer $id) + */ +abstract class Entity { + + public $id; + + private $_updatedFields = array(); + private $_fieldTypes = array('id' => 'integer'); + + + /** + * Simple alternative constructor for building entities from a request + * @param array $params the array which was obtained via $this->params('key') + * in the controller + * @return Entity + */ + public static function fromParams(array $params) { + $instance = new static(); + + foreach($params as $key => $value) { + $method = 'set' . ucfirst($key); + $instance->$method($value); + } + + return $instance; + } + + + /** + * Maps the keys of the row array to the attributes + * @param array $row the row to map onto the entity + */ + public static function fromRow(array $row){ + $instance = new static(); + + foreach($row as $key => $value){ + $prop = ucfirst($instance->columnToProperty($key)); + $setter = 'set' . $prop; + $instance->$setter($value); + } + + $instance->resetUpdatedFields(); + + return $instance; + } + + + /** + * @return an array with attribute and type + */ + public function getFieldTypes() { + return $this->_fieldTypes; + } + + + /** + * Marks the entity as clean needed for setting the id after the insertion + */ + public function resetUpdatedFields(){ + $this->_updatedFields = array(); + } + + + protected function setter($name, $args) { + // setters should only work for existing attributes + if(property_exists($this, $name)){ + if($this->$name === $args[0]) { + return; + } + $this->markFieldUpdated($name); + + // if type definition exists, cast to correct type + if($args[0] !== null && array_key_exists($name, $this->_fieldTypes)) { + settype($args[0], $this->_fieldTypes[$name]); + } + $this->$name = $args[0]; + + } else { + throw new \BadFunctionCallException($name . + ' is not a valid attribute'); + } + } + + + protected function getter($name) { + // getters should only work for existing attributes + if(property_exists($this, $name)){ + return $this->$name; + } else { + throw new \BadFunctionCallException($name . + ' is not a valid attribute'); + } + } + + + /** + * Each time a setter is called, push the part after set + * into an array: for instance setId will save Id in the + * updated fields array so it can be easily used to create the + * getter method + */ + public function __call($methodName, $args){ + $attr = lcfirst( substr($methodName, 3) ); + + if(strpos($methodName, 'set') === 0){ + $this->setter($attr, $args); + } elseif(strpos($methodName, 'get') === 0) { + return $this->getter($attr); + } else { + throw new \BadFunctionCallException($methodName . + ' does not exist'); + } + + } + + + /** + * Mark am attribute as updated + * @param string $attribute the name of the attribute + */ + protected function markFieldUpdated($attribute){ + $this->_updatedFields[$attribute] = true; + } + + + /** + * Transform a database columnname to a property + * @param string $columnName the name of the column + * @return string the property name + */ + public function columnToProperty($columnName){ + $parts = explode('_', $columnName); + $property = null; + + foreach($parts as $part){ + if($property === null){ + $property = $part; + } else { + $property .= ucfirst($part); + } + } + + return $property; + } + + + /** + * Transform a property to a database column name + * @param string $property the name of the property + * @return string the column name + */ + public function propertyToColumn($property){ + $parts = preg_split('/(?=[A-Z])/', $property); + $column = null; + + foreach($parts as $part){ + if($column === null){ + $column = $part; + } else { + $column .= '_' . lcfirst($part); + } + } + + return $column; + } + + + /** + * @return array array of updated fields for update query + */ + public function getUpdatedFields(){ + return $this->_updatedFields; + } + + + /** + * Adds type information for a field so that its automatically casted to + * that value once its being returned from the database + * @param string $fieldName the name of the attribute + * @param string $type the type which will be used to call settype() + */ + protected function addType($fieldName, $type){ + $this->_fieldTypes[$fieldName] = $type; + } + + + /** + * Slugify the value of a given attribute + * Warning: This doesn't result in a unique value + * @param string $attributeName the name of the attribute, which value should be slugified + * @return string slugified value + */ + public function slugify($attributeName){ + // toSlug should only work for existing attributes + if(property_exists($this, $attributeName)){ + $value = $this->$attributeName; + // replace everything except alphanumeric with a single '-' + $value = preg_replace('/[^A-Za-z0-9]+/', '-', $value); + $value = strtolower($value); + // trim '-' + return trim($value, '-'); + } else { + throw new \BadFunctionCallException($attributeName . + ' is not a valid attribute'); + } + } + +} diff --git a/lib/public/appframework/db/mapper.php b/lib/public/appframework/db/mapper.php new file mode 100644 index 00000000000..a23149e796b --- /dev/null +++ b/lib/public/appframework/db/mapper.php @@ -0,0 +1,291 @@ +<?php + +/** + * ownCloud - App Framework + * + * @author Bernhard Posselt + * @author Morris Jobke + * @copyright 2012 Bernhard Posselt dev@bernhard-posselt.com + * @copyright 2013 Morris Jobke morris.jobke@gmail.com + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + + +namespace OCP\AppFramework\Db; + +use \OCP\IDb; + + +/** + * Simple parent class for inheriting your data access layer from. This class + * may be subject to change in the future + */ +abstract class Mapper { + + protected $tableName; + protected $entityClass; + protected $db; + + /** + * @param IDb $db Instance of the Db abstraction layer + * @param string $tableName the name of the table. set this to allow entity + * @param string $entityClass the name of the entity that the sql should be + * mapped to queries without using sql + */ + public function __construct(IDb $db, $tableName, $entityClass=null){ + $this->db = $db; + $this->tableName = '*PREFIX*' . $tableName; + + // if not given set the entity name to the class without the mapper part + // cache it here for later use since reflection is slow + if($entityClass === null) { + $this->entityClass = str_replace('Mapper', '', get_class($this)); + } else { + $this->entityClass = $entityClass; + } + } + + + /** + * @return string the table name + */ + public function getTableName(){ + return $this->tableName; + } + + + /** + * Deletes an entity from the table + * @param Entity $entity the entity that should be deleted + */ + public function delete(Entity $entity){ + $sql = 'DELETE FROM `' . $this->tableName . '` WHERE `id` = ?'; + $this->execute($sql, array($entity->getId())); + } + + + /** + * Creates a new entry in the db from an entity + * @param Entity $entity the entity that should be created + * @return Entity the saved entity with the set id + */ + public function insert(Entity $entity){ + // get updated fields to save, fields have to be set using a setter to + // be saved + $properties = $entity->getUpdatedFields(); + $values = ''; + $columns = ''; + $params = array(); + + // build the fields + $i = 0; + foreach($properties as $property => $updated) { + $column = $entity->propertyToColumn($property); + $getter = 'get' . ucfirst($property); + + $columns .= '`' . $column . '`'; + $values .= '?'; + + // only append colon if there are more entries + if($i < count($properties)-1){ + $columns .= ','; + $values .= ','; + } + + array_push($params, $entity->$getter()); + $i++; + + } + + $sql = 'INSERT INTO `' . $this->tableName . '`(' . + $columns . ') VALUES(' . $values . ')'; + + $this->execute($sql, $params); + + $entity->setId((int) $this->db->getInsertId($this->tableName)); + return $entity; + } + + + + /** + * Updates an entry in the db from an entity + * @throws \InvalidArgumentException if entity has no id + * @param Entity $entity the entity that should be created + */ + public function update(Entity $entity){ + // if entity wasn't changed it makes no sense to run a db query + $properties = $entity->getUpdatedFields(); + if(count($properties) === 0) { + return $entity; + } + + // entity needs an id + $id = $entity->getId(); + if($id === null){ + throw new \InvalidArgumentException( + 'Entity which should be updated has no id'); + } + + // get updated fields to save, fields have to be set using a setter to + // be saved + // dont update the id field + unset($properties['id']); + + $columns = ''; + $params = array(); + + // build the fields + $i = 0; + foreach($properties as $property => $updated) { + + $column = $entity->propertyToColumn($property); + $getter = 'get' . ucfirst($property); + + $columns .= '`' . $column . '` = ?'; + + // only append colon if there are more entries + if($i < count($properties)-1){ + $columns .= ','; + } + + array_push($params, $entity->$getter()); + $i++; + } + + $sql = 'UPDATE `' . $this->tableName . '` SET ' . + $columns . ' WHERE `id` = ?'; + array_push($params, $id); + + $this->execute($sql, $params); + } + + + /** + * Runs an sql query + * @param string $sql the prepare string + * @param array $params the params which should replace the ? in the sql query + * @param int $limit the maximum number of rows + * @param int $offset from which row we want to start + * @return \PDOStatement the database query result + */ + protected function execute($sql, array $params=array(), $limit=null, $offset=null){ + $query = $this->db->prepareQuery($sql, $limit, $offset); + + $index = 1; // bindParam is 1 indexed + foreach($params as $param) { + + switch (gettype($param)) { + case 'integer': + $pdoConstant = \PDO::PARAM_INT; + break; + + case 'boolean': + $pdoConstant = \PDO::PARAM_BOOL; + break; + + default: + $pdoConstant = \PDO::PARAM_STR; + break; + } + + $query->bindValue($index, $param, $pdoConstant); + + $index++; + } + + return $query->execute(); + } + + + /** + * Returns an db result and throws exceptions when there are more or less + * results + * @see findEntity + * @param string $sql the sql query + * @param array $params the parameters of the sql query + * @param int $limit the maximum number of rows + * @param int $offset from which row we want to start + * @throws DoesNotExistException if the item does not exist + * @throws MultipleObjectsReturnedException if more than one item exist + * @return array the result as row + */ + protected function findOneQuery($sql, array $params=array(), $limit=null, $offset=null){ + $result = $this->execute($sql, $params, $limit, $offset); + $row = $result->fetch(); + + if($row === false || $row === null){ + throw new DoesNotExistException('No matching entry found'); + } + $row2 = $result->fetch(); + //MDB2 returns null, PDO and doctrine false when no row is available + if( ! ($row2 === false || $row2 === null )) { + throw new MultipleObjectsReturnedException('More than one result'); + } else { + return $row; + } + } + + + /** + * Creates an entity from a row. Automatically determines the entity class + * from the current mapper name (MyEntityMapper -> MyEntity) + * @param array $row the row which should be converted to an entity + * @return Entity the entity + */ + protected function mapRowToEntity($row) { + return call_user_func($this->entityClass .'::fromRow', $row); + } + + + /** + * Runs a sql query and returns an array of entities + * @param string $sql the prepare string + * @param array $params the params which should replace the ? in the sql query + * @param int $limit the maximum number of rows + * @param int $offset from which row we want to start + * @return array all fetched entities + */ + protected function findEntities($sql, array $params=array(), $limit=null, $offset=null) { + $result = $this->execute($sql, $params, $limit, $offset); + + $entities = array(); + + while($row = $result->fetch()){ + $entities[] = $this->mapRowToEntity($row); + } + + return $entities; + } + + + /** + * Returns an db result and throws exceptions when there are more or less + * results + * @param string $sql the sql query + * @param array $params the parameters of the sql query + * @param int $limit the maximum number of rows + * @param int $offset from which row we want to start + * @throws DoesNotExistException if the item does not exist + * @throws MultipleObjectsReturnedException if more than one item exist + * @return Entity the entity + */ + protected function findEntity($sql, array $params=array(), $limit=null, $offset=null){ + return $this->mapRowToEntity($this->findOneQuery($sql, $params, $limit, $offset)); + } + + +} diff --git a/lib/public/appframework/db/multipleobjectsreturnedexception.php b/lib/public/appframework/db/multipleobjectsreturnedexception.php new file mode 100644 index 00000000000..51d8d6bc7e1 --- /dev/null +++ b/lib/public/appframework/db/multipleobjectsreturnedexception.php @@ -0,0 +1,42 @@ +<?php + +/** + * ownCloud - App Framework + * + * @author Bernhard Posselt + * @copyright 2012 Bernhard Posselt dev@bernhard-posselt.com + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + + +namespace OCP\AppFramework\Db; + + +/** + * This is returned or should be returned when a find request finds more than one + * row + */ +class MultipleObjectsReturnedException extends \Exception { + + /** + * Constructor + * @param string $msg the error message + */ + public function __construct($msg){ + parent::__construct($msg); + } + +}
\ No newline at end of file diff --git a/lib/public/appframework/http.php b/lib/public/appframework/http.php index 60f314202cc..c6e2ff8846f 100644 --- a/lib/public/appframework/http.php +++ b/lib/public/appframework/http.php @@ -3,7 +3,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt, Thomas Tanghus, Bart Visscher - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE diff --git a/lib/public/appframework/http/downloadresponse.php b/lib/public/appframework/http/downloadresponse.php index d3c2818e828..6b61490341e 100644 --- a/lib/public/appframework/http/downloadresponse.php +++ b/lib/public/appframework/http/downloadresponse.php @@ -4,7 +4,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE diff --git a/lib/public/appframework/http/iresponseserializer.php b/lib/public/appframework/http/iresponseserializer.php new file mode 100644 index 00000000000..c16e106df34 --- /dev/null +++ b/lib/public/appframework/http/iresponseserializer.php @@ -0,0 +1,27 @@ +<?php +/** + * ownCloud - App Framework + * + * @author Bernhard Posselt + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\AppFramework\Http; + +interface IResponseSerializer { + function serialize($response); +}
\ No newline at end of file diff --git a/lib/public/appframework/http/jsonresponse.php b/lib/public/appframework/http/jsonresponse.php index 6d029b7464a..c6360e0a0f5 100644 --- a/lib/public/appframework/http/jsonresponse.php +++ b/lib/public/appframework/http/jsonresponse.php @@ -3,7 +3,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE diff --git a/lib/public/appframework/http/redirectresponse.php b/lib/public/appframework/http/redirectresponse.php index 416e1533635..a1b482c6b3b 100644 --- a/lib/public/appframework/http/redirectresponse.php +++ b/lib/public/appframework/http/redirectresponse.php @@ -4,7 +4,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE diff --git a/lib/public/appframework/http/response.php b/lib/public/appframework/http/response.php index 45402d9b3b3..20e936bb860 100644 --- a/lib/public/appframework/http/response.php +++ b/lib/public/appframework/http/response.php @@ -3,7 +3,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt, Thomas Tanghus, Bart Visscher - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -92,6 +92,10 @@ class Response { * @return Response Reference to this object */ public function addHeader($name, $value) { + $name = trim($name); // always remove leading and trailing whitespace + // to be able to reliably check for security + // headers + if(is_null($value)) { unset($this->headers[$name]); } else { diff --git a/lib/public/appframework/http/templateresponse.php b/lib/public/appframework/http/templateresponse.php index f5baf788ada..02589f4e2a4 100644 --- a/lib/public/appframework/http/templateresponse.php +++ b/lib/public/appframework/http/templateresponse.php @@ -3,7 +3,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -61,12 +61,16 @@ class TemplateResponse extends Response { * constructor of TemplateResponse * @param string $appName the name of the app to load the template from * @param string $templateName the name of the template + * @param array $params an array of parameters which should be passed to the + * template + * @param string $renderAs how the page should be rendered, defaults to user */ - public function __construct($appName, $templateName) { + public function __construct($appName, $templateName, array $params=array(), + $renderAs='user') { $this->templateName = $templateName; $this->appName = $appName; - $this->params = array(); - $this->renderAs = 'user'; + $this->params = $params; + $this->renderAs = $renderAs; } diff --git a/lib/public/appframework/iapi.php b/lib/public/appframework/iapi.php index c4aeea2d4e5..9af251be850 100644 --- a/lib/public/appframework/iapi.php +++ b/lib/public/appframework/iapi.php @@ -3,7 +3,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE diff --git a/lib/public/appframework/middleware.php b/lib/public/appframework/middleware.php index 24f31939935..2e1111e9d5d 100644 --- a/lib/public/appframework/middleware.php +++ b/lib/public/appframework/middleware.php @@ -3,7 +3,7 @@ * ownCloud - App Framework * * @author Bernhard Posselt - * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com + * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE diff --git a/lib/public/backgroundjob.php b/lib/public/backgroundjob.php index 03b94403b47..562228e1e52 100644 --- a/lib/public/backgroundjob.php +++ b/lib/public/backgroundjob.php @@ -94,7 +94,7 @@ class BackgroundJob { /** * @deprecated * gets all regular tasks - * @return associative array + * @return array * * key is string "$klass-$method", value is array( $klass, $method ) */ @@ -115,7 +115,7 @@ class BackgroundJob { * @deprecated * Gets one queued task * @param int $id ID of the task - * @return BackgroundJob\IJob array + * @return BackgroundJob\IJob|null */ public static function findQueuedTask($id) { $jobList = \OC::$server->getJobList(); @@ -125,7 +125,7 @@ class BackgroundJob { /** * @deprecated * Gets all queued tasks - * @return array with associative arrays + * @return array an array of associative arrays */ public static function allQueuedTasks() { $jobList = \OC::$server->getJobList(); @@ -145,7 +145,7 @@ class BackgroundJob { * @deprecated * Gets all queued tasks of a specific app * @param string $app app name - * @return array with associative arrays + * @return array an array of associative arrays */ public static function queuedTaskWhereAppIs($app) { $jobList = \OC::$server->getJobList(); diff --git a/lib/public/backgroundjob/ijoblist.php b/lib/public/backgroundjob/ijoblist.php index c9b546605b8..366b0e37368 100644 --- a/lib/public/backgroundjob/ijoblist.php +++ b/lib/public/backgroundjob/ijoblist.php @@ -12,7 +12,7 @@ interface IJobList { /** * Add a job to the list * - * @param \OCP\BackgroundJob\IJob |string $job + * @param \OCP\BackgroundJob\IJob|string $job * @param mixed $argument The argument to be passed to $job->run() when the job is exectured * @param string $job * @return void @@ -22,7 +22,7 @@ interface IJobList { /** * Remove a job from the list * - * @param IJob $job + * @param \OCP\BackgroundJob\IJob|string $job * @param mixed $argument * @return void */ @@ -31,7 +31,7 @@ interface IJobList { /** * check if a job is in the list * - * @param $job + * @param \OCP\BackgroundJob\IJob|string $job * @param mixed $argument * @return bool */ diff --git a/lib/public/contacts.php b/lib/public/contacts.php index 1b61d7aa4ff..fb88c13bd1b 100644 --- a/lib/public/contacts.php +++ b/lib/public/contacts.php @@ -87,7 +87,7 @@ namespace OCP { * @param string $pattern which should match within the $searchProperties * @param array $searchProperties defines the properties within the query pattern should match * @param array $options - for future use. One should always have options! - * @return array of contacts which are arrays of key-value-pairs + * @return array an array of contacts which are arrays of key-value-pairs */ public static function search($pattern, $searchProperties = array(), $options = array()) { $cm = \OC::$server->getContactsManager(); @@ -98,7 +98,7 @@ namespace OCP { * This function can be used to delete the contact identified by the given id * * @param object $id the unique identifier to a contact - * @param $address_book_key + * @param string $address_book_key * @return bool successful or not */ public static function delete($id, $address_book_key) { @@ -111,12 +111,12 @@ namespace OCP { * Otherwise the contact will be updated by replacing the entire data set. * * @param array $properties this array if key-value-pairs defines a contact - * @param $address_book_key string to identify the address book in which the contact shall be created or updated - * @return array representing the contact just created or updated + * @param string $address_book_key identifier of the address book in which the contact shall be created or updated + * @return array an array representing the contact just created or updated */ public static function createOrUpdate($properties, $address_book_key) { $cm = \OC::$server->getContactsManager(); - return $cm->search($properties, $address_book_key); + return $cm->createOrUpdate($properties, $address_book_key); } /** diff --git a/lib/public/contacts/imanager.php b/lib/public/contacts/imanager.php index 005b71f298b..32559220091 100644 --- a/lib/public/contacts/imanager.php +++ b/lib/public/contacts/imanager.php @@ -88,7 +88,7 @@ namespace OCP\Contacts { * @param string $pattern which should match within the $searchProperties * @param array $searchProperties defines the properties within the query pattern should match * @param array $options - for future use. One should always have options! - * @return array of contacts which are arrays of key-value-pairs + * @return array an array of contacts which are arrays of key-value-pairs */ function search($pattern, $searchProperties = array(), $options = array()); @@ -107,7 +107,7 @@ namespace OCP\Contacts { * * @param array $properties this array if key-value-pairs defines a contact * @param string $address_book_key identifier of the address book in which the contact shall be created or updated - * @return array representing the contact just created or updated + * @return array an array representing the contact just created or updated */ function createOrUpdate($properties, $address_book_key); diff --git a/lib/public/db.php b/lib/public/db.php index cb876b4d1f9..ba3a4724ce0 100644 --- a/lib/public/db.php +++ b/lib/public/db.php @@ -50,7 +50,7 @@ class DB { /** * Insert a row if a matching row doesn't exists. * @param string $table The optional table name (will replace *PREFIX*) and add sequence suffix - * @param $input array + * @param array $input * * The input array if in the form: * diff --git a/lib/public/files/fileinfo.php b/lib/public/files/fileinfo.php index 37162e09336..b9c8258f21e 100644 --- a/lib/public/files/fileinfo.php +++ b/lib/public/files/fileinfo.php @@ -104,7 +104,7 @@ interface FileInfo { /** * Check whether this is a file or a folder * - * @return \OCP\Files\FileInfo::TYPE_FILE | \OCP\Files\FileInfo::TYPE_FOLDER + * @return \OCP\Files\FileInfo::TYPE_FILE|\OCP\Files\FileInfo::TYPE_FOLDER */ public function getType(); @@ -135,4 +135,18 @@ interface FileInfo { * @return bool */ public function isShareable(); + + /** + * Check if a file or folder is shared + * + * @return bool + */ + public function isShared(); + + /** + * Check if a file or folder is mounted + * + * @return bool + */ + public function isMounted(); } diff --git a/lib/public/iaddressbook.php b/lib/public/iaddressbook.php index dcfe08012e6..70309e8c57a 100644 --- a/lib/public/iaddressbook.php +++ b/lib/public/iaddressbook.php @@ -45,7 +45,7 @@ namespace OCP { * @param string $pattern which should match within the $searchProperties * @param array $searchProperties defines the properties within the query pattern should match * @param array $options - for future use. One should always have options! - * @return array of contacts which are arrays of key-value-pairs + * @return array an array of contacts which are arrays of key-value-pairs */ public function search($pattern, $searchProperties, $options); // // dummy results @@ -56,7 +56,7 @@ namespace OCP { /** * @param array $properties this array if key-value-pairs defines a contact - * @return array representing the contact just created or updated + * @return array an array representing the contact just created or updated */ public function createOrUpdate($properties); // // dummy diff --git a/lib/public/iappconfig.php b/lib/public/iappconfig.php index 2b014df2e42..d43eb70ee04 100644 --- a/lib/public/iappconfig.php +++ b/lib/public/iappconfig.php @@ -13,7 +13,7 @@ namespace OCP; */ interface IAppConfig { /** - * @brief check if a key is set in the appconfig + * check if a key is set in the appconfig * @param string $app * @param string $key * @return bool @@ -21,7 +21,7 @@ interface IAppConfig { public function hasKey($app, $key); /** - * @brief Gets the config value + * Gets the config value * @param string $app app * @param string $key key * @param string $default = null, default value if the key does not exist @@ -33,7 +33,7 @@ interface IAppConfig { public function getValue($app, $key, $default = null); /** - * @brief Deletes a key + * Deletes a key * @param string $app app * @param string $key key * @return bool @@ -43,9 +43,9 @@ interface IAppConfig { public function deleteKey($app, $key); /** - * @brief Get the available keys for an app + * Get the available keys for an app * @param string $app the app we are looking for - * @return array with key names + * @return array an array of key names * * This function gets all keys of an app. Please note that the values are * not returned. @@ -62,7 +62,7 @@ interface IAppConfig { public function getValues($app, $key); /** - * @brief sets a value in the appconfig + * sets a value in the appconfig * @param string $app app * @param string $key key * @param string $value value @@ -73,8 +73,8 @@ interface IAppConfig { public function setValue($app, $key, $value); /** - * @brief Get all apps using the config - * @return array with app ids + * Get all apps using the config + * @return array an array of app ids * * This function returns a list of all apps that have at least one * entry in the appconfig table. @@ -82,7 +82,7 @@ interface IAppConfig { public function getApps(); /** - * @brief Remove app from appconfig + * Remove app from appconfig * @param string $app app * @return bool * diff --git a/lib/public/iavatar.php b/lib/public/iavatar.php index 43fa32556de..1e80682c4f7 100644 --- a/lib/public/iavatar.php +++ b/lib/public/iavatar.php @@ -14,14 +14,14 @@ namespace OCP; interface IAvatar { /** - * @brief get the users avatar - * @param $size integer size in px of the avatar, avatars are square, defaults to 64 + * get the users avatar + * @param int $size size in px of the avatar, avatars are square, defaults to 64 * @return boolean|\OC_Image containing the avatar or false if there's no image */ function get($size = 64); /** - * @brief sets the users avatar + * sets the users avatar * @param Image $data mixed imagedata or path to set a new avatar * @throws Exception if the provided file is not a jpg or png image * @throws Exception if the provided image is not valid @@ -31,7 +31,7 @@ interface IAvatar { function set($data); /** - * @brief remove the users avatar + * remove the users avatar * @return void */ function remove(); diff --git a/lib/public/iavatarmanager.php b/lib/public/iavatarmanager.php index 9b185ae0467..1fd89405983 100644 --- a/lib/public/iavatarmanager.php +++ b/lib/public/iavatarmanager.php @@ -14,9 +14,9 @@ namespace OCP; interface IAvatarManager { /** - * @brief return a user specific instance of \OCP\IAvatar + * return a user specific instance of \OCP\IAvatar * @see \OCP\IAvatar - * @param $user string the ownCloud user id + * @param string $user the ownCloud user id * @return \OCP\IAvatar */ function getAvatar($user); diff --git a/lib/public/idb.php b/lib/public/idb.php new file mode 100644 index 00000000000..82a8a681500 --- /dev/null +++ b/lib/public/idb.php @@ -0,0 +1,51 @@ +<?php + +/** + * ownCloud - App Framework + * + * @author Bernhard Posselt + * @copyright 2012 Bernhard Posselt dev@bernhard-posselt.com + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP; + + +/** + * Small Facade for being able to inject the database connection for tests + */ +interface IDb { + + + /** + * Used to abstract the owncloud database access away + * @param string $sql the sql query with ? placeholder for params + * @param int $limit the maximum number of rows + * @param int $offset from which row we want to start + * @return \OC_DB_StatementWrapper prepared SQL query + */ + public function prepareQuery($sql, $limit=null, $offset=null); + + + /** + * Used to get the id of the just inserted element + * @param string $tableName the name of the table where we inserted the item + * @return int the id of the inserted element + */ + public function getInsertId($tableName); + + +} diff --git a/lib/public/idbconnection.php b/lib/public/idbconnection.php index 656b5e7e5b2..3e6624e07e9 100644 --- a/lib/public/idbconnection.php +++ b/lib/public/idbconnection.php @@ -52,8 +52,8 @@ interface IDBConnection { /** * Insert a row if a matching row doesn't exists. - * @param string The table name (will replace *PREFIX*) to perform the replace on. - * @param array + * @param string $table The table name (will replace *PREFIX*) to perform the replace on. + * @param array $input * * The input array if in the form: * diff --git a/lib/public/il10n.php b/lib/public/il10n.php index 1388274c21a..2c95ddfec18 100644 --- a/lib/public/il10n.php +++ b/lib/public/il10n.php @@ -53,7 +53,7 @@ interface IL10N { * Localization * @param string $type Type of localization * @param array $data parameters for this localization - * @return String or false + * @return string|false * * Returns the localized data. * @@ -72,4 +72,18 @@ interface IL10N { * - params: timestamp (int/string) */ public function l($type, $data); + + + /** + * find the best language + * @param array|string $app details below + * @return string language + * + * If $app is an array, ownCloud assumes that these are the available + * languages. Otherwise ownCloud tries to find the files in the l10n + * folder. + * + * If nothing works it returns 'en' + */ + public function getLanguageCode($app=null); } diff --git a/lib/public/ilogger.php b/lib/public/ilogger.php new file mode 100644 index 00000000000..ad0fcd05a1d --- /dev/null +++ b/lib/public/ilogger.php @@ -0,0 +1,101 @@ +<?php +/** + * Copyright (c) 2014 Bernhard Posselt <dev@bernhard-posselt.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCP; + +/** + * Interface ILogger + * @package OCP + * + * This logger interface follows the design guidelines of PSR-3 + * https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md#3-psrlogloggerinterface + */ +interface ILogger { + /** + * System is unusable. + * + * @param string $message + * @param array $context + * @return null + */ + function emergency($message, array $context = array()); + + /** + * Action must be taken immediately. + * + * @param string $message + * @param array $context + * @return null + */ + function alert($message, array $context = array()); + + /** + * Critical conditions. + * + * @param string $message + * @param array $context + * @return null + */ + function critical($message, array $context = array()); + + /** + * Runtime errors that do not require immediate action but should typically + * be logged and monitored. + * + * @param string $message + * @param array $context + * @return null + */ + function error($message, array $context = array()); + + /** + * Exceptional occurrences that are not errors. + * + * @param string $message + * @param array $context + * @return null + */ + function warning($message, array $context = array()); + + /** + * Normal but significant events. + * + * @param string $message + * @param array $context + * @return null + */ + function notice($message, array $context = array()); + + /** + * Interesting events. + * + * @param string $message + * @param array $context + * @return null + */ + function info($message, array $context = array()); + + /** + * Detailed debug information. + * + * @param string $message + * @param array $context + * @return null + */ + function debug($message, array $context = array()); + + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string $message + * @param array $context + * @return mixed + */ + function log($level, $message, array $context = array()); +} diff --git a/lib/public/iservercontainer.php b/lib/public/iservercontainer.php index 600d81d83af..22176c36b8a 100644 --- a/lib/public/iservercontainer.php +++ b/lib/public/iservercontainer.php @@ -113,6 +113,14 @@ interface IServerContainer { */ function getConfig(); + + /** + * Returns an instance of the db facade + * @return \OCP\IDb + */ + function getDb(); + + /** * Returns the app config manager * diff --git a/lib/public/itags.php b/lib/public/itags.php index f8ebaa668f1..1cba07e9b53 100644 --- a/lib/public/itags.php +++ b/lib/public/itags.php @@ -62,7 +62,7 @@ interface ITags { * ['id' => 1, 'name' = 'Second tag'], * ] * - * @returns array + * @return array */ public function getTags(); diff --git a/lib/public/route/iroute.php b/lib/public/route/iroute.php index d5610e762a8..f511e7af720 100644 --- a/lib/public/route/iroute.php +++ b/lib/public/route/iroute.php @@ -26,7 +26,7 @@ interface IRoute { * The action to execute when this route matches, includes a file like * it is called directly * - * @param $file + * @param string $file * @return void */ public function actionInclude($file); diff --git a/lib/public/share.php b/lib/public/share.php index 230a517b5ee..8566a38c61e 100644 --- a/lib/public/share.php +++ b/lib/public/share.php @@ -41,11 +41,11 @@ class Share extends \OC\Share\Constants { /** * Register a sharing backend class that implements OCP\Share_Backend for an item type - * @param string Item type - * @param string Backend class - * @param string (optional) Depends on item type - * @param array (optional) List of supported file extensions if this item type depends on files - * @return Returns true if backend is registered or false if error + * @param string $itemType Item type + * @param string $class Backend class + * @param string $collectionOf (optional) Depends on item type + * @param array $supportedFileExtensions (optional) List of supported file extensions if this item type depends on files + * @return boolean true if backend is registered or false if error */ public static function registerBackend($itemType, $class, $collectionOf = null, $supportedFileExtensions = null) { return \OC\Share\Share::registerBackend($itemType, $class, $collectionOf, $supportedFileExtensions); @@ -53,7 +53,7 @@ class Share extends \OC\Share\Constants { /** * Check if the Share API is enabled - * @return Returns true if enabled or false + * @return boolean true if enabled or false * * The Share API is enabled by default if not configured */ @@ -77,12 +77,12 @@ class Share extends \OC\Share\Constants { /** * Get the items of item type shared with the current user - * @param string Item type - * @param int Format (optional) Format type must be defined by the backend - * @param mixed Parameters (optional) - * @param int Number of items to return (optional) Returns all by default - * @param bool include collections (optional) - * @return Return depends on format + * @param string $itemType + * @param int $format (optional) Format type must be defined by the backend + * @param mixed $parameters (optional) + * @param int $limit Number of items to return (optional) Returns all by default + * @param bool $includeCollections (optional) + * @return mixed Return depends on format */ public static function getItemsSharedWith($itemType, $format = self::FORMAT_NONE, $parameters = null, $limit = -1, $includeCollections = false) { @@ -92,13 +92,13 @@ class Share extends \OC\Share\Constants { /** * Get the items of item type shared with a user - * @param string Item type - * @param sting user id for which user we want the shares - * @param int Format (optional) Format type must be defined by the backend - * @param mixed Parameters (optional) - * @param int Number of items to return (optional) Returns all by default - * @param bool include collections (optional) - * @return Return depends on format + * @param string $itemType + * @param string $user for which user we want the shares + * @param int $format (optional) Format type must be defined by the backend + * @param mixed $parameters (optional) + * @param int $limit Number of items to return (optional) Returns all by default + * @param bool $includeCollections (optional) + * @return mixed Return depends on format */ public static function getItemsSharedWithUser($itemType, $user, $format = self::FORMAT_NONE, $parameters = null, $limit = -1, $includeCollections = false) { @@ -111,9 +111,9 @@ class Share extends \OC\Share\Constants { * @param string $itemType * @param string $itemTarget * @param int $format (optional) Format type must be defined by the backend - * @param mixed Parameters (optional) - * @param bool include collections (optional) - * @return Return depends on format + * @param mixed $parameters (optional) + * @param bool $includeCollections (optional) + * @return mixed Return depends on format */ public static function getItemSharedWith($itemType, $itemTarget, $format = self::FORMAT_NONE, $parameters = null, $includeCollections = false) { @@ -134,12 +134,12 @@ class Share extends \OC\Share\Constants { /** * Get the item of item type shared with the current user by source - * @param string Item type - * @param string Item source - * @param int Format (optional) Format type must be defined by the backend - * @param mixed Parameters - * @param bool include collections - * @return Return depends on format + * @param string $itemType + * @param string $itemSource + * @param int $format (optional) Format type must be defined by the backend + * @param mixed $parameters + * @param bool $includeCollections + * @return mixed Return depends on format */ public static function getItemSharedWithBySource($itemType, $itemSource, $format = self::FORMAT_NONE, $parameters = null, $includeCollections = false) { @@ -148,9 +148,9 @@ class Share extends \OC\Share\Constants { /** * Get the item of item type shared by a link - * @param string Item type - * @param string Item source - * @param string Owner of link + * @param string $itemType + * @param string $itemSource + * @param string $uidOwner Owner of link * @return Item */ public static function getItemSharedWithByLink($itemType, $itemSource, $uidOwner) { @@ -160,7 +160,7 @@ class Share extends \OC\Share\Constants { /** * Based on the given token the share information will be returned - password protected shares will be verified * @param string $token - * @return array | bool false will be returned in case the token is unknown or unauthorized + * @return array|bool false will be returned in case the token is unknown or unauthorized */ public static function getShareByToken($token, $checkPasswordProtection = true) { return \OC\Share\Share::getShareByToken($token, $checkPasswordProtection); @@ -168,8 +168,8 @@ class Share extends \OC\Share\Constants { /** * resolves reshares down to the last real share - * @param $linkItem - * @return $fileOwner + * @param array $linkItem + * @return array file owner */ public static function resolveReShare($linkItem) { return \OC\Share\Share::resolveReShare($linkItem); @@ -178,12 +178,12 @@ class Share extends \OC\Share\Constants { /** * Get the shared items of item type owned by the current user - * @param string Item type - * @param int Format (optional) Format type must be defined by the backend - * @param mixed Parameters - * @param int Number of items to return (optional) Returns all by default - * @param bool include collections - * @return Return depends on format + * @param string $itemType + * @param int $format (optional) Format type must be defined by the backend + * @param mixed $parameters + * @param int $limit Number of items to return (optional) Returns all by default + * @param bool $includeCollections + * @return mixed Return depends on format */ public static function getItemsShared($itemType, $format = self::FORMAT_NONE, $parameters = null, $limit = -1, $includeCollections = false) { @@ -193,12 +193,12 @@ class Share extends \OC\Share\Constants { /** * Get the shared item of item type owned by the current user - * @param string Item type - * @param string Item source - * @param int Format (optional) Format type must be defined by the backend - * @param mixed Parameters - * @param bool include collections - * @return Return depends on format + * @param string $itemType + * @param string $itemSource + * @param int $format (optional) Format type must be defined by the backend + * @param mixed $parameters + * @param bool $includeCollections + * @return mixed Return depends on format */ public static function getItemShared($itemType, $itemSource, $format = self::FORMAT_NONE, $parameters = null, $includeCollections = false) { @@ -208,12 +208,12 @@ class Share extends \OC\Share\Constants { /** * Get all users an item is shared with - * @param string Item type - * @param string Item source - * @param string Owner - * @param bool Include collections - * @praram bool check expire date - * @return Return array of users + * @param string $itemType + * @param string $itemSource + * @param string $uidOwner + * @param bool $includeCollections + * @param bool $checkExpireDate + * @return array Return array of users */ public static function getUsersItemShared($itemType, $itemSource, $uidOwner, $includeCollections = false, $checkExpireDate = true) { return \OC\Share\Share::getUsersItemShared($itemType, $itemSource, $uidOwner, $includeCollections, $checkExpireDate); @@ -226,26 +226,22 @@ class Share extends \OC\Share\Constants { * @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK * @param string $shareWith User or group the item is being shared with * @param int $permissions CRUDS - * @param null $itemSourceName - * @throws \Exception - * @internal param \OCP\Item $string type - * @internal param \OCP\Item $string source - * @internal param \OCP\SHARE_TYPE_USER $int , SHARE_TYPE_GROUP, or SHARE_TYPE_LINK - * @internal param \OCP\User $string or group the item is being shared with - * @internal param \OCP\CRUDS $int permissions + * @param string $itemSourceName + * @param \DateTime $expirationDate * @return bool|string Returns true on success or false on failure, Returns token on success for links + * @throws \Exception */ - public static function shareItem($itemType, $itemSource, $shareType, $shareWith, $permissions, $itemSourceName = null) { - return \OC\Share\Share::shareItem($itemType, $itemSource, $shareType, $shareWith, $permissions, $itemSourceName); + public static function shareItem($itemType, $itemSource, $shareType, $shareWith, $permissions, $itemSourceName = null, \DateTime $expirationDate = null) { + return \OC\Share\Share::shareItem($itemType, $itemSource, $shareType, $shareWith, $permissions, $itemSourceName, $expirationDate); } /** * Unshare an item from a user, group, or delete a private link - * @param string Item type - * @param string Item source - * @param int SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK - * @param string User or group the item is being shared with - * @return Returns true on success or false on failure + * @param string $itemType + * @param string $itemSource + * @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK + * @param string $shareWith User or group the item is being shared with + * @return boolean true on success or false on failure */ public static function unshare($itemType, $itemSource, $shareType, $shareWith) { return \OC\Share\Share::unshare($itemType, $itemSource, $shareType, $shareWith); @@ -253,9 +249,9 @@ class Share extends \OC\Share\Constants { /** * Unshare an item from all users, groups, and remove all links - * @param string Item type - * @param string Item source - * @return Returns true on success or false on failure + * @param string $itemType + * @param string $itemSource + * @return boolean true on success or false on failure */ public static function unshareAll($itemType, $itemSource) { return \OC\Share\Share::unshareAll($itemType, $itemSource); @@ -263,15 +259,16 @@ class Share extends \OC\Share\Constants { /** * Unshare an item shared with the current user - * @param string Item type - * @param string Item target - * @return Returns true on success or false on failure + * @param string $itemType + * @param string $itemTarget + * @return boolean true on success or false on failure * * Unsharing from self is not allowed for items inside collections */ public static function unshareFromSelf($itemType, $itemTarget) { return \OC\Share\Share::unshareFromSelf($itemType, $itemTarget); } + /** * sent status if users got informed by mail about share * @param string $itemType @@ -285,12 +282,12 @@ class Share extends \OC\Share\Constants { /** * Set the permissions of an item for a specific user or group - * @param string Item type - * @param string Item source - * @param int SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK - * @param string User or group the item is being shared with - * @param int CRUDS permissions - * @return Returns true on success or false on failure + * @param string $itemType + * @param string $itemSource + * @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK + * @param string $shareWith User or group the item is being shared with + * @param int $permissions CRUDS permissions + * @return boolean true on success or false on failure */ public static function setPermissions($itemType, $itemSource, $shareType, $shareWith, $permissions) { return \OC\Share\Share::setPermissions($itemType, $itemSource, $shareType, $shareWith, $permissions); @@ -301,7 +298,7 @@ class Share extends \OC\Share\Constants { * @param string $itemType * @param string $itemSource * @param string $date expiration date - * @return Share_Backend + * @return boolean */ public static function setExpirationDate($itemType, $itemSource, $date) { return \OC\Share\Share::setExpirationDate($itemType, $itemSource, $date); @@ -340,23 +337,20 @@ class Share extends \OC\Share\Constants { interface Share_Backend { /** - * Get the source of the item to be stored in the database - * @param string Item source - * @param string Owner of the item - * @return mixed|array|false Source + * Check if this $itemSource exist for the user + * @param string $itemSource + * @param string $uidOwner Owner of the item + * @return boolean|null Source * - * Return an array if the item is file dependent, the array needs two keys: 'item' and 'file' * Return false if the item does not exist for the user - * - * The formatItems() function will translate the source returned back into the item */ public function isValidSource($itemSource, $uidOwner); /** * Get a unique name of the item for the specified user - * @param string Item source - * @param string|false User the item is being shared with - * @param array|null List of similar item names already existing as shared items + * @param string $itemSource + * @param string|false $shareWith User the item is being shared with + * @param array|null $exclude List of similar item names already existing as shared items * @return string Target name * * This function needs to verify that the user does not already have an item with this name. @@ -366,8 +360,8 @@ interface Share_Backend { /** * Converts the shared item sources back into the item in the specified format - * @param array Shared items - * @param int Format + * @param array $items Shared items + * @param int $format * @return TODO * * The items array is a 3-dimensional array with the item_source as the @@ -397,8 +391,9 @@ interface Share_Backend_File_Dependent extends Share_Backend { /** * Get the file path of the item - * @param string Item source - * @param string User that is the owner of shared item + * @param string $itemSource + * @param string $uidOwner User that is the owner of shared item + * @return string|false */ public function getFilePath($itemSource, $uidOwner); @@ -412,7 +407,7 @@ interface Share_Backend_Collection extends Share_Backend { /** * Get the sources of the children of the item - * @param string Item source + * @param string $itemSource * @return array Returns an array of children each inside an array with the keys: source, target, and file_path if applicable */ public function getChildren($itemSource); diff --git a/lib/public/template.php b/lib/public/template.php index 6cc984b12d5..b1264e0c3ad 100644 --- a/lib/public/template.php +++ b/lib/public/template.php @@ -33,8 +33,8 @@ namespace OCP; /** * Make OC_Helper::imagePath available as a simple function - * @param string app - * @param string image + * @param string $app + * @param string $image * @return string to the image * * @see OC_Helper::imagePath @@ -46,7 +46,7 @@ function image_path( $app, $image ) { /** * Make OC_Helper::mimetypeIcon available as a simple function - * @param string mimetype + * @param string $mimetype * @return string to the image of this file type. */ function mimetype_icon( $mimetype ) { @@ -55,7 +55,7 @@ function mimetype_icon( $mimetype ) { /** * Make preview_icon available as a simple function - * @param string path of file + * @param string $path path to file * @return string to the preview of the image */ function preview_icon( $path ) { @@ -76,7 +76,7 @@ function publicPreview_icon ( $path, $token ) { /** * Make OC_Helper::humanFileSize available as a simple function * Example: 2048 to 2 kB. - * @param int size in bytes + * @param int $size in bytes * @return string size as string */ function human_file_size( $bytes ) { @@ -86,8 +86,8 @@ function human_file_size( $bytes ) { /** * Return the relative date in relation to today. Returns something like "last hour" or "two month ago" - * @param int unix timestamp - * @param boolean date only + * @param int $timestamp unix timestamp + * @param boolean $dateOnly * @return OC_L10N_String human readable interpretation of the timestamp */ function relative_modified_date( $timestamp, $dateOnly = false ) { @@ -98,7 +98,7 @@ function relative_modified_date( $timestamp, $dateOnly = false ) { /** * Return a human readable outout for a file size. * @deprecated human_file_size() instead - * @param integer size of a file in byte + * @param integer $bytes size of a file in byte * @return string human readable interpretation of a file size */ function simple_file_size($bytes) { @@ -108,9 +108,9 @@ function simple_file_size($bytes) { /** * Generate html code for an options block. - * @param $options the options - * @param $selected which one is selected? - * @param array the parameters + * @param array $options the options + * @param mixed $selected which one is selected? + * @param array $params the parameters * @return string html options */ function html_select_options($options, $selected, $params=array()) { diff --git a/lib/public/user.php b/lib/public/user.php index 7bac938b838..925410d37d5 100644 --- a/lib/public/user.php +++ b/lib/public/user.php @@ -45,10 +45,10 @@ class User { /** * Get a list of all users - * @param string search pattern - * @param integer $limit - * @param integer $offset - * @return array with all uids + * @param string $search search pattern + * @param int|null $limit + * @param int|null $offset + * @return array an array of all uids */ public static function getUsers( $search = '', $limit = null, $offset = null ) { return \OC_User::getUsers( $search, $limit, $offset ); @@ -56,7 +56,7 @@ class User { /** * Get the user display name of the user currently logged in. - * @param string user id or null for current user + * @param string|null $user user id or null for current user * @return string display name */ public static function getDisplayName( $user = null ) { @@ -65,10 +65,10 @@ class User { /** * Get a list of all display names and user ids. - * @param string search pattern - * @param int limit - * @param int offset - * @return array with all display names (value) and the correspondig uids (key) + * @param string $search search pattern + * @param int|null $limit + * @param int|null $offset + * @return array an array of all display names (value) and the correspondig uids (key) */ public static function getDisplayNames( $search = '', $limit = null, $offset = null ) { return \OC_User::getDisplayNames( $search, $limit, $offset ); diff --git a/lib/public/util.php b/lib/public/util.php index f06ddd66641..3166d4040d8 100644 --- a/lib/public/util.php +++ b/lib/public/util.php @@ -86,21 +86,22 @@ class Util { * if DEBUG mode is enabled * @param string $app app name * @param \Exception $ex exception to log + * @param string $level log level, defaults to \OCP\Util::FATAL */ - public static function logException( $app, \Exception $ex ) { + public static function logException( $app, \Exception $ex, $level = \OCP\Util::FATAL ) { $class = get_class($ex); $message = $class . ': ' . $ex->getMessage(); if ($ex->getCode()) { $message .= ' [' . $ex->getCode() . ']'; } - \OCP\Util::writeLog($app, $message, \OCP\Util::FATAL); + \OCP\Util::writeLog($app, $message, $level); if (defined('DEBUG') and DEBUG) { // also log stack trace $stack = explode("\n", $ex->getTraceAsString()); // first element is empty array_shift($stack); foreach ($stack as $s) { - \OCP\Util::writeLog($app, 'Exception: ' . $s, \OCP\Util::FATAL); + \OCP\Util::writeLog($app, 'Exception: ' . $s, $level); } // include cause @@ -110,7 +111,7 @@ class Util { if ($ex->getCode()) { $message .= '[' . $ex->getCode() . '] '; } - \OCP\Util::writeLog($app, 'Exception: ' . $message, \OCP\Util::FATAL); + \OCP\Util::writeLog($app, 'Exception: ' . $message, $level); } } } @@ -202,7 +203,7 @@ class Util { /** * Creates an url using a defined route - * @param $route + * @param string $route * @param array $parameters * @internal param array $args with param=>value, will be appended to the returned url * @return string the url @@ -292,7 +293,7 @@ class Util { /** * Returns the script name, even if the website uses one or more reverse proxies - * @returns string the script name + * @return string the script name */ public static function getScriptName() { return(\OC_Request::scriptName()); @@ -379,8 +380,8 @@ class Util { * This function is used to sanitize HTML and should be applied on any * string or array of strings before displaying it on a web page. * - * @param string|array of strings - * @return array with sanitized strings or a single sinitized string, depends on the input parameter. + * @param string|array $value + * @return string|array an array of sanitized strings or a single sinitized string, depends on the input parameter. */ public static function sanitizeHTML( $value ) { return(\OC_Util::sanitizeHTML($value)); @@ -457,7 +458,7 @@ class Util { * * @param string $dir the current folder where the user currently operates * @param int $free the number of bytes free on the storage holding $dir, if not set this will be received from the storage directly - * @return number of bytes representing + * @return int number of bytes representing */ public static function maxUploadFilesize($dir, $free = null) { return \OC_Helper::maxUploadFilesize($dir, $free); @@ -475,7 +476,7 @@ class Util { /** * Calculate PHP upload limit * - * @return number of bytes representing + * @return int number of bytes representing */ public static function uploadLimit() { return \OC_Helper::uploadLimit(); @@ -483,7 +484,7 @@ class Util { /** * Returns whether the given file name is valid - * @param $file string file name to check + * @param string $file file name to check * @return bool true if the file name is valid, false otherwise */ public static function isValidFileName($file) { @@ -491,11 +492,19 @@ class Util { } /** - * @brief Generates a cryptographic secure pseudo-random string - * @param Int $length of the random string - * @return String + * Generates a cryptographic secure pseudo-random string + * @param int $length of the random string + * @return string */ public static function generateRandomBytes($length = 30) { return \OC_Util::generateRandomBytes($length); } + + /** + * check if a password is required for each public link + * @return boolean + */ + public static function isPublicLinkPasswordRequired() { + return \OC_Util::isPublicLinkPasswordRequired(); + } } |