diff options
34 files changed, 200 insertions, 39 deletions
diff --git a/apps/files/l10n/fa.js b/apps/files/l10n/fa.js index 1dc459ab584..b053d4af79b 100644 --- a/apps/files/l10n/fa.js +++ b/apps/files/l10n/fa.js @@ -94,6 +94,9 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s مورد %1$s را حذف کرد", "You restored %1$s" : "شما %1$s را بازگردانی کردید", "%2$s restored %1$s" : "%2$s %1$s را بازگردانی کرد", + "Changed by %2$s" : "تغییریافته توسط %2$s", + "Deleted by %2$s" : "حذف شده توسط %2$s", + "Restored by %2$s" : "بازگردانی شده توسط %2$s", "%s could not be renamed as it has been deleted" : "امکان تغییر نام %s با توجه به حذف شدن آن وجود ندارد", "%s could not be renamed" : "%s نمیتواند تغییر نام دهد.", "Upload (max. %s)" : "آپلود (بیشترین سایز %s)", diff --git a/apps/files/l10n/fa.json b/apps/files/l10n/fa.json index 4ea1170c288..0f745e7f243 100644 --- a/apps/files/l10n/fa.json +++ b/apps/files/l10n/fa.json @@ -92,6 +92,9 @@ "%2$s deleted %1$s" : "%2$s مورد %1$s را حذف کرد", "You restored %1$s" : "شما %1$s را بازگردانی کردید", "%2$s restored %1$s" : "%2$s %1$s را بازگردانی کرد", + "Changed by %2$s" : "تغییریافته توسط %2$s", + "Deleted by %2$s" : "حذف شده توسط %2$s", + "Restored by %2$s" : "بازگردانی شده توسط %2$s", "%s could not be renamed as it has been deleted" : "امکان تغییر نام %s با توجه به حذف شدن آن وجود ندارد", "%s could not be renamed" : "%s نمیتواند تغییر نام دهد.", "Upload (max. %s)" : "آپلود (بیشترین سایز %s)", diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js index 665d185cd2d..650401d6fa3 100644 --- a/apps/files/l10n/fr.js +++ b/apps/files/l10n/fr.js @@ -96,6 +96,9 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s a supprimé %1$s", "You restored %1$s" : "Vous avez restauré %1$s", "%2$s restored %1$s" : "%2$s a restauré %1$s", + "Changed by %2$s" : "Modifié par %2$s", + "Deleted by %2$s" : "Supprimé par %2$s", + "Restored by %2$s" : "Restauré par %2$s", "%s could not be renamed as it has been deleted" : "%s ne peut être renommé car il a été supprimé ", "%s could not be renamed" : "%s ne peut être renommé", "Upload (max. %s)" : "Envoi (max. %s)", diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json index 02601ee9d9b..5f28b9d12e7 100644 --- a/apps/files/l10n/fr.json +++ b/apps/files/l10n/fr.json @@ -94,6 +94,9 @@ "%2$s deleted %1$s" : "%2$s a supprimé %1$s", "You restored %1$s" : "Vous avez restauré %1$s", "%2$s restored %1$s" : "%2$s a restauré %1$s", + "Changed by %2$s" : "Modifié par %2$s", + "Deleted by %2$s" : "Supprimé par %2$s", + "Restored by %2$s" : "Restauré par %2$s", "%s could not be renamed as it has been deleted" : "%s ne peut être renommé car il a été supprimé ", "%s could not be renamed" : "%s ne peut être renommé", "Upload (max. %s)" : "Envoi (max. %s)", diff --git a/apps/files_external/l10n/fr.js b/apps/files_external/l10n/fr.js index f183bfeef57..c5ceea05566 100644 --- a/apps/files_external/l10n/fr.js +++ b/apps/files_external/l10n/fr.js @@ -12,6 +12,8 @@ OC.L10N.register( "Invalid mount point" : "Point de montage non valide", "Objectstore forbidden" : "\"Objectstore\" interdit", "Invalid storage backend \"%s\"" : "Service de stockage non valide : \"%s\"", + "Not permitted to use backend \"%s\"" : "Non autorisé à utiliser backend \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "Non autorisé à utiliser le mécanisme d'authentification \"%s\"", "Unsatisfied backend parameters" : "Paramètres manquants pour le service", "Unsatisfied authentication mechanism parameters" : "Paramètres manquants pour la méthode d'authentification", "Personal" : "Personnel", @@ -77,6 +79,7 @@ OC.L10N.register( "SMB / CIFS using OC login" : "SMB / CIFS en utilisant les identifiants OC", "Username as share" : "Nom d'utilisateur comme nom de partage", "OpenStack Object Storage" : "OpenStack Object Storage", + "Service name" : "Nom du service", "<b>Note:</b> " : "<b>Attention :</b>", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention :</b> La prise en charge de cURL par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention : </b> La prise en charge du FTP par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", diff --git a/apps/files_external/l10n/fr.json b/apps/files_external/l10n/fr.json index ed5c397f302..3eab0afee30 100644 --- a/apps/files_external/l10n/fr.json +++ b/apps/files_external/l10n/fr.json @@ -10,6 +10,8 @@ "Invalid mount point" : "Point de montage non valide", "Objectstore forbidden" : "\"Objectstore\" interdit", "Invalid storage backend \"%s\"" : "Service de stockage non valide : \"%s\"", + "Not permitted to use backend \"%s\"" : "Non autorisé à utiliser backend \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "Non autorisé à utiliser le mécanisme d'authentification \"%s\"", "Unsatisfied backend parameters" : "Paramètres manquants pour le service", "Unsatisfied authentication mechanism parameters" : "Paramètres manquants pour la méthode d'authentification", "Personal" : "Personnel", @@ -75,6 +77,7 @@ "SMB / CIFS using OC login" : "SMB / CIFS en utilisant les identifiants OC", "Username as share" : "Nom d'utilisateur comme nom de partage", "OpenStack Object Storage" : "OpenStack Object Storage", + "Service name" : "Nom du service", "<b>Note:</b> " : "<b>Attention :</b>", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention :</b> La prise en charge de cURL par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention : </b> La prise en charge du FTP par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", diff --git a/apps/files_sharing/l10n/fr.js b/apps/files_sharing/l10n/fr.js index 382bc1e69e5..f0c7d6c331c 100644 --- a/apps/files_sharing/l10n/fr.js +++ b/apps/files_sharing/l10n/fr.js @@ -42,6 +42,8 @@ OC.L10N.register( "%2$s shared %1$s with group %3$s" : "%2$s partagé %1$s avec le groupe %3$s", "%2$s shared %1$s with you" : "%2$s a partagé %1$s avec vous", "You shared %1$s via link" : "Vous avez partagé %1$s par lien public", + "Downloaded via public link" : "Téléchargé via un lien publique", + "Shared via public link" : "Partagé via un lien publique", "Shares" : "Partages", "You received %2$s as a remote share from %1$s" : "Vous avez reçu %2$s en tant que partage distant par %1$s", "Accept" : "Accepter", diff --git a/apps/files_sharing/l10n/fr.json b/apps/files_sharing/l10n/fr.json index 7766b016f3b..524eb382568 100644 --- a/apps/files_sharing/l10n/fr.json +++ b/apps/files_sharing/l10n/fr.json @@ -40,6 +40,8 @@ "%2$s shared %1$s with group %3$s" : "%2$s partagé %1$s avec le groupe %3$s", "%2$s shared %1$s with you" : "%2$s a partagé %1$s avec vous", "You shared %1$s via link" : "Vous avez partagé %1$s par lien public", + "Downloaded via public link" : "Téléchargé via un lien publique", + "Shared via public link" : "Partagé via un lien publique", "Shares" : "Partages", "You received %2$s as a remote share from %1$s" : "Vous avez reçu %2$s en tant que partage distant par %1$s", "Accept" : "Accepter", diff --git a/apps/files_sharing/lib/controllers/sharecontroller.php b/apps/files_sharing/lib/controllers/sharecontroller.php index 28feb3110b4..616b64e6c59 100644 --- a/apps/files_sharing/lib/controllers/sharecontroller.php +++ b/apps/files_sharing/lib/controllers/sharecontroller.php @@ -233,9 +233,10 @@ class ShareController extends Controller { * @param string $token * @param string $files * @param string $path + * @param string $downloadStartSecret * @return void|RedirectResponse */ - public function downloadShare($token, $files = null, $path = '') { + public function downloadShare($token, $files = null, $path = '', $downloadStartSecret = '') { \OC_User::setIncognitoMode(true); $linkItem = OCP\Share::getShareByToken($token, false); @@ -288,6 +289,19 @@ class ShareController extends Controller { } } + /** + * this sets a cookie to be able to recognize the start of the download + * the content must not be longer than 32 characters and must only contain + * alphanumeric characters + */ + if (!empty($downloadStartSecret) + && !isset($downloadStartSecret[32]) + && preg_match('!^[a-zA-Z0-9]+$!', $downloadStartSecret) === 1) { + + // FIXME: set on the response once we use an actual app framework response + setcookie('ocDownloadStarted', $downloadStartSecret, time() + 20, '/'); + } + // download selected files if (!is_null($files)) { // FIXME: The exit is required here because otherwise the AppFramework is trying to add headers as well diff --git a/apps/user_ldap/l10n/fa.js b/apps/user_ldap/l10n/fa.js index 4e3e924d88d..082f297f98f 100644 --- a/apps/user_ldap/l10n/fa.js +++ b/apps/user_ldap/l10n/fa.js @@ -45,6 +45,7 @@ OC.L10N.register( "For anonymous access, leave DN and Password empty." : "برای دسترسی ناشناس، DN را رها نموده و رمزعبور را خالی بگذارید.", "One Base DN per line" : "یک پایه DN در هر خط", "You can specify Base DN for users and groups in the Advanced tab" : "شما می توانید پایه DN را برای کاربران و گروه ها در زبانه Advanced مشخص کنید.", + "Test Base DN" : "تست DN پایه", "Saving" : "درحال ذخیره", "Back" : "بازگشت", "Continue" : "ادامه", @@ -58,6 +59,7 @@ OC.L10N.register( "Backup (Replica) Port" : "پشتیبان گیری (بدل) پورت", "Disable Main Server" : "غیر فعال کردن سرور اصلی", "Turn off SSL certificate validation." : "غیرفعال کردن اعتبار گواهی نامه SSL .", + "Cache Time-To-Live" : "مدت زمان کش", "Directory Settings" : "تنظیمات پوشه", "User Display Name Field" : "فیلد نام کاربر", "Base User Tree" : "کاربر درخت پایه", @@ -69,6 +71,7 @@ OC.L10N.register( "One Group Base DN per line" : "یک گروه پایه DN در هر خط", "Group Search Attributes" : "گروه صفات جستجو", "Group-Member association" : "انجمن گروه کاربران", + "Nested Groups" : "گروههای زیرمجموعه", "Special Attributes" : "ویژگی های مخصوص", "Quota Field" : "سهمیه بندی انجام نشد.", "Quota Default" : "سهمیه بندی پیش فرض", @@ -79,6 +82,7 @@ OC.L10N.register( "Internal Username" : "نام کاربری داخلی", "Internal Username Attribute:" : "ویژگی نام کاربری داخلی:", "Override UUID detection" : "نادیده گرفتن تشخیص UUID ", + "UUID Attribute for Users:" : "UUID ویژگی برای کاربران:", "Username-LDAP User Mapping" : "نام کاربری - نگاشت کاربر LDAP ", "Clear Username-LDAP User Mapping" : "پاک کردن نام کاربری- LDAP نگاشت کاربر ", "Clear Groupname-LDAP Group Mapping" : "پاک کردن نام گروه -LDAP گروه نقشه برداری" diff --git a/apps/user_ldap/l10n/fa.json b/apps/user_ldap/l10n/fa.json index 5efa24f0d51..7a8b3e8212e 100644 --- a/apps/user_ldap/l10n/fa.json +++ b/apps/user_ldap/l10n/fa.json @@ -43,6 +43,7 @@ "For anonymous access, leave DN and Password empty." : "برای دسترسی ناشناس، DN را رها نموده و رمزعبور را خالی بگذارید.", "One Base DN per line" : "یک پایه DN در هر خط", "You can specify Base DN for users and groups in the Advanced tab" : "شما می توانید پایه DN را برای کاربران و گروه ها در زبانه Advanced مشخص کنید.", + "Test Base DN" : "تست DN پایه", "Saving" : "درحال ذخیره", "Back" : "بازگشت", "Continue" : "ادامه", @@ -56,6 +57,7 @@ "Backup (Replica) Port" : "پشتیبان گیری (بدل) پورت", "Disable Main Server" : "غیر فعال کردن سرور اصلی", "Turn off SSL certificate validation." : "غیرفعال کردن اعتبار گواهی نامه SSL .", + "Cache Time-To-Live" : "مدت زمان کش", "Directory Settings" : "تنظیمات پوشه", "User Display Name Field" : "فیلد نام کاربر", "Base User Tree" : "کاربر درخت پایه", @@ -67,6 +69,7 @@ "One Group Base DN per line" : "یک گروه پایه DN در هر خط", "Group Search Attributes" : "گروه صفات جستجو", "Group-Member association" : "انجمن گروه کاربران", + "Nested Groups" : "گروههای زیرمجموعه", "Special Attributes" : "ویژگی های مخصوص", "Quota Field" : "سهمیه بندی انجام نشد.", "Quota Default" : "سهمیه بندی پیش فرض", @@ -77,6 +80,7 @@ "Internal Username" : "نام کاربری داخلی", "Internal Username Attribute:" : "ویژگی نام کاربری داخلی:", "Override UUID detection" : "نادیده گرفتن تشخیص UUID ", + "UUID Attribute for Users:" : "UUID ویژگی برای کاربران:", "Username-LDAP User Mapping" : "نام کاربری - نگاشت کاربر LDAP ", "Clear Username-LDAP User Mapping" : "پاک کردن نام کاربری- LDAP نگاشت کاربر ", "Clear Groupname-LDAP Group Mapping" : "پاک کردن نام گروه -LDAP گروه نقشه برداری" diff --git a/core/avatar/avatarcontroller.php b/core/avatar/avatarcontroller.php index 4841ba00f7a..97b3615c032 100644 --- a/core/avatar/avatarcontroller.php +++ b/core/avatar/avatarcontroller.php @@ -140,12 +140,21 @@ class AvatarController extends Controller { $userId = $this->userSession->getUser()->getUID(); $files = $this->request->getUploadedFile('files'); + $headers = []; + if ($this->request->isUserAgent([\OC\AppFramework\Http\Request::USER_AGENT_IE_8])) { + // due to upload iframe workaround, need to set content-type to text/plain + $headers['Content-Type'] = 'text/plain'; + } + if (isset($path)) { $path = stripslashes($path); $node = $this->userFolder->get($path); if ($node->getSize() > 20*1024*1024) { - return new DataResponse(['data' => ['message' => $this->l->t('File is too big')]], - Http::STATUS_BAD_REQUEST); + return new DataResponse( + ['data' => ['message' => $this->l->t('File is too big')]], + Http::STATUS_BAD_REQUEST, + $headers + ); } $content = $node->getContent(); } elseif (!is_null($files)) { @@ -155,20 +164,29 @@ class AvatarController extends Controller { !\OC\Files\Filesystem::isFileBlacklisted($files['tmp_name'][0]) ) { if ($files['size'][0] > 20*1024*1024) { - return new DataResponse(['data' => ['message' => $this->l->t('File is too big')]], - Http::STATUS_BAD_REQUEST); + return new DataResponse( + ['data' => ['message' => $this->l->t('File is too big')]], + Http::STATUS_BAD_REQUEST, + $headers + ); } $this->cache->set('avatar_upload', file_get_contents($files['tmp_name'][0]), 7200); $content = $this->cache->get('avatar_upload'); unlink($files['tmp_name'][0]); } else { - return new DataResponse(['data' => ['message' => $this->l->t('Invalid file provided')]], - Http::STATUS_BAD_REQUEST); + return new DataResponse( + ['data' => ['message' => $this->l->t('Invalid file provided')]], + Http::STATUS_BAD_REQUEST, + $headers + ); } } else { //Add imgfile - return new DataResponse(['data' => ['message' => $this->l->t('No image or file provided')]], - Http::STATUS_BAD_REQUEST); + return new DataResponse( + ['data' => ['message' => $this->l->t('No image or file provided')]], + Http::STATUS_BAD_REQUEST, + $headers + ); } try { @@ -179,16 +197,32 @@ class AvatarController extends Controller { if ($image->valid()) { $mimeType = $image->mimeType(); if ($mimeType !== 'image/jpeg' && $mimeType !== 'image/png') { - return new DataResponse(['data' => ['message' => $this->l->t('Unknown filetype')]]); + return new DataResponse( + ['data' => ['message' => $this->l->t('Unknown filetype')]], + Http::STATUS_OK, + $headers + ); } $this->cache->set('tmpAvatar', $image->data(), 7200); - return new DataResponse(['data' => 'notsquare']); + return new DataResponse( + ['data' => 'notsquare'], + Http::STATUS_OK, + $headers + ); } else { - return new DataResponse(['data' => ['message' => $this->l->t('Invalid image')]]); + return new DataResponse( + ['data' => ['message' => $this->l->t('Invalid image')]], + Http::STATUS_OK, + $headers + ); } } catch (\Exception $e) { - return new DataResponse(['data' => ['message' => $e->getMessage()]]); + return new DataResponse( + ['data' => ['message' => $e->getMessage()]], + Http::STATUS_OK, + $headers + ); } } diff --git a/core/js/js.js b/core/js/js.js index 4f0f288bd0c..00a775b8027 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -85,6 +85,7 @@ var OC={ appConfig: window.oc_appconfig || {}, theme: window.oc_defaults || {}, coreApps:['', 'admin','log','core/search','settings','core','3rdparty'], + requestToken: oc_requesttoken, menuSpeed: 50, /** diff --git a/core/l10n/fa.js b/core/l10n/fa.js index e781c67281d..7a1becdbd5f 100644 --- a/core/l10n/fa.js +++ b/core/l10n/fa.js @@ -194,6 +194,7 @@ OC.L10N.register( "Finish setup" : "اتمام نصب", "Finishing …" : "در حال اتمام ...", "Need help?" : "کمک لازم دارید ؟", + "See the documentation" : "مشاهدهی مستندات", "Log out" : "خروج", "Search" : "جستوجو", "Please contact your administrator." : "لطفا با مدیر وبسایت تماس بگیرید.", diff --git a/core/l10n/fa.json b/core/l10n/fa.json index 56604614b4f..4f3d4163903 100644 --- a/core/l10n/fa.json +++ b/core/l10n/fa.json @@ -192,6 +192,7 @@ "Finish setup" : "اتمام نصب", "Finishing …" : "در حال اتمام ...", "Need help?" : "کمک لازم دارید ؟", + "See the documentation" : "مشاهدهی مستندات", "Log out" : "خروج", "Search" : "جستوجو", "Please contact your administrator." : "لطفا با مدیر وبسایت تماس بگیرید.", diff --git a/core/l10n/fr.js b/core/l10n/fr.js index 6e8343a0675..9ab3dc1f1ed 100644 --- a/core/l10n/fr.js +++ b/core/l10n/fr.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Couldn't send mail to following users: %s " : "Impossible d'envoyer un courriel aux utilisateurs suivants : %s", "Preparing update" : "Préparation de la mise à jour", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Les tests de migration sont ignorées - \"update.skip-migration-test\" est activée dans le fichier config.php", "Turned on maintenance mode" : "Mode de maintenance activé", "Turned off maintenance mode" : "Mode de maintenance désactivé", "Maintenance mode is kept active" : "Le mode de maintenance est laissé actif", @@ -12,6 +13,8 @@ OC.L10N.register( "Updated \"%s\" to %s" : "Mise à jour de « %s » vers %s", "Repair warning: " : "Avertissement de réparation :", "Repair error: " : "Erreur de réparation :", + "Set log level to debug - current level: \"%s\"" : "Régler le niveau de journal pour le débogage - niveau actuel: \"%s\"", + "Reset log level to \"%s\"" : "Réinitialiser le niveau des journaux pour \"%s\"", "Following incompatible apps have been disabled: %s" : "Les applications incompatibles suivantes ont été désactivées : %s", "Following apps have been disabled: %s" : "Les applications suivantes ont été désactivées : %s", "Already up to date" : "Déjà à jour", @@ -183,6 +186,7 @@ OC.L10N.register( "New Password" : "Nouveau mot de passe", "Reset password" : "Réinitialiser le mot de passe", "Searching other places" : "Recherche en cours dans d'autres emplacements", + "No search results in other folders" : "Aucun résultat de recherche dans les autres dossiers", "Personal" : "Personnel", "Users" : "Utilisateurs", "Apps" : "Applications", diff --git a/core/l10n/fr.json b/core/l10n/fr.json index 62e6ba164f6..a6c01c55636 100644 --- a/core/l10n/fr.json +++ b/core/l10n/fr.json @@ -1,6 +1,7 @@ { "translations": { "Couldn't send mail to following users: %s " : "Impossible d'envoyer un courriel aux utilisateurs suivants : %s", "Preparing update" : "Préparation de la mise à jour", + "Migration tests are skipped - \"update.skip-migration-test\" is activated in config.php" : "Les tests de migration sont ignorées - \"update.skip-migration-test\" est activée dans le fichier config.php", "Turned on maintenance mode" : "Mode de maintenance activé", "Turned off maintenance mode" : "Mode de maintenance désactivé", "Maintenance mode is kept active" : "Le mode de maintenance est laissé actif", @@ -10,6 +11,8 @@ "Updated \"%s\" to %s" : "Mise à jour de « %s » vers %s", "Repair warning: " : "Avertissement de réparation :", "Repair error: " : "Erreur de réparation :", + "Set log level to debug - current level: \"%s\"" : "Régler le niveau de journal pour le débogage - niveau actuel: \"%s\"", + "Reset log level to \"%s\"" : "Réinitialiser le niveau des journaux pour \"%s\"", "Following incompatible apps have been disabled: %s" : "Les applications incompatibles suivantes ont été désactivées : %s", "Following apps have been disabled: %s" : "Les applications suivantes ont été désactivées : %s", "Already up to date" : "Déjà à jour", @@ -181,6 +184,7 @@ "New Password" : "Nouveau mot de passe", "Reset password" : "Réinitialiser le mot de passe", "Searching other places" : "Recherche en cours dans d'autres emplacements", + "No search results in other folders" : "Aucun résultat de recherche dans les autres dossiers", "Personal" : "Personnel", "Users" : "Utilisateurs", "Apps" : "Applications", diff --git a/core/l10n/hu_HU.js b/core/l10n/hu_HU.js index 17edf5dd286..f90cd8d2b62 100644 --- a/core/l10n/hu_HU.js +++ b/core/l10n/hu_HU.js @@ -110,6 +110,7 @@ OC.L10N.register( "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "a /dev/urandom eszköz nem elérhető PHP-ből, ami nagyon nagy biztonsági problémát jelent. További információ található az alábbi <a href=\"{docLink}\">dokumentációban</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "A PHP verziód ({version}) már nem <a href=\"{phpLink}\">támogatott a PHP által</a>. Javasoljuk, hogy frissítsd a PHP verziót, hogy kihasználd a teljesítménybeli és biztonsági javításokat.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "A fordított proxy fejlécek konfigurációs beállításai helytelenek, vagy egy megbízható proxy-ból próbálja az ownCloud-ot elérni. Ha nem megbízható proxy-ból próbálja elérni az ownCloud-ot, akkor ez egy biztonsági probléma, a támadó az ownCloud számára látható IP cím csalást tud végrehajtani. További információ található a <a href=\"{docLink}\">dokumentációban</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached be van konfigurálva gyorsítótárnak, de rossz \"memcache\" PHP modul van telepítve. \\OC\\Memcache\\Memcached csak a \"memcached\"-t támogatja, és nem a \"memcache\"-t. Kérjük, nézd meg a <a href=\"{wikiLink}\">memcached wiki oldalt a modulokkal kapcsolatban</a>.", "Error occurred while checking server setup" : "Hiba történt a szerver beállítások ellenőrzése közben", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "A \"{header}\" HTTP fejléc nincs beállítva, hogy megegyezzen az elvárttal \"{expected}\". Ez egy potenciális biztonsági kockázat és kérjük, hogy változtassa meg a beállításokat.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "A \"Strict-Transport-Security\" HTTP fejléc nincs beállítva hogy \"{seconds}\" másodpercig tartson. Biztonsági okokból ajánljuk, hogy engedélyezze a HSTS, ahogyan ezt részletezzük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban.", diff --git a/core/l10n/hu_HU.json b/core/l10n/hu_HU.json index 976fd0050fe..429c5e095ea 100644 --- a/core/l10n/hu_HU.json +++ b/core/l10n/hu_HU.json @@ -108,6 +108,7 @@ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "a /dev/urandom eszköz nem elérhető PHP-ből, ami nagyon nagy biztonsági problémát jelent. További információ található az alábbi <a href=\"{docLink}\">dokumentációban</a>.", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "A PHP verziód ({version}) már nem <a href=\"{phpLink}\">támogatott a PHP által</a>. Javasoljuk, hogy frissítsd a PHP verziót, hogy kihasználd a teljesítménybeli és biztonsági javításokat.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "A fordított proxy fejlécek konfigurációs beállításai helytelenek, vagy egy megbízható proxy-ból próbálja az ownCloud-ot elérni. Ha nem megbízható proxy-ból próbálja elérni az ownCloud-ot, akkor ez egy biztonsági probléma, a támadó az ownCloud számára látható IP cím csalást tud végrehajtani. További információ található a <a href=\"{docLink}\">dokumentációban</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached be van konfigurálva gyorsítótárnak, de rossz \"memcache\" PHP modul van telepítve. \\OC\\Memcache\\Memcached csak a \"memcached\"-t támogatja, és nem a \"memcache\"-t. Kérjük, nézd meg a <a href=\"{wikiLink}\">memcached wiki oldalt a modulokkal kapcsolatban</a>.", "Error occurred while checking server setup" : "Hiba történt a szerver beállítások ellenőrzése közben", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "A \"{header}\" HTTP fejléc nincs beállítva, hogy megegyezzen az elvárttal \"{expected}\". Ez egy potenciális biztonsági kockázat és kérjük, hogy változtassa meg a beállításokat.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "A \"Strict-Transport-Security\" HTTP fejléc nincs beállítva hogy \"{seconds}\" másodpercig tartson. Biztonsági okokból ajánljuk, hogy engedélyezze a HSTS, ahogyan ezt részletezzük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban.", diff --git a/lib/l10n/fa.js b/lib/l10n/fa.js index 8658c4bf7fc..3e77cf40baa 100644 --- a/lib/l10n/fa.js +++ b/lib/l10n/fa.js @@ -54,6 +54,9 @@ OC.L10N.register( "Microsoft Windows Platform is not supported" : "بستر Microsoft Windows پشتیبانی نمیشود", "Cannot write into \"config\" directory" : "امکان نوشتن درون شاخهی \"config\" وجود ندارد", "Please ask your server administrator to install the module." : "لطفا از مدیر سیستم بخواهید تا ماژول را نصب کند.", - "PostgreSQL >= 9 required" : "PostgreSQL >= 9 نیاز است" + "PHP module %s not installed." : "ماژول PHP %s نصب نشده است.", + "PostgreSQL >= 9 required" : "PostgreSQL >= 9 نیاز است", + "Please upgrade your database version" : "لطفا نسخهی پایگاهدادهی خود را بروز کنید", + "Error occurred while checking PostgreSQL version" : "خطا در هنگام بررسی نسخهی PostgreSQL" }, "nplurals=1; plural=0;"); diff --git a/lib/l10n/fa.json b/lib/l10n/fa.json index b1ffa2ac122..ae18861fa8a 100644 --- a/lib/l10n/fa.json +++ b/lib/l10n/fa.json @@ -52,6 +52,9 @@ "Microsoft Windows Platform is not supported" : "بستر Microsoft Windows پشتیبانی نمیشود", "Cannot write into \"config\" directory" : "امکان نوشتن درون شاخهی \"config\" وجود ندارد", "Please ask your server administrator to install the module." : "لطفا از مدیر سیستم بخواهید تا ماژول را نصب کند.", - "PostgreSQL >= 9 required" : "PostgreSQL >= 9 نیاز است" + "PHP module %s not installed." : "ماژول PHP %s نصب نشده است.", + "PostgreSQL >= 9 required" : "PostgreSQL >= 9 نیاز است", + "Please upgrade your database version" : "لطفا نسخهی پایگاهدادهی خود را بروز کنید", + "Error occurred while checking PostgreSQL version" : "خطا در هنگام بررسی نسخهی PostgreSQL" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/lib/private/appframework/http/request.php b/lib/private/appframework/http/request.php index 3e24eec37c8..77785135162 100644 --- a/lib/private/appframework/http/request.php +++ b/lib/private/appframework/http/request.php @@ -43,6 +43,7 @@ use OCP\Security\ISecureRandom; class Request implements \ArrayAccess, \Countable, IRequest { const USER_AGENT_IE = '/MSIE/'; + const USER_AGENT_IE_8 = '/MSIE 8.0/'; // Android Chrome user agent: https://developers.google.com/chrome/mobile/docs/user-agent const USER_AGENT_ANDROID_MOBILE_CHROME = '#Android.*Chrome/[.0-9]*#'; const USER_AGENT_FREEBOX = '#^Mozilla/5\.0$#'; diff --git a/lib/private/files/utils/scanner.php b/lib/private/files/utils/scanner.php index 35e36e23cb2..460c8007bf4 100644 --- a/lib/private/files/utils/scanner.php +++ b/lib/private/files/utils/scanner.php @@ -31,6 +31,7 @@ use OC\Files\Cache\ChangePropagator; use OC\Files\Filesystem; use OC\ForbiddenException; use OC\Hooks\PublicEmitter; +use OC\Lock\DBLockingProvider; /** * Class Scanner @@ -156,9 +157,14 @@ class Scanner extends PublicEmitter { $scanner = $storage->getScanner(); $scanner->setUseTransactions(false); $this->attachListener($mount); - $this->db->beginTransaction(); + $isDbLocking = \OC::$server->getLockingProvider() instanceof DBLockingProvider; + if (!$isDbLocking) { + $this->db->beginTransaction(); + } $scanner->scan($relativePath, \OC\Files\Cache\Scanner::SCAN_RECURSIVE, \OC\Files\Cache\Scanner::REUSE_ETAG | \OC\Files\Cache\Scanner::REUSE_SIZE); - $this->db->commit(); + if (!$isDbLocking) { + $this->db->commit(); + } } $this->propagator->propagateChanges(time()); } diff --git a/lib/public/appframework/controller.php b/lib/public/appframework/controller.php index b8986c0b772..5c7292cd130 100644 --- a/lib/public/appframework/controller.php +++ b/lib/public/appframework/controller.php @@ -83,7 +83,13 @@ abstract class Controller { $data->getData(), $data->getStatus() ); - $response->setHeaders(array_merge($data->getHeaders(), $response->getHeaders())); + $dataHeaders = $data->getHeaders(); + $headers = $response->getHeaders(); + // do not overwrite Content-Type if it already exists + if (isset($dataHeaders['Content-Type'])) { + unset($headers['Content-Type']); + } + $response->setHeaders(array_merge($dataHeaders, $headers)); return $response; } else { return new JSONResponse($data); diff --git a/settings/controller/certificatecontroller.php b/settings/controller/certificatecontroller.php index 8ff9f51a66c..750144e7a2c 100644 --- a/settings/controller/certificatecontroller.php +++ b/settings/controller/certificatecontroller.php @@ -68,19 +68,25 @@ class CertificateController extends Controller { * @return array */ public function addPersonalRootCertificate() { + $headers = []; + if ($this->request->isUserAgent([\OC\AppFramework\Http\Request::USER_AGENT_IE_8])) { + // due to upload iframe workaround, need to set content-type to text/plain + $headers['Content-Type'] = 'text/plain'; + } if ($this->isCertificateImportAllowed() === false) { - return new DataResponse('Individual certificate management disabled', Http::STATUS_FORBIDDEN); + return new DataResponse(['message' => 'Individual certificate management disabled'], Http::STATUS_FORBIDDEN, $headers); } $file = $this->request->getUploadedFile('rootcert_import'); if(empty($file)) { - return new DataResponse(['message' => 'No file uploaded'], Http::STATUS_UNPROCESSABLE_ENTITY); + return new DataResponse(['message' => 'No file uploaded'], Http::STATUS_UNPROCESSABLE_ENTITY, $headers); } try { $certificate = $this->certificateManager->addCertificate(file_get_contents($file['tmp_name']), $file['name']); - return new DataResponse([ + return new DataResponse( + [ 'name' => $certificate->getName(), 'commonName' => $certificate->getCommonName(), 'organization' => $certificate->getOrganization(), @@ -90,9 +96,12 @@ class CertificateController extends Controller { 'validTillString' => $this->l10n->l('date', $certificate->getExpireDate()), 'issuer' => $certificate->getIssuerName(), 'issuerOrganization' => $certificate->getIssuerOrganization(), - ]); + ], + Http::STATUS_OK, + $headers + ); } catch (\Exception $e) { - return new DataResponse('An error occurred.', Http::STATUS_UNPROCESSABLE_ENTITY); + return new DataResponse('An error occurred.', Http::STATUS_UNPROCESSABLE_ENTITY, $headers); } } diff --git a/settings/js/personal.js b/settings/js/personal.js index 33746d22aca..acc1478cd78 100644 --- a/settings/js/personal.js +++ b/settings/js/personal.js @@ -5,8 +5,6 @@ * See the COPYING-README file. */ -/* global OC, t */ - /** * The callback will be fired as soon as enter is pressed by the * user or 1 second after the last data entry @@ -156,6 +154,9 @@ function cleanCropper () { } function avatarResponseHandler (data) { + if (typeof data === 'string') { + data = $.parseJSON(data); + } var $warning = $('#avatar .warning'); $warning.hide(); if (data.status === "success") { @@ -233,7 +234,21 @@ $(document).ready(function () { var uploadparms = { done: function (e, data) { - avatarResponseHandler(data.result); + var response = data; + if (typeof data.result === 'string') { + response = $.parseJSON(data.result); + } else if (data.result && data.result.length) { + // fetch response from iframe + response = $.parseJSON(data.result[0].body.innerText); + } else { + response = data.result; + } + avatarResponseHandler(response); + }, + submit: function(e, data) { + data.formData = _.extend(data.formData || {}, { + requesttoken: OC.requestToken + }); }, fail: function (e, data){ var msg = data.jqXHR.statusText + ' (' + data.jqXHR.status + ')'; @@ -251,10 +266,6 @@ $(document).ready(function () { } }; - $('#uploadavatarbutton').click(function () { - $('#uploadavatar').click(); - }); - $('#uploadavatar').fileupload(uploadparms); $('#selectavatar').click(function () { @@ -344,7 +355,24 @@ $(document).ready(function () { $('#sslCertificate tr > td').tipsy({gravity: 'n', live: true}); $('#rootcert_import').fileupload({ + submit: function(e, data) { + data.formData = _.extend(data.formData || {}, { + requesttoken: OC.requestToken + }); + }, success: function (data) { + if (typeof data === 'string') { + data = $.parseJSON(data); + } else if (data && data.length) { + // fetch response from iframe + data = $.parseJSON(data[0].body.innerText); + } + if (!data || typeof(data) === 'string') { + // IE8 iframe workaround comes here instead of fail() + OC.Notification.showTemporary( + t('settings', 'An error occurred. Please upload an ASCII-encoded PEM certificate.')); + return; + } var issueDate = new Date(data.validFrom * 1000); var expireDate = new Date(data.validTill * 1000); var now = new Date(); @@ -374,10 +402,6 @@ $(document).ready(function () { } }); - $('#rootcert_import_button').click(function () { - $('#rootcert_import').click(); - }); - if ($('#sslCertificate > tbody > tr').length === 0) { $('#sslCertificate').hide(); } diff --git a/settings/l10n/fa.js b/settings/l10n/fa.js index 062e77cbd6a..b6345dbb767 100644 --- a/settings/l10n/fa.js +++ b/settings/l10n/fa.js @@ -72,6 +72,7 @@ OC.L10N.register( "A valid username must be provided" : "نام کاربری صحیح باید وارد شود", "Error creating user" : "خطا در ایجاد کاربر", "A valid password must be provided" : "رمز عبور صحیح باید وارد شود", + "A valid email must be provided" : "یک ایمیل معتبر باید وارد شود", "__language_name__" : "__language_name__", "Sync clients" : "همگامسازی مشتریان", "Personal info" : "مشخصات شخصی", @@ -88,6 +89,7 @@ OC.L10N.register( "SSL" : "SSL", "TLS" : "TLS", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "ماژول 'fileinfo' PHP از کار افتاده است.ما اکیدا توصیه می کنیم که این ماژول را فعال کنید تا نتایج بهتری به وسیله ی mime-type detection دریافت کنید.", + "All checks passed." : "تمامی موارد با موفقیت چک شدند.", "Open documentation" : "بازکردن مستند", "Allow apps to use the Share API" : "اجازه ی برنامه ها برای استفاده از API اشتراک گذاری", "Allow users to share via link" : "اجازه دادن به کاربران برای اشتراک گذاری توسط پیوند", @@ -160,9 +162,13 @@ OC.L10N.register( "Choose as profile image" : "یک تصویر پروفایل انتخاب کنید", "Language" : "زبان", "Help translate" : "به ترجمه آن کمک کنید", + "Common Name" : "نام مشترک", "Valid until" : "متعبر تا", + "Issued By" : "صدور توسط", + "Valid until %s" : "متعبر تا %s", "Show storage location" : "نمایش محل ذخیرهسازی", "Show last log in" : "نمایش اخرین ورود", + "Send email to new user" : "ارسال ایمیل به کاربر جدید", "Show email address" : "نمایش پست الکترونیکی", "Username" : "نام کاربری", "E-Mail" : "ایمیل", diff --git a/settings/l10n/fa.json b/settings/l10n/fa.json index c61ad80c655..b9f5e3aca22 100644 --- a/settings/l10n/fa.json +++ b/settings/l10n/fa.json @@ -70,6 +70,7 @@ "A valid username must be provided" : "نام کاربری صحیح باید وارد شود", "Error creating user" : "خطا در ایجاد کاربر", "A valid password must be provided" : "رمز عبور صحیح باید وارد شود", + "A valid email must be provided" : "یک ایمیل معتبر باید وارد شود", "__language_name__" : "__language_name__", "Sync clients" : "همگامسازی مشتریان", "Personal info" : "مشخصات شخصی", @@ -86,6 +87,7 @@ "SSL" : "SSL", "TLS" : "TLS", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "ماژول 'fileinfo' PHP از کار افتاده است.ما اکیدا توصیه می کنیم که این ماژول را فعال کنید تا نتایج بهتری به وسیله ی mime-type detection دریافت کنید.", + "All checks passed." : "تمامی موارد با موفقیت چک شدند.", "Open documentation" : "بازکردن مستند", "Allow apps to use the Share API" : "اجازه ی برنامه ها برای استفاده از API اشتراک گذاری", "Allow users to share via link" : "اجازه دادن به کاربران برای اشتراک گذاری توسط پیوند", @@ -158,9 +160,13 @@ "Choose as profile image" : "یک تصویر پروفایل انتخاب کنید", "Language" : "زبان", "Help translate" : "به ترجمه آن کمک کنید", + "Common Name" : "نام مشترک", "Valid until" : "متعبر تا", + "Issued By" : "صدور توسط", + "Valid until %s" : "متعبر تا %s", "Show storage location" : "نمایش محل ذخیرهسازی", "Show last log in" : "نمایش اخرین ورود", + "Send email to new user" : "ارسال ایمیل به کاربر جدید", "Show email address" : "نمایش پست الکترونیکی", "Username" : "نام کاربری", "E-Mail" : "ایمیل", diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js index a7c389aab1e..23cc6357a2a 100644 --- a/settings/l10n/fr.js +++ b/settings/l10n/fr.js @@ -77,6 +77,7 @@ OC.L10N.register( "Uninstalling ...." : "Désinstallation...", "Error while uninstalling app" : "Erreur lors de la désinstallation de l'application", "Uninstall" : "Désinstaller", + "App update" : "Mise à jour App", "An error occurred: {message}" : "Une erreur est survenue : {message}", "Select a profile picture" : "Selectionnez une photo de profil ", "Very weak password" : "Mot de passe de très faible sécurité", diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json index 81011944298..b51a82df574 100644 --- a/settings/l10n/fr.json +++ b/settings/l10n/fr.json @@ -75,6 +75,7 @@ "Uninstalling ...." : "Désinstallation...", "Error while uninstalling app" : "Erreur lors de la désinstallation de l'application", "Uninstall" : "Désinstaller", + "App update" : "Mise à jour App", "An error occurred: {message}" : "Une erreur est survenue : {message}", "Select a profile picture" : "Selectionnez une photo de profil ", "Very weak password" : "Mot de passe de très faible sécurité", diff --git a/settings/l10n/hu_HU.js b/settings/l10n/hu_HU.js index 226ce7e01d9..5451728773b 100644 --- a/settings/l10n/hu_HU.js +++ b/settings/l10n/hu_HU.js @@ -72,6 +72,7 @@ OC.L10N.register( "Uninstalling ...." : "Eltávolítás ...", "Error while uninstalling app" : "Hiba történt az alkalmazás eltávolítása közben", "Uninstall" : "Eltávolítás", + "App update" : "Alkalmazás frissítése", "An error occurred: {message}" : "Hiba történt: {message}", "Select a profile picture" : "Válasszon profilképet!", "Very weak password" : "Nagyon gyenge jelszó", diff --git a/settings/l10n/hu_HU.json b/settings/l10n/hu_HU.json index 14577924e94..08a34e158f5 100644 --- a/settings/l10n/hu_HU.json +++ b/settings/l10n/hu_HU.json @@ -70,6 +70,7 @@ "Uninstalling ...." : "Eltávolítás ...", "Error while uninstalling app" : "Hiba történt az alkalmazás eltávolítása közben", "Uninstall" : "Eltávolítás", + "App update" : "Alkalmazás frissítése", "An error occurred: {message}" : "Hiba történt: {message}", "Select a profile picture" : "Válasszon profilképet!", "Very weak password" : "Nagyon gyenge jelszó", diff --git a/settings/personal.php b/settings/personal.php index e58e043af50..8cbcf923a58 100644 --- a/settings/personal.php +++ b/settings/personal.php @@ -46,6 +46,7 @@ OC_Util::addScript( 'settings', 'personal' ); OC_Util::addStyle( 'settings', 'settings' ); \OC_Util::addVendorScript('strengthify/jquery.strengthify'); \OC_Util::addVendorStyle('strengthify/strengthify'); +\OC_Util::addScript('files', 'jquery.iframe-transport'); \OC_Util::addScript('files', 'jquery.fileupload'); if ($config->getSystemValue('enable_avatars', true) === true) { \OC_Util::addVendorScript('jcrop/js/jquery.Jcrop'); diff --git a/settings/templates/personal.php b/settings/templates/personal.php index c0adaf9c5a3..0eba71d77d1 100644 --- a/settings/templates/personal.php +++ b/settings/templates/personal.php @@ -155,10 +155,11 @@ if($_['passwordChangeSupported']) { <div class="avatardiv"></div><br> <div class="warning hidden"></div> <?php if ($_['avatarChangeSupported']): ?> - <div class="inlineblock button" id="uploadavatarbutton"><?php p($l->t('Upload new')); ?></div> - <input type="file" class="hidden" name="files[]" id="uploadavatar"> + <label for="uploadavatar" class="inlineblock button" id="uploadavatarbutton"><?php p($l->t('Upload new')); ?></label> <div class="inlineblock button" id="selectavatar"><?php p($l->t('Select new from Files')); ?></div> - <div class="inlineblock button" id="removeavatar"><?php p($l->t('Remove image')); ?></div><br> + <div class="inlineblock button" id="removeavatar"><?php p($l->t('Remove image')); ?></div> + <input type="file" name="files[]" id="uploadavatar" class="hiddenuploadfield"> + <br> <?php p($l->t('Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB.')); ?> <?php else: ?> <?php p($l->t('Your avatar is provided by your original account.')); ?> @@ -239,8 +240,8 @@ if($_['passwordChangeSupported']) { </tbody> </table> <form class="uploadButton" method="post" action="<?php p($_['urlGenerator']->linkToRoute('settings.Certificate.addPersonalRootCertificate')); ?>" target="certUploadFrame"> - <input type="file" id="rootcert_import" name="rootcert_import" class="hidden"> - <input type="button" id="rootcert_import_button" value="<?php p($l->t('Import root certificate')); ?>"/> + <label for="rootcert_import" class="inlineblock button" id="rootcert_import_button"><?php p($l->t('Import root certificate')); ?></label> + <input type="file" id="rootcert_import" name="rootcert_import" class="hiddenuploadfield"> </form> </div> <?php endif; ?> |