diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..81f0715c2888b450f8b67f75631c0ab67396c7e7
--- /dev/null
+++ b/.idea/codeStyleSettings.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.scrutinizer.yml b/.scrutinizer.yml
index d1dbb20139fc968d08681cc9f2aa08f0d3fac767..bbffc9ce2a77c68c6266f9e69a52ca7fbc8617ed 100644
--- a/.scrutinizer.yml
+++ b/.scrutinizer.yml
@@ -14,14 +14,13 @@ filter:
- 'core/js/jquery-migrate-1.2.1.min.js'
- 'core/js/jquery-showpassword.js'
- 'core/js/jquery-tipsy.js'
- - 'core/js/jquery.infieldlabel.js'
- 'core/js/jquery-ui-1.10.0.custom.js'
- - 'core/js/jquery.inview.js'
- - 'core/js/jquery.placeholder.js'
+ - 'core/js/jquery.inview.js'
+ - 'core/js/placeholders.js'
- 'core/js/underscore.js'
- 'core/js/jquery.multiselect.js'
-
+
imports:
- javascript
- php
diff --git a/3rdparty b/3rdparty
index 82c5785c5ded047fb10791151aed7086785b0468..045dde529e050316788a63cd0067a38bbc6921b0 160000
--- a/3rdparty
+++ b/3rdparty
@@ -1 +1 @@
-Subproject commit 82c5785c5ded047fb10791151aed7086785b0468
+Subproject commit 045dde529e050316788a63cd0067a38bbc6921b0
diff --git a/apps/files/admin.php b/apps/files/admin.php
index 02c3147dba58cbe5bc17b13a63bd1da339e0b510..bf12af74105372b4992c9a96111190d568656f8c 100644
--- a/apps/files/admin.php
+++ b/apps/files/admin.php
@@ -34,17 +34,7 @@ if($_POST && OC_Util::isCallRegistered()) {
$maxUploadFilesize = OCP\Util::humanFileSize($setMaxSize);
}
}
- if(isset($_POST['maxZipInputSize'])) {
- $maxZipInputSize=$_POST['maxZipInputSize'];
- OCP\Config::setSystemValue('maxZipInputSize', OCP\Util::computerFileSize($maxZipInputSize));
- }
- if(isset($_POST['submitFilesAdminSettings'])) {
- OCP\Config::setSystemValue('allowZipDownload', isset($_POST['allowZipDownload']));
- }
}
-$maxZipInputSizeDefault = OCP\Util::computerFileSize('800 MB');
-$maxZipInputSize = OCP\Util::humanFileSize(OCP\Config::getSystemValue('maxZipInputSize', $maxZipInputSizeDefault));
-$allowZipDownload = intval(OCP\Config::getSystemValue('allowZipDownload', true));
OCP\App::setActiveNavigationEntry( "files_administration" );
@@ -56,6 +46,4 @@ $tmpl->assign( 'uploadMaxFilesize', $maxUploadFilesize);
// max possible makes only sense on a 32 bit system
$tmpl->assign( 'displayMaxPossibleUploadSize', PHP_INT_SIZE===4);
$tmpl->assign( 'maxPossibleUploadSize', OCP\Util::humanFileSize(PHP_INT_MAX));
-$tmpl->assign( 'allowZipDownload', $allowZipDownload);
-$tmpl->assign( 'maxZipInputSize', $maxZipInputSize);
return $tmpl->fetchPage();
diff --git a/apps/files/appinfo/app.php b/apps/files/appinfo/app.php
index 4b0db457ada50bb8812d216b6fd9438be8dee033..43e6cffa3356156917a5f9cdd168ddc46a1a5c2a 100644
--- a/apps/files/appinfo/app.php
+++ b/apps/files/appinfo/app.php
@@ -12,8 +12,6 @@ OCP\App::addNavigationEntry(array("id" => "files_index",
OC_Search::registerProvider('OC_Search_Provider_File');
-\OCP\BackgroundJob::addRegularTask('\OC\Files\Cache\BackgroundWatcher', 'checkNext');
-
$templateManager = OC_Helper::getFileTemplateManager();
$templateManager->registerTemplate('text/html', 'core/templates/filetemplates/template.html');
$templateManager->registerTemplate('application/vnd.oasis.opendocument.presentation', 'core/templates/filetemplates/template.odp');
diff --git a/apps/files/appinfo/remote.php b/apps/files/appinfo/remote.php
index c1baee4f1ef985d99aa84caa45f15cb9a19d9708..92c761838760db9e1b820346e0939c2d6f8650c4 100644
--- a/apps/files/appinfo/remote.php
+++ b/apps/files/appinfo/remote.php
@@ -36,9 +36,9 @@ $server->setBaseUri($baseuri);
// Load plugins
$defaults = new OC_Defaults();
-$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend, $defaults->getName()));
-$server->addPlugin(new Sabre_DAV_Locks_Plugin($lockBackend));
-$server->addPlugin(new Sabre_DAV_Browser_Plugin(false));
+$server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, $defaults->getName()));
+$server->addPlugin(new \Sabre\DAV\Locks\Plugin($lockBackend));
+$server->addPlugin(new \Sabre\DAV\Browser\Plugin(false)); // Show something in the Browser, but no upload
$server->addPlugin(new OC_Connector_Sabre_FilesPlugin());
$server->addPlugin(new OC_Connector_Sabre_MaintenancePlugin());
$server->addPlugin(new OC_Connector_Sabre_ExceptionLoggerPlugin('webdav'));
diff --git a/apps/files/appinfo/update.php b/apps/files/appinfo/update.php
new file mode 100644
index 0000000000000000000000000000000000000000..de635e5ce6b93b3dfadd1cda033192ee8404629e
--- /dev/null
+++ b/apps/files/appinfo/update.php
@@ -0,0 +1,8 @@
+.viewcontainer {
height: 100%;
@@ -101,7 +97,7 @@
* to be more flexible / relative
*/
#body-user .app-files #controls {
- left: 310px; /* main nav bar + sidebar */
+ left: 230px; /* sidebar width */
position: fixed;
padding-left: 0px;
}
@@ -112,12 +108,10 @@
padding-left: 80px; /* main nav bar */
}
-.app-files #app-navigation {
- width: 230px;
-}
-
-.app-files #app-settings {
- width: 229px; /* DUH */
+/* move Deleted Files to bottom of sidebar */
+.nav-trashbin {
+ position: absolute !important;
+ bottom: 0;
}
.app-files #app-settings input {
@@ -155,8 +149,9 @@ tr:hover span.extension {
color: #777;
}
-table tr.mouseOver td { background-color:#eee; }
-table th { height:24px; padding:0 8px; }
+table tr.mouseOver td {
+ background-color: #eee;
+}
table th, table th a {
color: #999;
}
@@ -179,7 +174,7 @@ table th .columntitle.name {
}
/* hover effect on sortable column */
table th a.columntitle:hover {
- background-color: #F0F0F0;
+ color: #000;
}
table th .sort-indicator {
width: 10px;
@@ -266,7 +261,7 @@ table td.filename .nametext, .uploadtext, .modified { float:left; padding:14px 0
.modified {
position: relative;
- padding-left: 8px;
+ padding-left: 15px;
overflow: hidden;
text-overflow: ellipsis;
width: 90%;
@@ -369,7 +364,7 @@ table td.filename form { font-size:14px; margin-left:48px; margin-right:48px; }
padding: 28px 14px 19px !important;
}
-#fileList .action.action-share-notification span, img, a {
+#fileList .action.action-share-notification span, #fileList a {
cursor: default !important;
}
diff --git a/apps/files/index.php b/apps/files/index.php
index 95ae7977eccf1ff125a5b56b430d468c6134a3b6..bc74e17aee131b9ea429c6d502646c154591477d 100644
--- a/apps/files/index.php
+++ b/apps/files/index.php
@@ -118,11 +118,10 @@ $tmpl = new OCP\Template('files', 'index', 'user');
$tmpl->assign('usedSpacePercent', (int)$storageInfo['relative']);
$tmpl->assign('isPublic', false);
$tmpl->assign("encryptedFiles", \OCP\Util::encryptedFiles());
-$tmpl->assign("mailNotificationEnabled", $config->getAppValue('core', 'shareapi_allow_mail_notification', 'yes'));
+$tmpl->assign("mailNotificationEnabled", $config->getAppValue('core', 'shareapi_allow_mail_notification', 'no'));
$tmpl->assign("allowShareWithLink", $config->getAppValue('core', 'shareapi_allow_links', 'yes'));
$tmpl->assign("encryptionInitStatus", $encryptionInitStatus);
$tmpl->assign('appNavigation', $nav);
$tmpl->assign('appContents', $contentItems);
-$tmpl->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
$tmpl->printPage();
diff --git a/apps/files/js/admin.js b/apps/files/js/admin.js
index 842b73c0caefa5b4d319aa83747909dc802ba5e9..dcfec824cfe08473761f93d900dfc675222826d7 100644
--- a/apps/files/js/admin.js
+++ b/apps/files/js/admin.js
@@ -25,12 +25,4 @@ $(document).ready(function() {
// To get rid of onClick()
switchPublicFolder();
});
-
- $('#allowZipDownload').bind('change', function() {
- if($('#allowZipDownload').attr('checked')) {
- $('#maxZipInputSize').removeAttr('disabled');
- } else {
- $('#maxZipInputSize').attr('disabled', 'disabled');
- }
- });
});
diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js
index 3df62f37518c68dd1f9d73202e7299d4f8ebc7e8..de02bf5e730c6d0efb8d4b65414ace6fd6c9ef3a 100644
--- a/apps/files/js/fileactions.js
+++ b/apps/files/js/fileactions.js
@@ -275,14 +275,8 @@
});
this.setDefault('dir', 'Open');
- var downloadScope;
- if ($('#allowZipDownload').val() == 1) {
- downloadScope = 'all';
- } else {
- downloadScope = 'file';
- }
- this.register(downloadScope, 'Download', OC.PERMISSION_READ, function () {
+ this.register('all', 'Download', OC.PERMISSION_READ, function () {
return OC.imagePath('core', 'actions/download');
}, function (filename, context) {
var dir = context.dir || context.fileList.getCurrentDirectory();
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index 1b2a62137e5ec6d3a17dd468d7040dc01edfb076..4229988b171a52e3ef4fee652c0325370a17a357 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -613,7 +613,7 @@
// size column
if (typeof(fileData.size) !== 'undefined' && fileData.size >= 0) {
- simpleSize = humanFileSize(parseInt(fileData.size, 10));
+ simpleSize = humanFileSize(parseInt(fileData.size, 10), true);
sizeColor = Math.round(160-Math.pow((fileData.size/(1024*1024)),2));
} else {
simpleSize = t('files', 'Pending');
diff --git a/apps/files/js/files.js b/apps/files/js/files.js
index 4549de57f3f320c267bd299fd766b972a2bff76f..8d871d6dac60c420c12dc3bd5d4d63a23a5beedc 100644
--- a/apps/files/js/files.js
+++ b/apps/files/js/files.js
@@ -279,13 +279,7 @@
}
}
- $('#app-settings-header').on('click', function() {
- var $settings = $('#app-settings');
- $settings.toggleClass('opened');
- if ($settings.hasClass('opened')) {
- $settings.find('input').focus();
- }
- });
+
$('#webdavurl').on('click', function () {
$('#webdavurl').select();
});
diff --git a/apps/files/js/navigation.js b/apps/files/js/navigation.js
index c58a284e83fe01eb36ff1fcea06427e6788df1e5..b959e016e8cda76afa741ad49115ac2a2c365767 100644
--- a/apps/files/js/navigation.js
+++ b/apps/files/js/navigation.js
@@ -82,13 +82,13 @@
}
return;
}
- this.$el.find('li').removeClass('selected');
+ this.$el.find('li').removeClass('active');
if (this.$currentContent) {
this.$currentContent.addClass('hidden');
this.$currentContent.trigger(jQuery.Event('hide'));
}
this._activeItem = itemId;
- this.$el.find('li[data-id=' + itemId + ']').addClass('selected');
+ this.$el.find('li[data-id=' + itemId + ']').addClass('active');
this.$currentContent = $('#app-content-' + itemId);
this.$currentContent.removeClass('hidden');
if (!options || !options.silent) {
diff --git a/apps/files/l10n/ar.php b/apps/files/l10n/ar.php
index 72effe3e207c396ddbdd5384bbf04b443f8a7aa8..e823dc5d5ea8f9f0d851eb21aa7f837178b42dcb 100644
--- a/apps/files/l10n/ar.php
+++ b/apps/files/l10n/ar.php
@@ -26,6 +26,7 @@ $TRANSLATIONS = array(
"{new_name} already exists" => "{new_name} موجود مسبقا",
"Share" => "شارك",
"Delete permanently" => "حذف بشكل دائم",
+"Delete" => "إلغاء",
"Rename" => "إعادة تسميه",
"Your download is being prepared. This might take some time if the files are big." => "جاري تجهيز عملية التحميل. قد تستغرق بعض الوقت اذا كان حجم الملفات كبير.",
"Pending" => "قيد الانتظار",
@@ -47,10 +48,6 @@ $TRANSLATIONS = array(
"File handling" => "التعامل مع الملف",
"Maximum upload size" => "الحد الأقصى لحجم الملفات التي يمكن رفعها",
"max. possible: " => "الحد الأقصى المسموح به",
-"Needed for multi-file and folder downloads." => "اجباري للسماح بالتحميل المتعدد للمجلدات والملفات",
-"Enable ZIP-download" => "تفعيل خاصية تحميل ملفات ZIP",
-"0 is unlimited" => "0 = غير محدود",
-"Maximum input size for ZIP files" => "الحد الأقصى المسموح به لملفات ZIP",
"Save" => "حفظ",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "استخدم هذا العنوان لـ الدخول الى ملفاتك عن طريق WebDAV ",
@@ -62,7 +59,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "إلغاء رفع الملفات",
"Nothing in here. Upload something!" => "لا يوجد شيء هنا. إرفع بعض الملفات!",
"Download" => "تحميل",
-"Delete" => "إلغاء",
"Upload too large" => "حجم الترفيع أعلى من المسموح",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم.",
"Files are being scanned, please wait." => "يرجى الانتظار , جاري فحص الملفات ."
diff --git a/apps/files/l10n/ast.php b/apps/files/l10n/ast.php
index b0d7e42d5d0ab1d134ad3bb8032217d487fa7db5..4b7dd8b0ad6948d607b97430c130368d1077b3aa 100644
--- a/apps/files/l10n/ast.php
+++ b/apps/files/l10n/ast.php
@@ -41,6 +41,7 @@ $TRANSLATIONS = array(
"Could not create folder" => "Nun pudo crease la carpeta",
"Share" => "Compartir",
"Delete permanently" => "Desaniciar dafechu",
+"Delete" => "Desaniciar",
"Rename" => "Renomar",
"Your download is being prepared. This might take some time if the files are big." => "Ta preparándose la to descarga. Esto podría llevar dalgún tiempu si los ficheros son grandes.",
"Pending" => "Pendiente",
@@ -67,10 +68,6 @@ $TRANSLATIONS = array(
"File handling" => "Alministración de ficheros",
"Maximum upload size" => "Tamañu máximu de xubida",
"max. possible: " => "máx. posible:",
-"Needed for multi-file and folder downloads." => "Ye necesariu pa descargues multificheru y de carpetes",
-"Enable ZIP-download" => "Activar descarga ZIP",
-"0 is unlimited" => "0 ye illimitao",
-"Maximum input size for ZIP files" => "Tamañu máximu d'entrada pa ficheros ZIP",
"Save" => "Guardar",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Usa esta direición pa acceder a los ficheros a traviés de WebDAV ",
@@ -84,7 +81,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Nun tienes permisu pa xubir o crear ficheros equí",
"Nothing in here. Upload something!" => "Nun hai nada equí. ¡Xubi daqué!",
"Download" => "Descargar",
-"Delete" => "Desaniciar",
"Upload too large" => "La xuba ye abondo grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Los ficheros que tas intentando xubir perpasen el tamañu máximu pa les xubíes de ficheros nesti servidor.",
"Files are being scanned, please wait." => "Tan escaniándose los ficheros, espera por favor.",
diff --git a/apps/files/l10n/bg_BG.php b/apps/files/l10n/bg_BG.php
index 7b5bac636d793089cf2f4586d39cb5d7deaa2e37..b92a36950e6fca73433a4d14737c349f83bb4222 100644
--- a/apps/files/l10n/bg_BG.php
+++ b/apps/files/l10n/bg_BG.php
@@ -11,6 +11,7 @@ $TRANSLATIONS = array(
"Upload cancelled." => "Качването е спряно.",
"Share" => "Споделяне",
"Delete permanently" => "Изтриване завинаги",
+"Delete" => "Изтриване",
"Rename" => "Преименуване",
"Pending" => "Чакащо",
"Error" => "Грешка",
@@ -21,7 +22,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
"Maximum upload size" => "Максимален размер за качване",
-"0 is unlimited" => "Ползвайте 0 за без ограничения",
"Save" => "Запис",
"WebDAV" => "WebDAV",
"New" => "Ново",
@@ -31,7 +31,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "Спри качването",
"Nothing in here. Upload something!" => "Няма нищо тук. Качете нещо.",
"Download" => "Изтегляне",
-"Delete" => "Изтриване",
"Upload too large" => "Файлът който сте избрали за качване е прекалено голям",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файловете които се опитвате да качите са по-големи от позволеното за сървъра.",
"Files are being scanned, please wait." => "Файловете се претърсват, изчакайте."
diff --git a/apps/files/l10n/bn_BD.php b/apps/files/l10n/bn_BD.php
index 55bafd1a8fdae1b6296bde9c07108fe3c54b26b5..635bc365cb2f0d3d454536ccf7c4a9e6920af731 100644
--- a/apps/files/l10n/bn_BD.php
+++ b/apps/files/l10n/bn_BD.php
@@ -18,6 +18,7 @@ $TRANSLATIONS = array(
"File upload is in progress. Leaving the page now will cancel the upload." => "ফাইল আপলোড চলমান। এই পৃষ্ঠা পরিত্যাগ করলে আপলোড বাতিল করা হবে।",
"{new_name} already exists" => "{new_name} টি বিদ্যমান",
"Share" => "ভাগাভাগি কর",
+"Delete" => "মুছে",
"Rename" => "পূনঃনামকরণ",
"Pending" => "মুলতুবি",
"Error" => "সমস্যা",
@@ -30,10 +31,6 @@ $TRANSLATIONS = array(
"File handling" => "ফাইল হ্যার্ডলিং",
"Maximum upload size" => "আপলোডের সর্বোচ্চ আকার",
"max. possible: " => "অনুমোদিত সর্বোচ্চ আকার",
-"Needed for multi-file and folder downloads." => "একাধিক ফাইল এবং ফোল্ডার ডাউনলোড করার জন্য আবশ্যক।",
-"Enable ZIP-download" => "ZIP ডাউনলোড সক্রিয় কর",
-"0 is unlimited" => "০ এর অর্থ অসীম",
-"Maximum input size for ZIP files" => "ZIP ফাইলের ইনপুটের সর্বোচ্চ আকার",
"Save" => "সংরক্ষণ",
"WebDAV" => "WebDAV",
"New" => "নতুন",
@@ -43,7 +40,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "আপলোড বাতিল কর",
"Nothing in here. Upload something!" => "এখানে কিছুই নেই। কিছু আপলোড করুন !",
"Download" => "ডাউনলোড",
-"Delete" => "মুছে",
"Upload too large" => "আপলোডের আকারটি অনেক বড়",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "আপনি এই সার্ভারে আপলোড করার জন্য অনুমোদিত ফাইলের সর্বোচ্চ আকারের চেয়ে বৃহদাকার ফাইল আপলোড করার চেষ্টা করছেন ",
"Files are being scanned, please wait." => "ফাইলগুলো স্ক্যান করা হচ্ছে, দয়া করে অপেক্ষা করুন।"
diff --git a/apps/files/l10n/ca.php b/apps/files/l10n/ca.php
index 9929cfea88d2bbf5506ea9a149cf35aa91da74e5..0bcbfd6aa234710860419543bacc47c9d9ab9a8a 100644
--- a/apps/files/l10n/ca.php
+++ b/apps/files/l10n/ca.php
@@ -41,6 +41,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Error en obtenir la URL",
"Share" => "Comparteix",
"Delete permanently" => "Esborra permanentment",
+"Delete" => "Esborra",
"Rename" => "Reanomena",
"Your download is being prepared. This might take some time if the files are big." => "S'està preparant la baixada. Pot trigar una estona si els fitxers són grans.",
"Pending" => "Pendent",
@@ -66,10 +67,6 @@ $TRANSLATIONS = array(
"File handling" => "Gestió de fitxers",
"Maximum upload size" => "Mida màxima de pujada",
"max. possible: " => "màxim possible:",
-"Needed for multi-file and folder downloads." => "Necessari per fitxers múltiples i baixada de carpetes",
-"Enable ZIP-download" => "Activa la baixada ZIP",
-"0 is unlimited" => "0 és sense límit",
-"Maximum input size for ZIP files" => "Mida màxima d'entrada per fitxers ZIP",
"Save" => "Desa",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Useu aquesta adreça per accedir als fitxers via WebDAV ",
@@ -83,7 +80,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "No teniu permisos per a pujar o crear els fitxers aquí",
"Nothing in here. Upload something!" => "Res per aquí. Pugeu alguna cosa!",
"Download" => "Baixa",
-"Delete" => "Esborra",
"Upload too large" => "La pujada és massa gran",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor",
"Files are being scanned, please wait." => "S'estan escanejant els fitxers, espereu"
diff --git a/apps/files/l10n/cs_CZ.php b/apps/files/l10n/cs_CZ.php
index ebfc2e6add78eca5ae2be368336e370f74a14e80..0e3c68a16f79266ae03e732496962589023bc935 100644
--- a/apps/files/l10n/cs_CZ.php
+++ b/apps/files/l10n/cs_CZ.php
@@ -41,6 +41,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Chyba při načítání URL",
"Share" => "Sdílet",
"Delete permanently" => "Trvale odstranit",
+"Delete" => "Smazat",
"Rename" => "Přejmenovat",
"Your download is being prepared. This might take some time if the files are big." => "Vaše soubory ke stažení se připravují. Pokud jsou velké, může to chvíli trvat.",
"Pending" => "Nevyřízené",
@@ -67,10 +68,6 @@ $TRANSLATIONS = array(
"File handling" => "Zacházení se soubory",
"Maximum upload size" => "Maximální velikost pro odesílání",
"max. possible: " => "největší možná: ",
-"Needed for multi-file and folder downloads." => "Potřebné pro více-souborové stahování a stahování složek.",
-"Enable ZIP-download" => "Povolit ZIP-stahování",
-"0 is unlimited" => "0 znamená bez omezení",
-"Maximum input size for ZIP files" => "Maximální velikost vstupu pro ZIP soubory",
"Save" => "Uložit",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Použijte tuto adresu pro přístup k vašim souborům přes WebDAV ",
@@ -84,7 +81,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Nemáte oprávnění zde nahrávat či vytvářet soubory",
"Nothing in here. Upload something!" => "Žádný obsah. Nahrajte něco.",
"Download" => "Stáhnout",
-"Delete" => "Smazat",
"Upload too large" => "Odesílaný soubor je příliš velký",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Soubory, které se snažíte odeslat, překračují limit velikosti odesílání na tomto serveru.",
"Files are being scanned, please wait." => "Soubory se prohledávají, prosím čekejte."
diff --git a/apps/files/l10n/cy_GB.php b/apps/files/l10n/cy_GB.php
index 443d21667ccfec2df1054397a4d93aad4cd1cf5f..84e108a93ae66c772452f2706ee4c0c92317ee53 100644
--- a/apps/files/l10n/cy_GB.php
+++ b/apps/files/l10n/cy_GB.php
@@ -20,6 +20,7 @@ $TRANSLATIONS = array(
"{new_name} already exists" => "{new_name} yn bodoli'n barod",
"Share" => "Rhannu",
"Delete permanently" => "Dileu'n barhaol",
+"Delete" => "Dileu",
"Rename" => "Ailenwi",
"Your download is being prepared. This might take some time if the files are big." => "Wrthi'n paratoi i lwytho i lawr. Gall gymryd peth amser os yw'r ffeiliau'n fawr.",
"Pending" => "I ddod",
@@ -35,10 +36,6 @@ $TRANSLATIONS = array(
"File handling" => "Trafod ffeiliau",
"Maximum upload size" => "Maint mwyaf llwytho i fyny",
"max. possible: " => "mwyaf. posib:",
-"Needed for multi-file and folder downloads." => "Angen ar gyfer llwytho mwy nag un ffeil neu blygell i lawr yr un pryd.",
-"Enable ZIP-download" => "Galluogi llwytho i lawr ZIP",
-"0 is unlimited" => "0 yn ddiderfyn",
-"Maximum input size for ZIP files" => "Maint mewnbynnu mwyaf ffeiliau ZIP",
"Save" => "Cadw",
"New" => "Newydd",
"Text file" => "Ffeil destun",
@@ -47,7 +44,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "Diddymu llwytho i fyny",
"Nothing in here. Upload something!" => "Does dim byd fan hyn. Llwythwch rhywbeth i fyny!",
"Download" => "Llwytho i lawr",
-"Delete" => "Dileu",
"Upload too large" => "Maint llwytho i fyny'n rhy fawr",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Mae'r ffeiliau rydych yn ceisio llwytho i fyny'n fwy na maint mwyaf llwytho ffeiliau i fyny ar y gweinydd hwn.",
"Files are being scanned, please wait." => "Arhoswch, mae ffeiliau'n cael eu sganio."
diff --git a/apps/files/l10n/da.php b/apps/files/l10n/da.php
index 95b848a50e510e729099164d9c3ec92044540bdb..24e95f8ec39a256d2cb7daeec4b92e07740e475d 100644
--- a/apps/files/l10n/da.php
+++ b/apps/files/l10n/da.php
@@ -41,6 +41,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Fejl ved URL",
"Share" => "Del",
"Delete permanently" => "Slet permanent",
+"Delete" => "Slet",
"Rename" => "Omdøb",
"Your download is being prepared. This might take some time if the files are big." => "Dit download forberedes. Dette kan tage lidt tid ved større filer.",
"Pending" => "Afventer",
@@ -67,10 +68,6 @@ $TRANSLATIONS = array(
"File handling" => "Filhåndtering",
"Maximum upload size" => "Maksimal upload-størrelse",
"max. possible: " => "max. mulige: ",
-"Needed for multi-file and folder downloads." => "Nødvendigt for at kunne downloade mapper og flere filer ad gangen.",
-"Enable ZIP-download" => "Tillad ZIP-download",
-"0 is unlimited" => "0 er ubegrænset",
-"Maximum input size for ZIP files" => "Maksimal størrelse på ZIP filer",
"Save" => "Gem",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Brug denne adresse for at tilgå dine filer via WebDAV ",
@@ -84,7 +81,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Du har ikke tilladelse til at uploade eller oprette filer her",
"Nothing in here. Upload something!" => "Her er tomt. Upload noget!",
"Download" => "Download",
-"Delete" => "Slet",
"Upload too large" => "Upload er for stor",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload på denne server.",
"Files are being scanned, please wait." => "Filerne bliver indlæst, vent venligst."
diff --git a/apps/files/l10n/de.php b/apps/files/l10n/de.php
index 685d84854b1967c420647cf871133f1f62a2401f..69a889ceca378f6cc8a0de765d5d71e2c0399ed1 100644
--- a/apps/files/l10n/de.php
+++ b/apps/files/l10n/de.php
@@ -42,6 +42,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Fehler beim Abrufen der URL",
"Share" => "Teilen",
"Delete permanently" => "Endgültig löschen",
+"Delete" => "Löschen",
"Rename" => "Umbenennen",
"Your download is being prepared. This might take some time if the files are big." => "Dein Download wird vorbereitet. Dies kann bei größeren Dateien etwas dauern.",
"Pending" => "Ausstehend",
@@ -68,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "Dateibehandlung",
"Maximum upload size" => "Maximale Upload-Größe",
"max. possible: " => "maximal möglich:",
-"Needed for multi-file and folder downloads." => "Für Mehrfachdatei- und Ordnerdownloads benötigt:",
-"Enable ZIP-download" => "ZIP-Download aktivieren",
-"0 is unlimited" => "0 bedeutet unbegrenzt",
-"Maximum input size for ZIP files" => "Maximale Größe für ZIP-Dateien",
"Save" => "Speichern",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Verwenden Sie diese Adresse, um via WebDAV auf Ihre Dateien zuzugreifen ",
@@ -85,7 +82,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Du besitzt hier keine Berechtigung, um Dateien hochzuladen oder zu erstellen",
"Nothing in here. Upload something!" => "Alles leer. Lade etwas hoch!",
"Download" => "Herunterladen",
-"Delete" => "Löschen",
"Upload too large" => "Der Upload ist zu groß",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.",
"Files are being scanned, please wait." => "Dateien werden gescannt, bitte warten.",
diff --git a/apps/files/l10n/de_AT.php b/apps/files/l10n/de_AT.php
index e1b55f6dd1043845e9c17913dbb38c76ce783ef3..d7aa8c2c6a81047b0be9a62ac9aadd3dc5821d9d 100644
--- a/apps/files/l10n/de_AT.php
+++ b/apps/files/l10n/de_AT.php
@@ -1,11 +1,11 @@
"Freigeben",
+"Delete" => "Löschen",
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
"Save" => "Speichern",
-"Download" => "Herunterladen",
-"Delete" => "Löschen"
+"Download" => "Herunterladen"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/de_CH.php b/apps/files/l10n/de_CH.php
index 536b0c055c95970de62f9650d43574b18d08ee91..71ac05b62c9ad1ed4c73bf4d6c4bb26cae0513bd 100644
--- a/apps/files/l10n/de_CH.php
+++ b/apps/files/l10n/de_CH.php
@@ -22,6 +22,7 @@ $TRANSLATIONS = array(
"{new_name} already exists" => "{new_name} existiert bereits",
"Share" => "Teilen",
"Delete permanently" => "Endgültig löschen",
+"Delete" => "Löschen",
"Rename" => "Umbenennen",
"Your download is being prepared. This might take some time if the files are big." => "Ihr Download wird vorbereitet. Dies kann bei grösseren Dateien etwas dauern.",
"Pending" => "Ausstehend",
@@ -39,10 +40,6 @@ $TRANSLATIONS = array(
"File handling" => "Dateibehandlung",
"Maximum upload size" => "Maximale Upload-Grösse",
"max. possible: " => "maximal möglich:",
-"Needed for multi-file and folder downloads." => "Für Mehrfachdatei- und Ordnerdownloads benötigt:",
-"Enable ZIP-download" => "ZIP-Download aktivieren",
-"0 is unlimited" => "0 bedeutet unbegrenzt",
-"Maximum input size for ZIP files" => "Maximale Grösse für ZIP-Dateien",
"Save" => "Speichern",
"WebDAV" => "WebDAV",
"New" => "Neu",
@@ -53,7 +50,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "Upload abbrechen",
"Nothing in here. Upload something!" => "Alles leer. Laden Sie etwas hoch!",
"Download" => "Herunterladen",
-"Delete" => "Löschen",
"Upload too large" => "Der Upload ist zu gross",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei überschreitet die Maximalgrösse für Uploads auf diesem Server.",
"Files are being scanned, please wait." => "Dateien werden gescannt, bitte warten."
diff --git a/apps/files/l10n/de_DE.php b/apps/files/l10n/de_DE.php
index bc7e12b066f9925cac7038e05ecbfe6c5792588c..c53c6a9a1b7374aadf5fa0d4585cfa74474e9fb6 100644
--- a/apps/files/l10n/de_DE.php
+++ b/apps/files/l10n/de_DE.php
@@ -42,6 +42,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Fehler beim Abrufen der URL",
"Share" => "Teilen",
"Delete permanently" => "Endgültig löschen",
+"Delete" => "Löschen",
"Rename" => "Umbenennen",
"Your download is being prepared. This might take some time if the files are big." => "Ihr Download wird vorbereitet. Dies kann bei größeren Dateien etwas dauern.",
"Pending" => "Ausstehend",
@@ -68,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "Dateibehandlung",
"Maximum upload size" => "Maximale Upload-Größe",
"max. possible: " => "maximal möglich:",
-"Needed for multi-file and folder downloads." => "Für Mehrfachdatei- und Ordnerdownloads benötigt:",
-"Enable ZIP-download" => "ZIP-Download aktivieren",
-"0 is unlimited" => "0 bedeutet unbegrenzt",
-"Maximum input size for ZIP files" => "Maximale Größe für ZIP-Dateien",
"Save" => "Speichern",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Verwenden Sie diese Adresse, um via WebDAV auf Ihre Dateien zuzugreifen ",
@@ -85,7 +82,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Sie besitzen hier keine Berechtigung Dateien hochzuladen oder zu erstellen",
"Nothing in here. Upload something!" => "Alles leer. Laden Sie etwas hoch!",
"Download" => "Herunterladen",
-"Delete" => "Löschen",
"Upload too large" => "Der Upload ist zu groß",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.",
"Files are being scanned, please wait." => "Dateien werden gescannt, bitte warten.",
diff --git a/apps/files/l10n/el.php b/apps/files/l10n/el.php
index 1ea2c3cc3d2bcf3ef355b93577d0664272bb3761..ea41540aa97914a27fb6f5b6a66e191246725ff5 100644
--- a/apps/files/l10n/el.php
+++ b/apps/files/l10n/el.php
@@ -42,6 +42,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Σφάλμα φόρτωσης URL",
"Share" => "Διαμοιρασμός",
"Delete permanently" => "Μόνιμη διαγραφή",
+"Delete" => "Διαγραφή",
"Rename" => "Μετονομασία",
"Your download is being prepared. This might take some time if the files are big." => "Η λήψη προετοιμάζεται. Αυτό μπορεί να πάρει ώρα εάν τα αρχεία έχουν μεγάλο μέγεθος.",
"Pending" => "Εκκρεμεί",
@@ -68,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "Διαχείριση αρχείων",
"Maximum upload size" => "Μέγιστο μέγεθος αποστολής",
"max. possible: " => "μέγιστο δυνατό:",
-"Needed for multi-file and folder downloads." => "Απαραίτητο για κατέβασμα πολλαπλών αρχείων και φακέλων",
-"Enable ZIP-download" => "Επιτρέπεται η λήψη ZIP",
-"0 is unlimited" => "0 για απεριόριστο",
-"Maximum input size for ZIP files" => "Μέγιστο μέγεθος για αρχεία ZIP",
"Save" => "Αποθήκευση",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Χρησιμοποιήστε αυτήν την διεύθυνση για να αποκτήσετε πρόσβαση στα αρχεία σας μέσω WebDAV ",
@@ -85,7 +82,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Δεν έχετε δικαιώματα φόρτωσης ή δημιουργίας αρχείων εδώ",
"Nothing in here. Upload something!" => "Δεν υπάρχει τίποτα εδώ. Ανεβάστε κάτι!",
"Download" => "Λήψη",
-"Delete" => "Διαγραφή",
"Upload too large" => "Πολύ μεγάλο αρχείο προς αποστολή",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Τα αρχεία που προσπαθείτε να ανεβάσετε υπερβαίνουν το μέγιστο μέγεθος αποστολής αρχείων σε αυτόν τον διακομιστή.",
"Files are being scanned, please wait." => "Τα αρχεία σαρώνονται, παρακαλώ περιμένετε."
diff --git a/apps/files/l10n/en_GB.php b/apps/files/l10n/en_GB.php
index 37229a45808885f6090a06ab36af1b16d3ea4b28..273a69490bbc05d9d45082ed10b4c86820c37331 100644
--- a/apps/files/l10n/en_GB.php
+++ b/apps/files/l10n/en_GB.php
@@ -42,6 +42,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Error fetching URL",
"Share" => "Share",
"Delete permanently" => "Delete permanently",
+"Delete" => "Delete",
"Rename" => "Rename",
"Your download is being prepared. This might take some time if the files are big." => "Your download is being prepared. This might take some time if the files are big.",
"Pending" => "Pending",
@@ -68,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "File handling",
"Maximum upload size" => "Maximum upload size",
"max. possible: " => "max. possible: ",
-"Needed for multi-file and folder downloads." => "Needed for multi-file and folder downloads.",
-"Enable ZIP-download" => "Enable ZIP-download",
-"0 is unlimited" => "0 is unlimited",
-"Maximum input size for ZIP files" => "Maximum input size for ZIP files",
"Save" => "Save",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Use this address to access your Files via WebDAV ",
@@ -85,7 +82,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "You don’t have permission to upload or create files here",
"Nothing in here. Upload something!" => "Nothing in here. Upload something!",
"Download" => "Download",
-"Delete" => "Delete",
"Upload too large" => "Upload too large",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "The files you are trying to upload exceed the maximum size for file uploads on this server.",
"Files are being scanned, please wait." => "Files are being scanned, please wait.",
diff --git a/apps/files/l10n/eo.php b/apps/files/l10n/eo.php
index 651948dfeb0301261bc8e9ad98cc5c3e084e50c0..45c9ca78aad22f954db2f45e7e0e4360b4581f15 100644
--- a/apps/files/l10n/eo.php
+++ b/apps/files/l10n/eo.php
@@ -34,6 +34,7 @@ $TRANSLATIONS = array(
"Could not create folder" => "Ne povis kreiĝi dosierujo",
"Share" => "Kunhavigi",
"Delete permanently" => "Forigi por ĉiam",
+"Delete" => "Forigi",
"Rename" => "Alinomigi",
"Your download is being prepared. This might take some time if the files are big." => "Via elŝuto pretiĝatas. Ĉi tio povas daŭri iom da tempo se la dosieroj grandas.",
"Pending" => "Traktotaj",
@@ -53,10 +54,6 @@ $TRANSLATIONS = array(
"File handling" => "Dosieradministro",
"Maximum upload size" => "Maksimuma alŝutogrando",
"max. possible: " => "maks. ebla: ",
-"Needed for multi-file and folder downloads." => "Necesa por elŝuto de pluraj dosieroj kaj dosierujoj.",
-"Enable ZIP-download" => "Kapabligi ZIP-elŝuton",
-"0 is unlimited" => "0 signifas senlime",
-"Maximum input size for ZIP files" => "Maksimuma enirgrando por ZIP-dosieroj",
"Save" => "Konservi",
"WebDAV" => "WebDAV",
"New" => "Nova",
@@ -68,7 +65,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Vi ne havas permeson alŝuti aŭ krei dosierojn ĉi tie",
"Nothing in here. Upload something!" => "Nenio estas ĉi tie. Alŝutu ion!",
"Download" => "Elŝuti",
-"Delete" => "Forigi",
"Upload too large" => "Alŝuto tro larĝa",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.",
"Files are being scanned, please wait." => "Dosieroj estas skanataj, bonvolu atendi."
diff --git a/apps/files/l10n/es.php b/apps/files/l10n/es.php
index 9449f90f1c984e6e96e8a78730d10d2fd00c030d..13a9d717e91070027f83c1e7250fb19f63d76b1f 100644
--- a/apps/files/l10n/es.php
+++ b/apps/files/l10n/es.php
@@ -42,6 +42,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Error al descargar URL.",
"Share" => "Compartir",
"Delete permanently" => "Eliminar permanentemente",
+"Delete" => "Eliminar",
"Rename" => "Renombrar",
"Your download is being prepared. This might take some time if the files are big." => "Su descarga está siendo preparada. Esto podría tardar algo de tiempo si los archivos son grandes.",
"Pending" => "Pendiente",
@@ -68,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "Administración de archivos",
"Maximum upload size" => "Tamaño máximo de subida",
"max. possible: " => "máx. posible:",
-"Needed for multi-file and folder downloads." => "Necesario para multi-archivo y descarga de carpetas",
-"Enable ZIP-download" => "Habilitar descarga en ZIP",
-"0 is unlimited" => "0 significa ilimitado",
-"Maximum input size for ZIP files" => "Tamaño máximo para archivos ZIP de entrada",
"Save" => "Guardar",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Use esta URL para acceder via WebDAV ",
@@ -85,7 +82,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "No tienes permisos para subir o crear archivos aquí.",
"Nothing in here. Upload something!" => "No hay nada aquí. ¡Suba algo!",
"Download" => "Descargar",
-"Delete" => "Eliminar",
"Upload too large" => "Subida demasido grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.",
"Files are being scanned, please wait." => "Los archivos están siendo escaneados, por favor espere.",
diff --git a/apps/files/l10n/es_AR.php b/apps/files/l10n/es_AR.php
index 3bef48950552e41e1e9d9329b679c66847a4fef8..98ef52894dc3602791be8d0b21582441c912633d 100644
--- a/apps/files/l10n/es_AR.php
+++ b/apps/files/l10n/es_AR.php
@@ -37,6 +37,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Error al obtener la URL",
"Share" => "Compartir",
"Delete permanently" => "Borrar permanentemente",
+"Delete" => "Borrar",
"Rename" => "Cambiar nombre",
"Your download is being prepared. This might take some time if the files are big." => "Tu descarga se está preparando. Esto puede demorar si los archivos son muy grandes.",
"Pending" => "Pendientes",
@@ -60,10 +61,6 @@ $TRANSLATIONS = array(
"File handling" => "Tratamiento de archivos",
"Maximum upload size" => "Tamaño máximo de subida",
"max. possible: " => "máx. posible:",
-"Needed for multi-file and folder downloads." => "Es necesario para descargas multi-archivo y de directorios.",
-"Enable ZIP-download" => "Habilitar descarga en formato ZIP",
-"0 is unlimited" => "0 significa ilimitado",
-"Maximum input size for ZIP files" => "Tamaño máximo para archivos ZIP de entrada",
"Save" => "Guardar",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Usar esta dirección para acceder a tus archivos vía WebDAV ",
@@ -77,7 +74,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "No tienes permisos para subir o crear archivos aquí",
"Nothing in here. Upload something!" => "No hay nada. ¡Subí contenido!",
"Download" => "Descargar",
-"Delete" => "Borrar",
"Upload too large" => "El tamaño del archivo que querés subir es demasiado grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Los archivos que intentás subir sobrepasan el tamaño máximo ",
"Files are being scanned, please wait." => "Se están escaneando los archivos, por favor esperá."
diff --git a/apps/files/l10n/es_MX.php b/apps/files/l10n/es_MX.php
index 3743a33f606d7744e0b1e2d12f3c3fd22c535574..b02cd1be769546edcd9080401a19ea986293b4da 100644
--- a/apps/files/l10n/es_MX.php
+++ b/apps/files/l10n/es_MX.php
@@ -37,6 +37,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Error al descargar URL.",
"Share" => "Compartir",
"Delete permanently" => "Eliminar permanentemente",
+"Delete" => "Eliminar",
"Rename" => "Renombrar",
"Your download is being prepared. This might take some time if the files are big." => "Su descarga está siendo preparada. Esto podría tardar algo de tiempo si los archivos son grandes.",
"Pending" => "Pendiente",
@@ -60,10 +61,6 @@ $TRANSLATIONS = array(
"File handling" => "Administración de archivos",
"Maximum upload size" => "Tamaño máximo de subida",
"max. possible: " => "máx. posible:",
-"Needed for multi-file and folder downloads." => "Necesario para multi-archivo y descarga de carpetas",
-"Enable ZIP-download" => "Habilitar descarga en ZIP",
-"0 is unlimited" => "0 significa ilimitado",
-"Maximum input size for ZIP files" => "Tamaño máximo para archivos ZIP de entrada",
"Save" => "Guardar",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Utilice esta dirección para acceder a sus archivos vía WebDAV ",
@@ -77,7 +74,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "No tienes permisos para subir o crear archivos aquí.",
"Nothing in here. Upload something!" => "No hay nada aquí. ¡Suba algo!",
"Download" => "Descargar",
-"Delete" => "Eliminar",
"Upload too large" => "Subida demasido grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.",
"Files are being scanned, please wait." => "Los archivos están siendo escaneados, por favor espere."
diff --git a/apps/files/l10n/et_EE.php b/apps/files/l10n/et_EE.php
index 7531d2b25627ed7946ee0f2b7c7e51dbeef2f172..1903b8acff652bea7d61d364e1f37ea4d6cd0b28 100644
--- a/apps/files/l10n/et_EE.php
+++ b/apps/files/l10n/et_EE.php
@@ -69,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "Failide käsitlemine",
"Maximum upload size" => "Maksimaalne üleslaadimise suurus",
"max. possible: " => "maks. võimalik: ",
-"Needed for multi-file and folder downloads." => "Vajalik mitme faili ja kausta allalaadimiste jaoks.",
-"Enable ZIP-download" => "Luba ZIP-ina allalaadimine",
-"0 is unlimited" => "0 tähendab piiramatut",
-"Maximum input size for ZIP files" => "Maksimaalne ZIP-faili sisestatava faili suurus",
"Save" => "Salvesta",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Kasuta seda aadressi oma failidele ligipääsuks WebDAV kaudu ",
diff --git a/apps/files/l10n/eu.php b/apps/files/l10n/eu.php
index b60358e4202c640af4d32c4d93a8892651f4e040..d796ab96b5e619bc5dbd961192f9e0b2ace69dc6 100644
--- a/apps/files/l10n/eu.php
+++ b/apps/files/l10n/eu.php
@@ -41,6 +41,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Errorea URLa eskuratzerakoan",
"Share" => "Elkarbanatu",
"Delete permanently" => "Ezabatu betirako",
+"Delete" => "Ezabatu",
"Rename" => "Berrizendatu",
"Your download is being prepared. This might take some time if the files are big." => "Zure deskarga prestatu egin behar da. Denbora bat har lezake fitxategiak handiak badira. ",
"Pending" => "Zain",
@@ -67,10 +68,6 @@ $TRANSLATIONS = array(
"File handling" => "Fitxategien kudeaketa",
"Maximum upload size" => "Igo daitekeen gehienezko tamaina",
"max. possible: " => "max, posiblea:",
-"Needed for multi-file and folder downloads." => "Beharrezkoa fitxategi-anitz eta karpeten deskargarako.",
-"Enable ZIP-download" => "Gaitu ZIP-deskarga",
-"0 is unlimited" => "0 mugarik gabe esan nahi du",
-"Maximum input size for ZIP files" => "ZIP fitxategien gehienezko tamaina",
"Save" => "Gorde",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "helbidea erabili zure fitxategiak WebDAV bidez eskuratzeko ",
@@ -84,7 +81,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Ez duzu fitxategiak hona igotzeko edo hemen sortzeko baimenik",
"Nothing in here. Upload something!" => "Ez dago ezer. Igo zerbait!",
"Download" => "Deskargatu",
-"Delete" => "Ezabatu",
"Upload too large" => "Igoera handiegia da",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira.",
"Files are being scanned, please wait." => "Fitxategiak eskaneatzen ari da, itxoin mezedez."
diff --git a/apps/files/l10n/eu_ES.php b/apps/files/l10n/eu_ES.php
index 293e6de83798fce65add09d9bf652ea5809b8823..e2be349d06b882ded019ef867d23ce8f937cc6ef 100644
--- a/apps/files/l10n/eu_ES.php
+++ b/apps/files/l10n/eu_ES.php
@@ -1,10 +1,10 @@
"Ezabatu",
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
"Save" => "Gorde",
-"Download" => "Deskargatu",
-"Delete" => "Ezabatu"
+"Download" => "Deskargatu"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/fa.php b/apps/files/l10n/fa.php
index 46e8dca52349031e0c92af62742d81cd461f9871..f99b34d32146d686d210f04b14c4608ffe9de8a3 100644
--- a/apps/files/l10n/fa.php
+++ b/apps/files/l10n/fa.php
@@ -22,6 +22,7 @@ $TRANSLATIONS = array(
"{new_name} already exists" => "{نام _جدید} در حال حاضر وجود دارد.",
"Share" => "اشتراکگذاری",
"Delete permanently" => "حذف قطعی",
+"Delete" => "حذف",
"Rename" => "تغییرنام",
"Your download is being prepared. This might take some time if the files are big." => "دانلود شما در حال آماده شدن است. در صورتیکه پرونده ها بزرگ باشند ممکن است مدتی طول بکشد.",
"Pending" => "در انتظار",
@@ -38,10 +39,6 @@ $TRANSLATIONS = array(
"File handling" => "اداره پرونده ها",
"Maximum upload size" => "حداکثر اندازه بارگزاری",
"max. possible: " => "حداکثرمقدارممکن:",
-"Needed for multi-file and folder downloads." => "احتیاج پیدا خواهد شد برای چند پوشه و پرونده",
-"Enable ZIP-download" => "فعال سازی بارگیری پرونده های فشرده",
-"0 is unlimited" => "0 نامحدود است",
-"Maximum input size for ZIP files" => "حداکثرمقدار برای بار گزاری پرونده های فشرده",
"Save" => "ذخیره",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "از این آدرس استفاده کنید تا بتوانید به فایلهای خود توسط WebDAV دسترسی پیدا کنید ",
@@ -53,7 +50,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "متوقف کردن بار گذاری",
"Nothing in here. Upload something!" => "اینجا هیچ چیز نیست.",
"Download" => "دانلود",
-"Delete" => "حذف",
"Upload too large" => "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد",
"Files are being scanned, please wait." => "پرونده ها در حال بازرسی هستند لطفا صبر کنید"
diff --git a/apps/files/l10n/fi_FI.php b/apps/files/l10n/fi_FI.php
index 668f85cfc45de31b6f5be3f1c6329c5f1be9693e..47da8e36d8b90a49efc495c0d8af6196f2ee2052 100644
--- a/apps/files/l10n/fi_FI.php
+++ b/apps/files/l10n/fi_FI.php
@@ -41,6 +41,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Virhe noutaessa verkko-osoitetta",
"Share" => "Jaa",
"Delete permanently" => "Poista pysyvästi",
+"Delete" => "Poista",
"Rename" => "Nimeä uudelleen",
"Your download is being prepared. This might take some time if the files are big." => "Lataustasi valmistellaan. Tämä saattaa kestää hetken, jos tiedostot ovat suuria kooltaan.",
"Pending" => "Odottaa",
@@ -67,10 +68,6 @@ $TRANSLATIONS = array(
"File handling" => "Tiedostonhallinta",
"Maximum upload size" => "Lähetettävän tiedoston suurin sallittu koko",
"max. possible: " => "suurin mahdollinen:",
-"Needed for multi-file and folder downloads." => "Tarvitaan useampien tiedostojen ja kansioiden latausta varten.",
-"Enable ZIP-download" => "Ota ZIP-paketin lataaminen käytöön",
-"0 is unlimited" => "0 on rajoittamaton",
-"Maximum input size for ZIP files" => "ZIP-tiedostojen enimmäiskoko",
"Save" => "Tallenna",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Käytä tätä osoitetta käyttääksesi tiedostojasi WebDAVin kautta ",
@@ -84,7 +81,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Käyttöoikeutesi eivät riitä tiedostojen lähettämiseen tai kansioiden luomiseen tähän sijaintiin",
"Nothing in here. Upload something!" => "Täällä ei ole mitään. Lähetä tänne jotakin!",
"Download" => "Lataa",
-"Delete" => "Poista",
"Upload too large" => "Lähetettävä tiedosto on liian suuri",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan.",
"Files are being scanned, please wait." => "Tiedostoja tarkistetaan, odota hetki.",
diff --git a/apps/files/l10n/fr.php b/apps/files/l10n/fr.php
index fcba687f4b474fb77a81f5b4001dd9ecdec667ae..493e449785ad78b57a1c28ee89a008cc935a335f 100644
--- a/apps/files/l10n/fr.php
+++ b/apps/files/l10n/fr.php
@@ -42,6 +42,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Erreur d'accès à l'URL",
"Share" => "Partager",
"Delete permanently" => "Supprimer de façon définitive",
+"Delete" => "Supprimer",
"Rename" => "Renommer",
"Your download is being prepared. This might take some time if the files are big." => "Votre téléchargement est cours de préparation. Ceci peut nécessiter un certain temps si les fichiers sont volumineux.",
"Pending" => "En attente",
@@ -68,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "Gestion des fichiers",
"Maximum upload size" => "Taille max. d'envoi",
"max. possible: " => "Max. possible :",
-"Needed for multi-file and folder downloads." => "Nécessaire pour le téléchargement de plusieurs fichiers et de dossiers.",
-"Enable ZIP-download" => "Activer le téléchargement ZIP",
-"0 is unlimited" => "0 est illimité",
-"Maximum input size for ZIP files" => "Taille maximale pour les fichiers ZIP",
"Save" => "Sauvegarder",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Utiliser cette adresse pour accéder à vos fichiers par WebDAV ",
@@ -85,7 +82,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Vous n'avez pas la permission de téléverser ou de créer des fichiers ici",
"Nothing in here. Upload something!" => "Il n'y a rien ici ! Envoyez donc quelque chose :)",
"Download" => "Télécharger",
-"Delete" => "Supprimer",
"Upload too large" => "Téléversement trop volumineux",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Les fichiers que vous essayez d'envoyer dépassent la taille maximale permise par ce serveur.",
"Files are being scanned, please wait." => "Les fichiers sont en cours d'analyse, veuillez patienter.",
diff --git a/apps/files/l10n/gl.php b/apps/files/l10n/gl.php
index 611809e506c58d84923787c486fc1c275938d5ad..866d8a366faa528e228f613c4fd79b8f9d54c30c 100644
--- a/apps/files/l10n/gl.php
+++ b/apps/files/l10n/gl.php
@@ -42,6 +42,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Produciuse un erro ao obter o URL",
"Share" => "Compartir",
"Delete permanently" => "Eliminar permanentemente",
+"Delete" => "Eliminar",
"Rename" => "Renomear",
"Your download is being prepared. This might take some time if the files are big." => "Está a prepararse a súa descarga. Isto pode levar bastante tempo se os ficheiros son grandes.",
"Pending" => "Pendentes",
@@ -68,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "Manexo de ficheiro",
"Maximum upload size" => "Tamaño máximo do envío",
"max. possible: " => "máx. posíbel: ",
-"Needed for multi-file and folder downloads." => "Precísase para a descarga de varios ficheiros e cartafoles.",
-"Enable ZIP-download" => "Activar a descarga ZIP",
-"0 is unlimited" => "0 significa ilimitado",
-"Maximum input size for ZIP files" => "Tamaño máximo de descarga para os ficheiros ZIP",
"Save" => "Gardar",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Empregue esta ligazón para acceder aos seus ficheiros mediante WebDAV ",
@@ -85,8 +82,7 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Non ten permisos para enviar ou crear ficheiros aquí.",
"Nothing in here. Upload something!" => "Aquí non hai nada. Envíe algo.",
"Download" => "Descargar",
-"Delete" => "Eliminar",
-"Upload too large" => "Envío demasiado grande",
+"Upload too large" => "Envío grande de máis",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os ficheiros que tenta enviar exceden do tamaño máximo permitido neste servidor",
"Files are being scanned, please wait." => "Estanse analizando os ficheiros. Agarde.",
"Currently scanning" => "Análise actual"
diff --git a/apps/files/l10n/he.php b/apps/files/l10n/he.php
index 56810eaabefe0e872a888777eb7a710ef0ad30d5..7f312f348c12419a5159f4fc6b008706816c53b8 100644
--- a/apps/files/l10n/he.php
+++ b/apps/files/l10n/he.php
@@ -22,6 +22,7 @@ $TRANSLATIONS = array(
"{new_name} already exists" => "{new_name} כבר קיים",
"Share" => "שתף",
"Delete permanently" => "מחק לצמיתות",
+"Delete" => "מחיקה",
"Rename" => "שינוי שם",
"Pending" => "ממתין",
"Error" => "שגיאה",
@@ -35,10 +36,6 @@ $TRANSLATIONS = array(
"File handling" => "טיפול בקבצים",
"Maximum upload size" => "גודל העלאה מקסימלי",
"max. possible: " => "המרבי האפשרי: ",
-"Needed for multi-file and folder downloads." => "נחוץ להורדה של ריבוי קבצים או תיקיות.",
-"Enable ZIP-download" => "הפעלת הורדת ZIP",
-"0 is unlimited" => "0 - ללא הגבלה",
-"Maximum input size for ZIP files" => "גודל הקלט המרבי לקובצי ZIP",
"Save" => "שמירה",
"WebDAV" => "WebDAV",
"New" => "חדש",
@@ -48,7 +45,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "ביטול ההעלאה",
"Nothing in here. Upload something!" => "אין כאן שום דבר. אולי ברצונך להעלות משהו?",
"Download" => "הורדה",
-"Delete" => "מחיקה",
"Upload too large" => "העלאה גדולה מידי",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.",
"Files are being scanned, please wait." => "הקבצים נסרקים, נא להמתין."
diff --git a/apps/files/l10n/hr.php b/apps/files/l10n/hr.php
index 626a7d6a6e0cded1e98eeb6955edf90afeca707d..09bf62070f450e4f8b076ac070fc0a5e9df52cc7 100644
--- a/apps/files/l10n/hr.php
+++ b/apps/files/l10n/hr.php
@@ -10,6 +10,7 @@ $TRANSLATIONS = array(
"Upload cancelled." => "Slanje poništeno.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Učitavanje datoteke. Napuštanjem stranice će prekinuti učitavanje.",
"Share" => "Podijeli",
+"Delete" => "Obriši",
"Rename" => "Promjeni ime",
"Pending" => "U tijeku",
"Error" => "Greška",
@@ -22,10 +23,6 @@ $TRANSLATIONS = array(
"File handling" => "datoteka za rukovanje",
"Maximum upload size" => "Maksimalna veličina prijenosa",
"max. possible: " => "maksimalna moguća: ",
-"Needed for multi-file and folder downloads." => "Potrebno za preuzimanje više datoteke i mape",
-"Enable ZIP-download" => "Omogući ZIP-preuzimanje",
-"0 is unlimited" => "0 je \"bez limita\"",
-"Maximum input size for ZIP files" => "Maksimalna veličina za ZIP datoteke",
"Save" => "Snimi",
"New" => "novo",
"Text file" => "tekstualna datoteka",
@@ -33,7 +30,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "Prekini upload",
"Nothing in here. Upload something!" => "Nema ničega u ovoj mapi. Pošalji nešto!",
"Download" => "Preuzimanje",
-"Delete" => "Obriši",
"Upload too large" => "Prijenos je preobiman",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteke koje pokušavate prenijeti prelaze maksimalnu veličinu za prijenos datoteka na ovom poslužitelju.",
"Files are being scanned, please wait." => "Datoteke se skeniraju, molimo pričekajte."
diff --git a/apps/files/l10n/hu_HU.php b/apps/files/l10n/hu_HU.php
index 02ca5866e2fde7fbece99be2fc77583e493902b6..98b72ae832975bcae911fb180748a7468d9fb623 100644
--- a/apps/files/l10n/hu_HU.php
+++ b/apps/files/l10n/hu_HU.php
@@ -37,6 +37,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "A megadott URL-ről nem sikerül adatokat kapni",
"Share" => "Megosztás",
"Delete permanently" => "Végleges törlés",
+"Delete" => "Törlés",
"Rename" => "Átnevezés",
"Your download is being prepared. This might take some time if the files are big." => "Készül a letöltendő állomány. Ez eltarthat egy ideig, ha nagyok a fájlok.",
"Pending" => "Folyamatban",
@@ -60,10 +61,6 @@ $TRANSLATIONS = array(
"File handling" => "Fájlkezelés",
"Maximum upload size" => "Maximális feltölthető fájlméret",
"max. possible: " => "max. lehetséges: ",
-"Needed for multi-file and folder downloads." => "Kötegelt fájl- vagy mappaletöltéshez szükséges",
-"Enable ZIP-download" => "A ZIP-letöltés engedélyezése",
-"0 is unlimited" => "0 = korlátlan",
-"Maximum input size for ZIP files" => "ZIP-fájlok maximális kiindulási mérete",
"Save" => "Mentés",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Ezt a címet használd, hogy hozzáférj a fileokhoz WebDAV-on keresztül ",
@@ -77,7 +74,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Önnek nincs jogosultsága ahhoz, hogy ide állományokat töltsön föl, vagy itt újakat hozzon létre",
"Nothing in here. Upload something!" => "Itt nincs semmi. Töltsön fel valamit!",
"Download" => "Letöltés",
-"Delete" => "Törlés",
"Upload too large" => "A feltöltés túl nagy",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "A feltöltendő állományok mérete meghaladja a kiszolgálón megengedett maximális méretet.",
"Files are being scanned, please wait." => "A fájllista ellenőrzése zajlik, kis türelmet!"
diff --git a/apps/files/l10n/hy.php b/apps/files/l10n/hy.php
index 9a5ebb862a9f150acb2fbb4c1a9c4ba170136fdc..c32411a57d1333856313d39dd52bd2036420ffeb 100644
--- a/apps/files/l10n/hy.php
+++ b/apps/files/l10n/hy.php
@@ -1,10 +1,10 @@
"Ջնջել",
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
"Save" => "Պահպանել",
-"Download" => "Բեռնել",
-"Delete" => "Ջնջել"
+"Download" => "Բեռնել"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/ia.php b/apps/files/l10n/ia.php
index 51d433258bb9f3ad303dc30eee951eb437625e6e..5a9cdfac4079336dbac14700694a498b8904d569 100644
--- a/apps/files/l10n/ia.php
+++ b/apps/files/l10n/ia.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Manca un dossier temporari",
"Files" => "Files",
"Share" => "Compartir",
+"Delete" => "Deler",
"Error" => "Error",
"Name" => "Nomine",
"Size" => "Dimension",
@@ -20,7 +21,6 @@ $TRANSLATIONS = array(
"Folder" => "Dossier",
"Nothing in here. Upload something!" => "Nihil hic. Incarga alcun cosa!",
"Download" => "Discargar",
-"Delete" => "Deler",
"Upload too large" => "Incargamento troppo longe"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/id.php b/apps/files/l10n/id.php
index 67896a2a6ddf683f42455637bfceceab21101c0a..2ec2aff185dca844c745860c3d2b9a444d04604b 100644
--- a/apps/files/l10n/id.php
+++ b/apps/files/l10n/id.php
@@ -35,6 +35,7 @@ $TRANSLATIONS = array(
"Could not create folder" => "Tidak dapat membuat folder",
"Share" => "Bagikan",
"Delete permanently" => "Hapus secara permanen",
+"Delete" => "Hapus",
"Rename" => "Ubah nama",
"Your download is being prepared. This might take some time if the files are big." => "Unduhan Anda sedang disiapkan. Prosesnya dapat berlangsung agak lama jika ukuran berkasnya besar.",
"Pending" => "Menunggu",
@@ -58,10 +59,6 @@ $TRANSLATIONS = array(
"File handling" => "Penanganan berkas",
"Maximum upload size" => "Ukuran pengunggahan maksimum",
"max. possible: " => "Kemungkinan maks.:",
-"Needed for multi-file and folder downloads." => "Dibutuhkan untuk pengunduhan multi-berkas dan multi-folder",
-"Enable ZIP-download" => "Aktifkan unduhan ZIP",
-"0 is unlimited" => "0 berarti tidak terbatas",
-"Maximum input size for ZIP files" => "Ukuran masukan maksimum untuk berkas ZIP",
"Save" => "Simpan",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Gunakan alamat ini untuk mengakses Berkas via WebDAV ",
@@ -75,7 +72,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Anda tidak memiliki akses untuk mengunggah atau membuat berkas disini",
"Nothing in here. Upload something!" => "Tidak ada apa-apa di sini. Unggah sesuatu!",
"Download" => "Unduh",
-"Delete" => "Hapus",
"Upload too large" => "Yang diunggah terlalu besar",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Berkas yang dicoba untuk diunggah melebihi ukuran maksimum pengunggahan berkas di server ini.",
"Files are being scanned, please wait." => "Berkas sedang dipindai, silakan tunggu."
diff --git a/apps/files/l10n/is.php b/apps/files/l10n/is.php
index fef4df6ea1750d4ca0d534ef3551d36a0467b829..08ae40c575efa20aec6d5293faaae9ddbb31eb1f 100644
--- a/apps/files/l10n/is.php
+++ b/apps/files/l10n/is.php
@@ -18,6 +18,7 @@ $TRANSLATIONS = array(
"File upload is in progress. Leaving the page now will cancel the upload." => "Innsending í gangi. Ef þú ferð af þessari síðu mun innsending misheppnast.",
"{new_name} already exists" => "{new_name} er þegar til",
"Share" => "Deila",
+"Delete" => "Eyða",
"Rename" => "Endurskýra",
"Pending" => "Bíður",
"Error" => "Villa",
@@ -30,10 +31,6 @@ $TRANSLATIONS = array(
"File handling" => "Meðhöndlun skrár",
"Maximum upload size" => "Hámarks stærð innsendingar",
"max. possible: " => "hámark mögulegt: ",
-"Needed for multi-file and folder downloads." => "Nauðsynlegt til að sækja margar skrár og möppur í einu.",
-"Enable ZIP-download" => "Virkja ZIP niðurhal.",
-"0 is unlimited" => "0 er ótakmarkað",
-"Maximum input size for ZIP files" => "Hámarks inntaksstærð fyrir ZIP skrár",
"Save" => "Vista",
"WebDAV" => "WebDAV",
"New" => "Nýtt",
@@ -43,7 +40,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "Hætta við innsendingu",
"Nothing in here. Upload something!" => "Ekkert hér. Settu eitthvað inn!",
"Download" => "Niðurhal",
-"Delete" => "Eyða",
"Upload too large" => "Innsend skrá er of stór",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Skrárnar sem þú ert að senda inn eru stærri en hámarks innsendingarstærð á þessum netþjóni.",
"Files are being scanned, please wait." => "Verið er að skima skrár, vinsamlegast hinkraðu."
diff --git a/apps/files/l10n/it.php b/apps/files/l10n/it.php
index e7bdf24e455c59bc18339d12a8306404e9659c57..25801f6ad71c064082f45dcab065835dc7df7c5f 100644
--- a/apps/files/l10n/it.php
+++ b/apps/files/l10n/it.php
@@ -42,6 +42,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Errore durante il recupero dello URL",
"Share" => "Condividi",
"Delete permanently" => "Elimina definitivamente",
+"Delete" => "Elimina",
"Rename" => "Rinomina",
"Your download is being prepared. This might take some time if the files are big." => "Il tuo scaricamento è in fase di preparazione. Ciò potrebbe richiedere del tempo se i file sono grandi.",
"Pending" => "In corso",
@@ -68,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "Gestione file",
"Maximum upload size" => "Dimensione massima upload",
"max. possible: " => "numero mass.: ",
-"Needed for multi-file and folder downloads." => "Necessario per lo scaricamento di file multipli e cartelle.",
-"Enable ZIP-download" => "Abilita scaricamento ZIP",
-"0 is unlimited" => "0 è illimitato",
-"Maximum input size for ZIP files" => "Dimensione massima per i file ZIP",
"Save" => "Salva",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Utilizza questo indirizzo per accedere ai tuoi file con WebDAV ",
@@ -85,7 +82,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Qui non hai i permessi di caricare o creare file",
"Nothing in here. Upload something!" => "Non c'è niente qui. Carica qualcosa!",
"Download" => "Scarica",
-"Delete" => "Elimina",
"Upload too large" => "Caricamento troppo grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "I file che stai provando a caricare superano la dimensione massima consentita su questo server.",
"Files are being scanned, please wait." => "Scansione dei file in corso, attendi",
diff --git a/apps/files/l10n/ja.php b/apps/files/l10n/ja.php
index c0e0468bafd69ce5365e1c967040507e81b322ee..fe1a9aeb86404711339cb43ff4fbcab81e65e918 100644
--- a/apps/files/l10n/ja.php
+++ b/apps/files/l10n/ja.php
@@ -5,7 +5,7 @@ $TRANSLATIONS = array(
"File name cannot be empty." => "ファイル名を空にすることはできません。",
"\"%s\" is an invalid file name." => "\"%s\" は無効なファイル名です。",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "無効な名前、'\\', '/', '<', '>', ':', '\"', '|', '?', '*' は使用できません。",
-"The target folder has been moved or deleted." => "目標のフォルダは移動されたか、削除されました。",
+"The target folder has been moved or deleted." => "対象のフォルダーは移動されたか、削除されました。",
"The name %s is already used in the folder %s. Please choose a different name." => "%s はフォルダー %s ですでに使われています。別の名前を選択してください。",
"Not a valid source" => "有効なソースではありません",
"Server is not allowed to open URLs, please check the server configuration" => "サーバーは、URLを開くことは許されません。サーバーの設定をチェックしてください。",
@@ -42,6 +42,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "URL取得エラー",
"Share" => "共有",
"Delete permanently" => "完全に削除する",
+"Delete" => "削除",
"Rename" => "名前の変更",
"Your download is being prepared. This might take some time if the files are big." => "ダウンロードの準備中です。ファイルサイズが大きい場合は少し時間がかかるかもしれません。",
"Pending" => "中断",
@@ -68,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "ファイル操作",
"Maximum upload size" => "最大アップロードサイズ",
"max. possible: " => "最大容量: ",
-"Needed for multi-file and folder downloads." => "複数ファイルおよびフォルダーのダウンロードに必要",
-"Enable ZIP-download" => "ZIP形式のダウンロードを有効にする",
-"0 is unlimited" => "0を指定した場合は無制限",
-"Maximum input size for ZIP files" => "ZIPファイルでの最大入力サイズ",
"Save" => "保存",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "WebDAV 経由でファイルにアクセス するにはこのアドレスを利用してください",
@@ -85,9 +82,9 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "ここにファイルをアップロードもしくは作成する権限がありません",
"Nothing in here. Upload something!" => "ここには何もありません。何かアップロードしてください。",
"Download" => "ダウンロード",
-"Delete" => "削除",
"Upload too large" => "アップロードには大きすぎます。",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "アップロードしようとしているファイルは、サーバーで規定された最大サイズを超えています。",
-"Files are being scanned, please wait." => "ファイルをスキャンしています、しばらくお待ちください。"
+"Files are being scanned, please wait." => "ファイルをスキャンしています、しばらくお待ちください。",
+"Currently scanning" => "現在スキャン中"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/ka_GE.php b/apps/files/l10n/ka_GE.php
index 82f3404cfe8a8db02b9994210186c176c1afa8a3..09e247e7079685bfce153f3b4e6ba06d1ec41c24 100644
--- a/apps/files/l10n/ka_GE.php
+++ b/apps/files/l10n/ka_GE.php
@@ -20,6 +20,7 @@ $TRANSLATIONS = array(
"{new_name} already exists" => "{new_name} უკვე არსებობს",
"Share" => "გაზიარება",
"Delete permanently" => "სრულად წაშლა",
+"Delete" => "წაშლა",
"Rename" => "გადარქმევა",
"Your download is being prepared. This might take some time if the files are big." => "გადმოწერის მოთხოვნა მუშავდება. ის მოითხოვს გარკვეულ დროს რაგდან ფაილები არის დიდი ზომის.",
"Pending" => "მოცდის რეჟიმში",
@@ -35,10 +36,6 @@ $TRANSLATIONS = array(
"File handling" => "ფაილის დამუშავება",
"Maximum upload size" => "მაქსიმუმ ატვირთის ზომა",
"max. possible: " => "მაქს. შესაძლებელი:",
-"Needed for multi-file and folder downloads." => "საჭიროა მულტი ფაილ ან საქაღალდის ჩამოტვირთვა.",
-"Enable ZIP-download" => "ZIP-Download–ის ჩართვა",
-"0 is unlimited" => "0 is unlimited",
-"Maximum input size for ZIP files" => "ZIP ფაილების მაქსიმუმ დასაშვები ზომა",
"Save" => "შენახვა",
"WebDAV" => "WebDAV",
"New" => "ახალი",
@@ -49,7 +46,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "ატვირთვის გაუქმება",
"Nothing in here. Upload something!" => "აქ არაფერი არ არის. ატვირთე რამე!",
"Download" => "ჩამოტვირთვა",
-"Delete" => "წაშლა",
"Upload too large" => "ასატვირთი ფაილი ძალიან დიდია",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "ფაილის ზომა რომლის ატვირთვასაც თქვენ აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს.",
"Files are being scanned, please wait." => "მიმდინარეობს ფაილების სკანირება, გთხოვთ დაელოდოთ."
diff --git a/apps/files/l10n/km.php b/apps/files/l10n/km.php
index 3cfb33854bc9c2b54c21726a5ef3a488b129e8f4..d629f9864132ddd7f827a3b1b988cb3124e1ef49 100644
--- a/apps/files/l10n/km.php
+++ b/apps/files/l10n/km.php
@@ -1,12 +1,17 @@
"មិនអាចផ្លាស់ទី %s - មានឈ្មោះឯកសារដូចនេះហើយ",
+"Could not move %s" => "មិនអាចផ្លាស់ទី %s",
"File name cannot be empty." => "ឈ្មោះឯកសារមិនអាចនៅទទេបានឡើយ។",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "ឈ្មោះមិនត្រឹមត្រូវ, មិនអនុញ្ញាត '\\', '/', '<', '>', ':', '\"', '|', '?' និង '*' ទេ។",
+"No file was uploaded. Unknown error" => "មិនមានឯកសារដែលបានផ្ទុកឡើង។ មិនស្គាល់កំហុស",
+"There is no error, the file uploaded with success" => "មិនមានកំហុសអ្វីទេ ហើយឯកសារត្រូវបានផ្ទុកឡើងដោយជោគជ័យ",
"Files" => "ឯកសារ",
"Upload cancelled." => "បានបោះបង់ការផ្ទុកឡើង។",
"{new_name} already exists" => "មានឈ្មោះ {new_name} រួចហើយ",
"Share" => "ចែករំលែក",
"Delete permanently" => "លុបជាអចិន្ត្រៃយ៍",
+"Delete" => "លុប",
"Rename" => "ប្ដូរឈ្មោះ",
"Your download is being prepared. This might take some time if the files are big." => "ការទាញយករបស់អ្នកកំពុងត្រូវបានរៀបចំហើយ។ នេះអាចចំណាយពេលមួយសំទុះ ប្រសិនបើឯកសារធំ។",
"Pending" => "កំពុងរង់ចាំ",
@@ -18,9 +23,6 @@ $TRANSLATIONS = array(
"_%n file_::_%n files_" => array(""),
"_Uploading %n file_::_Uploading %n files_" => array(""),
"Maximum upload size" => "ទំហំផ្ទុកឡើងជាអតិបរមា",
-"Enable ZIP-download" => "បើកការទាញយកជា ZIP",
-"0 is unlimited" => "0 គឺមិនកំណត់",
-"Maximum input size for ZIP files" => "ទំហំចូលជាអតិបរមាសម្រាប់ឯកសារ ZIP",
"Save" => "រក្សាទុក",
"WebDAV" => "WebDAV",
"New" => "ថ្មី",
@@ -31,7 +33,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "បោះបង់ការផ្ទុកឡើង",
"Nothing in here. Upload something!" => "គ្មានអ្វីនៅទីនេះទេ។ ផ្ទុកឡើងអ្វីមួយ!",
"Download" => "ទាញយក",
-"Delete" => "លុប",
"Upload too large" => "ផ្ទុកឡើងធំពេក"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/ko.php b/apps/files/l10n/ko.php
index 1caab50ecf21b376e16dc9c148834a2660985592..55c9e75f1b3f126370635d76ecab6cfc7a4726a5 100644
--- a/apps/files/l10n/ko.php
+++ b/apps/files/l10n/ko.php
@@ -37,6 +37,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "URL을 가져올 수 없음",
"Share" => "공유",
"Delete permanently" => "영구히 삭제",
+"Delete" => "삭제",
"Rename" => "이름 바꾸기",
"Your download is being prepared. This might take some time if the files are big." => "다운로드 준비 중입니다. 파일 크기가 크면 시간이 오래 걸릴 수도 있습니다.",
"Pending" => "대기 중",
@@ -60,10 +61,6 @@ $TRANSLATIONS = array(
"File handling" => "파일 처리",
"Maximum upload size" => "최대 업로드 크기",
"max. possible: " => "최대 가능:",
-"Needed for multi-file and folder downloads." => "다중 파일 및 폴더 다운로드에 필요합니다.",
-"Enable ZIP-download" => "ZIP 다운로드 허용",
-"0 is unlimited" => "0은 무제한입니다",
-"Maximum input size for ZIP files" => "ZIP 파일 최대 크기",
"Save" => "저장",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "WebDAV로 파일에 접근하려면 이 주소를 사용하십시오 ",
@@ -77,7 +74,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "여기에 파일을 업로드하거나 만들 권한이 없습니다",
"Nothing in here. Upload something!" => "내용이 없습니다. 업로드할 수 있습니다!",
"Download" => "다운로드",
-"Delete" => "삭제",
"Upload too large" => "업로드한 파일이 너무 큼",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.",
"Files are being scanned, please wait." => "파일을 검색하고 있습니다. 기다려 주십시오."
diff --git a/apps/files/l10n/lb.php b/apps/files/l10n/lb.php
index 95efe7e1be72629d0b1e80d308e84383c7a1ee97..f136e6bb076e346b522de6537654b2cda1caf98a 100644
--- a/apps/files/l10n/lb.php
+++ b/apps/files/l10n/lb.php
@@ -10,6 +10,7 @@ $TRANSLATIONS = array(
"Upload cancelled." => "Upload ofgebrach.",
"File upload is in progress. Leaving the page now will cancel the upload." => "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach.",
"Share" => "Deelen",
+"Delete" => "Läschen",
"Rename" => "Ëm-benennen",
"Error" => "Fehler",
"Name" => "Numm",
@@ -21,10 +22,6 @@ $TRANSLATIONS = array(
"File handling" => "Fichier handling",
"Maximum upload size" => "Maximum Upload Gréisst ",
"max. possible: " => "max. méiglech:",
-"Needed for multi-file and folder downloads." => "Gett gebraucht fir multi-Fichier an Dossier Downloads.",
-"Enable ZIP-download" => "ZIP-download erlaben",
-"0 is unlimited" => "0 ass onlimitéiert",
-"Maximum input size for ZIP files" => "Maximal Gréisst fir ZIP Fichieren",
"Save" => "Späicheren",
"New" => "Nei",
"Text file" => "Text Fichier",
@@ -32,7 +29,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "Upload ofbriechen",
"Nothing in here. Upload something!" => "Hei ass näischt. Lued eppes rop!",
"Download" => "Download",
-"Delete" => "Läschen",
"Upload too large" => "Upload ze grouss",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.",
"Files are being scanned, please wait." => "Fichieren gi gescannt, war weg."
diff --git a/apps/files/l10n/lt_LT.php b/apps/files/l10n/lt_LT.php
index 0204f7e80a8e94c3b5aa86697540e38699d6f154..2680e294fc3bfd832498332d0371a318565580c3 100644
--- a/apps/files/l10n/lt_LT.php
+++ b/apps/files/l10n/lt_LT.php
@@ -37,6 +37,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Klauda gaunant URL",
"Share" => "Dalintis",
"Delete permanently" => "Ištrinti negrįžtamai",
+"Delete" => "Ištrinti",
"Rename" => "Pervadinti",
"Your download is being prepared. This might take some time if the files are big." => "Jūsų atsisiuntimas yra paruošiamas. tai gali užtrukti jei atsisiunčiamas didelis failas.",
"Pending" => "Laukiantis",
@@ -60,10 +61,6 @@ $TRANSLATIONS = array(
"File handling" => "Failų tvarkymas",
"Maximum upload size" => "Maksimalus įkeliamo failo dydis",
"max. possible: " => "maks. galima:",
-"Needed for multi-file and folder downloads." => "Reikalinga daugybinui failų ir aplankalų atsisiuntimui.",
-"Enable ZIP-download" => "Įjungti atsisiuntimą ZIP archyvu",
-"0 is unlimited" => "0 yra neribotas",
-"Maximum input size for ZIP files" => "Maksimalus ZIP archyvo failo dydis",
"Save" => "Išsaugoti",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Naudokite šį adresą, kad pasiektumėte savo failus per WebDAV ",
@@ -77,7 +74,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Jūs neturite leidimo čia įkelti arba kurti failus",
"Nothing in here. Upload something!" => "Čia tuščia. Įkelkite ką nors!",
"Download" => "Atsisiųsti",
-"Delete" => "Ištrinti",
"Upload too large" => "Įkėlimui failas per didelis",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Bandomų įkelti failų dydis viršija maksimalų, kuris leidžiamas šiame serveryje",
"Files are being scanned, please wait." => "Skenuojami failai, prašome palaukti."
diff --git a/apps/files/l10n/lv.php b/apps/files/l10n/lv.php
index 8eb939a2789efbf4379637c73a0143807a1003a0..cc5c70b5d562446522422567a879821651e738d0 100644
--- a/apps/files/l10n/lv.php
+++ b/apps/files/l10n/lv.php
@@ -22,6 +22,7 @@ $TRANSLATIONS = array(
"{new_name} already exists" => "{new_name} jau eksistē",
"Share" => "Dalīties",
"Delete permanently" => "Dzēst pavisam",
+"Delete" => "Dzēst",
"Rename" => "Pārsaukt",
"Your download is being prepared. This might take some time if the files are big." => "Tiek sagatavota lejupielāde. Tas var aizņemt kādu laiciņu, ja datnes ir lielas.",
"Pending" => "Gaida savu kārtu",
@@ -39,10 +40,6 @@ $TRANSLATIONS = array(
"File handling" => "Datņu pārvaldība",
"Maximum upload size" => "Maksimālais datņu augšupielādes apjoms",
"max. possible: " => "maksimālais iespējamais:",
-"Needed for multi-file and folder downloads." => "Vajadzīgs vairāku datņu un mapju lejupielādēšanai.",
-"Enable ZIP-download" => "Aktivēt ZIP lejupielādi",
-"0 is unlimited" => "0 ir neierobežots",
-"Maximum input size for ZIP files" => "Maksimālais ievades izmērs ZIP datnēm",
"Save" => "Saglabāt",
"WebDAV" => "WebDAV",
"New" => "Jauna",
@@ -53,7 +50,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "Atcelt augšupielādi",
"Nothing in here. Upload something!" => "Te vēl nekas nav. Rīkojies, sāc augšupielādēt!",
"Download" => "Lejupielādēt",
-"Delete" => "Dzēst",
"Upload too large" => "Datne ir par lielu, lai to augšupielādētu",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Augšupielādējamās datnes pārsniedz servera pieļaujamo datņu augšupielādes apjomu",
"Files are being scanned, please wait." => "Datnes šobrīd tiek caurskatītas, lūdzu, uzgaidiet."
diff --git a/apps/files/l10n/mk.php b/apps/files/l10n/mk.php
index d006b2e8dde060e00f925a4ead3d17014e6ffa22..6e2aaab4123d8c7b02b0a2d32fa07eb919574b83 100644
--- a/apps/files/l10n/mk.php
+++ b/apps/files/l10n/mk.php
@@ -32,6 +32,7 @@ $TRANSLATIONS = array(
"Could not create folder" => "Не можам да креирам папка",
"Share" => "Сподели",
"Delete permanently" => "Трајно избришани",
+"Delete" => "Избриши",
"Rename" => "Преименувај",
"Your download is being prepared. This might take some time if the files are big." => "Вашето преземање се подготвува. Ова може да потрае до колку датотеките се големи.",
"Pending" => "Чека",
@@ -51,10 +52,6 @@ $TRANSLATIONS = array(
"File handling" => "Ракување со датотеки",
"Maximum upload size" => "Максимална големина за подигање",
"max. possible: " => "макс. можно:",
-"Needed for multi-file and folder downloads." => "Потребно за симнување повеќе-датотеки и папки.",
-"Enable ZIP-download" => "Овозможи ZIP симнување ",
-"0 is unlimited" => "0 е неограничено",
-"Maximum input size for ZIP files" => "Максимална големина за внес на ZIP датотеки",
"Save" => "Сними",
"WebDAV" => "WebDAV",
"New" => "Ново",
@@ -64,7 +61,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "Откажи прикачување",
"Nothing in here. Upload something!" => "Тука нема ништо. Снимете нешто!",
"Download" => "Преземи",
-"Delete" => "Избриши",
"Upload too large" => "Фајлот кој се вчитува е преголем",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.",
"Files are being scanned, please wait." => "Се скенираат датотеки, ве молам почекајте."
diff --git a/apps/files/l10n/ms_MY.php b/apps/files/l10n/ms_MY.php
index e3fee81a15848790770393007a60e016356d2c46..9f1ab265a042195839dd3920a73468b1f6bf4e66 100644
--- a/apps/files/l10n/ms_MY.php
+++ b/apps/files/l10n/ms_MY.php
@@ -10,6 +10,7 @@ $TRANSLATIONS = array(
"Files" => "Fail-fail",
"Upload cancelled." => "Muatnaik dibatalkan.",
"Share" => "Kongsi",
+"Delete" => "Padam",
"Rename" => "Namakan",
"Pending" => "Dalam proses",
"Error" => "Ralat",
@@ -22,10 +23,6 @@ $TRANSLATIONS = array(
"File handling" => "Pengendalian fail",
"Maximum upload size" => "Saiz maksimum muat naik",
"max. possible: " => "maksimum:",
-"Needed for multi-file and folder downloads." => "Diperlukan untuk muatturun fail pelbagai ",
-"Enable ZIP-download" => "Aktifkan muatturun ZIP",
-"0 is unlimited" => "0 adalah tanpa had",
-"Maximum input size for ZIP files" => "Saiz maksimum input untuk fail ZIP",
"Save" => "Simpan",
"New" => "Baru",
"Text file" => "Fail teks",
@@ -33,7 +30,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "Batal muat naik",
"Nothing in here. Upload something!" => "Tiada apa-apa di sini. Muat naik sesuatu!",
"Download" => "Muat turun",
-"Delete" => "Padam",
"Upload too large" => "Muatnaik terlalu besar",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server",
"Files are being scanned, please wait." => "Fail sedang diimbas, harap bersabar."
diff --git a/apps/files/l10n/nb_NO.php b/apps/files/l10n/nb_NO.php
index a9f92214c3d85ad62ae7634ff5d3f1f8cc3527e5..55e75becb76ee1b19587e1ec8803746722361782 100644
--- a/apps/files/l10n/nb_NO.php
+++ b/apps/files/l10n/nb_NO.php
@@ -69,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "Filhåndtering",
"Maximum upload size" => "Maksimum opplastingsstørrelse",
"max. possible: " => "max. mulige:",
-"Needed for multi-file and folder downloads." => "Nødvendig for å laste ned mapper og mer enn én fil om gangen.",
-"Enable ZIP-download" => "Aktiver nedlasting av ZIP",
-"0 is unlimited" => "0 er ubegrenset",
-"Maximum input size for ZIP files" => "Maksimal størrelse på ZIP-filer",
"Save" => "Lagre",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Bruk denne adressen for å aksessere filene dine via WebDAV ",
diff --git a/apps/files/l10n/nl.php b/apps/files/l10n/nl.php
index 4c7c73b318ba5b28910e6f416d294f11a87c41b3..9d49d1391f00a031c9f9e9a2d34122a8e44f2d08 100644
--- a/apps/files/l10n/nl.php
+++ b/apps/files/l10n/nl.php
@@ -69,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "Bestand",
"Maximum upload size" => "Maximale bestandsgrootte voor uploads",
"max. possible: " => "max. mogelijk: ",
-"Needed for multi-file and folder downloads." => "Nodig voor meerdere bestanden en mappen downloads.",
-"Enable ZIP-download" => "Zet ZIP-download aan",
-"0 is unlimited" => "0 is ongelimiteerd",
-"Maximum input size for ZIP files" => "Maximale grootte voor ZIP bestanden",
"Save" => "Bewaren",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Gebruik deze link om uw bestanden via WebDAV te benaderen ",
diff --git a/apps/files/l10n/nn_NO.php b/apps/files/l10n/nn_NO.php
index 3b40cc58f0d41eb2dfa1a1910e4dda6c4c831c41..bb6bf0778a2f39798d1ba726c2c06914ea65dff1 100644
--- a/apps/files/l10n/nn_NO.php
+++ b/apps/files/l10n/nn_NO.php
@@ -26,6 +26,7 @@ $TRANSLATIONS = array(
"{new_name} already exists" => "{new_name} finst allereie",
"Share" => "Del",
"Delete permanently" => "Slett for godt",
+"Delete" => "Slett",
"Rename" => "Endra namn",
"Your download is being prepared. This might take some time if the files are big." => "Gjer klar nedlastinga di. Dette kan ta ei stund viss filene er store.",
"Pending" => "Under vegs",
@@ -45,10 +46,6 @@ $TRANSLATIONS = array(
"File handling" => "Filhandtering",
"Maximum upload size" => "Maksimal opplastingsstorleik",
"max. possible: " => "maks. moglege:",
-"Needed for multi-file and folder downloads." => "Nødvendig for fleirfils- og mappenedlastingar.",
-"Enable ZIP-download" => "Slå på ZIP-nedlasting",
-"0 is unlimited" => "0 er ubegrensa",
-"Maximum input size for ZIP files" => "Maksimal storleik for ZIP-filer",
"Save" => "Lagre",
"WebDAV" => "WebDAV",
"New" => "Ny",
@@ -59,7 +56,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "Avbryt opplasting",
"Nothing in here. Upload something!" => "Ingenting her. Last noko opp!",
"Download" => "Last ned",
-"Delete" => "Slett",
"Upload too large" => "For stor opplasting",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filene du prøver å lasta opp er større enn maksgrensa til denne tenaren.",
"Files are being scanned, please wait." => "Skannar filer, ver venleg og vent."
diff --git a/apps/files/l10n/oc.php b/apps/files/l10n/oc.php
index d72d496f29a065478970fcc4b83fcce9647ea2d9..1e1dbf7ad56b9644b2e28e1722deeb60d8da3170 100644
--- a/apps/files/l10n/oc.php
+++ b/apps/files/l10n/oc.php
@@ -10,6 +10,7 @@ $TRANSLATIONS = array(
"Upload cancelled." => "Amontcargar anullat.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Un amontcargar es a se far. Daissar aquesta pagina ara tamparà lo cargament. ",
"Share" => "Parteja",
+"Delete" => "Escafa",
"Rename" => "Torna nomenar",
"Pending" => "Al esperar",
"Error" => "Error",
@@ -22,10 +23,6 @@ $TRANSLATIONS = array(
"File handling" => "Manejament de fichièr",
"Maximum upload size" => "Talha maximum d'amontcargament",
"max. possible: " => "max. possible: ",
-"Needed for multi-file and folder downloads." => "Requesit per avalcargar gropat de fichièrs e dorsièr",
-"Enable ZIP-download" => "Activa l'avalcargament de ZIP",
-"0 is unlimited" => "0 es pas limitat",
-"Maximum input size for ZIP files" => "Talha maximum de dintrada per fichièrs ZIP",
"Save" => "Enregistra",
"New" => "Nòu",
"Text file" => "Fichièr de tèxte",
@@ -33,7 +30,6 @@ $TRANSLATIONS = array(
"Cancel upload" => " Anulla l'amontcargar",
"Nothing in here. Upload something!" => "Pas res dedins. Amontcarga qualquaren",
"Download" => "Avalcarga",
-"Delete" => "Escafa",
"Upload too large" => "Amontcargament tròp gròs",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Los fichièrs que sias a amontcargar son tròp pesucs per la talha maxi pel servidor.",
"Files are being scanned, please wait." => "Los fiichièrs son a èsser explorats, "
diff --git a/apps/files/l10n/pa.php b/apps/files/l10n/pa.php
index 3cf8724249145e1fc6a6a5178ce8c0f42c5b3e8d..d2a64f36693678785a38cb1d5e32e7ce9128bfb6 100644
--- a/apps/files/l10n/pa.php
+++ b/apps/files/l10n/pa.php
@@ -2,13 +2,13 @@
$TRANSLATIONS = array(
"Files" => "ਫਾਇਲਾਂ",
"Share" => "ਸਾਂਝਾ ਕਰੋ",
+"Delete" => "ਹਟਾਓ",
"Rename" => "ਨਾਂ ਬਦਲੋ",
"Error" => "ਗਲਤੀ",
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
"Cancel upload" => "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ",
-"Download" => "ਡਾਊਨਲੋਡ",
-"Delete" => "ਹਟਾਓ"
+"Download" => "ਡਾਊਨਲੋਡ"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/pl.php b/apps/files/l10n/pl.php
index aaa1b18737cc4ceb4ff2de5effdd5a80f55e4f4b..20950f03ce4afc1f64714bd8bba1dc90615fdc10 100644
--- a/apps/files/l10n/pl.php
+++ b/apps/files/l10n/pl.php
@@ -42,6 +42,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Błąd przy pobieraniu adresu URL",
"Share" => "Udostępnij",
"Delete permanently" => "Trwale usuń",
+"Delete" => "Usuń",
"Rename" => "Zmień nazwę",
"Your download is being prepared. This might take some time if the files are big." => "Pobieranie jest przygotowywane. Może to zająć trochę czasu jeśli pliki są duże.",
"Pending" => "Oczekujące",
@@ -68,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "Zarządzanie plikami",
"Maximum upload size" => "Maksymalny rozmiar wysyłanego pliku",
"max. possible: " => "maks. możliwy:",
-"Needed for multi-file and folder downloads." => "Wymagany do pobierania wielu plików i folderów",
-"Enable ZIP-download" => "Włącz pobieranie ZIP-paczki",
-"0 is unlimited" => "0 - bez limitów",
-"Maximum input size for ZIP files" => "Maksymalna wielkość pliku wejściowego ZIP ",
"Save" => "Zapisz",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Użyj tego adresu do dostępu do twoich plików przez WebDAV ",
@@ -85,7 +82,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Nie masz uprawnień do wczytywania lub tworzenia plików w tym miejscu",
"Nothing in here. Upload something!" => "Pusto. Wyślij coś!",
"Download" => "Pobierz",
-"Delete" => "Usuń",
"Upload too large" => "Ładowany plik jest za duży",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Pliki, które próbujesz przesłać, przekraczają maksymalną dopuszczalną wielkość.",
"Files are being scanned, please wait." => "Skanowanie plików, proszę czekać.",
diff --git a/apps/files/l10n/pt_BR.php b/apps/files/l10n/pt_BR.php
index 3b3fedaeb12719deeb6adcf4d3ab7097bcdf36e4..38bc6d86977f787afe3e917626a2634362960037 100644
--- a/apps/files/l10n/pt_BR.php
+++ b/apps/files/l10n/pt_BR.php
@@ -42,6 +42,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Erro ao buscar URL",
"Share" => "Compartilhar",
"Delete permanently" => "Excluir permanentemente",
+"Delete" => "Excluir",
"Rename" => "Renomear",
"Your download is being prepared. This might take some time if the files are big." => "Seu download está sendo preparado. Isto pode levar algum tempo se os arquivos forem grandes.",
"Pending" => "Pendente",
@@ -68,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "Tratamento de Arquivo",
"Maximum upload size" => "Tamanho máximo para carregar",
"max. possible: " => "max. possível:",
-"Needed for multi-file and folder downloads." => "Necessário para download de múltiplos arquivos e diretórios.",
-"Enable ZIP-download" => "Habilitar ZIP-download",
-"0 is unlimited" => "0 para ilimitado",
-"Maximum input size for ZIP files" => "Tamanho máximo para arquivo ZIP",
"Save" => "Guardar",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Use este endereço para ter acesso aos seus Arquivos via WebDAV ",
@@ -85,7 +82,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Você não tem permissão para carregar ou criar arquivos aqui",
"Nothing in here. Upload something!" => "Nada aqui. Carrege alguma coisa!",
"Download" => "Baixar",
-"Delete" => "Excluir",
"Upload too large" => "Upload muito grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os arquivos que você está tentando carregar excedeu o tamanho máximo para arquivos no servidor.",
"Files are being scanned, please wait." => "Arquivos sendo escaneados, por favor aguarde.",
diff --git a/apps/files/l10n/pt_PT.php b/apps/files/l10n/pt_PT.php
index 5ba460730843fc679fa83516250fb0212ebce4d9..ac12e047c5422926a9f4fdd7d1dba2fc34d2ee01 100644
--- a/apps/files/l10n/pt_PT.php
+++ b/apps/files/l10n/pt_PT.php
@@ -69,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "Manuseamento de ficheiros",
"Maximum upload size" => "Tamanho máximo de envio",
"max. possible: " => "max. possivel: ",
-"Needed for multi-file and folder downloads." => "Necessário para multi download de ficheiros e pastas",
-"Enable ZIP-download" => "Permitir descarregar em ficheiro ZIP",
-"0 is unlimited" => "0 é ilimitado",
-"Maximum input size for ZIP files" => "Tamanho máximo para ficheiros ZIP",
"Save" => "Guardar",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Utilize esta ligação para aceder aos seus ficheiros via WebDAV ",
diff --git a/apps/files/l10n/ro.php b/apps/files/l10n/ro.php
index 8bfde7b1f332c0b4c59bba4720d8a77166a4927d..2ac5a549607b536ec9aacec9f96a43d6e4446f4c 100644
--- a/apps/files/l10n/ro.php
+++ b/apps/files/l10n/ro.php
@@ -41,6 +41,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Eroare încarcare URL",
"Share" => "Partajează",
"Delete permanently" => "Șterge permanent",
+"Delete" => "Șterge",
"Rename" => "Redenumește",
"Your download is being prepared. This might take some time if the files are big." => "Se pregătește descărcarea. Aceasta poate dura ceva timp dacă fișierele sunt mari.",
"Pending" => "În așteptare",
@@ -67,10 +68,6 @@ $TRANSLATIONS = array(
"File handling" => "Manipulare fișiere",
"Maximum upload size" => "Dimensiune maximă admisă la încărcare",
"max. possible: " => "max. posibil:",
-"Needed for multi-file and folder downloads." => "Necesar pentru descărcarea mai multor fișiere și a dosarelor.",
-"Enable ZIP-download" => "Permite descărcarea ZIP",
-"0 is unlimited" => "0 este nelimitat",
-"Maximum input size for ZIP files" => "Dimensiunea maximă de intrare pentru fișierele ZIP",
"Save" => "Salvează",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Folosește această adresă pentru acces la fișierele tale folosind WebDAV ",
@@ -84,7 +81,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Nu aveti permisiunea de a incarca sau crea fisiere aici",
"Nothing in here. Upload something!" => "Nimic aici. Încarcă ceva!",
"Download" => "Descarcă",
-"Delete" => "Șterge",
"Upload too large" => "Fișierul încărcat este prea mare",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fișierele pe care încerci să le încarci depășesc limita de încărcare maximă admisă pe acest server.",
"Files are being scanned, please wait." => "Fișierele sunt scanate, te rog așteaptă."
diff --git a/apps/files/l10n/ru.php b/apps/files/l10n/ru.php
index f24744223ee5b87e198d0b0742aeb1d08a81999c..f63c441930279cc26f5af3bca8beaf4713cb9458 100644
--- a/apps/files/l10n/ru.php
+++ b/apps/files/l10n/ru.php
@@ -69,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "Управление файлами",
"Maximum upload size" => "Максимальный размер загружаемого файла",
"max. possible: " => "макс. возможно: ",
-"Needed for multi-file and folder downloads." => "Требуется для скачивания нескольких файлов и папок",
-"Enable ZIP-download" => "Включить скачивание в виде архивов ZIP",
-"0 is unlimited" => "0 - без ограничений",
-"Maximum input size for ZIP files" => "Максимальный исходный размер для ZIP файлов",
"Save" => "Сохранить",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Используйте этот адресс для доступа к вашим файлам через WebDAV ",
diff --git a/apps/files/l10n/si_LK.php b/apps/files/l10n/si_LK.php
index 59b720e710076274befb3b2c928cf437e80a11c9..c0fc18cf2a513b972186f2c494e8fbed0dc28e9a 100644
--- a/apps/files/l10n/si_LK.php
+++ b/apps/files/l10n/si_LK.php
@@ -11,6 +11,7 @@ $TRANSLATIONS = array(
"Upload cancelled." => "උඩුගත කිරීම අත් හරින්න ලදී",
"File upload is in progress. Leaving the page now will cancel the upload." => "උඩුගතකිරීමක් සිදුවේ. පිටුව හැර යාමෙන් එය නැවතෙනු ඇත",
"Share" => "බෙදා හදා ගන්න",
+"Delete" => "මකා දමන්න",
"Rename" => "නැවත නම් කරන්න",
"Error" => "දෝෂයක්",
"Name" => "නම",
@@ -22,10 +23,6 @@ $TRANSLATIONS = array(
"File handling" => "ගොනු පරිහරණය",
"Maximum upload size" => "උඩුගත කිරීමක උපරිම ප්රමාණය",
"max. possible: " => "හැකි උපරිමය:",
-"Needed for multi-file and folder downloads." => "බහු-ගොනු හා ෆොල්ඩර බාගත කිරීමට අවශ්යයි",
-"Enable ZIP-download" => "ZIP-බාගත කිරීම් සක්රිය කරන්න",
-"0 is unlimited" => "0 යනු සීමාවක් නැති බවය",
-"Maximum input size for ZIP files" => "ZIP ගොනු සඳහා දැමිය හැකි උපරිම විශාලතවය",
"Save" => "සුරකින්න",
"New" => "නව",
"Text file" => "පෙළ ගොනුව",
@@ -34,7 +31,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "උඩුගත කිරීම අත් හරින්න",
"Nothing in here. Upload something!" => "මෙහි කිසිවක් නොමැත. යමක් උඩුගත කරන්න",
"Download" => "බාන්න",
-"Delete" => "මකා දමන්න",
"Upload too large" => "උඩුගත කිරීම විශාල වැඩිය",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "ඔබ උඩුගත කිරීමට තැත් කරන ගොනු මෙම සේවාදායකයා උඩුගත කිරීමට ඉඩදී ඇති උපරිම ගොනු විශාලත්වයට වඩා වැඩිය",
"Files are being scanned, please wait." => "ගොනු පරික්ෂා කෙරේ. මඳක් රැඳී සිටින්න"
diff --git a/apps/files/l10n/sk.php b/apps/files/l10n/sk.php
index 53daf549eaa41e18c243da307532bd53c10df16d..8d6c2237dc3df2cca8494f8dba87aa2c4a7b7128 100644
--- a/apps/files/l10n/sk.php
+++ b/apps/files/l10n/sk.php
@@ -1,11 +1,11 @@
"Zdieľať",
+"Delete" => "Odstrániť",
"_%n folder_::_%n folders_" => array("","",""),
"_%n file_::_%n files_" => array("","",""),
"_Uploading %n file_::_Uploading %n files_" => array("","",""),
"Save" => "Uložiť",
-"Download" => "Stiahnuť",
-"Delete" => "Odstrániť"
+"Download" => "Stiahnuť"
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;";
diff --git a/apps/files/l10n/sk_SK.php b/apps/files/l10n/sk_SK.php
index 343e53e5acdfe15ef48dc97bbd811c2dbafb3ffc..8d8848e6a5dab88310bfb69e0f5cf4d2d0708215 100644
--- a/apps/files/l10n/sk_SK.php
+++ b/apps/files/l10n/sk_SK.php
@@ -41,6 +41,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Chyba pri načítavaní URL",
"Share" => "Zdieľať",
"Delete permanently" => "Zmazať trvalo",
+"Delete" => "Zmazať",
"Rename" => "Premenovať",
"Your download is being prepared. This might take some time if the files are big." => "Vaše sťahovanie sa pripravuje. Ak sú sťahované súbory veľké, môže to chvíľu trvať.",
"Pending" => "Prebieha",
@@ -66,10 +67,6 @@ $TRANSLATIONS = array(
"File handling" => "Nastavenie správania sa k súborom",
"Maximum upload size" => "Maximálna veľkosť odosielaného súboru",
"max. possible: " => "najväčšie možné:",
-"Needed for multi-file and folder downloads." => "Vyžadované pre sťahovanie viacerých súborov a priečinkov.",
-"Enable ZIP-download" => "Povoliť sťahovanie ZIP súborov",
-"0 is unlimited" => "0 znamená neobmedzené",
-"Maximum input size for ZIP files" => "Najväčšia veľkosť ZIP súborov",
"Save" => "Uložiť",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Použite túto linku pre prístup k vašim súborom cez WebDAV ",
@@ -83,7 +80,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Nemáte oprávnenie sem nahrávať alebo vytvoriť súbory",
"Nothing in here. Upload something!" => "Žiadny súbor. Nahrajte niečo!",
"Download" => "Sťahovanie",
-"Delete" => "Zmazať",
"Upload too large" => "Nahrávanie je príliš veľké",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Súbory, ktoré sa snažíte nahrať, presahujú maximálnu veľkosť pre nahratie súborov na tento server.",
"Files are being scanned, please wait." => "Čakajte, súbory sú prehľadávané."
diff --git a/apps/files/l10n/sl.php b/apps/files/l10n/sl.php
index ca7590263e970178bdad11d0e6b0e4006f9a44d6..e5665a4c64de21f028fc524fd4729753c93ae0dc 100644
--- a/apps/files/l10n/sl.php
+++ b/apps/files/l10n/sl.php
@@ -41,6 +41,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Napaka pridobivanja naslova URL",
"Share" => "Souporaba",
"Delete permanently" => "Izbriši dokončno",
+"Delete" => "Izbriši",
"Rename" => "Preimenuj",
"Your download is being prepared. This might take some time if the files are big." => "Postopek priprave datoteke za prejem je lahko dolgotrajen, kadar je datoteka zelo velika.",
"Pending" => "V čakanju ...",
@@ -67,10 +68,6 @@ $TRANSLATIONS = array(
"File handling" => "Upravljanje z datotekami",
"Maximum upload size" => "Največja velikost za pošiljanja",
"max. possible: " => "največ mogoče:",
-"Needed for multi-file and folder downloads." => "Uporabljeno za prejem več datotek in map.",
-"Enable ZIP-download" => "Omogoči prejemanje arhivov ZIP",
-"0 is unlimited" => "0 predstavlja neomejeno vrednost",
-"Maximum input size for ZIP files" => "Največja vhodna velikost za datoteke ZIP",
"Save" => "Shrani",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Uporabite naslov za dostop do datotek rpeko sistema WebDAV .",
@@ -84,7 +81,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Ni ustreznih dovoljenj za pošiljanje ali ustvarjanje datotek na tem mestu.",
"Nothing in here. Upload something!" => "Tukaj še ni ničesar. Najprej je treba kakšno datoteko poslati v oblak!",
"Download" => "Prejmi",
-"Delete" => "Izbriši",
"Upload too large" => "Prekoračenje omejitve velikosti",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteke, ki jih želite poslati, presegajo največjo dovoljeno velikost na strežniku.",
"Files are being scanned, please wait." => "Poteka preučevanje datotek, počakajte ..."
diff --git a/apps/files/l10n/sq.php b/apps/files/l10n/sq.php
index d872dfc284b656386d9811639dbdda4ce5578be3..c1cdacf2ea92184845a318f7f61c8df686420543 100644
--- a/apps/files/l10n/sq.php
+++ b/apps/files/l10n/sq.php
@@ -24,6 +24,7 @@ $TRANSLATIONS = array(
"Could not create folder" => "I pamundur krijimi i kartelës",
"Share" => "Ndaj",
"Delete permanently" => "Fshi përfundimisht",
+"Delete" => "Fshi",
"Rename" => "Riemëro",
"Your download is being prepared. This might take some time if the files are big." => "Shkarkimi juaj është duke u përgatitur. Kjo mund të kërkojë kohë nëse skedarët janë të mëdhenj.",
"Pending" => "Në vijim",
@@ -43,10 +44,6 @@ $TRANSLATIONS = array(
"File handling" => "Trajtimi i Skedarëve",
"Maximum upload size" => "Madhësia maksimale e nagarkimit",
"max. possible: " => "maks i mundshëm",
-"Needed for multi-file and folder downloads." => "Nevojitej shkarkim i shumë skedarëve dhe dosjeve",
-"Enable ZIP-download" => "Mundëso skarkimin e ZIP",
-"0 is unlimited" => "o është pa limit",
-"Maximum input size for ZIP files" => "Maksimumi hyrës i skedarëve ZIP",
"Save" => "Ruaj",
"WebDAV" => "WebDAV",
"New" => "E re",
@@ -57,7 +54,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "Anullo ngarkimin",
"Nothing in here. Upload something!" => "Këtu nuk ka asgje. Ngarko dicka",
"Download" => "Shkarko",
-"Delete" => "Fshi",
"Upload too large" => "Ngarkimi shumë i madh",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Skedarët që po mundoheni të ngarkoni e tejkalojnë madhësinë maksimale të lejuar nga serveri.",
"Files are being scanned, please wait." => "Skanerizimi i skedarit në proces. Ju lutem prisni."
diff --git a/apps/files/l10n/sr.php b/apps/files/l10n/sr.php
index b58bc90c35b59843b039835d59f404d0c48f153a..0c9b46281d6ed054405fced07b2488211e5d59e0 100644
--- a/apps/files/l10n/sr.php
+++ b/apps/files/l10n/sr.php
@@ -20,6 +20,7 @@ $TRANSLATIONS = array(
"{new_name} already exists" => "{new_name} већ постоји",
"Share" => "Дели",
"Delete permanently" => "Обриши за стално",
+"Delete" => "Обриши",
"Rename" => "Преименуј",
"Your download is being prepared. This might take some time if the files are big." => "Припремам преузимање. Ово може да потраје ако су датотеке велике.",
"Pending" => "На чекању",
@@ -35,10 +36,6 @@ $TRANSLATIONS = array(
"File handling" => "Управљање датотекама",
"Maximum upload size" => "Највећа величина датотеке",
"max. possible: " => "највећа величина:",
-"Needed for multi-file and folder downloads." => "Неопходно за преузимање вишеделних датотека и фасцикли.",
-"Enable ZIP-download" => "Омогући преузимање у ZIP-у",
-"0 is unlimited" => "0 је неограничено",
-"Maximum input size for ZIP files" => "Највећа величина ZIP датотека",
"Save" => "Сачувај",
"WebDAV" => "WebDAV",
"New" => "Нова",
@@ -48,7 +45,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "Прекини отпремање",
"Nothing in here. Upload something!" => "Овде нема ничег. Отпремите нешто!",
"Download" => "Преузми",
-"Delete" => "Обриши",
"Upload too large" => "Датотека је превелика",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Датотеке које желите да отпремите прелазе ограничење у величини.",
"Files are being scanned, please wait." => "Скенирам датотеке…"
diff --git a/apps/files/l10n/sr@latin.php b/apps/files/l10n/sr@latin.php
index 8ec42c56c743f25edb7b66a63a86119552c9ad11..e41c3434a2c10bb326df3f665c93e5d50a5cb8e9 100644
--- a/apps/files/l10n/sr@latin.php
+++ b/apps/files/l10n/sr@latin.php
@@ -7,6 +7,7 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Nedostaje privremena fascikla",
"Files" => "Fajlovi",
"Share" => "Podeli",
+"Delete" => "Obriši",
"Rename" => "Preimenij",
"Error" => "Greška",
"Name" => "Ime",
@@ -19,7 +20,6 @@ $TRANSLATIONS = array(
"Save" => "Snimi",
"Nothing in here. Upload something!" => "Ovde nema ničeg. Pošaljite nešto!",
"Download" => "Preuzmi",
-"Delete" => "Obriši",
"Upload too large" => "Pošiljka je prevelika",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fajlovi koje želite da pošaljete prevazilaze ograničenje maksimalne veličine pošiljke na ovom serveru."
);
diff --git a/apps/files/l10n/sv.php b/apps/files/l10n/sv.php
index 3a69acf7296ff5f4f4f904fff3f009673de91c65..cd59bf5828926fa413fc31413441ed951f567011 100644
--- a/apps/files/l10n/sv.php
+++ b/apps/files/l10n/sv.php
@@ -42,6 +42,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Fel vid hämtning av URL",
"Share" => "Dela",
"Delete permanently" => "Radera permanent",
+"Delete" => "Radera",
"Rename" => "Byt namn",
"Your download is being prepared. This might take some time if the files are big." => "Din nedladdning förbereds. Det kan ta tid om det är stora filer.",
"Pending" => "Väntar",
@@ -68,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "Filhantering",
"Maximum upload size" => "Maximal storlek att ladda upp",
"max. possible: " => "max. möjligt:",
-"Needed for multi-file and folder downloads." => "Krävs för nerladdning av flera mappar och filer.",
-"Enable ZIP-download" => "Aktivera ZIP-nerladdning",
-"0 is unlimited" => "0 är oändligt",
-"Maximum input size for ZIP files" => "Största tillåtna storlek för ZIP-filer",
"Save" => "Spara",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Använd denna adress till nå dina Filer via WebDAV ",
@@ -85,7 +82,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Du har ej tillåtelse att ladda upp eller skapa filer här",
"Nothing in here. Upload something!" => "Ingenting här. Ladda upp något!",
"Download" => "Ladda ner",
-"Delete" => "Radera",
"Upload too large" => "För stor uppladdning",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filerna du försöker ladda upp överstiger den maximala storleken för filöverföringar på servern.",
"Files are being scanned, please wait." => "Filer skannas, var god vänta",
diff --git a/apps/files/l10n/ta_LK.php b/apps/files/l10n/ta_LK.php
index dd7b55b58c6be1977c80a9438c61daf52f600a58..fa5634f765d90a1e29afbe3f52a645fcf6467fc6 100644
--- a/apps/files/l10n/ta_LK.php
+++ b/apps/files/l10n/ta_LK.php
@@ -13,6 +13,7 @@ $TRANSLATIONS = array(
"File upload is in progress. Leaving the page now will cancel the upload." => "கோப்பு பதிவேற்றம் செயல்பாட்டில் உள்ளது. இந்தப் பக்கத்திலிருந்து வெறியேறுவதானது பதிவேற்றலை இரத்து செய்யும்.",
"{new_name} already exists" => "{new_name} ஏற்கனவே உள்ளது",
"Share" => "பகிர்வு",
+"Delete" => "நீக்குக",
"Rename" => "பெயர்மாற்றம்",
"Pending" => "நிலுவையிலுள்ள",
"Error" => "வழு",
@@ -25,10 +26,6 @@ $TRANSLATIONS = array(
"File handling" => "கோப்பு கையாளுதல்",
"Maximum upload size" => "பதிவேற்றக்கூடிய ஆகக்கூடிய அளவு ",
"max. possible: " => "ஆகக் கூடியது:",
-"Needed for multi-file and folder downloads." => "பல்வேறுப்பட்ட கோப்பு மற்றும் கோப்புறைகளை பதிவிறக்க தேவையானது.",
-"Enable ZIP-download" => "ZIP பதிவிறக்கலை இயலுமைப்படுத்துக",
-"0 is unlimited" => "0 ஆனது எல்லையற்றது",
-"Maximum input size for ZIP files" => "ZIP கோப்புகளுக்கான ஆகக்கூடிய உள்ளீட்டு அளவு",
"Save" => "சேமிக்க ",
"New" => "புதிய",
"Text file" => "கோப்பு உரை",
@@ -37,7 +34,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "பதிவேற்றலை இரத்து செய்க",
"Nothing in here. Upload something!" => "இங்கு ஒன்றும் இல்லை. ஏதாவது பதிவேற்றுக!",
"Download" => "பதிவிறக்குக",
-"Delete" => "நீக்குக",
"Upload too large" => "பதிவேற்றல் மிகப்பெரியது",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "நீங்கள் பதிவேற்ற முயற்சிக்கும் கோப்புகளானது இந்த சேவையகத்தில் கோப்பு பதிவேற்றக்கூடிய ஆகக்கூடிய அளவிலும் கூடியது.",
"Files are being scanned, please wait." => "கோப்புகள் வருடப்படுகின்றன, தயவுசெய்து காத்திருங்கள்."
diff --git a/apps/files/l10n/te.php b/apps/files/l10n/te.php
index 0cf230fd55dacbcc833663a3100d4290dff09d0a..ee62ddafabfe8fb5343e2eb5d43e21f124e1c9c9 100644
--- a/apps/files/l10n/te.php
+++ b/apps/files/l10n/te.php
@@ -1,6 +1,7 @@
"శాశ్వతంగా తొలగించు",
+"Delete" => "తొలగించు",
"Error" => "పొరపాటు",
"Name" => "పేరు",
"Size" => "పరిమాణం",
@@ -9,7 +10,6 @@ $TRANSLATIONS = array(
"_Uploading %n file_::_Uploading %n files_" => array("",""),
"Save" => "భద్రపరచు",
"New folder" => "కొత్త సంచయం",
-"Folder" => "సంచయం",
-"Delete" => "తొలగించు"
+"Folder" => "సంచయం"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/th_TH.php b/apps/files/l10n/th_TH.php
index 15cf39b96cc94ca09380b72fe42f531690adb129..3d7ae35f93e7e0566112d14334cee2af93a8b8b4 100644
--- a/apps/files/l10n/th_TH.php
+++ b/apps/files/l10n/th_TH.php
@@ -19,6 +19,7 @@ $TRANSLATIONS = array(
"File upload is in progress. Leaving the page now will cancel the upload." => "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก",
"{new_name} already exists" => "{new_name} มีอยู่แล้วในระบบ",
"Share" => "แชร์",
+"Delete" => "ลบ",
"Rename" => "เปลี่ยนชื่อ",
"Your download is being prepared. This might take some time if the files are big." => "กำลังเตรียมดาวน์โหลดข้อมูล หากไฟล์มีขนาดใหญ่ อาจใช้เวลาสักครู่",
"Pending" => "อยู่ระหว่างดำเนินการ",
@@ -34,10 +35,6 @@ $TRANSLATIONS = array(
"File handling" => "การจัดกาไฟล์",
"Maximum upload size" => "ขนาดไฟล์สูงสุดที่อัพโหลดได้",
"max. possible: " => "จำนวนสูงสุดที่สามารถทำได้: ",
-"Needed for multi-file and folder downloads." => "จำเป็นต้องใช้สำหรับการดาวน์โหลดไฟล์พร้อมกันหลายๆไฟล์หรือดาวน์โหลดทั้งโฟลเดอร์",
-"Enable ZIP-download" => "อนุญาตให้ดาวน์โหลดเป็นไฟล์ ZIP ได้",
-"0 is unlimited" => "0 หมายถึงไม่จำกัด",
-"Maximum input size for ZIP files" => "ขนาดไฟล์ ZIP สูงสุด",
"Save" => "บันทึก",
"WebDAV" => "WebDAV",
"New" => "อัพโหลดไฟล์ใหม่",
@@ -48,7 +45,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "ยกเลิกการอัพโหลด",
"Nothing in here. Upload something!" => "ยังไม่มีไฟล์ใดๆอยู่ที่นี่ กรุณาอัพโหลดไฟล์!",
"Download" => "ดาวน์โหลด",
-"Delete" => "ลบ",
"Upload too large" => "ไฟล์ที่อัพโหลดมีขนาดใหญ่เกินไป",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "ไฟล์ที่คุณพยายามที่จะอัพโหลดมีขนาดเกินกว่าขนาดสูงสุดที่กำหนดไว้ให้อัพโหลดได้สำหรับเซิร์ฟเวอร์นี้",
"Files are being scanned, please wait." => "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่."
diff --git a/apps/files/l10n/tr.php b/apps/files/l10n/tr.php
index 775dc4b163718039942760e658fcf27ee4e0ca15..e179771d54737d3a6867e382c6168c1dad6823f3 100644
--- a/apps/files/l10n/tr.php
+++ b/apps/files/l10n/tr.php
@@ -42,6 +42,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "Adres getirilirken hata",
"Share" => "Paylaş",
"Delete permanently" => "Kalıcı olarak sil",
+"Delete" => "Sil",
"Rename" => "Yeniden adlandır",
"Your download is being prepared. This might take some time if the files are big." => "İndirme hazırlanıyor. Dosyalar büyük ise bu biraz zaman alabilir.",
"Pending" => "Bekliyor",
@@ -68,10 +69,6 @@ $TRANSLATIONS = array(
"File handling" => "Dosya işlemleri",
"Maximum upload size" => "Azami yükleme boyutu",
"max. possible: " => "mümkün olan en fazla: ",
-"Needed for multi-file and folder downloads." => "Çoklu dosya ve dizin indirmesi için gerekli.",
-"Enable ZIP-download" => "ZIP indirmeyi etkinleştir",
-"0 is unlimited" => "0 limitsiz demektir",
-"Maximum input size for ZIP files" => "ZIP dosyaları için en fazla girdi boyutu",
"Save" => "Kaydet",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "Dosyalarınıza WebDAV aracılığıyla erişmek için bu adresi kullanın",
@@ -85,7 +82,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Buraya dosya yükleme veya oluşturma izniniz yok",
"Nothing in here. Upload something!" => "Burada hiçbir şey yok. Bir şeyler yükleyin!",
"Download" => "İndir",
-"Delete" => "Sil",
"Upload too large" => "Yükleme çok büyük",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Yüklemeye çalıştığınız dosyalar bu sunucudaki azami yükleme boyutunu aşıyor.",
"Files are being scanned, please wait." => "Dosyalar taranıyor, lütfen bekleyin.",
diff --git a/apps/files/l10n/ug.php b/apps/files/l10n/ug.php
index b104f60794763bede78f124e8aadd67ae0f131e4..217f4636c0b726ae38a912f0c40b6c71ca382ea9 100644
--- a/apps/files/l10n/ug.php
+++ b/apps/files/l10n/ug.php
@@ -12,6 +12,7 @@ $TRANSLATIONS = array(
"{new_name} already exists" => "{new_name} مەۋجۇت",
"Share" => "ھەمبەھىر",
"Delete permanently" => "مەڭگۈلۈك ئۆچۈر",
+"Delete" => "ئۆچۈر",
"Rename" => "ئات ئۆزگەرت",
"Pending" => "كۈتۈۋاتىدۇ",
"Error" => "خاتالىق",
@@ -30,7 +31,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "يۈكلەشتىن ۋاز كەچ",
"Nothing in here. Upload something!" => "بۇ جايدا ھېچنېمە يوق. Upload something!",
"Download" => "چۈشۈر",
-"Delete" => "ئۆچۈر",
"Upload too large" => "يۈكلەندىغىنى بەك چوڭ"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/uk.php b/apps/files/l10n/uk.php
index a8657ea90056d8da9469735b9ad8ea2705f2dc38..740c4f5c0ccb4e50f2d1ee7f2f888d0482ea2aa6 100644
--- a/apps/files/l10n/uk.php
+++ b/apps/files/l10n/uk.php
@@ -25,6 +25,7 @@ $TRANSLATIONS = array(
"Could not create folder" => "Не вдалося створити теку",
"Share" => "Поділитися",
"Delete permanently" => "Видалити назавжди",
+"Delete" => "Видалити",
"Rename" => "Перейменувати",
"Your download is being prepared. This might take some time if the files are big." => "Ваше завантаження готується. Це може зайняти деякий час, якщо файли завеликі.",
"Pending" => "Очікування",
@@ -43,10 +44,6 @@ $TRANSLATIONS = array(
"File handling" => "Робота з файлами",
"Maximum upload size" => "Максимальний розмір відвантажень",
"max. possible: " => "макс.можливе:",
-"Needed for multi-file and folder downloads." => "Необхідно для мульти-файлового та каталогового завантаження.",
-"Enable ZIP-download" => "Активувати ZIP-завантаження",
-"0 is unlimited" => "0 є безліміт",
-"Maximum input size for ZIP files" => "Максимальний розмір завантажуємого ZIP файлу",
"Save" => "Зберегти",
"WebDAV" => "WebDAV",
"New" => "Створити",
@@ -57,7 +54,6 @@ $TRANSLATIONS = array(
"Cancel upload" => "Перервати завантаження",
"Nothing in here. Upload something!" => "Тут нічого немає. Відвантажте що-небудь!",
"Download" => "Завантажити",
-"Delete" => "Видалити",
"Upload too large" => "Файл занадто великий",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файли,що ви намагаєтесь відвантажити перевищують максимальний дозволений розмір файлів на цьому сервері.",
"Files are being scanned, please wait." => "Файли скануються, зачекайте, будь-ласка."
diff --git a/apps/files/l10n/ur_PK.php b/apps/files/l10n/ur_PK.php
index 7aa430d7ed594da136b9fe2c480160999842fded..5e088038cf29275c83bb7f36dac596509c6f0e49 100644
--- a/apps/files/l10n/ur_PK.php
+++ b/apps/files/l10n/ur_PK.php
@@ -1,13 +1,13 @@
"تقسیم",
+"Delete" => "حذف کریں",
"Error" => "ایرر",
"Name" => "اسم",
"_%n folder_::_%n folders_" => array("",""),
"_%n file_::_%n files_" => array("",""),
"_Uploading %n file_::_Uploading %n files_" => array("",""),
"Save" => "حفظ",
-"Download" => "ڈاؤن لوڈ،",
-"Delete" => "حذف کریں"
+"Download" => "ڈاؤن لوڈ،"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files/l10n/vi.php b/apps/files/l10n/vi.php
index f1b803a7e2673a1c8f87e9f777f71d517df6a4ae..71d49571b70fb74a888a84f428732b431034c75f 100644
--- a/apps/files/l10n/vi.php
+++ b/apps/files/l10n/vi.php
@@ -36,6 +36,7 @@ $TRANSLATIONS = array(
"Could not create folder" => "Không thể tạo thư mục",
"Share" => "Chia sẻ",
"Delete permanently" => "Xóa vĩnh vễn",
+"Delete" => "Xóa",
"Rename" => "Sửa tên",
"Your download is being prepared. This might take some time if the files are big." => "Your download is being prepared. This might take some time if the files are big.",
"Pending" => "Đang chờ",
@@ -58,10 +59,6 @@ $TRANSLATIONS = array(
"File handling" => "Xử lý tập tin",
"Maximum upload size" => "Kích thước tối đa ",
"max. possible: " => "tối đa cho phép:",
-"Needed for multi-file and folder downloads." => "Cần thiết cho tải nhiều tập tin và thư mục.",
-"Enable ZIP-download" => "Cho phép ZIP-download",
-"0 is unlimited" => "0 là không giới hạn",
-"Maximum input size for ZIP files" => "Kích thước tối đa cho các tập tin ZIP",
"Save" => "Lưu",
"WebDAV" => "WebDAV",
"New" => "Tạo mới",
@@ -74,7 +71,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Bạn không có quyền upload hoặc tạo files ở đây",
"Nothing in here. Upload something!" => "Không có gì ở đây .Hãy tải lên một cái gì đó !",
"Download" => "Tải về",
-"Delete" => "Xóa",
"Upload too large" => "Tập tin tải lên quá lớn",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ .",
"Files are being scanned, please wait." => "Tập tin đang được quét ,vui lòng chờ."
diff --git a/apps/files/l10n/zh_CN.php b/apps/files/l10n/zh_CN.php
index ae444ee52bd7b98d13d5bd23a156367387d302f1..0191e0bb448924f7b79d3cf5f516138986448259 100644
--- a/apps/files/l10n/zh_CN.php
+++ b/apps/files/l10n/zh_CN.php
@@ -41,6 +41,7 @@ $TRANSLATIONS = array(
"Error fetching URL" => "获取URL出错",
"Share" => "分享",
"Delete permanently" => "永久删除",
+"Delete" => "删除",
"Rename" => "重命名",
"Your download is being prepared. This might take some time if the files are big." => "下载正在准备中。如果文件较大可能会花费一些时间。",
"Pending" => "等待",
@@ -67,10 +68,6 @@ $TRANSLATIONS = array(
"File handling" => "文件处理",
"Maximum upload size" => "最大上传大小",
"max. possible: " => "最大允许: ",
-"Needed for multi-file and folder downloads." => "多文件和文件夹下载需要此项。",
-"Enable ZIP-download" => "启用 ZIP 下载",
-"0 is unlimited" => "0 为无限制",
-"Maximum input size for ZIP files" => "ZIP 文件的最大输入大小",
"Save" => "保存",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "使用这个地址 通过 WebDAV 访问您的文件 ",
@@ -84,7 +81,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "您没有权限来上传湖州哦和创建文件",
"Nothing in here. Upload something!" => "这里还什么都没有。上传些东西吧!",
"Download" => "下载",
-"Delete" => "删除",
"Upload too large" => "上传文件过大",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "您正尝试上传的文件超过了此服务器可以上传的最大容量限制",
"Files are being scanned, please wait." => "文件正在被扫描,请稍候。"
diff --git a/apps/files/l10n/zh_HK.php b/apps/files/l10n/zh_HK.php
index 62a37f4040513b1f2d5834f0bdade6272c2cd035..65438bd5dcedb106db2033ef77d445bf951f5edf 100644
--- a/apps/files/l10n/zh_HK.php
+++ b/apps/files/l10n/zh_HK.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Files" => "文件",
"Share" => "分享",
+"Delete" => "刪除",
"Error" => "錯誤",
"Name" => "名稱",
"Size" => "大小",
@@ -10,7 +11,6 @@ $TRANSLATIONS = array(
"_Uploading %n file_::_Uploading %n files_" => array(""),
"Save" => "儲存",
"New folder" => "新文件夾",
-"Download" => "下載",
-"Delete" => "刪除"
+"Download" => "下載"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files/l10n/zh_TW.php b/apps/files/l10n/zh_TW.php
index bfdeb6fe127812197aded491f8b808739ff35b24..878312068ac93ac01816703766481482be360356 100644
--- a/apps/files/l10n/zh_TW.php
+++ b/apps/files/l10n/zh_TW.php
@@ -35,6 +35,7 @@ $TRANSLATIONS = array(
"Could not create folder" => "無法建立資料夾",
"Share" => "分享",
"Delete permanently" => "永久刪除",
+"Delete" => "刪除",
"Rename" => "重新命名",
"Your download is being prepared. This might take some time if the files are big." => "正在準備您的下載,若您的檔案較大,將會需要更多時間。",
"Pending" => "等候中",
@@ -57,10 +58,6 @@ $TRANSLATIONS = array(
"File handling" => "檔案處理",
"Maximum upload size" => "上傳限制",
"max. possible: " => "最大允許:",
-"Needed for multi-file and folder downloads." => "下載多檔案和目錄時,此項是必填的。",
-"Enable ZIP-download" => "啟用 ZIP 下載",
-"0 is unlimited" => "0代表沒有限制",
-"Maximum input size for ZIP files" => "ZIP 壓縮前的原始大小限制",
"Save" => "儲存",
"WebDAV" => "WebDAV",
"Use this address to access your Files via WebDAV " => "使用這個地址來透過 WebDAV 存取檔案 ",
@@ -73,7 +70,6 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "您沒有權限在這裡上傳或建立檔案",
"Nothing in here. Upload something!" => "這裡還沒有東西,上傳一些吧!",
"Download" => "下載",
-"Delete" => "刪除",
"Upload too large" => "上傳過大",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "您試圖上傳的檔案大小超過伺服器的限制。",
"Files are being scanned, please wait." => "正在掃描檔案,請稍等。"
diff --git a/apps/files/list.php b/apps/files/list.php
index e583839b2519449f3e1e366ec1b98fd18da8cec7..5ecbd1c7fa09349b14c47698ee9d3d2f6d7df440 100644
--- a/apps/files/list.php
+++ b/apps/files/list.php
@@ -33,6 +33,5 @@ $uploadLimit=OCP\Util::uploadLimit();
$tmpl = new OCP\Template('files', 'list', '');
$tmpl->assign('uploadLimit', $uploadLimit); // PHP upload limit
$tmpl->assign('publicUploadEnabled', $publicUploadEnabled);
-$tmpl->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
$tmpl->printPage();
diff --git a/apps/files/templates/admin.php b/apps/files/templates/admin.php
index 5f7d3261d6c1a5dd2e6b16f347a2493f3e072a06..6fb99b18add620ab38571f474f6da58032cc33e5 100644
--- a/apps/files/templates/admin.php
+++ b/apps/files/templates/admin.php
@@ -1,26 +1,18 @@
-
+
-
-
-
-
+
diff --git a/apps/files/templates/appnavigation.php b/apps/files/templates/appnavigation.php
index 86436bbe8c4733398c0bf809a610a04a941286fe..3591d0199b079117378c62a6477234608f5683c5 100644
--- a/apps/files/templates/appnavigation.php
+++ b/apps/files/templates/appnavigation.php
@@ -6,7 +6,7 @@
t('WebDAV'));?>
diff --git a/apps/files/templates/list.php b/apps/files/templates/list.php
index 17bf3b3de837e4d8df0727970dd558dd936b902a..eddcd9f62360d950914bad5f5630bb3e058e2484 100644
--- a/apps/files/templates/list.php
+++ b/apps/files/templates/list.php
@@ -61,13 +61,11 @@
t( 'Name' )); ?>
-
-
- " />
- t('Download'))?>
-
-
+
+ " />
+ t('Download'))?>
+
@@ -89,7 +87,6 @@
-
diff --git a/apps/files/tests/js/appSpec.js b/apps/files/tests/js/appSpec.js
index a9bbab03ecb4914be8abeb3fa31cf530d0eac7a8..99a73d0b01df6f455a4a536d318e3dbc88cd9a50 100644
--- a/apps/files/tests/js/appSpec.js
+++ b/apps/files/tests/js/appSpec.js
@@ -200,31 +200,31 @@ describe('OCA.Files.App tests', function() {
expect(App.navigation.getActiveItem()).toEqual('other');
expect($('#app-content-files').hasClass('hidden')).toEqual(true);
expect($('#app-content-other').hasClass('hidden')).toEqual(false);
- expect($('li[data-id=files]').hasClass('selected')).toEqual(false);
- expect($('li[data-id=other]').hasClass('selected')).toEqual(true);
+ expect($('li[data-id=files]').hasClass('active')).toEqual(false);
+ expect($('li[data-id=other]').hasClass('active')).toEqual(true);
App._onPopState({view: 'files', dir: '/somedir'});
expect(App.navigation.getActiveItem()).toEqual('files');
expect($('#app-content-files').hasClass('hidden')).toEqual(false);
expect($('#app-content-other').hasClass('hidden')).toEqual(true);
- expect($('li[data-id=files]').hasClass('selected')).toEqual(true);
- expect($('li[data-id=other]').hasClass('selected')).toEqual(false);
+ expect($('li[data-id=files]').hasClass('active')).toEqual(true);
+ expect($('li[data-id=other]').hasClass('active')).toEqual(false);
});
it('clicking on navigation switches the panel visibility', function() {
$('li[data-id=other]>a').click();
expect(App.navigation.getActiveItem()).toEqual('other');
expect($('#app-content-files').hasClass('hidden')).toEqual(true);
expect($('#app-content-other').hasClass('hidden')).toEqual(false);
- expect($('li[data-id=files]').hasClass('selected')).toEqual(false);
- expect($('li[data-id=other]').hasClass('selected')).toEqual(true);
+ expect($('li[data-id=files]').hasClass('active')).toEqual(false);
+ expect($('li[data-id=other]').hasClass('active')).toEqual(true);
$('li[data-id=files]>a').click();
expect(App.navigation.getActiveItem()).toEqual('files');
expect($('#app-content-files').hasClass('hidden')).toEqual(false);
expect($('#app-content-other').hasClass('hidden')).toEqual(true);
- expect($('li[data-id=files]').hasClass('selected')).toEqual(true);
- expect($('li[data-id=other]').hasClass('selected')).toEqual(false);
+ expect($('li[data-id=files]').hasClass('active')).toEqual(true);
+ expect($('li[data-id=other]').hasClass('active')).toEqual(false);
});
it('clicking on navigation sends "show" and "urlChanged" event', function() {
var handler = sinon.stub();
diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js
index 855a5c9af5188aef27c6ff5c9246bc3602369416..7d3bc946dd3a6793375a0988b4ea001b4c86361b 100644
--- a/apps/files/tests/js/filelistSpec.js
+++ b/apps/files/tests/js/filelistSpec.js
@@ -252,7 +252,7 @@ describe('OCA.Files.FileList tests', function() {
size: '0'
};
var $tr = fileList.add(fileData);
- expect($tr.find('.filesize').text()).toEqual('0 B');
+ expect($tr.find('.filesize').text()).toEqual('0 kB');
});
it('adds new file to the end of the list', function() {
var $tr;
diff --git a/apps/files_encryption/3rdparty/Crypt_Blowfish/Blowfish.php b/apps/files_encryption/3rdparty/Crypt_Blowfish/Blowfish.php
index 4ccacb963e3c535182eba8f5f74470c86abdfc6d..2f04b9fcb5797c7bca36a6b851d0f3626407f524 100644
--- a/apps/files_encryption/3rdparty/Crypt_Blowfish/Blowfish.php
+++ b/apps/files_encryption/3rdparty/Crypt_Blowfish/Blowfish.php
@@ -25,10 +25,8 @@
* @link http://pear.php.net/package/Crypt_Blowfish
*/
-
require_once 'PEAR.php';
-
/**
*
* Example usage:
@@ -47,7 +45,7 @@ require_once 'PEAR.php';
* @version @package_version@
* @access public
*/
-class Crypt_Blowfish
+class Legacy_Crypt_Blowfish
{
/**
* P-Array contains 18 32-bit subkeys
@@ -91,7 +89,7 @@ class Crypt_Blowfish
* @param string $key
* @access public
*/
- function Crypt_Blowfish($key)
+ function Legacy_Crypt_Blowfish($key)
{
if (extension_loaded('mcrypt')) {
$this->_td = mcrypt_module_open(MCRYPT_BLOWFISH, '', 'ecb', '');
@@ -133,7 +131,7 @@ class Crypt_Blowfish
*/
function _init()
{
- $defaults = new Crypt_Blowfish_DefaultKey();
+ $defaults = new \Crypt_Blowfish_DefaultKey();
$this->_P = $defaults->P;
$this->_S = $defaults->S;
}
@@ -192,7 +190,7 @@ class Crypt_Blowfish
function encrypt($plainText)
{
if (!is_string($plainText)) {
- PEAR::raiseError('Plain text must be a string', 0, PEAR_ERROR_DIE);
+ \PEAR::raiseError('Plain text must be a string', 0, PEAR_ERROR_DIE);
}
if (extension_loaded('mcrypt')) {
@@ -221,7 +219,7 @@ class Crypt_Blowfish
function decrypt($cipherText)
{
if (!is_string($cipherText)) {
- PEAR::raiseError('Cipher text must be a string', 1, PEAR_ERROR_DIE);
+ \PEAR::raiseError('Cipher text must be a string', 1, PEAR_ERROR_DIE);
}
if (extension_loaded('mcrypt')) {
@@ -252,13 +250,13 @@ class Crypt_Blowfish
function setKey($key)
{
if (!is_string($key)) {
- PEAR::raiseError('Key must be a string', 2, PEAR_ERROR_DIE);
+ \PEAR::raiseError('Key must be a string', 2, PEAR_ERROR_DIE);
}
$len = strlen($key);
if ($len > 56 || $len == 0) {
- PEAR::raiseError('Key must be less than 56 characters and non-zero. Supplied key length: ' . $len, 3, PEAR_ERROR_DIE);
+ \PEAR::raiseError('Key must be less than 56 characters and non-zero. Supplied key length: ' . $len, 3, PEAR_ERROR_DIE);
}
if (extension_loaded('mcrypt')) {
@@ -313,5 +311,3 @@ class Crypt_Blowfish
}
}
-
-?>
diff --git a/apps/files_encryption/3rdparty/Crypt_Blowfish/Blowfish/DefaultKey.php b/apps/files_encryption/3rdparty/Crypt_Blowfish/Blowfish/DefaultKey.php
index 2ff8ac788a6b62a4abde68d476c673612b8bfe01..ce069498a9de71ba56e988f12356d19e6a3a43cf 100644
--- a/apps/files_encryption/3rdparty/Crypt_Blowfish/Blowfish/DefaultKey.php
+++ b/apps/files_encryption/3rdparty/Crypt_Blowfish/Blowfish/DefaultKey.php
@@ -25,7 +25,6 @@
* @link http://pear.php.net/package/Crypt_Blowfish
*/
-
/**
* Class containing default key
*
@@ -323,5 +322,3 @@ class Crypt_Blowfish_DefaultKey
}
}
-
-?>
diff --git a/apps/files_encryption/hooks/hooks.php b/apps/files_encryption/hooks/hooks.php
index f2096c3956e3b6e5f2ef49e58f065e644c6e0792..d1ee4a97d15a3d06105851bff2865a2ad9e76a93 100644
--- a/apps/files_encryption/hooks/hooks.php
+++ b/apps/files_encryption/hooks/hooks.php
@@ -51,16 +51,16 @@ class Hooks {
$view = new \OC\Files\View('/');
// ensure filesystem is loaded
- if(!\OC\Files\Filesystem::$loaded) {
+ if (!\OC\Files\Filesystem::$loaded) {
\OC_Util::setupFS($params['uid']);
}
$privateKey = \OCA\Encryption\Keymanager::getPrivateKey($view, $params['uid']);
// if no private key exists, check server configuration
- if(!$privateKey) {
+ if (!$privateKey) {
//check if all requirements are met
- if(!Helper::checkRequirements() || !Helper::checkConfiguration()) {
+ if (!Helper::checkRequirements() || !Helper::checkConfiguration()) {
$error_msg = $l->t("Missing requirements.");
$hint = $l->t('Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled.');
\OC_App::disable('files_encryption');
@@ -90,6 +90,8 @@ class Hooks {
return false;
}
+ $result = true;
+
// If migration not yet done
if ($ready) {
@@ -97,15 +99,14 @@ class Hooks {
// Set legacy encryption key if it exists, to support
// depreciated encryption system
- if (
- $userView->file_exists('encryption.key')
- && $encLegacyKey = $userView->file_get_contents('encryption.key')
- ) {
-
- $plainLegacyKey = Crypt::legacyDecrypt($encLegacyKey, $params['password']);
+ if ($userView->file_exists('encryption.key')) {
+ $encLegacyKey = $userView->file_get_contents('encryption.key');
+ if ($encLegacyKey) {
- $session->setLegacyKey($plainLegacyKey);
+ $plainLegacyKey = Crypt::legacyDecrypt($encLegacyKey, $params['password']);
+ $session->setLegacyKey($plainLegacyKey);
+ }
}
// Encrypt existing user files
@@ -113,26 +114,24 @@ class Hooks {
$result = $util->encryptAll('/' . $params['uid'] . '/' . 'files', $session->getLegacyKey(), $params['password']);
} catch (\Exception $ex) {
\OCP\Util::writeLog('Encryption library', 'Initial encryption failed! Error: ' . $ex->getMessage(), \OCP\Util::FATAL);
- $util->resetMigrationStatus();
- \OCP\User::logout();
$result = false;
}
if ($result) {
-
\OC_Log::write(
- 'Encryption library', 'Encryption of existing files belonging to "' . $params['uid'] . '" completed'
- , \OC_Log::INFO
- );
-
+ 'Encryption library', 'Encryption of existing files belonging to "' . $params['uid'] . '" completed'
+ , \OC_Log::INFO
+ );
// Register successful migration in DB
$util->finishMigration();
-
+ } else {
+ \OCP\Util::writeLog('Encryption library', 'Initial encryption failed!', \OCP\Util::FATAL);
+ $util->resetMigrationStatus();
+ \OCP\User::logout();
}
}
- return true;
-
+ return $result;
}
/**
diff --git a/apps/files_encryption/l10n/ar.php b/apps/files_encryption/l10n/ar.php
index fbe0ecfe9f606c6859701d40bd3dbfd223318305..841aafb266112267a03d8c6808fba7cd705173d6 100644
--- a/apps/files_encryption/l10n/ar.php
+++ b/apps/files_encryption/l10n/ar.php
@@ -11,6 +11,7 @@ $TRANSLATIONS = array(
"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "برنامج التشفير لم يتم تهيئتة ! من الممكن ان برنامج التشفير تم اعادة تفعيلة خلال الجلسة. يرجى تسجيل الخروج ومن ثم تسجيل الدخول مجددا لتهيئة برنامج التشفير.",
"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "مفتاحك الخاص غير صالح! ربما تم تغيير كلمة المرور خارج %s (مثل:مجلد شركتك). يمكنك تحديث كلمة المرور في الاعدادات الشخصية لإستعادة الوصول الى ملفاتك المشفرة.",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "لا يمكن فك التشفير من هذا الملف, من الممكن ان يكون هذا الملف مُشارك. يرجى سؤال صاحب الملف لإعادة مشاركتة معك.",
+"Unknown error. Please check your system settings or contact your administrator" => "خطأ غير معروف, الرجاء التحقق من إعدادات نظامك أو راسل المدير",
"Missing requirements." => "متطلبات ناقصة.",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "يرجى التاكد من ان اصدار PHP 5.3.3 او احدث , مثبت و التاكد من ان OpenSSL مفعل و مهيئ بشكل صحيح. حتى الان برنامج التتشفير تم تعطيلة.",
"Following users are not set up for encryption:" => "المستخدمين التاليين لم يتم تعيين لهم التشفيير:",
diff --git a/apps/files_encryption/l10n/gl.php b/apps/files_encryption/l10n/gl.php
index f5fce3260843b70d5d27dc2b3f1bac7545650b1e..936aaa328d2a40c3942a6a61cbbd0eabb34c4d6f 100644
--- a/apps/files_encryption/l10n/gl.php
+++ b/apps/files_encryption/l10n/gl.php
@@ -8,12 +8,12 @@ $TRANSLATIONS = array(
"Could not change the password. Maybe the old password was not correct." => "Non foi posíbel cambiar o contrasinal. Probabelmente o contrasinal antigo non é o correcto.",
"Private key password successfully updated." => "A chave privada foi actualizada correctamente.",
"Could not update the private key password. Maybe the old password was not correct." => "Non foi posíbel actualizar o contrasinal da chave privada. É probábel que o contrasinal antigo non sexa correcto.",
-"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Non se iniciou o aplicativo de cifrado! Quizais volva a activarse durante a sesión. Tente pechar a sesión e volver iniciala que tamén se inicie o aplicativo de cifrado.",
+"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Non se iniciou o aplicativo de cifrado! Quizais volva a activarse durante a sesión. Tente pechar a sesión e volver iniciala para que tamén se inicie o aplicativo de cifrado.",
"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "A chave privada non é correcta! É probábel que o seu contrasinal teña sido cambiado desde o exterior do %s (p.ex. o seu directorio corporativo). Vostede pode actualizar o contrasinal da súa chave privada nos seus axustes persoais para recuperar o acceso aos seus ficheiros",
-"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Non foi posíbel descifrar o ficheiro, probabelmente tratase dun ficheiro compartido. Pidalle ao propietario do ficheiro que volva compartir o ficheiro con vostede.",
+"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Non foi posíbel descifrar o ficheiro, probabelmente tratase dun ficheiro compartido. Pídalle ao propietario do ficheiro que volva compartir o ficheiro con vostede.",
"Unknown error. Please check your system settings or contact your administrator" => "Produciuse un erro descoñecido. Comprobe os axustes do sistema ou contacte co administrador",
"Missing requirements." => "Non se cumpren os requisitos.",
-"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Asegúrese de que está instalado o PHP 5.3.3 ou posterior e de o OpenSSL xunto coa extensión PHP estean activados e configurados correctamente. Polo de agora foi desactivado o aplicativo de cifrado.",
+"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Asegúrese de que está instalado o PHP 5.3.3 ou posterior e de que o OpenSSL xunto coa extensión PHP estean activados e configurados correctamente. Polo de agora foi desactivado o aplicativo de cifrado.",
"Following users are not set up for encryption:" => "Os seguintes usuarios non teñen configuración para o cifrado:",
"Initial encryption started... This can take some time. Please wait." => "Comezou o cifrado inicial... Isto pode levar bastante tempo. Agarde.",
"Initial encryption running... Please try again later." => "O cifrado inicial está en execución... Tenteo máis tarde.",
@@ -22,19 +22,19 @@ $TRANSLATIONS = array(
"Encryption" => "Cifrado",
"Enable recovery key (allow to recover users files in case of password loss):" => "Activar a chave de recuperación (permitirá recuperar os ficheiros dos usuarios no caso de perda do contrasinal):",
"Recovery key password" => "Contrasinal da chave de recuperación",
-"Repeat Recovery key password" => "Repita o contrasinal da chave da recuperación",
+"Repeat Recovery key password" => "Repita o contrasinal da chave de recuperación",
"Enabled" => "Activado",
"Disabled" => "Desactivado",
"Change recovery key password:" => "Cambiar o contrasinal da chave de la recuperación:",
"Old Recovery key password" => "Antigo contrasinal da chave de recuperación",
"New Recovery key password" => "Novo contrasinal da chave de recuperación",
-"Repeat New Recovery key password" => "Repita o novo contrasinal da chave da recuperación",
+"Repeat New Recovery key password" => "Repita o novo contrasinal da chave de recuperación",
"Change Password" => "Cambiar o contrasinal",
"Your private key password no longer match your log-in password:" => "O seu contrasinal da chave privada non coincide co seu contrasinal de acceso.",
"Set your old private key password to your current log-in password." => "Estabeleza o seu contrasinal antigo da chave de recuperación ao seu contrasinal de acceso actual",
-" If you don't remember your old password you can ask your administrator to recover your files." => " Se non lembra o seu antigo contrasinal pode pedírllelo ao seu administrador para recuperar os seus ficheiros.",
-"Old log-in password" => "Contrasinal de acceso antigo",
-"Current log-in password" => "Contrasinal de acceso actual",
+" If you don't remember your old password you can ask your administrator to recover your files." => "Se non lembra o seu antigo contrasinal pode pedírllelo ao seu administrador para recuperar os seus ficheiros.",
+"Old log-in password" => "Contrasinal antigo de acceso",
+"Current log-in password" => "Contrasinal actual de acceso",
"Update Private Key Password" => "Actualizar o contrasinal da chave privada",
"Enable password recovery:" => "Activar o contrasinal de recuperación:",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Ao activar esta opción permitiráselle volver a obter acceso aos ficheiros cifrados no caso de perda do contrasinal",
diff --git a/apps/files_encryption/l10n/ja.php b/apps/files_encryption/l10n/ja.php
index fa1d4c3da4029ab3150934cd48dca0dae899751b..81de8419c20265debac6e45a6ca34aef691bf5e3 100644
--- a/apps/files_encryption/l10n/ja.php
+++ b/apps/files_encryption/l10n/ja.php
@@ -11,6 +11,7 @@ $TRANSLATIONS = array(
"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "セッション中に暗号化アプリを再度有効にされたため、暗号化アプリが初期化されていません。暗号化アプリを初期化するため、ログアウトしてログインしなおしてください。",
"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "プライベートキーが有効ではありません!パスワードが%sの外部で変更された(例: 共同ディレクトリ)と思われます。個人設定でプライベートキーのパスワードを更新して、暗号化ファイルへのアクセスを回復することができます。",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "このファイルを復号化できません、共有ファイルの可能性があります。ファイルの所有者にお願いして、ファイルを共有しなおしてもらってください。",
+"Unknown error. Please check your system settings or contact your administrator" => "不明なエラーです。システム設定を確認するか、管理者に問い合わせてください。",
"Missing requirements." => "必要要件が満たされていません。",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "必ず、PHP 5.3.3もしくはそれ以上をインストールし、同時にOpenSSLのPHP拡張を有効にした上でOpenSSLも同様にインストール、適切に設定してください。現時点では暗号化アプリは無効になっています。",
"Following users are not set up for encryption:" => "以下のユーザーは、暗号化設定がされていません:",
diff --git a/apps/files_encryption/l10n/pl.php b/apps/files_encryption/l10n/pl.php
index e756ab4d03946348d901855ade3abf79969401ab..c8542cd8d78ced6e98dff18960b0901c374585e3 100644
--- a/apps/files_encryption/l10n/pl.php
+++ b/apps/files_encryption/l10n/pl.php
@@ -11,6 +11,7 @@ $TRANSLATIONS = array(
"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Szyfrowanie aplikacja nie została zainicjowane! Może szyfrowanie aplikacji zostało ponownie włączone podczas tej sesji. Spróbuj się wylogować i zalogować ponownie aby zainicjować szyfrowanie aplikacji.",
"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Klucz prywatny nie jest poprawny! Prawdopodobnie Twoje hasło zostało zmienione poza %s (np. w katalogu firmy). Aby odzyskać dostęp do zaszyfrowanych plików można zaktualizować hasło klucza prywatnego w ustawieniach osobistych.",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Nie można odszyfrować tego pliku, prawdopodobnie jest to plik udostępniony. Poproś właściciela pliku o ponowne udostępnianie pliku Tobie.",
+"Unknown error. Please check your system settings or contact your administrator" => "Nieznany błąd. Proszę sprawdzić ustawienia systemowe lub skontaktować się z administratorem",
"Missing requirements." => "Brak wymagań.",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Proszę upewnić się, że PHP 5.3.3 lub nowszy jest zainstalowany i że OpenSSL oraz rozszerzenie PHP jest włączone i poprawnie skonfigurowane. Obecnie szyfrowanie aplikacji zostało wyłączone.",
"Following users are not set up for encryption:" => "Następujący użytkownicy nie mają skonfigurowanego szyfrowania:",
diff --git a/apps/files_encryption/l10n/zh_TW.php b/apps/files_encryption/l10n/zh_TW.php
index e4954443cc656900dec71f0bc2b7d6759e27c42e..f45628676664b8d370d886ddd4b7e47ddb302a98 100644
--- a/apps/files_encryption/l10n/zh_TW.php
+++ b/apps/files_encryption/l10n/zh_TW.php
@@ -11,6 +11,7 @@ $TRANSLATIONS = array(
"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "加密功能未初始化!可能加密功能需要重新啟用在現在的連線上。請試著登出再登入來初始化加密功能。",
"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "您的私人金鑰不正確!可能您的密碼已經變更在外部的 %s (例如:您的企業目錄)。您可以在您的個人設定中更新私人金鑰密碼來還原存取您的加密檔案。",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "無法解密這個檔案,也許這是分享的檔案。請詢問檔案所有人重新分享檔案給您。",
+"Unknown error. Please check your system settings or contact your administrator" => "未知錯誤請檢查您的系統設定或是聯絡您的管理員",
"Missing requirements." => "遺失必要條件。",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "請確認已安裝 PHP 5.3.3 或是更新的版本以及 OpenSSL 也一併安裝在 PHP extension 裡面並啟用及設置完成。現在,加密功能是停用的。",
"Following users are not set up for encryption:" => "以下的使用者無法設定加密:",
diff --git a/apps/files_encryption/lib/crypt.php b/apps/files_encryption/lib/crypt.php
index ec7b3bc92e47c20994769c97804cb4232a9914dc..694791810c9a61f30a7d7a69478f75a17f307ab7 100755
--- a/apps/files_encryption/lib/crypt.php
+++ b/apps/files_encryption/lib/crypt.php
@@ -532,7 +532,7 @@ class Crypt {
if ($key) {
- return new \Crypt_Blowfish($key);
+ return new \Legacy_Crypt_Blowfish($key);
} else {
diff --git a/apps/files_encryption/lib/proxy.php b/apps/files_encryption/lib/proxy.php
index ae3df834e9f417394a65f732b0338c4a736b5a57..fd91073b8debf95cc77bc59b0efe2502460af51e 100644
--- a/apps/files_encryption/lib/proxy.php
+++ b/apps/files_encryption/lib/proxy.php
@@ -275,7 +275,7 @@ class Proxy extends \OC_FileProxy {
\OC_FileProxy::$enabled = false;
// get file size
- $data['size'] = self::postFileSize($path, $data['size']);
+ $data['size'] = self::postFileSize($path, $data['size'], $data);
// Re-enable the proxy
\OC_FileProxy::$enabled = $proxyStatus;
@@ -289,7 +289,7 @@ class Proxy extends \OC_FileProxy {
* @param int $size
* @return int|bool
*/
- public function postFileSize($path, $size) {
+ public function postFileSize($path, $size, $fileInfo = null) {
$view = new \OC\Files\View('/');
@@ -323,9 +323,8 @@ class Proxy extends \OC_FileProxy {
return $size;
}
- $fileInfo = false;
// get file info from database/cache if not .part file
- if (!Helper::isPartialFilePath($path)) {
+ if (empty($fileInfo) && !Helper::isPartialFilePath($path)) {
$proxyState = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false;
$fileInfo = $view->getFileInfo($path);
@@ -333,7 +332,7 @@ class Proxy extends \OC_FileProxy {
}
// if file is encrypted return real file size
- if ($fileInfo && $fileInfo['encrypted'] === true) {
+ if (isset($fileInfo['encrypted']) && $fileInfo['encrypted'] === true) {
// try to fix unencrypted file size if it doesn't look plausible
if ((int)$fileInfo['size'] > 0 && (int)$fileInfo['unencrypted_size'] === 0 ) {
$fixSize = $util->getFileSize($path);
diff --git a/apps/files_encryption/lib/util.php b/apps/files_encryption/lib/util.php
index 991960b7fa9ad88ab9f345598f0e3ae3edd5b768..434d23f4a5a48e7873db0d47a3ce408bd09cf5d4 100644
--- a/apps/files_encryption/lib/util.php
+++ b/apps/files_encryption/lib/util.php
@@ -303,7 +303,7 @@ class Util {
* Find all files and their encryption status within a directory
* @param string $directory The path of the parent directory to search
* @param bool $found the founded files if called again
- * @return mixed false if 0 found, array on success. Keys: name, path
+ * @return array keys: plain, encrypted, legacy, broken
* @note $directory needs to be a path relative to OC data dir. e.g.
* /admin/files NOT /backup OR /home/www/oc/data/admin/files
*/
@@ -322,11 +322,8 @@ class Util {
);
}
- if (
- $this->view->is_dir($directory)
- && $handle = $this->view->opendir($directory)
- ) {
- if(is_resource($handle)) {
+ if ($this->view->is_dir($directory) && $handle = $this->view->opendir($directory)){
+ if (is_resource($handle)) {
while (false !== ($file = readdir($handle))) {
if ($file !== "." && $file !== "..") {
@@ -390,34 +387,16 @@ class Util {
'name' => $file,
'path' => $relPath
);
-
}
-
}
-
}
-
}
}
-
- \OC_FileProxy::$enabled = true;
-
- if (empty($found)) {
-
- return false;
-
- } else {
-
- return $found;
-
- }
-
}
\OC_FileProxy::$enabled = true;
- return false;
-
+ return $found;
}
/**
@@ -571,28 +550,6 @@ class Util {
return $result;
}
-
- /**
- * @param string $path
- * @return bool
- */
- public function isSharedPath($path) {
-
- $trimmed = ltrim($path, '/');
- $split = explode('/', $trimmed);
-
- if (isset($split[2]) && $split[2] === 'Shared') {
-
- return true;
-
- } else {
-
- return false;
-
- }
-
- }
-
/**
* encrypt versions from given file
* @param array $filelist list of encrypted files, relative to data/user/files
@@ -808,121 +765,119 @@ class Util {
*/
public function encryptAll($dirPath, $legacyPassphrase = null, $newPassphrase = null) {
+ $result = true;
+
$found = $this->findEncFiles($dirPath);
- if ($found) {
+ // Disable proxy to prevent file being encrypted twice
+ \OC_FileProxy::$enabled = false;
- // Disable proxy to prevent file being encrypted twice
- \OC_FileProxy::$enabled = false;
+ $versionStatus = \OCP\App::isEnabled('files_versions');
+ \OC_App::disable('files_versions');
- $versionStatus = \OCP\App::isEnabled('files_versions');
- \OC_App::disable('files_versions');
+ $encryptedFiles = array();
- $encryptedFiles = array();
+ // Encrypt unencrypted files
+ foreach ($found['plain'] as $plainFile) {
- // Encrypt unencrypted files
- foreach ($found['plain'] as $plainFile) {
+ //get file info
+ $fileInfo = \OC\Files\Filesystem::getFileInfo($plainFile['path']);
- //get file info
- $fileInfo = \OC\Files\Filesystem::getFileInfo($plainFile['path']);
+ //relative to data/
/file
+ $relPath = $plainFile['path'];
- //relative to data//file
- $relPath = $plainFile['path'];
+ //relative to /data
+ $rawPath = '/' . $this->userId . '/files/' . $plainFile['path'];
- //relative to /data
- $rawPath = '/' . $this->userId . '/files/' . $plainFile['path'];
-
- // keep timestamp
- $timestamp = $fileInfo['mtime'];
+ // keep timestamp
+ $timestamp = $fileInfo['mtime'];
- // Open plain file handle for binary reading
- $plainHandle = $this->view->fopen($rawPath, 'rb');
+ // Open plain file handle for binary reading
+ $plainHandle = $this->view->fopen($rawPath, 'rb');
- // Open enc file handle for binary writing, with same filename as original plain file
- $encHandle = fopen('crypt://' . $rawPath . '.part', 'wb');
+ // Open enc file handle for binary writing, with same filename as original plain file
+ $encHandle = fopen('crypt://' . $rawPath . '.part', 'wb');
- if (is_resource($encHandle)) {
- // Move plain file to a temporary location
- $size = stream_copy_to_stream($plainHandle, $encHandle);
+ if (is_resource($encHandle) && is_resource($plainHandle)) {
+ // Move plain file to a temporary location
+ $size = stream_copy_to_stream($plainHandle, $encHandle);
- fclose($encHandle);
- fclose($plainHandle);
+ fclose($encHandle);
+ fclose($plainHandle);
- $fakeRoot = $this->view->getRoot();
- $this->view->chroot('/' . $this->userId . '/files');
+ $fakeRoot = $this->view->getRoot();
+ $this->view->chroot('/' . $this->userId . '/files');
- $this->view->rename($relPath . '.part', $relPath);
+ $this->view->rename($relPath . '.part', $relPath);
- // set timestamp
- $this->view->touch($relPath, $timestamp);
+ // set timestamp
+ $this->view->touch($relPath, $timestamp);
- $encSize = $this->view->filesize($relPath);
+ $encSize = $this->view->filesize($relPath);
- $this->view->chroot($fakeRoot);
+ $this->view->chroot($fakeRoot);
- // Add the file to the cache
- \OC\Files\Filesystem::putFileInfo($relPath, array(
- 'encrypted' => true,
- 'size' => $encSize,
- 'unencrypted_size' => $size,
- 'etag' => $fileInfo['etag']
- ));
+ // Add the file to the cache
+ \OC\Files\Filesystem::putFileInfo($relPath, array(
+ 'encrypted' => true,
+ 'size' => $encSize,
+ 'unencrypted_size' => $size,
+ 'etag' => $fileInfo['etag']
+ ));
- $encryptedFiles[] = $relPath;
- }
+ $encryptedFiles[] = $relPath;
+ } else {
+ \OCP\Util::writeLog('files_encryption', 'initial encryption: could not encrypt ' . $rawPath, \OCP\Util::FATAL);
+ $result = false;
}
+ }
- // Encrypt legacy encrypted files
- if (
- !empty($legacyPassphrase)
- && !empty($newPassphrase)
- ) {
-
- foreach ($found['legacy'] as $legacyFile) {
+ // Encrypt legacy encrypted files
+ if (!empty($legacyPassphrase) && !empty($newPassphrase)) {
- // Fetch data from file
- $legacyData = $this->view->file_get_contents($legacyFile['path']);
+ foreach ($found['legacy'] as $legacyFile) {
- // decrypt data, generate catfile
- $decrypted = Crypt::legacyBlockDecrypt($legacyData, $legacyPassphrase);
+ // Fetch data from file
+ $legacyData = $this->view->file_get_contents($legacyFile['path']);
- $rawPath = $legacyFile['path'];
+ // decrypt data, generate catfile
+ $decrypted = Crypt::legacyBlockDecrypt($legacyData, $legacyPassphrase);
- // enable proxy the ensure encryption is handled
- \OC_FileProxy::$enabled = true;
+ $rawPath = $legacyFile['path'];
- // Open enc file handle for binary writing, with same filename as original plain file
- $encHandle = $this->view->fopen( $rawPath, 'wb' );
+ // enable proxy the ensure encryption is handled
+ \OC_FileProxy::$enabled = true;
- if (is_resource($encHandle)) {
+ // Open enc file handle for binary writing, with same filename as original plain file
+ $encHandle = $this->view->fopen($rawPath, 'wb');
- // write data to stream
- fwrite($encHandle, $decrypted);
+ if (is_resource($encHandle)) {
- // close stream
- fclose($encHandle);
- }
+ // write data to stream
+ fwrite($encHandle, $decrypted);
- // disable proxy to prevent file being encrypted twice
- \OC_FileProxy::$enabled = false;
+ // close stream
+ fclose($encHandle);
+ } else {
+ \OCP\Util::writeLog('files_encryption', 'initial encryption: could not encrypt legacy file ' . $rawPath, \OCP\Util::FATAL);
+ $result = false;
}
+
+ // disable proxy to prevent file being encrypted twice
+ \OC_FileProxy::$enabled = false;
}
+ }
- \OC_FileProxy::$enabled = true;
+ \OC_FileProxy::$enabled = true;
- if ($versionStatus) {
- \OC_App::enable('files_versions');
- }
+ if ($versionStatus) {
+ \OC_App::enable('files_versions');
+ }
- $this->encryptVersions($encryptedFiles);
+ $result = $result && $this->encryptVersions($encryptedFiles);
- // If files were found, return true
- return true;
- } else {
+ return $result;
- // If no files were found, return false
- return false;
- }
}
/**
diff --git a/apps/files_encryption/tests/crypt.php b/apps/files_encryption/tests/crypt.php
index b22cd214eaaad1738e1b6590f8dc42ec5f05198d..3674381b6d177c18d958fa8ce5e5144d75cfd169 100755
--- a/apps/files_encryption/tests/crypt.php
+++ b/apps/files_encryption/tests/crypt.php
@@ -667,7 +667,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
*/
function legacyEncrypt($data, $passwd) {
- $bf = new \Crypt_Blowfish($passwd);
+ $bf = new Legacy_Crypt_Blowfish($passwd);
$crypted = $bf->encrypt($data);
return $crypted;
diff --git a/apps/files_encryption/tests/helper.php b/apps/files_encryption/tests/helper.php
index 4b46e976b8164f498f57be6ddff4ff9d4fab9ed8..582d8149a8ac3206728bc794965891b14003a3d1 100644
--- a/apps/files_encryption/tests/helper.php
+++ b/apps/files_encryption/tests/helper.php
@@ -18,15 +18,20 @@ use OCA\Encryption;
class Test_Encryption_Helper extends \PHPUnit_Framework_TestCase {
const TEST_ENCRYPTION_HELPER_USER1 = "test-helper-user1";
+ const TEST_ENCRYPTION_HELPER_USER2 = "test-helper-user2";
public static function setUpBeforeClass() {
// create test user
+ \Test_Encryption_Util::loginHelper(\Test_Encryption_Helper::TEST_ENCRYPTION_HELPER_USER2, true);
\Test_Encryption_Util::loginHelper(\Test_Encryption_Helper::TEST_ENCRYPTION_HELPER_USER1, true);
}
public static function tearDownAfterClass() {
// cleanup test user
\OC_User::deleteUser(\Test_Encryption_Helper::TEST_ENCRYPTION_HELPER_USER1);
+ \OC_User::deleteUser(\Test_Encryption_Helper::TEST_ENCRYPTION_HELPER_USER2);
+ \OC_Hook::clear();
+ \OC_FileProxy::clearProxies();
}
/**
@@ -81,9 +86,11 @@ class Test_Encryption_Helper extends \PHPUnit_Framework_TestCase {
$path1 = "/" . self::TEST_ENCRYPTION_HELPER_USER1 . "/files/foo/bar.txt";
$path2 = "/" . self::TEST_ENCRYPTION_HELPER_USER1 . "/cache/foo/bar.txt";
- $path3 = "/" . self::TEST_ENCRYPTION_HELPER_USER1 . "/thumbnails/foo";
+ $path3 = "/" . self::TEST_ENCRYPTION_HELPER_USER2 . "/thumbnails/foo";
$path4 ="/" . "/" . self::TEST_ENCRYPTION_HELPER_USER1;
+ \Test_Encryption_Util::loginHelper(self::TEST_ENCRYPTION_HELPER_USER1);
+
// if we are logged-in every path should return the currently logged-in user
$this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Encryption\Helper::getUser($path3));
diff --git a/apps/files_encryption/tests/stream.php b/apps/files_encryption/tests/stream.php
index 5df9cdbe1f1468c56232a90b368d6d31bd559448..254c5e87ed19697e5c0241a147615b57d6073891 100644
--- a/apps/files_encryption/tests/stream.php
+++ b/apps/files_encryption/tests/stream.php
@@ -136,6 +136,8 @@ class Test_Encryption_Stream extends \PHPUnit_Framework_TestCase {
// set stream options
$this->assertTrue(stream_set_blocking($handle, 1));
+ fclose($handle);
+
// tear down
$view->unlink($filename);
}
@@ -158,6 +160,8 @@ class Test_Encryption_Stream extends \PHPUnit_Framework_TestCase {
// set stream options
$this->assertFalse(stream_set_timeout($handle, 1));
+ fclose($handle);
+
// tear down
$view->unlink($filename);
}
@@ -177,6 +181,8 @@ class Test_Encryption_Stream extends \PHPUnit_Framework_TestCase {
// set stream options
$this->assertEquals(0, stream_set_write_buffer($handle, 1024));
+ fclose($handle);
+
// tear down
$view->unlink($filename);
}
diff --git a/apps/files_encryption/tests/util.php b/apps/files_encryption/tests/util.php
index a4dcc5cc8bdcffa26e86c55cbefec523e1df21e4..2b873bb308dfbbcce013e9e73b23b46a4c2e4309 100755
--- a/apps/files_encryption/tests/util.php
+++ b/apps/files_encryption/tests/util.php
@@ -306,18 +306,6 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
$this->view->unlink($this->userId . '/files/' . $filename);
}
- /**
- * @medium
- */
- function testIsSharedPath() {
- $sharedPath = '/user1/files/Shared/test';
- $path = '/user1/files/test';
-
- $this->assertTrue($this->util->isSharedPath($sharedPath));
-
- $this->assertFalse($this->util->isSharedPath($path));
- }
-
function testEncryptAll() {
$filename = "/encryptAll" . uniqid() . ".txt";
diff --git a/apps/files_encryption/tests/webdav.php b/apps/files_encryption/tests/webdav.php
index d33dc58cf920a80d1a016efdcfc35fec30be17af..84db54ff30b208a9e1a7cbb00505c0858cc7f91c 100755
--- a/apps/files_encryption/tests/webdav.php
+++ b/apps/files_encryption/tests/webdav.php
@@ -49,7 +49,7 @@ class Test_Encryption_Webdav extends \PHPUnit_Framework_TestCase {
public $dataShort;
public $stateFilesTrashbin;
- private static $storage;
+ private $storage;
public static function setUpBeforeClass() {
// reset backend
@@ -69,7 +69,6 @@ class Test_Encryption_Webdav extends \PHPUnit_Framework_TestCase {
// create test user
\Test_Encryption_Util::loginHelper(\Test_Encryption_Webdav::TEST_ENCRYPTION_WEBDAV_USER1, true);
- self::$storage = new \OC\Files\Storage\Temporary(array());
}
function setUp() {
@@ -83,7 +82,7 @@ class Test_Encryption_Webdav extends \PHPUnit_Framework_TestCase {
// init filesystem view
$this->view = new \OC\Files\View('/');
-
+ list($this->storage, $intPath) = $this->view->resolvePath('/');
// init short data
$this->dataShort = 'hats';
@@ -200,6 +199,9 @@ class Test_Encryption_Webdav extends \PHPUnit_Framework_TestCase {
$_SERVER['HTTP_AUTHORIZATION'] = 'Basic dGVzdC13ZWJkYXYtdXNlcjE6dGVzdC13ZWJkYXYtdXNlcjE=';
$_SERVER['PATH_INFO'] = '/webdav' . $filename;
+ // at the beginning the file should exist
+ $this->assertTrue($this->view->file_exists('/' . $this->userId . '/files' . $filename));
+
// handle webdav request
$content = $this->handleWebdavRequest();
@@ -230,21 +232,20 @@ class Test_Encryption_Webdav extends \PHPUnit_Framework_TestCase {
// Create ownCloud Dir
$root = '/' . $this->userId . '/files';
- \OC\Files\Filesystem::mount(self::$storage, array(), $root);
$view = new \OC\Files\View($root);
$publicDir = new OC_Connector_Sabre_Directory($view, $view->getFileInfo(''));
$objectTree = new \OC\Connector\Sabre\ObjectTree();
$objectTree->init($publicDir, $view);
// Fire up server
- $server = new Sabre_DAV_Server($publicDir);
+ $server = new \Sabre\DAV\Server($publicDir);
$server->httpRequest = $requestBackend;
$server->setBaseUri('/remote.php/webdav/');
// Load plugins
- $server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend, 'ownCloud'));
- $server->addPlugin(new Sabre_DAV_Locks_Plugin($lockBackend));
- $server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload
+ $server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, 'ownCloud'));
+ $server->addPlugin(new \Sabre\DAV\Locks\Plugin($lockBackend));
+ $server->addPlugin(new \Sabre\DAV\Browser\Plugin(false)); // Show something in the Browser, but no upload
$server->addPlugin(new OC_Connector_Sabre_QuotaPlugin($view));
$server->addPlugin(new OC_Connector_Sabre_MaintenancePlugin());
$server->debugExceptions = true;
diff --git a/apps/files_external/3rdparty/phpseclib/AUTHORS b/apps/files_external/3rdparty/phpseclib/AUTHORS
deleted file mode 100644
index e175f9f22c24f94604ae254212e42b07565921a9..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/AUTHORS
+++ /dev/null
@@ -1,5 +0,0 @@
-phpseclib Lead Developer: TerraFrost (Jim Wigginton)
-
-phpseclib Developers: monnerat (Patrick Monnerat)
- bantu (Andreas Fischer)
- petrich (Hans-Jürgen Petrich)
diff --git a/apps/files_external/3rdparty/phpseclib/LICENSE b/apps/files_external/3rdparty/phpseclib/LICENSE
deleted file mode 100644
index 75f6b2045c5b50843f38c4338bf25881f38ebbef..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-Copyright 2007-2013 TerraFrost and other contributors
-http://phpseclib.sourceforge.net/
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/apps/files_external/3rdparty/phpseclib/README.md b/apps/files_external/3rdparty/phpseclib/README.md
deleted file mode 100644
index de528231662b0d47ed6849c8cc45097a6523cbdc..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# phpseclib - PHP Secure Communications Library
-
-[![Build Status](https://secure.travis-ci.org/phpseclib/phpseclib.png?branch=master)](http://travis-ci.org/phpseclib/phpseclib)
-
-MIT-licensed pure-PHP implementations of an arbitrary-precision integer
-arithmetic library, fully PKCS#1 (v2.1) compliant RSA, DES, 3DES, RC4, Rijndael,
-AES, Blowfish, Twofish, SSH-1, SSH-2, SFTP, and X.509
-
-* [Download (0.3.6)](http://sourceforge.net/projects/phpseclib/files/phpseclib0.3.6.zip/download)
-* [Browse Git](https://github.com/phpseclib/phpseclib)
-* [Documentation](http://phpseclib.sourceforge.net/)
-* [Support](http://www.frostjedi.com/phpbb/viewforum.php?f=46)
-* [Code Coverage Report](http://phpseclib.bantux.org/code_coverage/master/latest/)
-
-
-PEAR Channel: [phpseclib.sourceforge.net](http://phpseclib.sourceforge.net/pear.htm)
diff --git a/apps/files_external/3rdparty/phpseclib/composer.json b/apps/files_external/3rdparty/phpseclib/composer.json
deleted file mode 100644
index 70f4f7c36e9412fb64849a9a66d9e0c8f1d4d8ff..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/composer.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
- "name": "phpseclib/phpseclib",
- "type": "library",
- "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
- "keywords": [
- "security",
- "crypto",
- "cryptography",
- "encryption",
- "signature",
- "signing",
- "rsa",
- "aes",
- "blowfish",
- "twofish",
- "ssh",
- "sftp",
- "x509",
- "x.509",
- "asn1",
- "asn.1",
- "BigInteger"
- ],
- "homepage": "http://phpseclib.sourceforge.net",
- "license": "MIT",
- "authors": [
- {
- "name": "Jim Wigginton",
- "email": "terrafrost@php.net",
- "role": "Lead Developer"
- },
- {
- "name": "Patrick Monnerat",
- "email": "pm@datasphere.ch",
- "role": "Developer"
- },
- {
- "name": "Andreas Fischer",
- "email": "bantu@phpbb.com",
- "role": "Developer"
- },
- {
- "name": "Hans-Jürgen Petrich",
- "email": "petrich@tronic-media.com",
- "role": "Developer"
- }
- ],
- "require": {
- "php": ">=5.0.0"
- },
- "require-dev": {
- "squizlabs/php_codesniffer": "1.*"
- },
- "suggest": {
- "ext-mcrypt": "Install the Mcrypt extension in order to speed up a wide variety of cryptographic operations.",
- "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
- "pear-pear/PHP_Compat": "Install PHP_Compat to get phpseclib working on PHP < 4.3.3."
- },
- "include-path": ["phpseclib/"],
- "autoload": {
- "psr-0": {
- "Crypt": "phpseclib/",
- "File": "phpseclib/",
- "Math": "phpseclib/",
- "Net": "phpseclib/",
- "System": "phpseclib/"
- },
- "files": [
- "phpseclib/Crypt/Random.php"
- ]
- },
- "extra": {
- "branch-alias": {
- "dev-master": "0.3-dev"
- }
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/composer.lock b/apps/files_external/3rdparty/phpseclib/composer.lock
deleted file mode 100644
index 1b5ff07e484bb920a8d9add230abf4456a2ae7a1..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/composer.lock
+++ /dev/null
@@ -1,95 +0,0 @@
-{
- "_readme": [
- "This file locks the dependencies of your project to a known state",
- "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file"
- ],
- "hash": "4975b8cde04a99d6e78e108753845af6",
- "packages": [
-
- ],
- "packages-dev": [
- {
- "name": "squizlabs/php_codesniffer",
- "version": "1.5.2",
- "source": {
- "type": "git",
- "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
- "reference": "a76a39b317ce8106abe6264daa505e24e1731860"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/a76a39b317ce8106abe6264daa505e24e1731860",
- "reference": "a76a39b317ce8106abe6264daa505e24e1731860",
- "shasum": ""
- },
- "require": {
- "ext-tokenizer": "*",
- "php": ">=5.1.2"
- },
- "suggest": {
- "phpunit/php-timer": "dev-master"
- },
- "bin": [
- "scripts/phpcs"
- ],
- "type": "library",
- "autoload": {
- "classmap": [
- "CodeSniffer.php",
- "CodeSniffer/CLI.php",
- "CodeSniffer/Exception.php",
- "CodeSniffer/File.php",
- "CodeSniffer/Report.php",
- "CodeSniffer/Reporting.php",
- "CodeSniffer/Sniff.php",
- "CodeSniffer/Tokens.php",
- "CodeSniffer/Reports/",
- "CodeSniffer/CommentParser/",
- "CodeSniffer/Tokenizers/",
- "CodeSniffer/DocGenerators/",
- "CodeSniffer/Standards/AbstractPatternSniff.php",
- "CodeSniffer/Standards/AbstractScopeSniff.php",
- "CodeSniffer/Standards/AbstractVariableSniff.php",
- "CodeSniffer/Standards/IncorrectPatternException.php",
- "CodeSniffer/Standards/Generic/Sniffs/",
- "CodeSniffer/Standards/MySource/Sniffs/",
- "CodeSniffer/Standards/PEAR/Sniffs/",
- "CodeSniffer/Standards/PSR1/Sniffs/",
- "CodeSniffer/Standards/PSR2/Sniffs/",
- "CodeSniffer/Standards/Squiz/Sniffs/",
- "CodeSniffer/Standards/Zend/Sniffs/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Greg Sherwood",
- "role": "lead"
- }
- ],
- "description": "PHP_CodeSniffer tokenises PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
- "homepage": "http://www.squizlabs.com/php-codesniffer",
- "keywords": [
- "phpcs",
- "standards"
- ],
- "time": "2014-02-04 23:49:58"
- }
- ],
- "aliases": [
-
- ],
- "minimum-stability": "stable",
- "stability-flags": [
-
- ],
- "platform": {
- "php": ">=5.0.0"
- },
- "platform-dev": [
-
- ]
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/AES.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/AES.php
deleted file mode 100644
index cf8c050a59e82b00eb4e0b2c4aeabceb732ba663..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/AES.php
+++ /dev/null
@@ -1,185 +0,0 @@
-
- * setKey('abcdefghijklmnop');
- *
- * $size = 10 * 1024;
- * $plaintext = '';
- * for ($i = 0; $i < $size; $i++) {
- * $plaintext.= 'a';
- * }
- *
- * echo $aes->decrypt($aes->encrypt($plaintext));
- * ?>
- *
- *
- * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @category Crypt
- * @package Crypt_AES
- * @author Jim Wigginton
- * @copyright MMVIII Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- */
-
-/**
- * Include Crypt_Rijndael
- */
-if (!class_exists('Crypt_Rijndael')) {
- include_once 'Rijndael.php';
-}
-
-/**#@+
- * @access public
- * @see Crypt_AES::encrypt()
- * @see Crypt_AES::decrypt()
- */
-/**
- * Encrypt / decrypt using the Counter mode.
- *
- * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
- */
-define('CRYPT_AES_MODE_CTR', CRYPT_MODE_CTR);
-/**
- * Encrypt / decrypt using the Electronic Code Book mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
- */
-define('CRYPT_AES_MODE_ECB', CRYPT_MODE_ECB);
-/**
- * Encrypt / decrypt using the Code Book Chaining mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
- */
-define('CRYPT_AES_MODE_CBC', CRYPT_MODE_CBC);
-/**
- * Encrypt / decrypt using the Cipher Feedback mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
- */
-define('CRYPT_AES_MODE_CFB', CRYPT_MODE_CFB);
-/**
- * Encrypt / decrypt using the Cipher Feedback mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
- */
-define('CRYPT_AES_MODE_OFB', CRYPT_MODE_OFB);
-/**#@-*/
-
-/**#@+
- * @access private
- * @see Crypt_AES::Crypt_AES()
- */
-/**
- * Toggles the internal implementation
- */
-define('CRYPT_AES_MODE_INTERNAL', CRYPT_MODE_INTERNAL);
-/**
- * Toggles the mcrypt implementation
- */
-define('CRYPT_AES_MODE_MCRYPT', CRYPT_MODE_MCRYPT);
-/**#@-*/
-
-/**
- * Pure-PHP implementation of AES.
- *
- * @package Crypt_AES
- * @author Jim Wigginton
- * @version 0.1.0
- * @access public
- */
-class Crypt_AES extends Crypt_Rijndael
-{
- /**
- * The namespace used by the cipher for its constants.
- *
- * @see Crypt_Base::const_namespace
- * @var String
- * @access private
- */
- var $const_namespace = 'AES';
-
- /**
- * Default Constructor.
- *
- * Determines whether or not the mcrypt extension should be used.
- *
- * $mode could be:
- *
- * - CRYPT_AES_MODE_ECB
- *
- * - CRYPT_AES_MODE_CBC
- *
- * - CRYPT_AES_MODE_CTR
- *
- * - CRYPT_AES_MODE_CFB
- *
- * - CRYPT_AES_MODE_OFB
- *
- * If not explictly set, CRYPT_AES_MODE_CBC will be used.
- *
- * @see Crypt_Rijndael::Crypt_Rijndael()
- * @see Crypt_Base::Crypt_Base()
- * @param optional Integer $mode
- * @access public
- */
- function Crypt_AES($mode = CRYPT_AES_MODE_CBC)
- {
- parent::Crypt_Rijndael($mode);
- }
-
- /**
- * Dummy function
- *
- * Since Crypt_AES extends Crypt_Rijndael, this function is, technically, available, but it doesn't do anything.
- *
- * @see Crypt_Rijndael::setBlockLength()
- * @access public
- * @param Integer $length
- */
- function setBlockLength($length)
- {
- return;
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Base.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Base.php
deleted file mode 100644
index f08529b902b1148cea6af277794c710438b36827..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Base.php
+++ /dev/null
@@ -1,1986 +0,0 @@
-
- * @author Hans-Juergen Petrich
- * @copyright MMVII Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @version 1.0.1
- * @link http://phpseclib.sourceforge.net
- */
-
-/**#@+
- * @access public
- * @see Crypt_Base::encrypt()
- * @see Crypt_Base::decrypt()
- */
-/**
- * Encrypt / decrypt using the Counter mode.
- *
- * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
- */
-define('CRYPT_MODE_CTR', -1);
-/**
- * Encrypt / decrypt using the Electronic Code Book mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
- */
-define('CRYPT_MODE_ECB', 1);
-/**
- * Encrypt / decrypt using the Code Book Chaining mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
- */
-define('CRYPT_MODE_CBC', 2);
-/**
- * Encrypt / decrypt using the Cipher Feedback mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
- */
-define('CRYPT_MODE_CFB', 3);
-/**
- * Encrypt / decrypt using the Output Feedback mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
- */
-define('CRYPT_MODE_OFB', 4);
-/**
- * Encrypt / decrypt using streaming mode.
- *
- */
-define('CRYPT_MODE_STREAM', 5);
-/**#@-*/
-
-/**#@+
- * @access private
- * @see Crypt_Base::Crypt_Base()
- */
-/**
- * Base value for the internal implementation $engine switch
- */
-define('CRYPT_MODE_INTERNAL', 1);
-/**
- * Base value for the mcrypt implementation $engine switch
- */
-define('CRYPT_MODE_MCRYPT', 2);
-/**#@-*/
-
-/**
- * Base Class for all Crypt_* cipher classes
- *
- * @package Crypt_Base
- * @author Jim Wigginton
- * @author Hans-Juergen Petrich
- * @version 1.0.0
- * @access public
- */
-class Crypt_Base
-{
- /**
- * The Encryption Mode
- *
- * @see Crypt_Base::Crypt_Base()
- * @var Integer
- * @access private
- */
- var $mode;
-
- /**
- * The Block Length of the block cipher
- *
- * @var Integer
- * @access private
- */
- var $block_size = 16;
-
- /**
- * The Key
- *
- * @see Crypt_Base::setKey()
- * @var String
- * @access private
- */
- var $key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
-
- /**
- * The Initialization Vector
- *
- * @see Crypt_Base::setIV()
- * @var String
- * @access private
- */
- var $iv;
-
- /**
- * A "sliding" Initialization Vector
- *
- * @see Crypt_Base::enableContinuousBuffer()
- * @see Crypt_Base::_clearBuffers()
- * @var String
- * @access private
- */
- var $encryptIV;
-
- /**
- * A "sliding" Initialization Vector
- *
- * @see Crypt_Base::enableContinuousBuffer()
- * @see Crypt_Base::_clearBuffers()
- * @var String
- * @access private
- */
- var $decryptIV;
-
- /**
- * Continuous Buffer status
- *
- * @see Crypt_Base::enableContinuousBuffer()
- * @var Boolean
- * @access private
- */
- var $continuousBuffer = false;
-
- /**
- * Encryption buffer for CTR, OFB and CFB modes
- *
- * @see Crypt_Base::encrypt()
- * @see Crypt_Base::_clearBuffers()
- * @var Array
- * @access private
- */
- var $enbuffer;
-
- /**
- * Decryption buffer for CTR, OFB and CFB modes
- *
- * @see Crypt_Base::decrypt()
- * @see Crypt_Base::_clearBuffers()
- * @var Array
- * @access private
- */
- var $debuffer;
-
- /**
- * mcrypt resource for encryption
- *
- * The mcrypt resource can be recreated every time something needs to be created or it can be created just once.
- * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode.
- *
- * @see Crypt_Base::encrypt()
- * @var Resource
- * @access private
- */
- var $enmcrypt;
-
- /**
- * mcrypt resource for decryption
- *
- * The mcrypt resource can be recreated every time something needs to be created or it can be created just once.
- * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode.
- *
- * @see Crypt_Base::decrypt()
- * @var Resource
- * @access private
- */
- var $demcrypt;
-
- /**
- * Does the enmcrypt resource need to be (re)initialized?
- *
- * @see Crypt_Twofish::setKey()
- * @see Crypt_Twofish::setIV()
- * @var Boolean
- * @access private
- */
- var $enchanged = true;
-
- /**
- * Does the demcrypt resource need to be (re)initialized?
- *
- * @see Crypt_Twofish::setKey()
- * @see Crypt_Twofish::setIV()
- * @var Boolean
- * @access private
- */
- var $dechanged = true;
-
- /**
- * mcrypt resource for CFB mode
- *
- * mcrypt's CFB mode, in (and only in) buffered context,
- * is broken, so phpseclib implements the CFB mode by it self,
- * even when the mcrypt php extension is available.
- *
- * In order to do the CFB-mode work (fast) phpseclib
- * use a separate ECB-mode mcrypt resource.
- *
- * @link http://phpseclib.sourceforge.net/cfb-demo.phps
- * @see Crypt_Base::encrypt()
- * @see Crypt_Base::decrypt()
- * @see Crypt_Base::_setupMcrypt()
- * @var Resource
- * @access private
- */
- var $ecb;
-
- /**
- * Optimizing value while CFB-encrypting
- *
- * Only relevant if $continuousBuffer enabled
- * and $engine == CRYPT_MODE_MCRYPT
- *
- * It's faster to re-init $enmcrypt if
- * $buffer bytes > $cfb_init_len than
- * using the $ecb resource furthermore.
- *
- * This value depends of the choosen cipher
- * and the time it would be needed for it's
- * initialization [by mcrypt_generic_init()]
- * which, typically, depends on the complexity
- * on its internaly Key-expanding algorithm.
- *
- * @see Crypt_Base::encrypt()
- * @var Integer
- * @access private
- */
- var $cfb_init_len = 600;
-
- /**
- * Does internal cipher state need to be (re)initialized?
- *
- * @see setKey()
- * @see setIV()
- * @see disableContinuousBuffer()
- * @var Boolean
- * @access private
- */
- var $changed = true;
-
- /**
- * Padding status
- *
- * @see Crypt_Base::enablePadding()
- * @var Boolean
- * @access private
- */
- var $padding = true;
-
- /**
- * Is the mode one that is paddable?
- *
- * @see Crypt_Base::Crypt_Base()
- * @var Boolean
- * @access private
- */
- var $paddable = false;
-
- /**
- * Holds which crypt engine internaly should be use,
- * which will be determined automatically on __construct()
- *
- * Currently available $engines are:
- * - CRYPT_MODE_MCRYPT (fast, php-extension: mcrypt, extension_loaded('mcrypt') required)
- * - CRYPT_MODE_INTERNAL (slower, pure php-engine, no php-extension required)
- *
- * In the pipeline... maybe. But currently not available:
- * - CRYPT_MODE_OPENSSL (very fast, php-extension: openssl, extension_loaded('openssl') required)
- *
- * If possible, CRYPT_MODE_MCRYPT will be used for each cipher.
- * Otherwise CRYPT_MODE_INTERNAL
- *
- * @see Crypt_Base::encrypt()
- * @see Crypt_Base::decrypt()
- * @var Integer
- * @access private
- */
- var $engine;
-
- /**
- * The mcrypt specific name of the cipher
- *
- * Only used if $engine == CRYPT_MODE_MCRYPT
- *
- * @link http://www.php.net/mcrypt_module_open
- * @link http://www.php.net/mcrypt_list_algorithms
- * @see Crypt_Base::_setupMcrypt()
- * @var String
- * @access private
- */
- var $cipher_name_mcrypt;
-
- /**
- * The default password key_size used by setPassword()
- *
- * @see Crypt_Base::setPassword()
- * @var Integer
- * @access private
- */
- var $password_key_size = 32;
-
- /**
- * The default salt used by setPassword()
- *
- * @see Crypt_Base::setPassword()
- * @var String
- * @access private
- */
- var $password_default_salt = 'phpseclib/salt';
-
- /**
- * The namespace used by the cipher for its constants.
- *
- * ie: AES.php is using CRYPT_AES_MODE_* for its constants
- * so $const_namespace is AES
- *
- * DES.php is using CRYPT_DES_MODE_* for its constants
- * so $const_namespace is DES... and so on
- *
- * All CRYPT_<$const_namespace>_MODE_* are aliases of
- * the generic CRYPT_MODE_* constants, so both could be used
- * for each cipher.
- *
- * Example:
- * $aes = new Crypt_AES(CRYPT_AES_MODE_CFB); // $aes will operate in cfb mode
- * $aes = new Crypt_AES(CRYPT_MODE_CFB); // identical
- *
- * @see Crypt_Base::Crypt_Base()
- * @var String
- * @access private
- */
- var $const_namespace;
-
- /**
- * The name of the performance-optimized callback function
- *
- * Used by encrypt() / decrypt()
- * only if $engine == CRYPT_MODE_INTERNAL
- *
- * @see Crypt_Base::encrypt()
- * @see Crypt_Base::decrypt()
- * @see Crypt_Base::_setupInlineCrypt()
- * @see Crypt_Base::$use_inline_crypt
- * @var Callback
- * @access private
- */
- var $inline_crypt;
-
- /**
- * Holds whether performance-optimized $inline_crypt() can/should be used.
- *
- * @see Crypt_Base::encrypt()
- * @see Crypt_Base::decrypt()
- * @see Crypt_Base::inline_crypt
- * @var mixed
- * @access private
- */
- var $use_inline_crypt;
-
- /**
- * Default Constructor.
- *
- * Determines whether or not the mcrypt extension should be used.
- *
- * $mode could be:
- *
- * - CRYPT_MODE_ECB
- *
- * - CRYPT_MODE_CBC
- *
- * - CRYPT_MODE_CTR
- *
- * - CRYPT_MODE_CFB
- *
- * - CRYPT_MODE_OFB
- *
- * (or the alias constants of the choosen cipher, for example for AES: CRYPT_AES_MODE_ECB or CRYPT_AES_MODE_CBC ...)
- *
- * If not explictly set, CRYPT_MODE_CBC will be used.
- *
- * @param optional Integer $mode
- * @access public
- */
- function Crypt_Base($mode = CRYPT_MODE_CBC)
- {
- $const_crypt_mode = 'CRYPT_' . $this->const_namespace . '_MODE';
-
- // Determining the availibility of mcrypt support for the cipher
- if (!defined($const_crypt_mode)) {
- switch (true) {
- case extension_loaded('mcrypt') && in_array($this->cipher_name_mcrypt, mcrypt_list_algorithms()):
- define($const_crypt_mode, CRYPT_MODE_MCRYPT);
- break;
- default:
- define($const_crypt_mode, CRYPT_MODE_INTERNAL);
- }
- }
-
- // Determining which internal $engine should be used.
- // The fastes possible first.
- switch (true) {
- case empty($this->cipher_name_mcrypt): // The cipher module has no mcrypt-engine support at all so we force CRYPT_MODE_INTERNAL
- $this->engine = CRYPT_MODE_INTERNAL;
- break;
- case constant($const_crypt_mode) == CRYPT_MODE_MCRYPT:
- $this->engine = CRYPT_MODE_MCRYPT;
- break;
- default:
- $this->engine = CRYPT_MODE_INTERNAL;
- }
-
- // $mode dependent settings
- switch ($mode) {
- case CRYPT_MODE_ECB:
- $this->paddable = true;
- $this->mode = $mode;
- break;
- case CRYPT_MODE_CTR:
- case CRYPT_MODE_CFB:
- case CRYPT_MODE_OFB:
- case CRYPT_MODE_STREAM:
- $this->mode = $mode;
- break;
- case CRYPT_MODE_CBC:
- default:
- $this->paddable = true;
- $this->mode = CRYPT_MODE_CBC;
- }
-
- // Determining whether inline crypting can be used by the cipher
- if ($this->use_inline_crypt !== false && function_exists('create_function')) {
- $this->use_inline_crypt = true;
- }
- }
-
- /**
- * Sets the initialization vector. (optional)
- *
- * SetIV is not required when CRYPT_MODE_ECB (or ie for AES: CRYPT_AES_MODE_ECB) is being used. If not explictly set, it'll be assumed
- * to be all zero's.
- *
- * Note: Could, but not must, extend by the child Crypt_* class
- *
- * @access public
- * @param String $iv
- */
- function setIV($iv)
- {
- if ($this->mode == CRYPT_MODE_ECB) {
- return;
- }
-
- $this->iv = $iv;
- $this->changed = true;
- }
-
- /**
- * Sets the key.
- *
- * The min/max length(s) of the key depends on the cipher which is used.
- * If the key not fits the length(s) of the cipher it will paded with null bytes
- * up to the closest valid key length. If the key is more than max length,
- * we trim the excess bits.
- *
- * If the key is not explicitly set, it'll be assumed to be all null bytes.
- *
- * Note: Could, but not must, extend by the child Crypt_* class
- *
- * @access public
- * @param String $key
- */
- function setKey($key)
- {
- $this->key = $key;
- $this->changed = true;
- }
-
- /**
- * Sets the password.
- *
- * Depending on what $method is set to, setPassword()'s (optional) parameters are as follows:
- * {@link http://en.wikipedia.org/wiki/PBKDF2 pbkdf2}:
- * $hash, $salt, $count, $dkLen
- *
- * Where $hash (default = sha1) currently supports the following hashes: see: Crypt/Hash.php
- *
- * Note: Could, but not must, extend by the child Crypt_* class
- *
- * @see Crypt/Hash.php
- * @param String $password
- * @param optional String $method
- * @access public
- */
- function setPassword($password, $method = 'pbkdf2')
- {
- $key = '';
-
- switch ($method) {
- default: // 'pbkdf2'
- $func_args = func_get_args();
-
- // Hash function
- $hash = isset($func_args[2]) ? $func_args[2] : 'sha1';
-
- // WPA and WPA2 use the SSID as the salt
- $salt = isset($func_args[3]) ? $func_args[3] : $this->password_default_salt;
-
- // RFC2898#section-4.2 uses 1,000 iterations by default
- // WPA and WPA2 use 4,096.
- $count = isset($func_args[4]) ? $func_args[4] : 1000;
-
- // Keylength
- $dkLen = isset($func_args[5]) ? $func_args[5] : $this->password_key_size;
-
- // Determining if php[>=5.5.0]'s hash_pbkdf2() function avail- and useable
- switch (true) {
- case !function_exists('hash_pbkdf2'):
- case !function_exists('hash_algos'):
- case !in_array($hash, hash_algos()):
- if (!class_exists('Crypt_Hash')) {
- include_once 'Crypt/Hash.php';
- }
- $i = 1;
- while (strlen($key) < $dkLen) {
- $hmac = new Crypt_Hash();
- $hmac->setHash($hash);
- $hmac->setKey($password);
- $f = $u = $hmac->hash($salt . pack('N', $i++));
- for ($j = 2; $j <= $count; ++$j) {
- $u = $hmac->hash($u);
- $f^= $u;
- }
- $key.= $f;
- }
- $key = substr($key, 0, $dkLen);
- break;
- default:
- $key = hash_pbkdf2($hash, $password, $salt, $count, $dkLen, true);
- }
- }
-
- $this->setKey($key);
- }
-
- /**
- * Encrypts a message.
- *
- * $plaintext will be padded with additional bytes such that it's length is a multiple of the block size. Other cipher
- * implementations may or may not pad in the same manner. Other common approaches to padding and the reasons why it's
- * necessary are discussed in the following
- * URL:
- *
- * {@link http://www.di-mgt.com.au/cryptopad.html http://www.di-mgt.com.au/cryptopad.html}
- *
- * An alternative to padding is to, separately, send the length of the file. This is what SSH, in fact, does.
- * strlen($plaintext) will still need to be a multiple of the block size, however, arbitrary values can be added to make it that
- * length.
- *
- * Note: Could, but not must, extend by the child Crypt_* class
- *
- * @see Crypt_Base::decrypt()
- * @access public
- * @param String $plaintext
- * @return String $cipertext
- */
- function encrypt($plaintext)
- {
- if ($this->engine == CRYPT_MODE_MCRYPT) {
- if ($this->changed) {
- $this->_setupMcrypt();
- $this->changed = false;
- }
- if ($this->enchanged) {
- mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV);
- $this->enchanged = false;
- }
-
- // re: {@link http://phpseclib.sourceforge.net/cfb-demo.phps}
- // using mcrypt's default handing of CFB the above would output two different things. using phpseclib's
- // rewritten CFB implementation the above outputs the same thing twice.
- if ($this->mode == CRYPT_MODE_CFB && $this->continuousBuffer) {
- $block_size = $this->block_size;
- $iv = &$this->encryptIV;
- $pos = &$this->enbuffer['pos'];
- $len = strlen($plaintext);
- $ciphertext = '';
- $i = 0;
- if ($pos) {
- $orig_pos = $pos;
- $max = $block_size - $pos;
- if ($len >= $max) {
- $i = $max;
- $len-= $max;
- $pos = 0;
- } else {
- $i = $len;
- $pos+= $len;
- $len = 0;
- }
- $ciphertext = substr($iv, $orig_pos) ^ $plaintext;
- $iv = substr_replace($iv, $ciphertext, $orig_pos, $i);
- $this->enbuffer['enmcrypt_init'] = true;
- }
- if ($len >= $block_size) {
- if ($this->enbuffer['enmcrypt_init'] === false || $len > $this->cfb_init_len) {
- if ($this->enbuffer['enmcrypt_init'] === true) {
- mcrypt_generic_init($this->enmcrypt, $this->key, $iv);
- $this->enbuffer['enmcrypt_init'] = false;
- }
- $ciphertext.= mcrypt_generic($this->enmcrypt, substr($plaintext, $i, $len - $len % $block_size));
- $iv = substr($ciphertext, -$block_size);
- $len%= $block_size;
- } else {
- while ($len >= $block_size) {
- $iv = mcrypt_generic($this->ecb, $iv) ^ substr($plaintext, $i, $block_size);
- $ciphertext.= $iv;
- $len-= $block_size;
- $i+= $block_size;
- }
- }
- }
-
- if ($len) {
- $iv = mcrypt_generic($this->ecb, $iv);
- $block = $iv ^ substr($plaintext, -$len);
- $iv = substr_replace($iv, $block, 0, $len);
- $ciphertext.= $block;
- $pos = $len;
- }
-
- return $ciphertext;
- }
-
- if ($this->paddable) {
- $plaintext = $this->_pad($plaintext);
- }
-
- $ciphertext = mcrypt_generic($this->enmcrypt, $plaintext);
-
- if (!$this->continuousBuffer) {
- mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV);
- }
-
- return $ciphertext;
- }
-
- if ($this->changed) {
- $this->_setup();
- $this->changed = false;
- }
- if ($this->use_inline_crypt) {
- $inline = $this->inline_crypt;
- return $inline('encrypt', $this, $plaintext);
- }
- if ($this->paddable) {
- $plaintext = $this->_pad($plaintext);
- }
-
- $buffer = &$this->enbuffer;
- $block_size = $this->block_size;
- $ciphertext = '';
- switch ($this->mode) {
- case CRYPT_MODE_ECB:
- for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
- $ciphertext.= $this->_encryptBlock(substr($plaintext, $i, $block_size));
- }
- break;
- case CRYPT_MODE_CBC:
- $xor = $this->encryptIV;
- for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
- $block = substr($plaintext, $i, $block_size);
- $block = $this->_encryptBlock($block ^ $xor);
- $xor = $block;
- $ciphertext.= $block;
- }
- if ($this->continuousBuffer) {
- $this->encryptIV = $xor;
- }
- break;
- case CRYPT_MODE_CTR:
- $xor = $this->encryptIV;
- if (strlen($buffer['encrypted'])) {
- for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
- $block = substr($plaintext, $i, $block_size);
- if (strlen($block) > strlen($buffer['encrypted'])) {
- $buffer['encrypted'].= $this->_encryptBlock($this->_generateXor($xor, $block_size));
- }
- $key = $this->_stringShift($buffer['encrypted'], $block_size);
- $ciphertext.= $block ^ $key;
- }
- } else {
- for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
- $block = substr($plaintext, $i, $block_size);
- $key = $this->_encryptBlock($this->_generateXor($xor, $block_size));
- $ciphertext.= $block ^ $key;
- }
- }
- if ($this->continuousBuffer) {
- $this->encryptIV = $xor;
- if ($start = strlen($plaintext) % $block_size) {
- $buffer['encrypted'] = substr($key, $start) . $buffer['encrypted'];
- }
- }
- break;
- case CRYPT_MODE_CFB:
- // cfb loosely routines inspired by openssl's:
- // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1}
- if ($this->continuousBuffer) {
- $iv = &$this->encryptIV;
- $pos = &$buffer['pos'];
- } else {
- $iv = $this->encryptIV;
- $pos = 0;
- }
- $len = strlen($plaintext);
- $i = 0;
- if ($pos) {
- $orig_pos = $pos;
- $max = $block_size - $pos;
- if ($len >= $max) {
- $i = $max;
- $len-= $max;
- $pos = 0;
- } else {
- $i = $len;
- $pos+= $len;
- $len = 0;
- }
- // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize
- $ciphertext = substr($iv, $orig_pos) ^ $plaintext;
- $iv = substr_replace($iv, $ciphertext, $orig_pos, $i);
- }
- while ($len >= $block_size) {
- $iv = $this->_encryptBlock($iv) ^ substr($plaintext, $i, $block_size);
- $ciphertext.= $iv;
- $len-= $block_size;
- $i+= $block_size;
- }
- if ($len) {
- $iv = $this->_encryptBlock($iv);
- $block = $iv ^ substr($plaintext, $i);
- $iv = substr_replace($iv, $block, 0, $len);
- $ciphertext.= $block;
- $pos = $len;
- }
- break;
- case CRYPT_MODE_OFB:
- $xor = $this->encryptIV;
- if (strlen($buffer['xor'])) {
- for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
- $block = substr($plaintext, $i, $block_size);
- if (strlen($block) > strlen($buffer['xor'])) {
- $xor = $this->_encryptBlock($xor);
- $buffer['xor'].= $xor;
- }
- $key = $this->_stringShift($buffer['xor'], $block_size);
- $ciphertext.= $block ^ $key;
- }
- } else {
- for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
- $xor = $this->_encryptBlock($xor);
- $ciphertext.= substr($plaintext, $i, $block_size) ^ $xor;
- }
- $key = $xor;
- }
- if ($this->continuousBuffer) {
- $this->encryptIV = $xor;
- if ($start = strlen($plaintext) % $block_size) {
- $buffer['xor'] = substr($key, $start) . $buffer['xor'];
- }
- }
- break;
- case CRYPT_MODE_STREAM:
- $ciphertext = $this->_encryptBlock($plaintext);
- break;
- }
-
- return $ciphertext;
- }
-
- /**
- * Decrypts a message.
- *
- * If strlen($ciphertext) is not a multiple of the block size, null bytes will be added to the end of the string until
- * it is.
- *
- * Note: Could, but not must, extend by the child Crypt_* class
- *
- * @see Crypt_Base::encrypt()
- * @access public
- * @param String $ciphertext
- * @return String $plaintext
- */
- function decrypt($ciphertext)
- {
- if ($this->engine == CRYPT_MODE_MCRYPT) {
- $block_size = $this->block_size;
- if ($this->changed) {
- $this->_setupMcrypt();
- $this->changed = false;
- }
- if ($this->dechanged) {
- mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV);
- $this->dechanged = false;
- }
-
- if ($this->mode == CRYPT_MODE_CFB && $this->continuousBuffer) {
- $iv = &$this->decryptIV;
- $pos = &$this->debuffer['pos'];
- $len = strlen($ciphertext);
- $plaintext = '';
- $i = 0;
- if ($pos) {
- $orig_pos = $pos;
- $max = $block_size - $pos;
- if ($len >= $max) {
- $i = $max;
- $len-= $max;
- $pos = 0;
- } else {
- $i = $len;
- $pos+= $len;
- $len = 0;
- }
- // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize
- $plaintext = substr($iv, $orig_pos) ^ $ciphertext;
- $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i);
- }
- if ($len >= $block_size) {
- $cb = substr($ciphertext, $i, $len - $len % $block_size);
- $plaintext.= mcrypt_generic($this->ecb, $iv . $cb) ^ $cb;
- $iv = substr($cb, -$block_size);
- $len%= $block_size;
- }
- if ($len) {
- $iv = mcrypt_generic($this->ecb, $iv);
- $plaintext.= $iv ^ substr($ciphertext, -$len);
- $iv = substr_replace($iv, substr($ciphertext, -$len), 0, $len);
- $pos = $len;
- }
-
- return $plaintext;
- }
-
- if ($this->paddable) {
- // we pad with chr(0) since that's what mcrypt_generic does. to quote from {@link http://www.php.net/function.mcrypt-generic}:
- // "The data is padded with "\0" to make sure the length of the data is n * blocksize."
- $ciphertext = str_pad($ciphertext, strlen($ciphertext) + ($block_size - strlen($ciphertext) % $block_size) % $block_size, chr(0));
- }
-
- $plaintext = mdecrypt_generic($this->demcrypt, $ciphertext);
-
- if (!$this->continuousBuffer) {
- mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV);
- }
-
- return $this->paddable ? $this->_unpad($plaintext) : $plaintext;
- }
-
- if ($this->changed) {
- $this->_setup();
- $this->changed = false;
- }
- if ($this->use_inline_crypt) {
- $inline = $this->inline_crypt;
- return $inline('decrypt', $this, $ciphertext);
- }
-
- $block_size = $this->block_size;
- if ($this->paddable) {
- // we pad with chr(0) since that's what mcrypt_generic does [...]
- $ciphertext = str_pad($ciphertext, strlen($ciphertext) + ($block_size - strlen($ciphertext) % $block_size) % $block_size, chr(0));
- }
-
- $buffer = &$this->debuffer;
- $plaintext = '';
- switch ($this->mode) {
- case CRYPT_MODE_ECB:
- for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
- $plaintext.= $this->_decryptBlock(substr($ciphertext, $i, $block_size));
- }
- break;
- case CRYPT_MODE_CBC:
- $xor = $this->decryptIV;
- for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
- $block = substr($ciphertext, $i, $block_size);
- $plaintext.= $this->_decryptBlock($block) ^ $xor;
- $xor = $block;
- }
- if ($this->continuousBuffer) {
- $this->decryptIV = $xor;
- }
- break;
- case CRYPT_MODE_CTR:
- $xor = $this->decryptIV;
- if (strlen($buffer['ciphertext'])) {
- for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
- $block = substr($ciphertext, $i, $block_size);
- if (strlen($block) > strlen($buffer['ciphertext'])) {
- $buffer['ciphertext'].= $this->_encryptBlock($this->_generateXor($xor, $block_size));
- }
- $key = $this->_stringShift($buffer['ciphertext'], $block_size);
- $plaintext.= $block ^ $key;
- }
- } else {
- for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
- $block = substr($ciphertext, $i, $block_size);
- $key = $this->_encryptBlock($this->_generateXor($xor, $block_size));
- $plaintext.= $block ^ $key;
- }
- }
- if ($this->continuousBuffer) {
- $this->decryptIV = $xor;
- if ($start = strlen($ciphertext) % $block_size) {
- $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext'];
- }
- }
- break;
- case CRYPT_MODE_CFB:
- if ($this->continuousBuffer) {
- $iv = &$this->decryptIV;
- $pos = &$buffer['pos'];
- } else {
- $iv = $this->decryptIV;
- $pos = 0;
- }
- $len = strlen($ciphertext);
- $i = 0;
- if ($pos) {
- $orig_pos = $pos;
- $max = $block_size - $pos;
- if ($len >= $max) {
- $i = $max;
- $len-= $max;
- $pos = 0;
- } else {
- $i = $len;
- $pos+= $len;
- $len = 0;
- }
- // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize
- $plaintext = substr($iv, $orig_pos) ^ $ciphertext;
- $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i);
- }
- while ($len >= $block_size) {
- $iv = $this->_encryptBlock($iv);
- $cb = substr($ciphertext, $i, $block_size);
- $plaintext.= $iv ^ $cb;
- $iv = $cb;
- $len-= $block_size;
- $i+= $block_size;
- }
- if ($len) {
- $iv = $this->_encryptBlock($iv);
- $plaintext.= $iv ^ substr($ciphertext, $i);
- $iv = substr_replace($iv, substr($ciphertext, $i), 0, $len);
- $pos = $len;
- }
- break;
- case CRYPT_MODE_OFB:
- $xor = $this->decryptIV;
- if (strlen($buffer['xor'])) {
- for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
- $block = substr($ciphertext, $i, $block_size);
- if (strlen($block) > strlen($buffer['xor'])) {
- $xor = $this->_encryptBlock($xor);
- $buffer['xor'].= $xor;
- }
- $key = $this->_stringShift($buffer['xor'], $block_size);
- $plaintext.= $block ^ $key;
- }
- } else {
- for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
- $xor = $this->_encryptBlock($xor);
- $plaintext.= substr($ciphertext, $i, $block_size) ^ $xor;
- }
- $key = $xor;
- }
- if ($this->continuousBuffer) {
- $this->decryptIV = $xor;
- if ($start = strlen($ciphertext) % $block_size) {
- $buffer['xor'] = substr($key, $start) . $buffer['xor'];
- }
- }
- break;
- case CRYPT_MODE_STREAM:
- $plaintext = $this->_decryptBlock($ciphertext);
- break;
- }
- return $this->paddable ? $this->_unpad($plaintext) : $plaintext;
- }
-
- /**
- * Pad "packets".
- *
- * Block ciphers working by encrypting between their specified [$this->]block_size at a time
- * If you ever need to encrypt or decrypt something that isn't of the proper length, it becomes necessary to
- * pad the input so that it is of the proper length.
- *
- * Padding is enabled by default. Sometimes, however, it is undesirable to pad strings. Such is the case in SSH,
- * where "packets" are padded with random bytes before being encrypted. Unpad these packets and you risk stripping
- * away characters that shouldn't be stripped away. (SSH knows how many bytes are added because the length is
- * transmitted separately)
- *
- * @see Crypt_Base::disablePadding()
- * @access public
- */
- function enablePadding()
- {
- $this->padding = true;
- }
-
- /**
- * Do not pad packets.
- *
- * @see Crypt_Base::enablePadding()
- * @access public
- */
- function disablePadding()
- {
- $this->padding = false;
- }
-
- /**
- * Treat consecutive "packets" as if they are a continuous buffer.
- *
- * Say you have a 32-byte plaintext $plaintext. Using the default behavior, the two following code snippets
- * will yield different outputs:
- *
- *
- * echo $rijndael->encrypt(substr($plaintext, 0, 16));
- * echo $rijndael->encrypt(substr($plaintext, 16, 16));
- *
- *
- * echo $rijndael->encrypt($plaintext);
- *
- *
- * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates
- * another, as demonstrated with the following:
- *
- *
- * $rijndael->encrypt(substr($plaintext, 0, 16));
- * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16)));
- *
- *
- * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16)));
- *
- *
- * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different
- * outputs. The reason is due to the fact that the initialization vector's change after every encryption /
- * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant.
- *
- * Put another way, when the continuous buffer is enabled, the state of the Crypt_*() object changes after each
- * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that
- * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them),
- * however, they are also less intuitive and more likely to cause you problems.
- *
- * Note: Could, but not must, extend by the child Crypt_* class
- *
- * @see Crypt_Base::disableContinuousBuffer()
- * @access public
- */
- function enableContinuousBuffer()
- {
- if ($this->mode == CRYPT_MODE_ECB) {
- return;
- }
-
- $this->continuousBuffer = true;
- }
-
- /**
- * Treat consecutive packets as if they are a discontinuous buffer.
- *
- * The default behavior.
- *
- * Note: Could, but not must, extend by the child Crypt_* class
- *
- * @see Crypt_Base::enableContinuousBuffer()
- * @access public
- */
- function disableContinuousBuffer()
- {
- if ($this->mode == CRYPT_MODE_ECB) {
- return;
- }
- if (!$this->continuousBuffer) {
- return;
- }
-
- $this->continuousBuffer = false;
- $this->changed = true;
- }
-
- /**
- * Encrypts a block
- *
- * Note: Must extend by the child Crypt_* class
- *
- * @access private
- * @param String $in
- * @return String
- */
- function _encryptBlock($in)
- {
- user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR);
- }
-
- /**
- * Decrypts a block
- *
- * Note: Must extend by the child Crypt_* class
- *
- * @access private
- * @param String $in
- * @return String
- */
- function _decryptBlock($in)
- {
- user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR);
- }
-
- /**
- * Setup the key (expansion)
- *
- * Only used if $engine == CRYPT_MODE_INTERNAL
- *
- * Note: Must extend by the child Crypt_* class
- *
- * @see Crypt_Base::_setup()
- * @access private
- */
- function _setupKey()
- {
- user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR);
- }
-
- /**
- * Setup the CRYPT_MODE_INTERNAL $engine
- *
- * (re)init, if necessary, the internal cipher $engine and flush all $buffers
- * Used (only) if $engine == CRYPT_MODE_INTERNAL
- *
- * _setup() will be called each time if $changed === true
- * typically this happens when using one or more of following public methods:
- *
- * - setKey()
- *
- * - setIV()
- *
- * - disableContinuousBuffer()
- *
- * - First run of encrypt() / decrypt() with no init-settings
- *
- * Internally: _setup() is called always before(!) en/decryption.
- *
- * Note: Could, but not must, extend by the child Crypt_* class
- *
- * @see setKey()
- * @see setIV()
- * @see disableContinuousBuffer()
- * @access private
- */
- function _setup()
- {
- $this->_clearBuffers();
- $this->_setupKey();
-
- if ($this->use_inline_crypt) {
- $this->_setupInlineCrypt();
- }
- }
-
- /**
- * Setup the CRYPT_MODE_MCRYPT $engine
- *
- * (re)init, if necessary, the (ext)mcrypt resources and flush all $buffers
- * Used (only) if $engine = CRYPT_MODE_MCRYPT
- *
- * _setupMcrypt() will be called each time if $changed === true
- * typically this happens when using one or more of following public methods:
- *
- * - setKey()
- *
- * - setIV()
- *
- * - disableContinuousBuffer()
- *
- * - First run of encrypt() / decrypt()
- *
- *
- * Note: Could, but not must, extend by the child Crypt_* class
- *
- * @see setKey()
- * @see setIV()
- * @see disableContinuousBuffer()
- * @access private
- */
- function _setupMcrypt()
- {
- $this->_clearBuffers();
- $this->enchanged = $this->dechanged = true;
-
- if (!isset($this->enmcrypt)) {
- static $mcrypt_modes = array(
- CRYPT_MODE_CTR => 'ctr',
- CRYPT_MODE_ECB => MCRYPT_MODE_ECB,
- CRYPT_MODE_CBC => MCRYPT_MODE_CBC,
- CRYPT_MODE_CFB => 'ncfb',
- CRYPT_MODE_OFB => MCRYPT_MODE_NOFB,
- CRYPT_MODE_STREAM => MCRYPT_MODE_STREAM,
- );
-
- $this->demcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], '');
- $this->enmcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], '');
-
- // we need the $ecb mcrypt resource (only) in MODE_CFB with enableContinuousBuffer()
- // to workaround mcrypt's broken ncfb implementation in buffered mode
- // see: {@link http://phpseclib.sourceforge.net/cfb-demo.phps}
- if ($this->mode == CRYPT_MODE_CFB) {
- $this->ecb = mcrypt_module_open($this->cipher_name_mcrypt, '', MCRYPT_MODE_ECB, '');
- }
-
- } // else should mcrypt_generic_deinit be called?
-
- if ($this->mode == CRYPT_MODE_CFB) {
- mcrypt_generic_init($this->ecb, $this->key, str_repeat("\0", $this->block_size));
- }
- }
-
- /**
- * Pads a string
- *
- * Pads a string using the RSA PKCS padding standards so that its length is a multiple of the blocksize.
- * $this->block_size - (strlen($text) % $this->block_size) bytes are added, each of which is equal to
- * chr($this->block_size - (strlen($text) % $this->block_size)
- *
- * If padding is disabled and $text is not a multiple of the blocksize, the string will be padded regardless
- * and padding will, hence forth, be enabled.
- *
- * @see Crypt_Base::_unpad()
- * @param String $text
- * @access private
- * @return String
- */
- function _pad($text)
- {
- $length = strlen($text);
-
- if (!$this->padding) {
- if ($length % $this->block_size == 0) {
- return $text;
- } else {
- user_error("The plaintext's length ($length) is not a multiple of the block size ({$this->block_size})");
- $this->padding = true;
- }
- }
-
- $pad = $this->block_size - ($length % $this->block_size);
-
- return str_pad($text, $length + $pad, chr($pad));
- }
-
- /**
- * Unpads a string.
- *
- * If padding is enabled and the reported padding length is invalid the encryption key will be assumed to be wrong
- * and false will be returned.
- *
- * @see Crypt_Base::_pad()
- * @param String $text
- * @access private
- * @return String
- */
- function _unpad($text)
- {
- if (!$this->padding) {
- return $text;
- }
-
- $length = ord($text[strlen($text) - 1]);
-
- if (!$length || $length > $this->block_size) {
- return false;
- }
-
- return substr($text, 0, -$length);
- }
-
- /**
- * Clears internal buffers
- *
- * Clearing/resetting the internal buffers is done everytime
- * after disableContinuousBuffer() or on cipher $engine (re)init
- * ie after setKey() or setIV()
- *
- * Note: Could, but not must, extend by the child Crypt_* class
- *
- * @access public
- */
- function _clearBuffers()
- {
- $this->enbuffer = array('encrypted' => '', 'xor' => '', 'pos' => 0, 'enmcrypt_init' => true);
- $this->debuffer = array('ciphertext' => '', 'xor' => '', 'pos' => 0, 'demcrypt_init' => true);
-
- // mcrypt's handling of invalid's $iv:
- // $this->encryptIV = $this->decryptIV = strlen($this->iv) == $this->block_size ? $this->iv : str_repeat("\0", $this->block_size);
- $this->encryptIV = $this->decryptIV = str_pad(substr($this->iv, 0, $this->block_size), $this->block_size, "\0");
- }
-
- /**
- * String Shift
- *
- * Inspired by array_shift
- *
- * @param String $string
- * @param optional Integer $index
- * @access private
- * @return String
- */
- function _stringShift(&$string, $index = 1)
- {
- $substr = substr($string, 0, $index);
- $string = substr($string, $index);
- return $substr;
- }
-
- /**
- * Generate CTR XOR encryption key
- *
- * Encrypt the output of this and XOR it against the ciphertext / plaintext to get the
- * plaintext / ciphertext in CTR mode.
- *
- * @see Crypt_Base::decrypt()
- * @see Crypt_Base::encrypt()
- * @param String $iv
- * @param Integer $length
- * @access private
- * @return String $xor
- */
- function _generateXor(&$iv, $length)
- {
- $xor = '';
- $block_size = $this->block_size;
- $num_blocks = floor(($length + ($block_size - 1)) / $block_size);
- for ($i = 0; $i < $num_blocks; $i++) {
- $xor.= $iv;
- for ($j = 4; $j <= $block_size; $j+= 4) {
- $temp = substr($iv, -$j, 4);
- switch ($temp) {
- case "\xFF\xFF\xFF\xFF":
- $iv = substr_replace($iv, "\x00\x00\x00\x00", -$j, 4);
- break;
- case "\x7F\xFF\xFF\xFF":
- $iv = substr_replace($iv, "\x80\x00\x00\x00", -$j, 4);
- break 2;
- default:
- extract(unpack('Ncount', $temp));
- $iv = substr_replace($iv, pack('N', $count + 1), -$j, 4);
- break 2;
- }
- }
- }
-
- return $xor;
- }
-
- /**
- * Setup the performance-optimized function for de/encrypt()
- *
- * Stores the created (or existing) callback function-name
- * in $this->inline_crypt
- *
- * Internally for phpseclib developers:
- *
- * _setupInlineCrypt() would be called only if:
- *
- * - $engine == CRYPT_MODE_INTERNAL and
- *
- * - $use_inline_crypt === true
- *
- * - each time on _setup(), after(!) _setupKey()
- *
- *
- * This ensures that _setupInlineCrypt() has allways a
- * full ready2go initializated internal cipher $engine state
- * where, for example, the keys allready expanded,
- * keys/block_size calculated and such.
- *
- * It is, each time if called, the responsibility of _setupInlineCrypt():
- *
- * - to set $this->inline_crypt to a valid and fully working callback function
- * as a (faster) replacement for encrypt() / decrypt()
- *
- * - NOT to create unlimited callback functions (for memory reasons!)
- * no matter how often _setupInlineCrypt() would be called. At some
- * point of amount they must be generic re-useable.
- *
- * - the code of _setupInlineCrypt() it self,
- * and the generated callback code,
- * must be, in following order:
- * - 100% safe
- * - 100% compatible to encrypt()/decrypt()
- * - using only php5+ features/lang-constructs/php-extensions if
- * compatibility (down to php4) or fallback is provided
- * - readable/maintainable/understandable/commented and... not-cryptic-styled-code :-)
- * - >= 10% faster than encrypt()/decrypt() [which is, by the way,
- * the reason for the existence of _setupInlineCrypt() :-)]
- * - memory-nice
- * - short (as good as possible)
- *
- * Note: - _setupInlineCrypt() is using _createInlineCryptFunction() to create the full callback function code.
- * - In case of using inline crypting, _setupInlineCrypt() must extend by the child Crypt_* class.
- * - The following variable names are reserved:
- * - $_* (all variable names prefixed with an underscore)
- * - $self (object reference to it self. Do not use $this, but $self instead)
- * - $in (the content of $in has to en/decrypt by the generated code)
- * - The callback function should not use the 'return' statement, but en/decrypt'ing the content of $in only
- *
- *
- * @see Crypt_Base::_setup()
- * @see Crypt_Base::_createInlineCryptFunction()
- * @see Crypt_Base::encrypt()
- * @see Crypt_Base::decrypt()
- * @access private
- */
- function _setupInlineCrypt()
- {
- // If a Crypt_* class providing inline crypting it must extend _setupInlineCrypt()
-
- // If, for any reason, an extending Crypt_Base() Crypt_* class
- // not using inline crypting then it must be ensured that: $this->use_inline_crypt = false
- // ie in the class var declaration of $use_inline_crypt in general for the Crypt_* class,
- // in the constructor at object instance-time
- // or, if it's runtime-specific, at runtime
-
- $this->use_inline_crypt = false;
- }
-
- /**
- * Creates the performance-optimized function for en/decrypt()
- *
- * Internally for phpseclib developers:
- *
- * _createInlineCryptFunction():
- *
- * - merge the $cipher_code [setup'ed by _setupInlineCrypt()]
- * with the current [$this->]mode of operation code
- *
- * - create the $inline function, which called by encrypt() / decrypt()
- * as its replacement to speed up the en/decryption operations.
- *
- * - return the name of the created $inline callback function
- *
- * - used to speed up en/decryption
- *
- *
- *
- * The main reason why can speed up things [up to 50%] this way are:
- *
- * - using variables more effective then regular.
- * (ie no use of expensive arrays but integers $k_0, $k_1 ...
- * or even, for example, the pure $key[] values hardcoded)
- *
- * - avoiding 1000's of function calls of ie _encryptBlock()
- * but inlining the crypt operations.
- * in the mode of operation for() loop.
- *
- * - full loop unroll the (sometimes key-dependent) rounds
- * avoiding this way ++$i counters and runtime-if's etc...
- *
- * The basic code architectur of the generated $inline en/decrypt()
- * lambda function, in pseudo php, is:
- *
- *
- * +----------------------------------------------------------------------------------------------+
- * | callback $inline = create_function: |
- * | lambda_function_0001_crypt_ECB($action, $text) |
- * | { |
- * | INSERT PHP CODE OF: |
- * | $cipher_code['init_crypt']; // general init code. |
- * | // ie: $sbox'es declarations used for |
- * | // encrypt and decrypt'ing. |
- * | |
- * | switch ($action) { |
- * | case 'encrypt': |
- * | INSERT PHP CODE OF: |
- * | $cipher_code['init_encrypt']; // encrypt sepcific init code. |
- * | ie: specified $key or $box |
- * | declarations for encrypt'ing. |
- * | |
- * | foreach ($ciphertext) { |
- * | $in = $block_size of $ciphertext; |
- * | |
- * | INSERT PHP CODE OF: |
- * | $cipher_code['encrypt_block']; // encrypt's (string) $in, which is always: |
- * | // strlen($in) == $this->block_size |
- * | // here comes the cipher algorithm in action |
- * | // for encryption. |
- * | // $cipher_code['encrypt_block'] has to |
- * | // encrypt the content of the $in variable |
- * | |
- * | $plaintext .= $in; |
- * | } |
- * | return $plaintext; |
- * | |
- * | case 'decrypt': |
- * | INSERT PHP CODE OF: |
- * | $cipher_code['init_decrypt']; // decrypt sepcific init code |
- * | ie: specified $key or $box |
- * | declarations for decrypt'ing. |
- * | foreach ($plaintext) { |
- * | $in = $block_size of $plaintext; |
- * | |
- * | INSERT PHP CODE OF: |
- * | $cipher_code['decrypt_block']; // decrypt's (string) $in, which is always |
- * | // strlen($in) == $this->block_size |
- * | // here comes the cipher algorithm in action |
- * | // for decryption. |
- * | // $cipher_code['decrypt_block'] has to |
- * | // decrypt the content of the $in variable |
- * | $ciphertext .= $in; |
- * | } |
- * | return $ciphertext; |
- * | } |
- * | } |
- * +----------------------------------------------------------------------------------------------+
- *
- *
- * See also the Crypt_*::_setupInlineCrypt()'s for
- * productive inline $cipher_code's how they works.
- *
- * Structure of:
- *
- * $cipher_code = array(
- * 'init_crypt' => (string) '', // optional
- * 'init_encrypt' => (string) '', // optional
- * 'init_decrypt' => (string) '', // optional
- * 'encrypt_block' => (string) '', // required
- * 'decrypt_block' => (string) '' // required
- * );
- *
- *
- * @see Crypt_Base::_setupInlineCrypt()
- * @see Crypt_Base::encrypt()
- * @see Crypt_Base::decrypt()
- * @param Array $cipher_code
- * @access private
- * @return String (the name of the created callback function)
- */
- function _createInlineCryptFunction($cipher_code)
- {
- $block_size = $this->block_size;
-
- // optional
- $init_crypt = isset($cipher_code['init_crypt']) ? $cipher_code['init_crypt'] : '';
- $init_encrypt = isset($cipher_code['init_encrypt']) ? $cipher_code['init_encrypt'] : '';
- $init_decrypt = isset($cipher_code['init_decrypt']) ? $cipher_code['init_decrypt'] : '';
- // required
- $encrypt_block = $cipher_code['encrypt_block'];
- $decrypt_block = $cipher_code['decrypt_block'];
-
- // Generating mode of operation inline code,
- // merged with the $cipher_code algorithm
- // for encrypt- and decryption.
- switch ($this->mode) {
- case CRYPT_MODE_ECB:
- $encrypt = $init_encrypt . '
- $_ciphertext = "";
- $_text = $self->_pad($_text);
- $_plaintext_len = strlen($_text);
-
- for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
- $in = substr($_text, $_i, '.$block_size.');
- '.$encrypt_block.'
- $_ciphertext.= $in;
- }
-
- return $_ciphertext;
- ';
-
- $decrypt = $init_decrypt . '
- $_plaintext = "";
- $_text = str_pad($_text, strlen($_text) + ('.$block_size.' - strlen($_text) % '.$block_size.') % '.$block_size.', chr(0));
- $_ciphertext_len = strlen($_text);
-
- for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
- $in = substr($_text, $_i, '.$block_size.');
- '.$decrypt_block.'
- $_plaintext.= $in;
- }
-
- return $self->_unpad($_plaintext);
- ';
- break;
- case CRYPT_MODE_CTR:
- $encrypt = $init_encrypt . '
- $_ciphertext = "";
- $_plaintext_len = strlen($_text);
- $_xor = $self->encryptIV;
- $_buffer = &$self->enbuffer;
-
- if (strlen($_buffer["encrypted"])) {
- for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
- $_block = substr($_text, $_i, '.$block_size.');
- if (strlen($_block) > strlen($_buffer["encrypted"])) {
- $in = $self->_generateXor($_xor, '.$block_size.');
- '.$encrypt_block.'
- $_buffer["encrypted"].= $in;
- }
- $_key = $self->_stringShift($_buffer["encrypted"], '.$block_size.');
- $_ciphertext.= $_block ^ $_key;
- }
- } else {
- for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
- $_block = substr($_text, $_i, '.$block_size.');
- $in = $self->_generateXor($_xor, '.$block_size.');
- '.$encrypt_block.'
- $_key = $in;
- $_ciphertext.= $_block ^ $_key;
- }
- }
- if ($self->continuousBuffer) {
- $self->encryptIV = $_xor;
- if ($_start = $_plaintext_len % '.$block_size.') {
- $_buffer["encrypted"] = substr($_key, $_start) . $_buffer["encrypted"];
- }
- }
-
- return $_ciphertext;
- ';
-
- $decrypt = $init_encrypt . '
- $_plaintext = "";
- $_ciphertext_len = strlen($_text);
- $_xor = $self->decryptIV;
- $_buffer = &$self->debuffer;
-
- if (strlen($_buffer["ciphertext"])) {
- for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
- $_block = substr($_text, $_i, '.$block_size.');
- if (strlen($_block) > strlen($_buffer["ciphertext"])) {
- $in = $self->_generateXor($_xor, '.$block_size.');
- '.$encrypt_block.'
- $_buffer["ciphertext"].= $in;
- }
- $_key = $self->_stringShift($_buffer["ciphertext"], '.$block_size.');
- $_plaintext.= $_block ^ $_key;
- }
- } else {
- for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
- $_block = substr($_text, $_i, '.$block_size.');
- $in = $self->_generateXor($_xor, '.$block_size.');
- '.$encrypt_block.'
- $_key = $in;
- $_plaintext.= $_block ^ $_key;
- }
- }
- if ($self->continuousBuffer) {
- $self->decryptIV = $_xor;
- if ($_start = $_ciphertext_len % '.$block_size.') {
- $_buffer["ciphertext"] = substr($_key, $_start) . $_buffer["ciphertext"];
- }
- }
-
- return $_plaintext;
- ';
- break;
- case CRYPT_MODE_CFB:
- $encrypt = $init_encrypt . '
- $_ciphertext = "";
- $_buffer = &$self->enbuffer;
-
- if ($self->continuousBuffer) {
- $_iv = &$self->encryptIV;
- $_pos = &$_buffer["pos"];
- } else {
- $_iv = $self->encryptIV;
- $_pos = 0;
- }
- $_len = strlen($_text);
- $_i = 0;
- if ($_pos) {
- $_orig_pos = $_pos;
- $_max = '.$block_size.' - $_pos;
- if ($_len >= $_max) {
- $_i = $_max;
- $_len-= $_max;
- $_pos = 0;
- } else {
- $_i = $_len;
- $_pos+= $_len;
- $_len = 0;
- }
- $_ciphertext = substr($_iv, $_orig_pos) ^ $_text;
- $_iv = substr_replace($_iv, $_ciphertext, $_orig_pos, $_i);
- }
- while ($_len >= '.$block_size.') {
- $in = $_iv;
- '.$encrypt_block.';
- $_iv = $in ^ substr($_text, $_i, '.$block_size.');
- $_ciphertext.= $_iv;
- $_len-= '.$block_size.';
- $_i+= '.$block_size.';
- }
- if ($_len) {
- $in = $_iv;
- '.$encrypt_block.'
- $_iv = $in;
- $_block = $_iv ^ substr($_text, $_i);
- $_iv = substr_replace($_iv, $_block, 0, $_len);
- $_ciphertext.= $_block;
- $_pos = $_len;
- }
- return $_ciphertext;
- ';
-
- $decrypt = $init_encrypt . '
- $_plaintext = "";
- $_buffer = &$self->debuffer;
-
- if ($self->continuousBuffer) {
- $_iv = &$self->decryptIV;
- $_pos = &$_buffer["pos"];
- } else {
- $_iv = $self->decryptIV;
- $_pos = 0;
- }
- $_len = strlen($_text);
- $_i = 0;
- if ($_pos) {
- $_orig_pos = $_pos;
- $_max = '.$block_size.' - $_pos;
- if ($_len >= $_max) {
- $_i = $_max;
- $_len-= $_max;
- $_pos = 0;
- } else {
- $_i = $_len;
- $_pos+= $_len;
- $_len = 0;
- }
- $_plaintext = substr($_iv, $_orig_pos) ^ $_text;
- $_iv = substr_replace($_iv, substr($_text, 0, $_i), $_orig_pos, $_i);
- }
- while ($_len >= '.$block_size.') {
- $in = $_iv;
- '.$encrypt_block.'
- $_iv = $in;
- $cb = substr($_text, $_i, '.$block_size.');
- $_plaintext.= $_iv ^ $cb;
- $_iv = $cb;
- $_len-= '.$block_size.';
- $_i+= '.$block_size.';
- }
- if ($_len) {
- $in = $_iv;
- '.$encrypt_block.'
- $_iv = $in;
- $_plaintext.= $_iv ^ substr($_text, $_i);
- $_iv = substr_replace($_iv, substr($_text, $_i), 0, $_len);
- $_pos = $_len;
- }
-
- return $_plaintext;
- ';
- break;
- case CRYPT_MODE_OFB:
- $encrypt = $init_encrypt . '
- $_ciphertext = "";
- $_plaintext_len = strlen($_text);
- $_xor = $self->encryptIV;
- $_buffer = &$self->enbuffer;
-
- if (strlen($_buffer["xor"])) {
- for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
- $_block = substr($_text, $_i, '.$block_size.');
- if (strlen($_block) > strlen($_buffer["xor"])) {
- $in = $_xor;
- '.$encrypt_block.'
- $_xor = $in;
- $_buffer["xor"].= $_xor;
- }
- $_key = $self->_stringShift($_buffer["xor"], '.$block_size.');
- $_ciphertext.= $_block ^ $_key;
- }
- } else {
- for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
- $in = $_xor;
- '.$encrypt_block.'
- $_xor = $in;
- $_ciphertext.= substr($_text, $_i, '.$block_size.') ^ $_xor;
- }
- $_key = $_xor;
- }
- if ($self->continuousBuffer) {
- $self->encryptIV = $_xor;
- if ($_start = $_plaintext_len % '.$block_size.') {
- $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"];
- }
- }
- return $_ciphertext;
- ';
-
- $decrypt = $init_encrypt . '
- $_plaintext = "";
- $_ciphertext_len = strlen($_text);
- $_xor = $self->decryptIV;
- $_buffer = &$self->debuffer;
-
- if (strlen($_buffer["xor"])) {
- for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
- $_block = substr($_text, $_i, '.$block_size.');
- if (strlen($_block) > strlen($_buffer["xor"])) {
- $in = $_xor;
- '.$encrypt_block.'
- $_xor = $in;
- $_buffer["xor"].= $_xor;
- }
- $_key = $self->_stringShift($_buffer["xor"], '.$block_size.');
- $_plaintext.= $_block ^ $_key;
- }
- } else {
- for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
- $in = $_xor;
- '.$encrypt_block.'
- $_xor = $in;
- $_plaintext.= substr($_text, $_i, '.$block_size.') ^ $_xor;
- }
- $_key = $_xor;
- }
- if ($self->continuousBuffer) {
- $self->decryptIV = $_xor;
- if ($_start = $_ciphertext_len % '.$block_size.') {
- $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"];
- }
- }
- return $_plaintext;
- ';
- break;
- case CRYPT_MODE_STREAM:
- $encrypt = $init_encrypt . '
- $_ciphertext = "";
- '.$encrypt_block.'
- return $_ciphertext;
- ';
- $decrypt = $init_decrypt . '
- $_plaintext = "";
- '.$decrypt_block.'
- return $_plaintext;
- ';
- break;
- // case CRYPT_MODE_CBC:
- default:
- $encrypt = $init_encrypt . '
- $_ciphertext = "";
- $_text = $self->_pad($_text);
- $_plaintext_len = strlen($_text);
-
- $in = $self->encryptIV;
-
- for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
- $in = substr($_text, $_i, '.$block_size.') ^ $in;
- '.$encrypt_block.'
- $_ciphertext.= $in;
- }
-
- if ($self->continuousBuffer) {
- $self->encryptIV = $in;
- }
-
- return $_ciphertext;
- ';
-
- $decrypt = $init_decrypt . '
- $_plaintext = "";
- $_text = str_pad($_text, strlen($_text) + ('.$block_size.' - strlen($_text) % '.$block_size.') % '.$block_size.', chr(0));
- $_ciphertext_len = strlen($_text);
-
- $_iv = $self->decryptIV;
-
- for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
- $in = $_block = substr($_text, $_i, '.$block_size.');
- '.$decrypt_block.'
- $_plaintext.= $in ^ $_iv;
- $_iv = $_block;
- }
-
- if ($self->continuousBuffer) {
- $self->decryptIV = $_iv;
- }
-
- return $self->_unpad($_plaintext);
- ';
- break;
- }
-
- // Create the $inline function and return its name as string. Ready to run!
- return create_function('$_action, &$self, $_text', $init_crypt . 'if ($_action == "encrypt") { ' . $encrypt . ' } else { ' . $decrypt . ' }');
- }
-
- /**
- * Holds the lambda_functions table (classwide)
- *
- * Each name of the lambda function, created from
- * _setupInlineCrypt() && _createInlineCryptFunction()
- * is stored, classwide (!), here for reusing.
- *
- * The string-based index of $function is a classwide
- * uniqe value representing, at least, the $mode of
- * operation (or more... depends of the optimizing level)
- * for which $mode the lambda function was created.
- *
- * @access private
- * @return &Array
- */
- function &_getLambdaFunctions()
- {
- static $functions = array();
- return $functions;
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Blowfish.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Blowfish.php
deleted file mode 100644
index b352e7c468887a2abe3fd595f21dcfcdb9216136..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Blowfish.php
+++ /dev/null
@@ -1,674 +0,0 @@
-
- * setKey('12345678901234567890123456789012');
- *
- * $plaintext = str_repeat('a', 1024);
- *
- * echo $blowfish->decrypt($blowfish->encrypt($plaintext));
- * ?>
- *
- *
- * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @category Crypt
- * @package Crypt_Blowfish
- * @author Jim Wigginton
- * @author Hans-Juergen Petrich
- * @copyright MMVII Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @version 1.0
- * @link http://phpseclib.sourceforge.net
- */
-
-/**
- * Include Crypt_Base
- *
- * Base cipher class
- */
-if (!class_exists('Crypt_Base')) {
- include_once 'Base.php';
-}
-
-/**#@+
- * @access public
- * @see Crypt_Blowfish::encrypt()
- * @see Crypt_Blowfish::decrypt()
- */
-/**
- * Encrypt / decrypt using the Counter mode.
- *
- * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
- */
-define('CRYPT_BLOWFISH_MODE_CTR', CRYPT_MODE_CTR);
-/**
- * Encrypt / decrypt using the Electronic Code Book mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
- */
-define('CRYPT_BLOWFISH_MODE_ECB', CRYPT_MODE_ECB);
-/**
- * Encrypt / decrypt using the Code Book Chaining mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
- */
-define('CRYPT_BLOWFISH_MODE_CBC', CRYPT_MODE_CBC);
-/**
- * Encrypt / decrypt using the Cipher Feedback mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
- */
-define('CRYPT_BLOWFISH_MODE_CFB', CRYPT_MODE_CFB);
-/**
- * Encrypt / decrypt using the Cipher Feedback mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
- */
-define('CRYPT_BLOWFISH_MODE_OFB', CRYPT_MODE_OFB);
-/**#@-*/
-
-/**#@+
- * @access private
- * @see Crypt_Blowfish::Crypt_Blowfish()
- */
-/**
- * Toggles the internal implementation
- */
-define('CRYPT_BLOWFISH_MODE_INTERNAL', CRYPT_MODE_INTERNAL);
-/**
- * Toggles the mcrypt implementation
- */
-define('CRYPT_BLOWFISH_MODE_MCRYPT', CRYPT_MODE_MCRYPT);
-/**#@-*/
-
-/**
- * Pure-PHP implementation of Blowfish.
- *
- * @package Crypt_Blowfish
- * @author Jim Wigginton
- * @author Hans-Juergen Petrich
- * @version 1.0
- * @access public
- */
-class Crypt_Blowfish extends Crypt_Base
-{
- /**
- * Block Length of the cipher
- *
- * @see Crypt_Base::block_size
- * @var Integer
- * @access private
- */
- var $block_size = 8;
-
- /**
- * The default password key_size used by setPassword()
- *
- * @see Crypt_Base::password_key_size
- * @see Crypt_Base::setPassword()
- * @var Integer
- * @access private
- */
- var $password_key_size = 56;
-
- /**
- * The namespace used by the cipher for its constants.
- *
- * @see Crypt_Base::const_namespace
- * @var String
- * @access private
- */
- var $const_namespace = 'BLOWFISH';
-
- /**
- * The mcrypt specific name of the cipher
- *
- * @see Crypt_Base::cipher_name_mcrypt
- * @var String
- * @access private
- */
- var $cipher_name_mcrypt = 'blowfish';
-
- /**
- * Optimizing value while CFB-encrypting
- *
- * @see Crypt_Base::cfb_init_len
- * @var Integer
- * @access private
- */
- var $cfb_init_len = 500;
-
- /**
- * The fixed subkeys boxes ($sbox0 - $sbox3) with 256 entries each
- *
- * S-Box 1
- *
- * @access private
- * @var array
- */
- var $sbox0 = array (
- 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
- 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
- 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
- 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
- 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
- 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
- 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
- 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
- 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
- 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
- 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
- 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
- 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
- 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
- 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
- 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
- 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
- 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
- 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
- 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
- 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
- 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
- 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
- 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
- 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
- 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
- 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
- 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
- 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
- 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
- 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
- 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a
- );
-
- /**
- * S-Box 1
- *
- * @access private
- * @var array
- */
- var $sbox1 = array(
- 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
- 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
- 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
- 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
- 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
- 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
- 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
- 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
- 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
- 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
- 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
- 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
- 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
- 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
- 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
- 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
- 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
- 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
- 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
- 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
- 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
- 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
- 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
- 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
- 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
- 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
- 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
- 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
- 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
- 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
- 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
- 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7
- );
-
- /**
- * S-Box 2
- *
- * @access private
- * @var array
- */
- var $sbox2 = array(
- 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
- 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
- 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
- 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
- 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
- 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
- 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
- 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
- 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
- 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
- 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
- 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
- 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
- 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
- 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
- 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
- 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
- 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
- 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
- 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
- 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
- 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
- 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
- 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
- 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
- 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
- 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
- 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
- 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
- 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
- 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
- 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0
- );
-
- /**
- * S-Box 3
- *
- * @access private
- * @var array
- */
- var $sbox3 = array(
- 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
- 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
- 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
- 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
- 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
- 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
- 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
- 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
- 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
- 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
- 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
- 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
- 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
- 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
- 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
- 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
- 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
- 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
- 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
- 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
- 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
- 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
- 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
- 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
- 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
- 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
- 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
- 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
- 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
- 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
- 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
- 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
- );
-
- /**
- * P-Array consists of 18 32-bit subkeys
- *
- * @var array $parray
- * @access private
- */
- var $parray = array(
- 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0,
- 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
- 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b
- );
-
- /**
- * The BCTX-working Array
- *
- * Holds the expanded key [p] and the key-depended s-boxes [sb]
- *
- * @var array $bctx
- * @access private
- */
- var $bctx;
-
- /**
- * Holds the last used key
- *
- * @var Array
- * @access private
- */
- var $kl;
-
- /**
- * Default Constructor.
- *
- * Determines whether or not the mcrypt extension should be used.
- *
- * $mode could be:
- *
- * - CRYPT_BLOWFISH_MODE_ECB
- *
- * - CRYPT_BLOWFISH_MODE_CBC
- *
- * - CRYPT_BLOWFISH_MODE_CTR
- *
- * - CRYPT_BLOWFISH_MODE_CFB
- *
- * - CRYPT_BLOWFISH_MODE_OFB
- *
- * If not explictly set, CRYPT_BLOWFISH_MODE_CBC will be used.
- *
- * @see Crypt_Base::Crypt_Base()
- * @param optional Integer $mode
- * @access public
- */
- function Crypt_Blowfish($mode = CRYPT_BLOWFISH_MODE_CBC)
- {
- parent::Crypt_Base($mode);
- }
-
- /**
- * Sets the key.
- *
- * Keys can be of any length. Blowfish, itself, requires the use of a key between 32 and max. 448-bits long.
- * If the key is less than 32-bits we NOT fill the key to 32bit but let the key as it is to be compatible
- * with mcrypt because mcrypt act this way with blowfish key's < 32 bits.
- *
- * If the key is more than 448-bits, we trim the excess bits.
- *
- * If the key is not explicitly set, or empty, it'll be assumed a 128 bits key to be all null bytes.
- *
- * @access public
- * @see Crypt_Base::setKey()
- * @param String $key
- */
- function setKey($key)
- {
- $keylength = strlen($key);
-
- if (!$keylength) {
- $key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
- } elseif ($keylength > 56) {
- $key = substr($key, 0, 56);
- }
-
- parent::setKey($key);
- }
-
- /**
- * Setup the key (expansion)
- *
- * @see Crypt_Base::_setupKey()
- * @access private
- */
- function _setupKey()
- {
- if (isset($this->kl['key']) && $this->key === $this->kl['key']) {
- // already expanded
- return;
- }
- $this->kl = array('key' => $this->key);
-
- /* key-expanding p[] and S-Box building sb[] */
- $this->bctx = array(
- 'p' => array(),
- 'sb' => array(
- $this->sbox0,
- $this->sbox1,
- $this->sbox2,
- $this->sbox3
- )
- );
-
- // unpack binary string in unsigned chars
- $key = array_values(unpack('C*', $this->key));
- $keyl = count($key);
- for ($j = 0, $i = 0; $i < 18; ++$i) {
- // xor P1 with the first 32-bits of the key, xor P2 with the second 32-bits ...
- for ($data = 0, $k = 0; $k < 4; ++$k) {
- $data = ($data << 8) | $key[$j];
- if (++$j >= $keyl) {
- $j = 0;
- }
- }
- $this->bctx['p'][] = $this->parray[$i] ^ $data;
- }
-
- // encrypt the zero-string, replace P1 and P2 with the encrypted data,
- // encrypt P3 and P4 with the new P1 and P2, do it with all P-array and subkeys
- $data = "\0\0\0\0\0\0\0\0";
- for ($i = 0; $i < 18; $i += 2) {
- list($l, $r) = array_values(unpack('N*', $data = $this->_encryptBlock($data)));
- $this->bctx['p'][$i ] = $l;
- $this->bctx['p'][$i + 1] = $r;
- }
- for ($i = 0; $i < 4; ++$i) {
- for ($j = 0; $j < 256; $j += 2) {
- list($l, $r) = array_values(unpack('N*', $data = $this->_encryptBlock($data)));
- $this->bctx['sb'][$i][$j ] = $l;
- $this->bctx['sb'][$i][$j + 1] = $r;
- }
- }
- }
-
- /**
- * Encrypts a block
- *
- * @access private
- * @param String $in
- * @return String
- */
- function _encryptBlock($in)
- {
- $p = $this->bctx["p"];
- // extract($this->bctx["sb"], EXTR_PREFIX_ALL, "sb"); // slower
- $sb_0 = $this->bctx["sb"][0];
- $sb_1 = $this->bctx["sb"][1];
- $sb_2 = $this->bctx["sb"][2];
- $sb_3 = $this->bctx["sb"][3];
-
- $in = unpack("N*", $in);
- $l = $in[1];
- $r = $in[2];
-
- for ($i = 0; $i < 16; $i+= 2) {
- $l^= $p[$i];
- $r^= ($sb_0[$l >> 24 & 0xff] +
- $sb_1[$l >> 16 & 0xff] ^
- $sb_2[$l >> 8 & 0xff]) +
- $sb_3[$l & 0xff];
-
- $r^= $p[$i + 1];
- $l^= ($sb_0[$r >> 24 & 0xff] +
- $sb_1[$r >> 16 & 0xff] ^
- $sb_2[$r >> 8 & 0xff]) +
- $sb_3[$r & 0xff];
- }
- return pack("N*", $r ^ $p[17], $l ^ $p[16]);
- }
-
- /**
- * Decrypts a block
- *
- * @access private
- * @param String $in
- * @return String
- */
- function _decryptBlock($in)
- {
- $p = $this->bctx["p"];
- $sb_0 = $this->bctx["sb"][0];
- $sb_1 = $this->bctx["sb"][1];
- $sb_2 = $this->bctx["sb"][2];
- $sb_3 = $this->bctx["sb"][3];
-
- $in = unpack("N*", $in);
- $l = $in[1];
- $r = $in[2];
-
- for ($i = 17; $i > 2; $i-= 2) {
- $l^= $p[$i];
- $r^= ($sb_0[$l >> 24 & 0xff] +
- $sb_1[$l >> 16 & 0xff] ^
- $sb_2[$l >> 8 & 0xff]) +
- $sb_3[$l & 0xff];
-
- $r^= $p[$i - 1];
- $l^= ($sb_0[$r >> 24 & 0xff] +
- $sb_1[$r >> 16 & 0xff] ^
- $sb_2[$r >> 8 & 0xff]) +
- $sb_3[$r & 0xff];
- }
-
- return pack("N*", $r ^ $p[0], $l ^ $p[1]);
- }
-
- /**
- * Setup the performance-optimized function for de/encrypt()
- *
- * @see Crypt_Base::_setupInlineCrypt()
- * @access private
- */
- function _setupInlineCrypt()
- {
- $lambda_functions =& Crypt_Blowfish::_getLambdaFunctions();
-
- // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function.
- // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one.
- $gen_hi_opt_code = (bool)( count($lambda_functions) < 10);
-
- switch (true) {
- case $gen_hi_opt_code:
- $code_hash = md5(str_pad("Crypt_Blowfish, {$this->mode}, ", 32, "\0") . $this->key);
- break;
- default:
- $code_hash = "Crypt_Blowfish, {$this->mode}";
- }
-
- if (!isset($lambda_functions[$code_hash])) {
- switch (true) {
- case $gen_hi_opt_code:
- $p = $this->bctx['p'];
- $init_crypt = '
- static $sb_0, $sb_1, $sb_2, $sb_3;
- if (!$sb_0) {
- $sb_0 = $self->bctx["sb"][0];
- $sb_1 = $self->bctx["sb"][1];
- $sb_2 = $self->bctx["sb"][2];
- $sb_3 = $self->bctx["sb"][3];
- }
- ';
- break;
- default:
- $p = array();
- for ($i = 0; $i < 18; ++$i) {
- $p[] = '$p_' . $i;
- }
- $init_crypt = '
- list($sb_0, $sb_1, $sb_2, $sb_3) = $self->bctx["sb"];
- list(' . implode(',', $p) . ') = $self->bctx["p"];
-
- ';
- }
-
- // Generating encrypt code:
- $encrypt_block = '
- $in = unpack("N*", $in);
- $l = $in[1];
- $r = $in[2];
- ';
- for ($i = 0; $i < 16; $i+= 2) {
- $encrypt_block.= '
- $l^= ' . $p[$i] . ';
- $r^= ($sb_0[$l >> 24 & 0xff] +
- $sb_1[$l >> 16 & 0xff] ^
- $sb_2[$l >> 8 & 0xff]) +
- $sb_3[$l & 0xff];
-
- $r^= ' . $p[$i + 1] . ';
- $l^= ($sb_0[$r >> 24 & 0xff] +
- $sb_1[$r >> 16 & 0xff] ^
- $sb_2[$r >> 8 & 0xff]) +
- $sb_3[$r & 0xff];
- ';
- }
- $encrypt_block.= '
- $in = pack("N*",
- $r ^ ' . $p[17] . ',
- $l ^ ' . $p[16] . '
- );
- ';
-
- // Generating decrypt code:
- $decrypt_block = '
- $in = unpack("N*", $in);
- $l = $in[1];
- $r = $in[2];
- ';
-
- for ($i = 17; $i > 2; $i-= 2) {
- $decrypt_block.= '
- $l^= ' . $p[$i] . ';
- $r^= ($sb_0[$l >> 24 & 0xff] +
- $sb_1[$l >> 16 & 0xff] ^
- $sb_2[$l >> 8 & 0xff]) +
- $sb_3[$l & 0xff];
-
- $r^= ' . $p[$i - 1] . ';
- $l^= ($sb_0[$r >> 24 & 0xff] +
- $sb_1[$r >> 16 & 0xff] ^
- $sb_2[$r >> 8 & 0xff]) +
- $sb_3[$r & 0xff];
- ';
- }
-
- $decrypt_block.= '
- $in = pack("N*",
- $r ^ ' . $p[0] . ',
- $l ^ ' . $p[1] . '
- );
- ';
-
- $lambda_functions[$code_hash] = $this->_createInlineCryptFunction(
- array(
- 'init_crypt' => $init_crypt,
- 'init_encrypt' => '',
- 'init_decrypt' => '',
- 'encrypt_block' => $encrypt_block,
- 'decrypt_block' => $decrypt_block
- )
- );
- }
- $this->inline_crypt = $lambda_functions[$code_hash];
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/DES.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/DES.php
deleted file mode 100644
index fcbf01993a1cdae275bbc094d9c27eaae1107e52..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/DES.php
+++ /dev/null
@@ -1,1535 +0,0 @@
-
- * setKey('abcdefgh');
- *
- * $size = 10 * 1024;
- * $plaintext = '';
- * for ($i = 0; $i < $size; $i++) {
- * $plaintext.= 'a';
- * }
- *
- * echo $des->decrypt($des->encrypt($plaintext));
- * ?>
- *
- *
- * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @category Crypt
- * @package Crypt_DES
- * @author Jim Wigginton
- * @copyright MMVII Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- */
-
-/**
- * Include Crypt_Base
- *
- * Base cipher class
- */
-if (!class_exists('Crypt_Base')) {
- include_once 'Base.php';
-}
-
-/**#@+
- * @access private
- * @see Crypt_DES::_setupKey()
- * @see Crypt_DES::_processBlock()
- */
-/**
- * Contains $keys[CRYPT_DES_ENCRYPT]
- */
-define('CRYPT_DES_ENCRYPT', 0);
-/**
- * Contains $keys[CRYPT_DES_DECRYPT]
- */
-define('CRYPT_DES_DECRYPT', 1);
-/**#@-*/
-
-/**#@+
- * @access public
- * @see Crypt_DES::encrypt()
- * @see Crypt_DES::decrypt()
- */
-/**
- * Encrypt / decrypt using the Counter mode.
- *
- * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
- */
-define('CRYPT_DES_MODE_CTR', CRYPT_MODE_CTR);
-/**
- * Encrypt / decrypt using the Electronic Code Book mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
- */
-define('CRYPT_DES_MODE_ECB', CRYPT_MODE_ECB);
-/**
- * Encrypt / decrypt using the Code Book Chaining mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
- */
-define('CRYPT_DES_MODE_CBC', CRYPT_MODE_CBC);
-/**
- * Encrypt / decrypt using the Cipher Feedback mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
- */
-define('CRYPT_DES_MODE_CFB', CRYPT_MODE_CFB);
-/**
- * Encrypt / decrypt using the Cipher Feedback mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
- */
-define('CRYPT_DES_MODE_OFB', CRYPT_MODE_OFB);
-/**#@-*/
-
-/**#@+
- * @access private
- * @see Crypt_DES::Crypt_DES()
- */
-/**
- * Toggles the internal implementation
- */
-define('CRYPT_DES_MODE_INTERNAL', CRYPT_MODE_INTERNAL);
-/**
- * Toggles the mcrypt implementation
- */
-define('CRYPT_DES_MODE_MCRYPT', CRYPT_MODE_MCRYPT);
-/**#@-*/
-
-/**
- * Pure-PHP implementation of DES.
- *
- * @package Crypt_DES
- * @author Jim Wigginton
- * @version 0.1.0
- * @access public
- */
-class Crypt_DES extends Crypt_Base
-{
- /**
- * Block Length of the cipher
- *
- * @see Crypt_Base::block_size
- * @var Integer
- * @access private
- */
- var $block_size = 8;
-
- /**
- * The Key
- *
- * @see Crypt_Base::key
- * @see setKey()
- * @var String
- * @access private
- */
- var $key = "\0\0\0\0\0\0\0\0";
-
- /**
- * The default password key_size used by setPassword()
- *
- * @see Crypt_Base::password_key_size
- * @see Crypt_Base::setPassword()
- * @var Integer
- * @access private
- */
- var $password_key_size = 8;
-
- /**
- * The namespace used by the cipher for its constants.
- *
- * @see Crypt_Base::const_namespace
- * @var String
- * @access private
- */
- var $const_namespace = 'DES';
-
- /**
- * The mcrypt specific name of the cipher
- *
- * @see Crypt_Base::cipher_name_mcrypt
- * @var String
- * @access private
- */
- var $cipher_name_mcrypt = 'des';
-
- /**
- * Optimizing value while CFB-encrypting
- *
- * @see Crypt_Base::cfb_init_len
- * @var Integer
- * @access private
- */
- var $cfb_init_len = 500;
-
- /**
- * Switch for DES/3DES encryption
- *
- * Used only if $engine == CRYPT_DES_MODE_INTERNAL
- *
- * @see Crypt_DES::_setupKey()
- * @see Crypt_DES::_processBlock()
- * @var Integer
- * @access private
- */
- var $des_rounds = 1;
-
- /**
- * max possible size of $key
- *
- * @see Crypt_DES::setKey()
- * @var String
- * @access private
- */
- var $key_size_max = 8;
-
- /**
- * The Key Schedule
- *
- * @see Crypt_DES::_setupKey()
- * @var Array
- * @access private
- */
- var $keys;
-
- /**
- * Shuffle table.
- *
- * For each byte value index, the entry holds an 8-byte string
- * with each byte containing all bits in the same state as the
- * corresponding bit in the index value.
- *
- * @see Crypt_DES::_processBlock()
- * @see Crypt_DES::_setupKey()
- * @var Array
- * @access private
- */
- var $shuffle = array(
- "\x00\x00\x00\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x00\x00\x00\xFF",
- "\x00\x00\x00\x00\x00\x00\xFF\x00", "\x00\x00\x00\x00\x00\x00\xFF\xFF",
- "\x00\x00\x00\x00\x00\xFF\x00\x00", "\x00\x00\x00\x00\x00\xFF\x00\xFF",
- "\x00\x00\x00\x00\x00\xFF\xFF\x00", "\x00\x00\x00\x00\x00\xFF\xFF\xFF",
- "\x00\x00\x00\x00\xFF\x00\x00\x00", "\x00\x00\x00\x00\xFF\x00\x00\xFF",
- "\x00\x00\x00\x00\xFF\x00\xFF\x00", "\x00\x00\x00\x00\xFF\x00\xFF\xFF",
- "\x00\x00\x00\x00\xFF\xFF\x00\x00", "\x00\x00\x00\x00\xFF\xFF\x00\xFF",
- "\x00\x00\x00\x00\xFF\xFF\xFF\x00", "\x00\x00\x00\x00\xFF\xFF\xFF\xFF",
- "\x00\x00\x00\xFF\x00\x00\x00\x00", "\x00\x00\x00\xFF\x00\x00\x00\xFF",
- "\x00\x00\x00\xFF\x00\x00\xFF\x00", "\x00\x00\x00\xFF\x00\x00\xFF\xFF",
- "\x00\x00\x00\xFF\x00\xFF\x00\x00", "\x00\x00\x00\xFF\x00\xFF\x00\xFF",
- "\x00\x00\x00\xFF\x00\xFF\xFF\x00", "\x00\x00\x00\xFF\x00\xFF\xFF\xFF",
- "\x00\x00\x00\xFF\xFF\x00\x00\x00", "\x00\x00\x00\xFF\xFF\x00\x00\xFF",
- "\x00\x00\x00\xFF\xFF\x00\xFF\x00", "\x00\x00\x00\xFF\xFF\x00\xFF\xFF",
- "\x00\x00\x00\xFF\xFF\xFF\x00\x00", "\x00\x00\x00\xFF\xFF\xFF\x00\xFF",
- "\x00\x00\x00\xFF\xFF\xFF\xFF\x00", "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF",
- "\x00\x00\xFF\x00\x00\x00\x00\x00", "\x00\x00\xFF\x00\x00\x00\x00\xFF",
- "\x00\x00\xFF\x00\x00\x00\xFF\x00", "\x00\x00\xFF\x00\x00\x00\xFF\xFF",
- "\x00\x00\xFF\x00\x00\xFF\x00\x00", "\x00\x00\xFF\x00\x00\xFF\x00\xFF",
- "\x00\x00\xFF\x00\x00\xFF\xFF\x00", "\x00\x00\xFF\x00\x00\xFF\xFF\xFF",
- "\x00\x00\xFF\x00\xFF\x00\x00\x00", "\x00\x00\xFF\x00\xFF\x00\x00\xFF",
- "\x00\x00\xFF\x00\xFF\x00\xFF\x00", "\x00\x00\xFF\x00\xFF\x00\xFF\xFF",
- "\x00\x00\xFF\x00\xFF\xFF\x00\x00", "\x00\x00\xFF\x00\xFF\xFF\x00\xFF",
- "\x00\x00\xFF\x00\xFF\xFF\xFF\x00", "\x00\x00\xFF\x00\xFF\xFF\xFF\xFF",
- "\x00\x00\xFF\xFF\x00\x00\x00\x00", "\x00\x00\xFF\xFF\x00\x00\x00\xFF",
- "\x00\x00\xFF\xFF\x00\x00\xFF\x00", "\x00\x00\xFF\xFF\x00\x00\xFF\xFF",
- "\x00\x00\xFF\xFF\x00\xFF\x00\x00", "\x00\x00\xFF\xFF\x00\xFF\x00\xFF",
- "\x00\x00\xFF\xFF\x00\xFF\xFF\x00", "\x00\x00\xFF\xFF\x00\xFF\xFF\xFF",
- "\x00\x00\xFF\xFF\xFF\x00\x00\x00", "\x00\x00\xFF\xFF\xFF\x00\x00\xFF",
- "\x00\x00\xFF\xFF\xFF\x00\xFF\x00", "\x00\x00\xFF\xFF\xFF\x00\xFF\xFF",
- "\x00\x00\xFF\xFF\xFF\xFF\x00\x00", "\x00\x00\xFF\xFF\xFF\xFF\x00\xFF",
- "\x00\x00\xFF\xFF\xFF\xFF\xFF\x00", "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF",
- "\x00\xFF\x00\x00\x00\x00\x00\x00", "\x00\xFF\x00\x00\x00\x00\x00\xFF",
- "\x00\xFF\x00\x00\x00\x00\xFF\x00", "\x00\xFF\x00\x00\x00\x00\xFF\xFF",
- "\x00\xFF\x00\x00\x00\xFF\x00\x00", "\x00\xFF\x00\x00\x00\xFF\x00\xFF",
- "\x00\xFF\x00\x00\x00\xFF\xFF\x00", "\x00\xFF\x00\x00\x00\xFF\xFF\xFF",
- "\x00\xFF\x00\x00\xFF\x00\x00\x00", "\x00\xFF\x00\x00\xFF\x00\x00\xFF",
- "\x00\xFF\x00\x00\xFF\x00\xFF\x00", "\x00\xFF\x00\x00\xFF\x00\xFF\xFF",
- "\x00\xFF\x00\x00\xFF\xFF\x00\x00", "\x00\xFF\x00\x00\xFF\xFF\x00\xFF",
- "\x00\xFF\x00\x00\xFF\xFF\xFF\x00", "\x00\xFF\x00\x00\xFF\xFF\xFF\xFF",
- "\x00\xFF\x00\xFF\x00\x00\x00\x00", "\x00\xFF\x00\xFF\x00\x00\x00\xFF",
- "\x00\xFF\x00\xFF\x00\x00\xFF\x00", "\x00\xFF\x00\xFF\x00\x00\xFF\xFF",
- "\x00\xFF\x00\xFF\x00\xFF\x00\x00", "\x00\xFF\x00\xFF\x00\xFF\x00\xFF",
- "\x00\xFF\x00\xFF\x00\xFF\xFF\x00", "\x00\xFF\x00\xFF\x00\xFF\xFF\xFF",
- "\x00\xFF\x00\xFF\xFF\x00\x00\x00", "\x00\xFF\x00\xFF\xFF\x00\x00\xFF",
- "\x00\xFF\x00\xFF\xFF\x00\xFF\x00", "\x00\xFF\x00\xFF\xFF\x00\xFF\xFF",
- "\x00\xFF\x00\xFF\xFF\xFF\x00\x00", "\x00\xFF\x00\xFF\xFF\xFF\x00\xFF",
- "\x00\xFF\x00\xFF\xFF\xFF\xFF\x00", "\x00\xFF\x00\xFF\xFF\xFF\xFF\xFF",
- "\x00\xFF\xFF\x00\x00\x00\x00\x00", "\x00\xFF\xFF\x00\x00\x00\x00\xFF",
- "\x00\xFF\xFF\x00\x00\x00\xFF\x00", "\x00\xFF\xFF\x00\x00\x00\xFF\xFF",
- "\x00\xFF\xFF\x00\x00\xFF\x00\x00", "\x00\xFF\xFF\x00\x00\xFF\x00\xFF",
- "\x00\xFF\xFF\x00\x00\xFF\xFF\x00", "\x00\xFF\xFF\x00\x00\xFF\xFF\xFF",
- "\x00\xFF\xFF\x00\xFF\x00\x00\x00", "\x00\xFF\xFF\x00\xFF\x00\x00\xFF",
- "\x00\xFF\xFF\x00\xFF\x00\xFF\x00", "\x00\xFF\xFF\x00\xFF\x00\xFF\xFF",
- "\x00\xFF\xFF\x00\xFF\xFF\x00\x00", "\x00\xFF\xFF\x00\xFF\xFF\x00\xFF",
- "\x00\xFF\xFF\x00\xFF\xFF\xFF\x00", "\x00\xFF\xFF\x00\xFF\xFF\xFF\xFF",
- "\x00\xFF\xFF\xFF\x00\x00\x00\x00", "\x00\xFF\xFF\xFF\x00\x00\x00\xFF",
- "\x00\xFF\xFF\xFF\x00\x00\xFF\x00", "\x00\xFF\xFF\xFF\x00\x00\xFF\xFF",
- "\x00\xFF\xFF\xFF\x00\xFF\x00\x00", "\x00\xFF\xFF\xFF\x00\xFF\x00\xFF",
- "\x00\xFF\xFF\xFF\x00\xFF\xFF\x00", "\x00\xFF\xFF\xFF\x00\xFF\xFF\xFF",
- "\x00\xFF\xFF\xFF\xFF\x00\x00\x00", "\x00\xFF\xFF\xFF\xFF\x00\x00\xFF",
- "\x00\xFF\xFF\xFF\xFF\x00\xFF\x00", "\x00\xFF\xFF\xFF\xFF\x00\xFF\xFF",
- "\x00\xFF\xFF\xFF\xFF\xFF\x00\x00", "\x00\xFF\xFF\xFF\xFF\xFF\x00\xFF",
- "\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF",
- "\xFF\x00\x00\x00\x00\x00\x00\x00", "\xFF\x00\x00\x00\x00\x00\x00\xFF",
- "\xFF\x00\x00\x00\x00\x00\xFF\x00", "\xFF\x00\x00\x00\x00\x00\xFF\xFF",
- "\xFF\x00\x00\x00\x00\xFF\x00\x00", "\xFF\x00\x00\x00\x00\xFF\x00\xFF",
- "\xFF\x00\x00\x00\x00\xFF\xFF\x00", "\xFF\x00\x00\x00\x00\xFF\xFF\xFF",
- "\xFF\x00\x00\x00\xFF\x00\x00\x00", "\xFF\x00\x00\x00\xFF\x00\x00\xFF",
- "\xFF\x00\x00\x00\xFF\x00\xFF\x00", "\xFF\x00\x00\x00\xFF\x00\xFF\xFF",
- "\xFF\x00\x00\x00\xFF\xFF\x00\x00", "\xFF\x00\x00\x00\xFF\xFF\x00\xFF",
- "\xFF\x00\x00\x00\xFF\xFF\xFF\x00", "\xFF\x00\x00\x00\xFF\xFF\xFF\xFF",
- "\xFF\x00\x00\xFF\x00\x00\x00\x00", "\xFF\x00\x00\xFF\x00\x00\x00\xFF",
- "\xFF\x00\x00\xFF\x00\x00\xFF\x00", "\xFF\x00\x00\xFF\x00\x00\xFF\xFF",
- "\xFF\x00\x00\xFF\x00\xFF\x00\x00", "\xFF\x00\x00\xFF\x00\xFF\x00\xFF",
- "\xFF\x00\x00\xFF\x00\xFF\xFF\x00", "\xFF\x00\x00\xFF\x00\xFF\xFF\xFF",
- "\xFF\x00\x00\xFF\xFF\x00\x00\x00", "\xFF\x00\x00\xFF\xFF\x00\x00\xFF",
- "\xFF\x00\x00\xFF\xFF\x00\xFF\x00", "\xFF\x00\x00\xFF\xFF\x00\xFF\xFF",
- "\xFF\x00\x00\xFF\xFF\xFF\x00\x00", "\xFF\x00\x00\xFF\xFF\xFF\x00\xFF",
- "\xFF\x00\x00\xFF\xFF\xFF\xFF\x00", "\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF",
- "\xFF\x00\xFF\x00\x00\x00\x00\x00", "\xFF\x00\xFF\x00\x00\x00\x00\xFF",
- "\xFF\x00\xFF\x00\x00\x00\xFF\x00", "\xFF\x00\xFF\x00\x00\x00\xFF\xFF",
- "\xFF\x00\xFF\x00\x00\xFF\x00\x00", "\xFF\x00\xFF\x00\x00\xFF\x00\xFF",
- "\xFF\x00\xFF\x00\x00\xFF\xFF\x00", "\xFF\x00\xFF\x00\x00\xFF\xFF\xFF",
- "\xFF\x00\xFF\x00\xFF\x00\x00\x00", "\xFF\x00\xFF\x00\xFF\x00\x00\xFF",
- "\xFF\x00\xFF\x00\xFF\x00\xFF\x00", "\xFF\x00\xFF\x00\xFF\x00\xFF\xFF",
- "\xFF\x00\xFF\x00\xFF\xFF\x00\x00", "\xFF\x00\xFF\x00\xFF\xFF\x00\xFF",
- "\xFF\x00\xFF\x00\xFF\xFF\xFF\x00", "\xFF\x00\xFF\x00\xFF\xFF\xFF\xFF",
- "\xFF\x00\xFF\xFF\x00\x00\x00\x00", "\xFF\x00\xFF\xFF\x00\x00\x00\xFF",
- "\xFF\x00\xFF\xFF\x00\x00\xFF\x00", "\xFF\x00\xFF\xFF\x00\x00\xFF\xFF",
- "\xFF\x00\xFF\xFF\x00\xFF\x00\x00", "\xFF\x00\xFF\xFF\x00\xFF\x00\xFF",
- "\xFF\x00\xFF\xFF\x00\xFF\xFF\x00", "\xFF\x00\xFF\xFF\x00\xFF\xFF\xFF",
- "\xFF\x00\xFF\xFF\xFF\x00\x00\x00", "\xFF\x00\xFF\xFF\xFF\x00\x00\xFF",
- "\xFF\x00\xFF\xFF\xFF\x00\xFF\x00", "\xFF\x00\xFF\xFF\xFF\x00\xFF\xFF",
- "\xFF\x00\xFF\xFF\xFF\xFF\x00\x00", "\xFF\x00\xFF\xFF\xFF\xFF\x00\xFF",
- "\xFF\x00\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF",
- "\xFF\xFF\x00\x00\x00\x00\x00\x00", "\xFF\xFF\x00\x00\x00\x00\x00\xFF",
- "\xFF\xFF\x00\x00\x00\x00\xFF\x00", "\xFF\xFF\x00\x00\x00\x00\xFF\xFF",
- "\xFF\xFF\x00\x00\x00\xFF\x00\x00", "\xFF\xFF\x00\x00\x00\xFF\x00\xFF",
- "\xFF\xFF\x00\x00\x00\xFF\xFF\x00", "\xFF\xFF\x00\x00\x00\xFF\xFF\xFF",
- "\xFF\xFF\x00\x00\xFF\x00\x00\x00", "\xFF\xFF\x00\x00\xFF\x00\x00\xFF",
- "\xFF\xFF\x00\x00\xFF\x00\xFF\x00", "\xFF\xFF\x00\x00\xFF\x00\xFF\xFF",
- "\xFF\xFF\x00\x00\xFF\xFF\x00\x00", "\xFF\xFF\x00\x00\xFF\xFF\x00\xFF",
- "\xFF\xFF\x00\x00\xFF\xFF\xFF\x00", "\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF",
- "\xFF\xFF\x00\xFF\x00\x00\x00\x00", "\xFF\xFF\x00\xFF\x00\x00\x00\xFF",
- "\xFF\xFF\x00\xFF\x00\x00\xFF\x00", "\xFF\xFF\x00\xFF\x00\x00\xFF\xFF",
- "\xFF\xFF\x00\xFF\x00\xFF\x00\x00", "\xFF\xFF\x00\xFF\x00\xFF\x00\xFF",
- "\xFF\xFF\x00\xFF\x00\xFF\xFF\x00", "\xFF\xFF\x00\xFF\x00\xFF\xFF\xFF",
- "\xFF\xFF\x00\xFF\xFF\x00\x00\x00", "\xFF\xFF\x00\xFF\xFF\x00\x00\xFF",
- "\xFF\xFF\x00\xFF\xFF\x00\xFF\x00", "\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF",
- "\xFF\xFF\x00\xFF\xFF\xFF\x00\x00", "\xFF\xFF\x00\xFF\xFF\xFF\x00\xFF",
- "\xFF\xFF\x00\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF",
- "\xFF\xFF\xFF\x00\x00\x00\x00\x00", "\xFF\xFF\xFF\x00\x00\x00\x00\xFF",
- "\xFF\xFF\xFF\x00\x00\x00\xFF\x00", "\xFF\xFF\xFF\x00\x00\x00\xFF\xFF",
- "\xFF\xFF\xFF\x00\x00\xFF\x00\x00", "\xFF\xFF\xFF\x00\x00\xFF\x00\xFF",
- "\xFF\xFF\xFF\x00\x00\xFF\xFF\x00", "\xFF\xFF\xFF\x00\x00\xFF\xFF\xFF",
- "\xFF\xFF\xFF\x00\xFF\x00\x00\x00", "\xFF\xFF\xFF\x00\xFF\x00\x00\xFF",
- "\xFF\xFF\xFF\x00\xFF\x00\xFF\x00", "\xFF\xFF\xFF\x00\xFF\x00\xFF\xFF",
- "\xFF\xFF\xFF\x00\xFF\xFF\x00\x00", "\xFF\xFF\xFF\x00\xFF\xFF\x00\xFF",
- "\xFF\xFF\xFF\x00\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF",
- "\xFF\xFF\xFF\xFF\x00\x00\x00\x00", "\xFF\xFF\xFF\xFF\x00\x00\x00\xFF",
- "\xFF\xFF\xFF\xFF\x00\x00\xFF\x00", "\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF",
- "\xFF\xFF\xFF\xFF\x00\xFF\x00\x00", "\xFF\xFF\xFF\xFF\x00\xFF\x00\xFF",
- "\xFF\xFF\xFF\xFF\x00\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF",
- "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00", "\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF",
- "\xFF\xFF\xFF\xFF\xFF\x00\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF",
- "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF",
- "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
- );
-
- /**
- * IP mapping helper table.
- *
- * Indexing this table with each source byte performs the initial bit permutation.
- *
- * @var Array
- * @access private
- */
- var $ipmap = array(
- 0x00, 0x10, 0x01, 0x11, 0x20, 0x30, 0x21, 0x31,
- 0x02, 0x12, 0x03, 0x13, 0x22, 0x32, 0x23, 0x33,
- 0x40, 0x50, 0x41, 0x51, 0x60, 0x70, 0x61, 0x71,
- 0x42, 0x52, 0x43, 0x53, 0x62, 0x72, 0x63, 0x73,
- 0x04, 0x14, 0x05, 0x15, 0x24, 0x34, 0x25, 0x35,
- 0x06, 0x16, 0x07, 0x17, 0x26, 0x36, 0x27, 0x37,
- 0x44, 0x54, 0x45, 0x55, 0x64, 0x74, 0x65, 0x75,
- 0x46, 0x56, 0x47, 0x57, 0x66, 0x76, 0x67, 0x77,
- 0x80, 0x90, 0x81, 0x91, 0xA0, 0xB0, 0xA1, 0xB1,
- 0x82, 0x92, 0x83, 0x93, 0xA2, 0xB2, 0xA3, 0xB3,
- 0xC0, 0xD0, 0xC1, 0xD1, 0xE0, 0xF0, 0xE1, 0xF1,
- 0xC2, 0xD2, 0xC3, 0xD3, 0xE2, 0xF2, 0xE3, 0xF3,
- 0x84, 0x94, 0x85, 0x95, 0xA4, 0xB4, 0xA5, 0xB5,
- 0x86, 0x96, 0x87, 0x97, 0xA6, 0xB6, 0xA7, 0xB7,
- 0xC4, 0xD4, 0xC5, 0xD5, 0xE4, 0xF4, 0xE5, 0xF5,
- 0xC6, 0xD6, 0xC7, 0xD7, 0xE6, 0xF6, 0xE7, 0xF7,
- 0x08, 0x18, 0x09, 0x19, 0x28, 0x38, 0x29, 0x39,
- 0x0A, 0x1A, 0x0B, 0x1B, 0x2A, 0x3A, 0x2B, 0x3B,
- 0x48, 0x58, 0x49, 0x59, 0x68, 0x78, 0x69, 0x79,
- 0x4A, 0x5A, 0x4B, 0x5B, 0x6A, 0x7A, 0x6B, 0x7B,
- 0x0C, 0x1C, 0x0D, 0x1D, 0x2C, 0x3C, 0x2D, 0x3D,
- 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
- 0x4C, 0x5C, 0x4D, 0x5D, 0x6C, 0x7C, 0x6D, 0x7D,
- 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
- 0x88, 0x98, 0x89, 0x99, 0xA8, 0xB8, 0xA9, 0xB9,
- 0x8A, 0x9A, 0x8B, 0x9B, 0xAA, 0xBA, 0xAB, 0xBB,
- 0xC8, 0xD8, 0xC9, 0xD9, 0xE8, 0xF8, 0xE9, 0xF9,
- 0xCA, 0xDA, 0xCB, 0xDB, 0xEA, 0xFA, 0xEB, 0xFB,
- 0x8C, 0x9C, 0x8D, 0x9D, 0xAC, 0xBC, 0xAD, 0xBD,
- 0x8E, 0x9E, 0x8F, 0x9F, 0xAE, 0xBE, 0xAF, 0xBF,
- 0xCC, 0xDC, 0xCD, 0xDD, 0xEC, 0xFC, 0xED, 0xFD,
- 0xCE, 0xDE, 0xCF, 0xDF, 0xEE, 0xFE, 0xEF, 0xFF
- );
-
- /**
- * Inverse IP mapping helper table.
- * Indexing this table with a byte value reverses the bit order.
- *
- * @var Array
- * @access private
- */
- var $invipmap = array(
- 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
- 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
- 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
- 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
- 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
- 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
- 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
- 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
- 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
- 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
- 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
- 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
- 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
- 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
- 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
- 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
- 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
- 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
- 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
- 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
- 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
- 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
- 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
- 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
- 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
- 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
- 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
- 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
- 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
- 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
- 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
- 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
- );
-
- /**
- * Pre-permuted S-box1
- *
- * Each box ($sbox1-$sbox8) has been vectorized, then each value pre-permuted using the
- * P table: concatenation can then be replaced by exclusive ORs.
- *
- * @var Array
- * @access private
- */
- var $sbox1 = array(
- 0x00808200, 0x00000000, 0x00008000, 0x00808202,
- 0x00808002, 0x00008202, 0x00000002, 0x00008000,
- 0x00000200, 0x00808200, 0x00808202, 0x00000200,
- 0x00800202, 0x00808002, 0x00800000, 0x00000002,
- 0x00000202, 0x00800200, 0x00800200, 0x00008200,
- 0x00008200, 0x00808000, 0x00808000, 0x00800202,
- 0x00008002, 0x00800002, 0x00800002, 0x00008002,
- 0x00000000, 0x00000202, 0x00008202, 0x00800000,
- 0x00008000, 0x00808202, 0x00000002, 0x00808000,
- 0x00808200, 0x00800000, 0x00800000, 0x00000200,
- 0x00808002, 0x00008000, 0x00008200, 0x00800002,
- 0x00000200, 0x00000002, 0x00800202, 0x00008202,
- 0x00808202, 0x00008002, 0x00808000, 0x00800202,
- 0x00800002, 0x00000202, 0x00008202, 0x00808200,
- 0x00000202, 0x00800200, 0x00800200, 0x00000000,
- 0x00008002, 0x00008200, 0x00000000, 0x00808002
- );
-
- /**
- * Pre-permuted S-box2
- *
- * @var Array
- * @access private
- */
- var $sbox2 = array(
- 0x40084010, 0x40004000, 0x00004000, 0x00084010,
- 0x00080000, 0x00000010, 0x40080010, 0x40004010,
- 0x40000010, 0x40084010, 0x40084000, 0x40000000,
- 0x40004000, 0x00080000, 0x00000010, 0x40080010,
- 0x00084000, 0x00080010, 0x40004010, 0x00000000,
- 0x40000000, 0x00004000, 0x00084010, 0x40080000,
- 0x00080010, 0x40000010, 0x00000000, 0x00084000,
- 0x00004010, 0x40084000, 0x40080000, 0x00004010,
- 0x00000000, 0x00084010, 0x40080010, 0x00080000,
- 0x40004010, 0x40080000, 0x40084000, 0x00004000,
- 0x40080000, 0x40004000, 0x00000010, 0x40084010,
- 0x00084010, 0x00000010, 0x00004000, 0x40000000,
- 0x00004010, 0x40084000, 0x00080000, 0x40000010,
- 0x00080010, 0x40004010, 0x40000010, 0x00080010,
- 0x00084000, 0x00000000, 0x40004000, 0x00004010,
- 0x40000000, 0x40080010, 0x40084010, 0x00084000
- );
-
- /**
- * Pre-permuted S-box3
- *
- * @var Array
- * @access private
- */
- var $sbox3 = array(
- 0x00000104, 0x04010100, 0x00000000, 0x04010004,
- 0x04000100, 0x00000000, 0x00010104, 0x04000100,
- 0x00010004, 0x04000004, 0x04000004, 0x00010000,
- 0x04010104, 0x00010004, 0x04010000, 0x00000104,
- 0x04000000, 0x00000004, 0x04010100, 0x00000100,
- 0x00010100, 0x04010000, 0x04010004, 0x00010104,
- 0x04000104, 0x00010100, 0x00010000, 0x04000104,
- 0x00000004, 0x04010104, 0x00000100, 0x04000000,
- 0x04010100, 0x04000000, 0x00010004, 0x00000104,
- 0x00010000, 0x04010100, 0x04000100, 0x00000000,
- 0x00000100, 0x00010004, 0x04010104, 0x04000100,
- 0x04000004, 0x00000100, 0x00000000, 0x04010004,
- 0x04000104, 0x00010000, 0x04000000, 0x04010104,
- 0x00000004, 0x00010104, 0x00010100, 0x04000004,
- 0x04010000, 0x04000104, 0x00000104, 0x04010000,
- 0x00010104, 0x00000004, 0x04010004, 0x00010100
- );
-
- /**
- * Pre-permuted S-box4
- *
- * @var Array
- * @access private
- */
- var $sbox4 = array(
- 0x80401000, 0x80001040, 0x80001040, 0x00000040,
- 0x00401040, 0x80400040, 0x80400000, 0x80001000,
- 0x00000000, 0x00401000, 0x00401000, 0x80401040,
- 0x80000040, 0x00000000, 0x00400040, 0x80400000,
- 0x80000000, 0x00001000, 0x00400000, 0x80401000,
- 0x00000040, 0x00400000, 0x80001000, 0x00001040,
- 0x80400040, 0x80000000, 0x00001040, 0x00400040,
- 0x00001000, 0x00401040, 0x80401040, 0x80000040,
- 0x00400040, 0x80400000, 0x00401000, 0x80401040,
- 0x80000040, 0x00000000, 0x00000000, 0x00401000,
- 0x00001040, 0x00400040, 0x80400040, 0x80000000,
- 0x80401000, 0x80001040, 0x80001040, 0x00000040,
- 0x80401040, 0x80000040, 0x80000000, 0x00001000,
- 0x80400000, 0x80001000, 0x00401040, 0x80400040,
- 0x80001000, 0x00001040, 0x00400000, 0x80401000,
- 0x00000040, 0x00400000, 0x00001000, 0x00401040
- );
-
- /**
- * Pre-permuted S-box5
- *
- * @var Array
- * @access private
- */
- var $sbox5 = array(
- 0x00000080, 0x01040080, 0x01040000, 0x21000080,
- 0x00040000, 0x00000080, 0x20000000, 0x01040000,
- 0x20040080, 0x00040000, 0x01000080, 0x20040080,
- 0x21000080, 0x21040000, 0x00040080, 0x20000000,
- 0x01000000, 0x20040000, 0x20040000, 0x00000000,
- 0x20000080, 0x21040080, 0x21040080, 0x01000080,
- 0x21040000, 0x20000080, 0x00000000, 0x21000000,
- 0x01040080, 0x01000000, 0x21000000, 0x00040080,
- 0x00040000, 0x21000080, 0x00000080, 0x01000000,
- 0x20000000, 0x01040000, 0x21000080, 0x20040080,
- 0x01000080, 0x20000000, 0x21040000, 0x01040080,
- 0x20040080, 0x00000080, 0x01000000, 0x21040000,
- 0x21040080, 0x00040080, 0x21000000, 0x21040080,
- 0x01040000, 0x00000000, 0x20040000, 0x21000000,
- 0x00040080, 0x01000080, 0x20000080, 0x00040000,
- 0x00000000, 0x20040000, 0x01040080, 0x20000080
- );
-
- /**
- * Pre-permuted S-box6
- *
- * @var Array
- * @access private
- */
- var $sbox6 = array(
- 0x10000008, 0x10200000, 0x00002000, 0x10202008,
- 0x10200000, 0x00000008, 0x10202008, 0x00200000,
- 0x10002000, 0x00202008, 0x00200000, 0x10000008,
- 0x00200008, 0x10002000, 0x10000000, 0x00002008,
- 0x00000000, 0x00200008, 0x10002008, 0x00002000,
- 0x00202000, 0x10002008, 0x00000008, 0x10200008,
- 0x10200008, 0x00000000, 0x00202008, 0x10202000,
- 0x00002008, 0x00202000, 0x10202000, 0x10000000,
- 0x10002000, 0x00000008, 0x10200008, 0x00202000,
- 0x10202008, 0x00200000, 0x00002008, 0x10000008,
- 0x00200000, 0x10002000, 0x10000000, 0x00002008,
- 0x10000008, 0x10202008, 0x00202000, 0x10200000,
- 0x00202008, 0x10202000, 0x00000000, 0x10200008,
- 0x00000008, 0x00002000, 0x10200000, 0x00202008,
- 0x00002000, 0x00200008, 0x10002008, 0x00000000,
- 0x10202000, 0x10000000, 0x00200008, 0x10002008
- );
-
- /**
- * Pre-permuted S-box7
- *
- * @var Array
- * @access private
- */
- var $sbox7 = array(
- 0x00100000, 0x02100001, 0x02000401, 0x00000000,
- 0x00000400, 0x02000401, 0x00100401, 0x02100400,
- 0x02100401, 0x00100000, 0x00000000, 0x02000001,
- 0x00000001, 0x02000000, 0x02100001, 0x00000401,
- 0x02000400, 0x00100401, 0x00100001, 0x02000400,
- 0x02000001, 0x02100000, 0x02100400, 0x00100001,
- 0x02100000, 0x00000400, 0x00000401, 0x02100401,
- 0x00100400, 0x00000001, 0x02000000, 0x00100400,
- 0x02000000, 0x00100400, 0x00100000, 0x02000401,
- 0x02000401, 0x02100001, 0x02100001, 0x00000001,
- 0x00100001, 0x02000000, 0x02000400, 0x00100000,
- 0x02100400, 0x00000401, 0x00100401, 0x02100400,
- 0x00000401, 0x02000001, 0x02100401, 0x02100000,
- 0x00100400, 0x00000000, 0x00000001, 0x02100401,
- 0x00000000, 0x00100401, 0x02100000, 0x00000400,
- 0x02000001, 0x02000400, 0x00000400, 0x00100001
- );
-
- /**
- * Pre-permuted S-box8
- *
- * @var Array
- * @access private
- */
- var $sbox8 = array(
- 0x08000820, 0x00000800, 0x00020000, 0x08020820,
- 0x08000000, 0x08000820, 0x00000020, 0x08000000,
- 0x00020020, 0x08020000, 0x08020820, 0x00020800,
- 0x08020800, 0x00020820, 0x00000800, 0x00000020,
- 0x08020000, 0x08000020, 0x08000800, 0x00000820,
- 0x00020800, 0x00020020, 0x08020020, 0x08020800,
- 0x00000820, 0x00000000, 0x00000000, 0x08020020,
- 0x08000020, 0x08000800, 0x00020820, 0x00020000,
- 0x00020820, 0x00020000, 0x08020800, 0x00000800,
- 0x00000020, 0x08020020, 0x00000800, 0x00020820,
- 0x08000800, 0x00000020, 0x08000020, 0x08020000,
- 0x08020020, 0x08000000, 0x00020000, 0x08000820,
- 0x00000000, 0x08020820, 0x00020020, 0x08000020,
- 0x08020000, 0x08000800, 0x08000820, 0x00000000,
- 0x08020820, 0x00020800, 0x00020800, 0x00000820,
- 0x00000820, 0x00020020, 0x08000000, 0x08020800
- );
-
- /**
- * Default Constructor.
- *
- * Determines whether or not the mcrypt extension should be used.
- *
- * $mode could be:
- *
- * - CRYPT_DES_MODE_ECB
- *
- * - CRYPT_DES_MODE_CBC
- *
- * - CRYPT_DES_MODE_CTR
- *
- * - CRYPT_DES_MODE_CFB
- *
- * - CRYPT_DES_MODE_OFB
- *
- * If not explictly set, CRYPT_DES_MODE_CBC will be used.
- *
- * @see Crypt_Base::Crypt_Base()
- * @param optional Integer $mode
- * @access public
- */
- function Crypt_DES($mode = CRYPT_DES_MODE_CBC)
- {
- parent::Crypt_Base($mode);
- }
-
- /**
- * Sets the key.
- *
- * Keys can be of any length. DES, itself, uses 64-bit keys (eg. strlen($key) == 8), however, we
- * only use the first eight, if $key has more then eight characters in it, and pad $key with the
- * null byte if it is less then eight characters long.
- *
- * DES also requires that every eighth bit be a parity bit, however, we'll ignore that.
- *
- * If the key is not explicitly set, it'll be assumed to be all zero's.
- *
- * @see Crypt_Base::setKey()
- * @access public
- * @param String $key
- */
- function setKey($key)
- {
- // We check/cut here only up to max length of the key.
- // Key padding to the proper length will be done in _setupKey()
- if (strlen($key) > $this->key_size_max) {
- $key = substr($key, 0, $this->key_size_max);
- }
-
- // Sets the key
- parent::setKey($key);
- }
-
- /**
- * Encrypts a block
- *
- * @see Crypt_Base::_encryptBlock()
- * @see Crypt_Base::encrypt()
- * @see Crypt_DES::encrypt()
- * @access private
- * @param String $in
- * @return String
- */
- function _encryptBlock($in)
- {
- return $this->_processBlock($in, CRYPT_DES_ENCRYPT);
- }
-
- /**
- * Decrypts a block
- *
- * @see Crypt_Base::_decryptBlock()
- * @see Crypt_Base::decrypt()
- * @see Crypt_DES::decrypt()
- * @access private
- * @param String $in
- * @return String
- */
- function _decryptBlock($in)
- {
- return $this->_processBlock($in, CRYPT_DES_DECRYPT);
- }
-
- /**
- * Encrypts or decrypts a 64-bit block
- *
- * $mode should be either CRYPT_DES_ENCRYPT or CRYPT_DES_DECRYPT. See
- * {@link http://en.wikipedia.org/wiki/Image:Feistel.png Feistel.png} to get a general
- * idea of what this function does.
- *
- * @see Crypt_DES::_encryptBlock()
- * @see Crypt_DES::_decryptBlock()
- * @access private
- * @param String $block
- * @param Integer $mode
- * @return String
- */
- function _processBlock($block, $mode)
- {
- static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip;
- if (!$sbox1) {
- $sbox1 = array_map("intval", $this->sbox1);
- $sbox2 = array_map("intval", $this->sbox2);
- $sbox3 = array_map("intval", $this->sbox3);
- $sbox4 = array_map("intval", $this->sbox4);
- $sbox5 = array_map("intval", $this->sbox5);
- $sbox6 = array_map("intval", $this->sbox6);
- $sbox7 = array_map("intval", $this->sbox7);
- $sbox8 = array_map("intval", $this->sbox8);
- /* Merge $shuffle with $[inv]ipmap */
- for ($i = 0; $i < 256; ++$i) {
- $shuffleip[] = $this->shuffle[$this->ipmap[$i]];
- $shuffleinvip[] = $this->shuffle[$this->invipmap[$i]];
- }
- }
-
- $keys = $this->keys[$mode];
- $ki = -1;
-
- // Do the initial IP permutation.
- $t = unpack('Nl/Nr', $block);
- list($l, $r) = array($t['l'], $t['r']);
- $block = ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") |
- ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") |
- ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") |
- ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") |
- ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") |
- ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") |
- ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") |
- ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01");
-
- // Extract L0 and R0.
- $t = unpack('Nl/Nr', $block);
- list($l, $r) = array($t['l'], $t['r']);
-
- for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) {
- // Perform the 16 steps.
- for ($i = 0; $i < 16; $i++) {
- // start of "the Feistel (F) function" - see the following URL:
- // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png
- // Merge key schedule.
- $b1 = (($r >> 3) & 0x1FFFFFFF) ^ ($r << 29) ^ $keys[++$ki];
- $b2 = (($r >> 31) & 0x00000001) ^ ($r << 1) ^ $keys[++$ki];
-
- // S-box indexing.
- $t = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^
- $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^
- $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^
- $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ $l;
- // end of "the Feistel (F) function"
-
- $l = $r;
- $r = $t;
- }
-
- // Last step should not permute L & R.
- $t = $l;
- $l = $r;
- $r = $t;
- }
-
- // Perform the inverse IP permutation.
- return ($shuffleinvip[($r >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") |
- ($shuffleinvip[($l >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") |
- ($shuffleinvip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") |
- ($shuffleinvip[($l >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") |
- ($shuffleinvip[($r >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") |
- ($shuffleinvip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") |
- ($shuffleinvip[ $r & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") |
- ($shuffleinvip[ $l & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01");
- }
-
- /**
- * Creates the key schedule
- *
- * @see Crypt_Base::_setupKey()
- * @access private
- */
- function _setupKey()
- {
- if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->des_rounds === $this->kl['des_rounds']) {
- // already expanded
- return;
- }
- $this->kl = array('key' => $this->key, 'des_rounds' => $this->des_rounds);
-
- static $shifts = array( // number of key bits shifted per round
- 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
- );
-
- static $pc1map = array(
- 0x00, 0x00, 0x08, 0x08, 0x04, 0x04, 0x0C, 0x0C,
- 0x02, 0x02, 0x0A, 0x0A, 0x06, 0x06, 0x0E, 0x0E,
- 0x10, 0x10, 0x18, 0x18, 0x14, 0x14, 0x1C, 0x1C,
- 0x12, 0x12, 0x1A, 0x1A, 0x16, 0x16, 0x1E, 0x1E,
- 0x20, 0x20, 0x28, 0x28, 0x24, 0x24, 0x2C, 0x2C,
- 0x22, 0x22, 0x2A, 0x2A, 0x26, 0x26, 0x2E, 0x2E,
- 0x30, 0x30, 0x38, 0x38, 0x34, 0x34, 0x3C, 0x3C,
- 0x32, 0x32, 0x3A, 0x3A, 0x36, 0x36, 0x3E, 0x3E,
- 0x40, 0x40, 0x48, 0x48, 0x44, 0x44, 0x4C, 0x4C,
- 0x42, 0x42, 0x4A, 0x4A, 0x46, 0x46, 0x4E, 0x4E,
- 0x50, 0x50, 0x58, 0x58, 0x54, 0x54, 0x5C, 0x5C,
- 0x52, 0x52, 0x5A, 0x5A, 0x56, 0x56, 0x5E, 0x5E,
- 0x60, 0x60, 0x68, 0x68, 0x64, 0x64, 0x6C, 0x6C,
- 0x62, 0x62, 0x6A, 0x6A, 0x66, 0x66, 0x6E, 0x6E,
- 0x70, 0x70, 0x78, 0x78, 0x74, 0x74, 0x7C, 0x7C,
- 0x72, 0x72, 0x7A, 0x7A, 0x76, 0x76, 0x7E, 0x7E,
- 0x80, 0x80, 0x88, 0x88, 0x84, 0x84, 0x8C, 0x8C,
- 0x82, 0x82, 0x8A, 0x8A, 0x86, 0x86, 0x8E, 0x8E,
- 0x90, 0x90, 0x98, 0x98, 0x94, 0x94, 0x9C, 0x9C,
- 0x92, 0x92, 0x9A, 0x9A, 0x96, 0x96, 0x9E, 0x9E,
- 0xA0, 0xA0, 0xA8, 0xA8, 0xA4, 0xA4, 0xAC, 0xAC,
- 0xA2, 0xA2, 0xAA, 0xAA, 0xA6, 0xA6, 0xAE, 0xAE,
- 0xB0, 0xB0, 0xB8, 0xB8, 0xB4, 0xB4, 0xBC, 0xBC,
- 0xB2, 0xB2, 0xBA, 0xBA, 0xB6, 0xB6, 0xBE, 0xBE,
- 0xC0, 0xC0, 0xC8, 0xC8, 0xC4, 0xC4, 0xCC, 0xCC,
- 0xC2, 0xC2, 0xCA, 0xCA, 0xC6, 0xC6, 0xCE, 0xCE,
- 0xD0, 0xD0, 0xD8, 0xD8, 0xD4, 0xD4, 0xDC, 0xDC,
- 0xD2, 0xD2, 0xDA, 0xDA, 0xD6, 0xD6, 0xDE, 0xDE,
- 0xE0, 0xE0, 0xE8, 0xE8, 0xE4, 0xE4, 0xEC, 0xEC,
- 0xE2, 0xE2, 0xEA, 0xEA, 0xE6, 0xE6, 0xEE, 0xEE,
- 0xF0, 0xF0, 0xF8, 0xF8, 0xF4, 0xF4, 0xFC, 0xFC,
- 0xF2, 0xF2, 0xFA, 0xFA, 0xF6, 0xF6, 0xFE, 0xFE
- );
-
- // Mapping tables for the PC-2 transformation.
- static $pc2mapc1 = array(
- 0x00000000, 0x00000400, 0x00200000, 0x00200400,
- 0x00000001, 0x00000401, 0x00200001, 0x00200401,
- 0x02000000, 0x02000400, 0x02200000, 0x02200400,
- 0x02000001, 0x02000401, 0x02200001, 0x02200401
- );
- static $pc2mapc2 = array(
- 0x00000000, 0x00000800, 0x08000000, 0x08000800,
- 0x00010000, 0x00010800, 0x08010000, 0x08010800,
- 0x00000000, 0x00000800, 0x08000000, 0x08000800,
- 0x00010000, 0x00010800, 0x08010000, 0x08010800,
- 0x00000100, 0x00000900, 0x08000100, 0x08000900,
- 0x00010100, 0x00010900, 0x08010100, 0x08010900,
- 0x00000100, 0x00000900, 0x08000100, 0x08000900,
- 0x00010100, 0x00010900, 0x08010100, 0x08010900,
- 0x00000010, 0x00000810, 0x08000010, 0x08000810,
- 0x00010010, 0x00010810, 0x08010010, 0x08010810,
- 0x00000010, 0x00000810, 0x08000010, 0x08000810,
- 0x00010010, 0x00010810, 0x08010010, 0x08010810,
- 0x00000110, 0x00000910, 0x08000110, 0x08000910,
- 0x00010110, 0x00010910, 0x08010110, 0x08010910,
- 0x00000110, 0x00000910, 0x08000110, 0x08000910,
- 0x00010110, 0x00010910, 0x08010110, 0x08010910,
- 0x00040000, 0x00040800, 0x08040000, 0x08040800,
- 0x00050000, 0x00050800, 0x08050000, 0x08050800,
- 0x00040000, 0x00040800, 0x08040000, 0x08040800,
- 0x00050000, 0x00050800, 0x08050000, 0x08050800,
- 0x00040100, 0x00040900, 0x08040100, 0x08040900,
- 0x00050100, 0x00050900, 0x08050100, 0x08050900,
- 0x00040100, 0x00040900, 0x08040100, 0x08040900,
- 0x00050100, 0x00050900, 0x08050100, 0x08050900,
- 0x00040010, 0x00040810, 0x08040010, 0x08040810,
- 0x00050010, 0x00050810, 0x08050010, 0x08050810,
- 0x00040010, 0x00040810, 0x08040010, 0x08040810,
- 0x00050010, 0x00050810, 0x08050010, 0x08050810,
- 0x00040110, 0x00040910, 0x08040110, 0x08040910,
- 0x00050110, 0x00050910, 0x08050110, 0x08050910,
- 0x00040110, 0x00040910, 0x08040110, 0x08040910,
- 0x00050110, 0x00050910, 0x08050110, 0x08050910,
- 0x01000000, 0x01000800, 0x09000000, 0x09000800,
- 0x01010000, 0x01010800, 0x09010000, 0x09010800,
- 0x01000000, 0x01000800, 0x09000000, 0x09000800,
- 0x01010000, 0x01010800, 0x09010000, 0x09010800,
- 0x01000100, 0x01000900, 0x09000100, 0x09000900,
- 0x01010100, 0x01010900, 0x09010100, 0x09010900,
- 0x01000100, 0x01000900, 0x09000100, 0x09000900,
- 0x01010100, 0x01010900, 0x09010100, 0x09010900,
- 0x01000010, 0x01000810, 0x09000010, 0x09000810,
- 0x01010010, 0x01010810, 0x09010010, 0x09010810,
- 0x01000010, 0x01000810, 0x09000010, 0x09000810,
- 0x01010010, 0x01010810, 0x09010010, 0x09010810,
- 0x01000110, 0x01000910, 0x09000110, 0x09000910,
- 0x01010110, 0x01010910, 0x09010110, 0x09010910,
- 0x01000110, 0x01000910, 0x09000110, 0x09000910,
- 0x01010110, 0x01010910, 0x09010110, 0x09010910,
- 0x01040000, 0x01040800, 0x09040000, 0x09040800,
- 0x01050000, 0x01050800, 0x09050000, 0x09050800,
- 0x01040000, 0x01040800, 0x09040000, 0x09040800,
- 0x01050000, 0x01050800, 0x09050000, 0x09050800,
- 0x01040100, 0x01040900, 0x09040100, 0x09040900,
- 0x01050100, 0x01050900, 0x09050100, 0x09050900,
- 0x01040100, 0x01040900, 0x09040100, 0x09040900,
- 0x01050100, 0x01050900, 0x09050100, 0x09050900,
- 0x01040010, 0x01040810, 0x09040010, 0x09040810,
- 0x01050010, 0x01050810, 0x09050010, 0x09050810,
- 0x01040010, 0x01040810, 0x09040010, 0x09040810,
- 0x01050010, 0x01050810, 0x09050010, 0x09050810,
- 0x01040110, 0x01040910, 0x09040110, 0x09040910,
- 0x01050110, 0x01050910, 0x09050110, 0x09050910,
- 0x01040110, 0x01040910, 0x09040110, 0x09040910,
- 0x01050110, 0x01050910, 0x09050110, 0x09050910
- );
- static $pc2mapc3 = array(
- 0x00000000, 0x00000004, 0x00001000, 0x00001004,
- 0x00000000, 0x00000004, 0x00001000, 0x00001004,
- 0x10000000, 0x10000004, 0x10001000, 0x10001004,
- 0x10000000, 0x10000004, 0x10001000, 0x10001004,
- 0x00000020, 0x00000024, 0x00001020, 0x00001024,
- 0x00000020, 0x00000024, 0x00001020, 0x00001024,
- 0x10000020, 0x10000024, 0x10001020, 0x10001024,
- 0x10000020, 0x10000024, 0x10001020, 0x10001024,
- 0x00080000, 0x00080004, 0x00081000, 0x00081004,
- 0x00080000, 0x00080004, 0x00081000, 0x00081004,
- 0x10080000, 0x10080004, 0x10081000, 0x10081004,
- 0x10080000, 0x10080004, 0x10081000, 0x10081004,
- 0x00080020, 0x00080024, 0x00081020, 0x00081024,
- 0x00080020, 0x00080024, 0x00081020, 0x00081024,
- 0x10080020, 0x10080024, 0x10081020, 0x10081024,
- 0x10080020, 0x10080024, 0x10081020, 0x10081024,
- 0x20000000, 0x20000004, 0x20001000, 0x20001004,
- 0x20000000, 0x20000004, 0x20001000, 0x20001004,
- 0x30000000, 0x30000004, 0x30001000, 0x30001004,
- 0x30000000, 0x30000004, 0x30001000, 0x30001004,
- 0x20000020, 0x20000024, 0x20001020, 0x20001024,
- 0x20000020, 0x20000024, 0x20001020, 0x20001024,
- 0x30000020, 0x30000024, 0x30001020, 0x30001024,
- 0x30000020, 0x30000024, 0x30001020, 0x30001024,
- 0x20080000, 0x20080004, 0x20081000, 0x20081004,
- 0x20080000, 0x20080004, 0x20081000, 0x20081004,
- 0x30080000, 0x30080004, 0x30081000, 0x30081004,
- 0x30080000, 0x30080004, 0x30081000, 0x30081004,
- 0x20080020, 0x20080024, 0x20081020, 0x20081024,
- 0x20080020, 0x20080024, 0x20081020, 0x20081024,
- 0x30080020, 0x30080024, 0x30081020, 0x30081024,
- 0x30080020, 0x30080024, 0x30081020, 0x30081024,
- 0x00000002, 0x00000006, 0x00001002, 0x00001006,
- 0x00000002, 0x00000006, 0x00001002, 0x00001006,
- 0x10000002, 0x10000006, 0x10001002, 0x10001006,
- 0x10000002, 0x10000006, 0x10001002, 0x10001006,
- 0x00000022, 0x00000026, 0x00001022, 0x00001026,
- 0x00000022, 0x00000026, 0x00001022, 0x00001026,
- 0x10000022, 0x10000026, 0x10001022, 0x10001026,
- 0x10000022, 0x10000026, 0x10001022, 0x10001026,
- 0x00080002, 0x00080006, 0x00081002, 0x00081006,
- 0x00080002, 0x00080006, 0x00081002, 0x00081006,
- 0x10080002, 0x10080006, 0x10081002, 0x10081006,
- 0x10080002, 0x10080006, 0x10081002, 0x10081006,
- 0x00080022, 0x00080026, 0x00081022, 0x00081026,
- 0x00080022, 0x00080026, 0x00081022, 0x00081026,
- 0x10080022, 0x10080026, 0x10081022, 0x10081026,
- 0x10080022, 0x10080026, 0x10081022, 0x10081026,
- 0x20000002, 0x20000006, 0x20001002, 0x20001006,
- 0x20000002, 0x20000006, 0x20001002, 0x20001006,
- 0x30000002, 0x30000006, 0x30001002, 0x30001006,
- 0x30000002, 0x30000006, 0x30001002, 0x30001006,
- 0x20000022, 0x20000026, 0x20001022, 0x20001026,
- 0x20000022, 0x20000026, 0x20001022, 0x20001026,
- 0x30000022, 0x30000026, 0x30001022, 0x30001026,
- 0x30000022, 0x30000026, 0x30001022, 0x30001026,
- 0x20080002, 0x20080006, 0x20081002, 0x20081006,
- 0x20080002, 0x20080006, 0x20081002, 0x20081006,
- 0x30080002, 0x30080006, 0x30081002, 0x30081006,
- 0x30080002, 0x30080006, 0x30081002, 0x30081006,
- 0x20080022, 0x20080026, 0x20081022, 0x20081026,
- 0x20080022, 0x20080026, 0x20081022, 0x20081026,
- 0x30080022, 0x30080026, 0x30081022, 0x30081026,
- 0x30080022, 0x30080026, 0x30081022, 0x30081026
- );
- static $pc2mapc4 = array(
- 0x00000000, 0x00100000, 0x00000008, 0x00100008,
- 0x00000200, 0x00100200, 0x00000208, 0x00100208,
- 0x00000000, 0x00100000, 0x00000008, 0x00100008,
- 0x00000200, 0x00100200, 0x00000208, 0x00100208,
- 0x04000000, 0x04100000, 0x04000008, 0x04100008,
- 0x04000200, 0x04100200, 0x04000208, 0x04100208,
- 0x04000000, 0x04100000, 0x04000008, 0x04100008,
- 0x04000200, 0x04100200, 0x04000208, 0x04100208,
- 0x00002000, 0x00102000, 0x00002008, 0x00102008,
- 0x00002200, 0x00102200, 0x00002208, 0x00102208,
- 0x00002000, 0x00102000, 0x00002008, 0x00102008,
- 0x00002200, 0x00102200, 0x00002208, 0x00102208,
- 0x04002000, 0x04102000, 0x04002008, 0x04102008,
- 0x04002200, 0x04102200, 0x04002208, 0x04102208,
- 0x04002000, 0x04102000, 0x04002008, 0x04102008,
- 0x04002200, 0x04102200, 0x04002208, 0x04102208,
- 0x00000000, 0x00100000, 0x00000008, 0x00100008,
- 0x00000200, 0x00100200, 0x00000208, 0x00100208,
- 0x00000000, 0x00100000, 0x00000008, 0x00100008,
- 0x00000200, 0x00100200, 0x00000208, 0x00100208,
- 0x04000000, 0x04100000, 0x04000008, 0x04100008,
- 0x04000200, 0x04100200, 0x04000208, 0x04100208,
- 0x04000000, 0x04100000, 0x04000008, 0x04100008,
- 0x04000200, 0x04100200, 0x04000208, 0x04100208,
- 0x00002000, 0x00102000, 0x00002008, 0x00102008,
- 0x00002200, 0x00102200, 0x00002208, 0x00102208,
- 0x00002000, 0x00102000, 0x00002008, 0x00102008,
- 0x00002200, 0x00102200, 0x00002208, 0x00102208,
- 0x04002000, 0x04102000, 0x04002008, 0x04102008,
- 0x04002200, 0x04102200, 0x04002208, 0x04102208,
- 0x04002000, 0x04102000, 0x04002008, 0x04102008,
- 0x04002200, 0x04102200, 0x04002208, 0x04102208,
- 0x00020000, 0x00120000, 0x00020008, 0x00120008,
- 0x00020200, 0x00120200, 0x00020208, 0x00120208,
- 0x00020000, 0x00120000, 0x00020008, 0x00120008,
- 0x00020200, 0x00120200, 0x00020208, 0x00120208,
- 0x04020000, 0x04120000, 0x04020008, 0x04120008,
- 0x04020200, 0x04120200, 0x04020208, 0x04120208,
- 0x04020000, 0x04120000, 0x04020008, 0x04120008,
- 0x04020200, 0x04120200, 0x04020208, 0x04120208,
- 0x00022000, 0x00122000, 0x00022008, 0x00122008,
- 0x00022200, 0x00122200, 0x00022208, 0x00122208,
- 0x00022000, 0x00122000, 0x00022008, 0x00122008,
- 0x00022200, 0x00122200, 0x00022208, 0x00122208,
- 0x04022000, 0x04122000, 0x04022008, 0x04122008,
- 0x04022200, 0x04122200, 0x04022208, 0x04122208,
- 0x04022000, 0x04122000, 0x04022008, 0x04122008,
- 0x04022200, 0x04122200, 0x04022208, 0x04122208,
- 0x00020000, 0x00120000, 0x00020008, 0x00120008,
- 0x00020200, 0x00120200, 0x00020208, 0x00120208,
- 0x00020000, 0x00120000, 0x00020008, 0x00120008,
- 0x00020200, 0x00120200, 0x00020208, 0x00120208,
- 0x04020000, 0x04120000, 0x04020008, 0x04120008,
- 0x04020200, 0x04120200, 0x04020208, 0x04120208,
- 0x04020000, 0x04120000, 0x04020008, 0x04120008,
- 0x04020200, 0x04120200, 0x04020208, 0x04120208,
- 0x00022000, 0x00122000, 0x00022008, 0x00122008,
- 0x00022200, 0x00122200, 0x00022208, 0x00122208,
- 0x00022000, 0x00122000, 0x00022008, 0x00122008,
- 0x00022200, 0x00122200, 0x00022208, 0x00122208,
- 0x04022000, 0x04122000, 0x04022008, 0x04122008,
- 0x04022200, 0x04122200, 0x04022208, 0x04122208,
- 0x04022000, 0x04122000, 0x04022008, 0x04122008,
- 0x04022200, 0x04122200, 0x04022208, 0x04122208
- );
- static $pc2mapd1 = array(
- 0x00000000, 0x00000001, 0x08000000, 0x08000001,
- 0x00200000, 0x00200001, 0x08200000, 0x08200001,
- 0x00000002, 0x00000003, 0x08000002, 0x08000003,
- 0x00200002, 0x00200003, 0x08200002, 0x08200003
- );
- static $pc2mapd2 = array(
- 0x00000000, 0x00100000, 0x00000800, 0x00100800,
- 0x00000000, 0x00100000, 0x00000800, 0x00100800,
- 0x04000000, 0x04100000, 0x04000800, 0x04100800,
- 0x04000000, 0x04100000, 0x04000800, 0x04100800,
- 0x00000004, 0x00100004, 0x00000804, 0x00100804,
- 0x00000004, 0x00100004, 0x00000804, 0x00100804,
- 0x04000004, 0x04100004, 0x04000804, 0x04100804,
- 0x04000004, 0x04100004, 0x04000804, 0x04100804,
- 0x00000000, 0x00100000, 0x00000800, 0x00100800,
- 0x00000000, 0x00100000, 0x00000800, 0x00100800,
- 0x04000000, 0x04100000, 0x04000800, 0x04100800,
- 0x04000000, 0x04100000, 0x04000800, 0x04100800,
- 0x00000004, 0x00100004, 0x00000804, 0x00100804,
- 0x00000004, 0x00100004, 0x00000804, 0x00100804,
- 0x04000004, 0x04100004, 0x04000804, 0x04100804,
- 0x04000004, 0x04100004, 0x04000804, 0x04100804,
- 0x00000200, 0x00100200, 0x00000A00, 0x00100A00,
- 0x00000200, 0x00100200, 0x00000A00, 0x00100A00,
- 0x04000200, 0x04100200, 0x04000A00, 0x04100A00,
- 0x04000200, 0x04100200, 0x04000A00, 0x04100A00,
- 0x00000204, 0x00100204, 0x00000A04, 0x00100A04,
- 0x00000204, 0x00100204, 0x00000A04, 0x00100A04,
- 0x04000204, 0x04100204, 0x04000A04, 0x04100A04,
- 0x04000204, 0x04100204, 0x04000A04, 0x04100A04,
- 0x00000200, 0x00100200, 0x00000A00, 0x00100A00,
- 0x00000200, 0x00100200, 0x00000A00, 0x00100A00,
- 0x04000200, 0x04100200, 0x04000A00, 0x04100A00,
- 0x04000200, 0x04100200, 0x04000A00, 0x04100A00,
- 0x00000204, 0x00100204, 0x00000A04, 0x00100A04,
- 0x00000204, 0x00100204, 0x00000A04, 0x00100A04,
- 0x04000204, 0x04100204, 0x04000A04, 0x04100A04,
- 0x04000204, 0x04100204, 0x04000A04, 0x04100A04,
- 0x00020000, 0x00120000, 0x00020800, 0x00120800,
- 0x00020000, 0x00120000, 0x00020800, 0x00120800,
- 0x04020000, 0x04120000, 0x04020800, 0x04120800,
- 0x04020000, 0x04120000, 0x04020800, 0x04120800,
- 0x00020004, 0x00120004, 0x00020804, 0x00120804,
- 0x00020004, 0x00120004, 0x00020804, 0x00120804,
- 0x04020004, 0x04120004, 0x04020804, 0x04120804,
- 0x04020004, 0x04120004, 0x04020804, 0x04120804,
- 0x00020000, 0x00120000, 0x00020800, 0x00120800,
- 0x00020000, 0x00120000, 0x00020800, 0x00120800,
- 0x04020000, 0x04120000, 0x04020800, 0x04120800,
- 0x04020000, 0x04120000, 0x04020800, 0x04120800,
- 0x00020004, 0x00120004, 0x00020804, 0x00120804,
- 0x00020004, 0x00120004, 0x00020804, 0x00120804,
- 0x04020004, 0x04120004, 0x04020804, 0x04120804,
- 0x04020004, 0x04120004, 0x04020804, 0x04120804,
- 0x00020200, 0x00120200, 0x00020A00, 0x00120A00,
- 0x00020200, 0x00120200, 0x00020A00, 0x00120A00,
- 0x04020200, 0x04120200, 0x04020A00, 0x04120A00,
- 0x04020200, 0x04120200, 0x04020A00, 0x04120A00,
- 0x00020204, 0x00120204, 0x00020A04, 0x00120A04,
- 0x00020204, 0x00120204, 0x00020A04, 0x00120A04,
- 0x04020204, 0x04120204, 0x04020A04, 0x04120A04,
- 0x04020204, 0x04120204, 0x04020A04, 0x04120A04,
- 0x00020200, 0x00120200, 0x00020A00, 0x00120A00,
- 0x00020200, 0x00120200, 0x00020A00, 0x00120A00,
- 0x04020200, 0x04120200, 0x04020A00, 0x04120A00,
- 0x04020200, 0x04120200, 0x04020A00, 0x04120A00,
- 0x00020204, 0x00120204, 0x00020A04, 0x00120A04,
- 0x00020204, 0x00120204, 0x00020A04, 0x00120A04,
- 0x04020204, 0x04120204, 0x04020A04, 0x04120A04,
- 0x04020204, 0x04120204, 0x04020A04, 0x04120A04
- );
- static $pc2mapd3 = array(
- 0x00000000, 0x00010000, 0x02000000, 0x02010000,
- 0x00000020, 0x00010020, 0x02000020, 0x02010020,
- 0x00040000, 0x00050000, 0x02040000, 0x02050000,
- 0x00040020, 0x00050020, 0x02040020, 0x02050020,
- 0x00002000, 0x00012000, 0x02002000, 0x02012000,
- 0x00002020, 0x00012020, 0x02002020, 0x02012020,
- 0x00042000, 0x00052000, 0x02042000, 0x02052000,
- 0x00042020, 0x00052020, 0x02042020, 0x02052020,
- 0x00000000, 0x00010000, 0x02000000, 0x02010000,
- 0x00000020, 0x00010020, 0x02000020, 0x02010020,
- 0x00040000, 0x00050000, 0x02040000, 0x02050000,
- 0x00040020, 0x00050020, 0x02040020, 0x02050020,
- 0x00002000, 0x00012000, 0x02002000, 0x02012000,
- 0x00002020, 0x00012020, 0x02002020, 0x02012020,
- 0x00042000, 0x00052000, 0x02042000, 0x02052000,
- 0x00042020, 0x00052020, 0x02042020, 0x02052020,
- 0x00000010, 0x00010010, 0x02000010, 0x02010010,
- 0x00000030, 0x00010030, 0x02000030, 0x02010030,
- 0x00040010, 0x00050010, 0x02040010, 0x02050010,
- 0x00040030, 0x00050030, 0x02040030, 0x02050030,
- 0x00002010, 0x00012010, 0x02002010, 0x02012010,
- 0x00002030, 0x00012030, 0x02002030, 0x02012030,
- 0x00042010, 0x00052010, 0x02042010, 0x02052010,
- 0x00042030, 0x00052030, 0x02042030, 0x02052030,
- 0x00000010, 0x00010010, 0x02000010, 0x02010010,
- 0x00000030, 0x00010030, 0x02000030, 0x02010030,
- 0x00040010, 0x00050010, 0x02040010, 0x02050010,
- 0x00040030, 0x00050030, 0x02040030, 0x02050030,
- 0x00002010, 0x00012010, 0x02002010, 0x02012010,
- 0x00002030, 0x00012030, 0x02002030, 0x02012030,
- 0x00042010, 0x00052010, 0x02042010, 0x02052010,
- 0x00042030, 0x00052030, 0x02042030, 0x02052030,
- 0x20000000, 0x20010000, 0x22000000, 0x22010000,
- 0x20000020, 0x20010020, 0x22000020, 0x22010020,
- 0x20040000, 0x20050000, 0x22040000, 0x22050000,
- 0x20040020, 0x20050020, 0x22040020, 0x22050020,
- 0x20002000, 0x20012000, 0x22002000, 0x22012000,
- 0x20002020, 0x20012020, 0x22002020, 0x22012020,
- 0x20042000, 0x20052000, 0x22042000, 0x22052000,
- 0x20042020, 0x20052020, 0x22042020, 0x22052020,
- 0x20000000, 0x20010000, 0x22000000, 0x22010000,
- 0x20000020, 0x20010020, 0x22000020, 0x22010020,
- 0x20040000, 0x20050000, 0x22040000, 0x22050000,
- 0x20040020, 0x20050020, 0x22040020, 0x22050020,
- 0x20002000, 0x20012000, 0x22002000, 0x22012000,
- 0x20002020, 0x20012020, 0x22002020, 0x22012020,
- 0x20042000, 0x20052000, 0x22042000, 0x22052000,
- 0x20042020, 0x20052020, 0x22042020, 0x22052020,
- 0x20000010, 0x20010010, 0x22000010, 0x22010010,
- 0x20000030, 0x20010030, 0x22000030, 0x22010030,
- 0x20040010, 0x20050010, 0x22040010, 0x22050010,
- 0x20040030, 0x20050030, 0x22040030, 0x22050030,
- 0x20002010, 0x20012010, 0x22002010, 0x22012010,
- 0x20002030, 0x20012030, 0x22002030, 0x22012030,
- 0x20042010, 0x20052010, 0x22042010, 0x22052010,
- 0x20042030, 0x20052030, 0x22042030, 0x22052030,
- 0x20000010, 0x20010010, 0x22000010, 0x22010010,
- 0x20000030, 0x20010030, 0x22000030, 0x22010030,
- 0x20040010, 0x20050010, 0x22040010, 0x22050010,
- 0x20040030, 0x20050030, 0x22040030, 0x22050030,
- 0x20002010, 0x20012010, 0x22002010, 0x22012010,
- 0x20002030, 0x20012030, 0x22002030, 0x22012030,
- 0x20042010, 0x20052010, 0x22042010, 0x22052010,
- 0x20042030, 0x20052030, 0x22042030, 0x22052030
- );
- static $pc2mapd4 = array(
- 0x00000000, 0x00000400, 0x01000000, 0x01000400,
- 0x00000000, 0x00000400, 0x01000000, 0x01000400,
- 0x00000100, 0x00000500, 0x01000100, 0x01000500,
- 0x00000100, 0x00000500, 0x01000100, 0x01000500,
- 0x10000000, 0x10000400, 0x11000000, 0x11000400,
- 0x10000000, 0x10000400, 0x11000000, 0x11000400,
- 0x10000100, 0x10000500, 0x11000100, 0x11000500,
- 0x10000100, 0x10000500, 0x11000100, 0x11000500,
- 0x00080000, 0x00080400, 0x01080000, 0x01080400,
- 0x00080000, 0x00080400, 0x01080000, 0x01080400,
- 0x00080100, 0x00080500, 0x01080100, 0x01080500,
- 0x00080100, 0x00080500, 0x01080100, 0x01080500,
- 0x10080000, 0x10080400, 0x11080000, 0x11080400,
- 0x10080000, 0x10080400, 0x11080000, 0x11080400,
- 0x10080100, 0x10080500, 0x11080100, 0x11080500,
- 0x10080100, 0x10080500, 0x11080100, 0x11080500,
- 0x00000008, 0x00000408, 0x01000008, 0x01000408,
- 0x00000008, 0x00000408, 0x01000008, 0x01000408,
- 0x00000108, 0x00000508, 0x01000108, 0x01000508,
- 0x00000108, 0x00000508, 0x01000108, 0x01000508,
- 0x10000008, 0x10000408, 0x11000008, 0x11000408,
- 0x10000008, 0x10000408, 0x11000008, 0x11000408,
- 0x10000108, 0x10000508, 0x11000108, 0x11000508,
- 0x10000108, 0x10000508, 0x11000108, 0x11000508,
- 0x00080008, 0x00080408, 0x01080008, 0x01080408,
- 0x00080008, 0x00080408, 0x01080008, 0x01080408,
- 0x00080108, 0x00080508, 0x01080108, 0x01080508,
- 0x00080108, 0x00080508, 0x01080108, 0x01080508,
- 0x10080008, 0x10080408, 0x11080008, 0x11080408,
- 0x10080008, 0x10080408, 0x11080008, 0x11080408,
- 0x10080108, 0x10080508, 0x11080108, 0x11080508,
- 0x10080108, 0x10080508, 0x11080108, 0x11080508,
- 0x00001000, 0x00001400, 0x01001000, 0x01001400,
- 0x00001000, 0x00001400, 0x01001000, 0x01001400,
- 0x00001100, 0x00001500, 0x01001100, 0x01001500,
- 0x00001100, 0x00001500, 0x01001100, 0x01001500,
- 0x10001000, 0x10001400, 0x11001000, 0x11001400,
- 0x10001000, 0x10001400, 0x11001000, 0x11001400,
- 0x10001100, 0x10001500, 0x11001100, 0x11001500,
- 0x10001100, 0x10001500, 0x11001100, 0x11001500,
- 0x00081000, 0x00081400, 0x01081000, 0x01081400,
- 0x00081000, 0x00081400, 0x01081000, 0x01081400,
- 0x00081100, 0x00081500, 0x01081100, 0x01081500,
- 0x00081100, 0x00081500, 0x01081100, 0x01081500,
- 0x10081000, 0x10081400, 0x11081000, 0x11081400,
- 0x10081000, 0x10081400, 0x11081000, 0x11081400,
- 0x10081100, 0x10081500, 0x11081100, 0x11081500,
- 0x10081100, 0x10081500, 0x11081100, 0x11081500,
- 0x00001008, 0x00001408, 0x01001008, 0x01001408,
- 0x00001008, 0x00001408, 0x01001008, 0x01001408,
- 0x00001108, 0x00001508, 0x01001108, 0x01001508,
- 0x00001108, 0x00001508, 0x01001108, 0x01001508,
- 0x10001008, 0x10001408, 0x11001008, 0x11001408,
- 0x10001008, 0x10001408, 0x11001008, 0x11001408,
- 0x10001108, 0x10001508, 0x11001108, 0x11001508,
- 0x10001108, 0x10001508, 0x11001108, 0x11001508,
- 0x00081008, 0x00081408, 0x01081008, 0x01081408,
- 0x00081008, 0x00081408, 0x01081008, 0x01081408,
- 0x00081108, 0x00081508, 0x01081108, 0x01081508,
- 0x00081108, 0x00081508, 0x01081108, 0x01081508,
- 0x10081008, 0x10081408, 0x11081008, 0x11081408,
- 0x10081008, 0x10081408, 0x11081008, 0x11081408,
- 0x10081108, 0x10081508, 0x11081108, 0x11081508,
- 0x10081108, 0x10081508, 0x11081108, 0x11081508
- );
-
- $keys = array();
- for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) {
- // pad the key and remove extra characters as appropriate.
- $key = str_pad(substr($this->key, $des_round * 8, 8), 8, "\0");
-
- // Perform the PC/1 transformation and compute C and D.
- $t = unpack('Nl/Nr', $key);
- list($l, $r) = array($t['l'], $t['r']);
- $key = ($this->shuffle[$pc1map[ $r & 0xFF]] & "\x80\x80\x80\x80\x80\x80\x80\x00") |
- ($this->shuffle[$pc1map[($r >> 8) & 0xFF]] & "\x40\x40\x40\x40\x40\x40\x40\x00") |
- ($this->shuffle[$pc1map[($r >> 16) & 0xFF]] & "\x20\x20\x20\x20\x20\x20\x20\x00") |
- ($this->shuffle[$pc1map[($r >> 24) & 0xFF]] & "\x10\x10\x10\x10\x10\x10\x10\x00") |
- ($this->shuffle[$pc1map[ $l & 0xFF]] & "\x08\x08\x08\x08\x08\x08\x08\x00") |
- ($this->shuffle[$pc1map[($l >> 8) & 0xFF]] & "\x04\x04\x04\x04\x04\x04\x04\x00") |
- ($this->shuffle[$pc1map[($l >> 16) & 0xFF]] & "\x02\x02\x02\x02\x02\x02\x02\x00") |
- ($this->shuffle[$pc1map[($l >> 24) & 0xFF]] & "\x01\x01\x01\x01\x01\x01\x01\x00");
- $key = unpack('Nc/Nd', $key);
- $c = ( $key['c'] >> 4) & 0x0FFFFFFF;
- $d = (($key['d'] >> 4) & 0x0FFFFFF0) | ($key['c'] & 0x0F);
-
- $keys[$des_round] = array(
- CRYPT_DES_ENCRYPT => array(),
- CRYPT_DES_DECRYPT => array_fill(0, 32, 0)
- );
- for ($i = 0, $ki = 31; $i < 16; ++$i, $ki-= 2) {
- $c <<= $shifts[$i];
- $c = ($c | ($c >> 28)) & 0x0FFFFFFF;
- $d <<= $shifts[$i];
- $d = ($d | ($d >> 28)) & 0x0FFFFFFF;
-
- // Perform the PC-2 transformation.
- $cp = $pc2mapc1[ $c >> 24 ] | $pc2mapc2[($c >> 16) & 0xFF] |
- $pc2mapc3[($c >> 8) & 0xFF] | $pc2mapc4[ $c & 0xFF];
- $dp = $pc2mapd1[ $d >> 24 ] | $pc2mapd2[($d >> 16) & 0xFF] |
- $pc2mapd3[($d >> 8) & 0xFF] | $pc2mapd4[ $d & 0xFF];
-
- // Reorder: odd bytes/even bytes. Push the result in key schedule.
- $val1 = ( $cp & 0xFF000000) | (($cp << 8) & 0x00FF0000) |
- (($dp >> 16) & 0x0000FF00) | (($dp >> 8) & 0x000000FF);
- $val2 = (($cp << 8) & 0xFF000000) | (($cp << 16) & 0x00FF0000) |
- (($dp >> 8) & 0x0000FF00) | ( $dp & 0x000000FF);
- $keys[$des_round][CRYPT_DES_ENCRYPT][ ] = $val1;
- $keys[$des_round][CRYPT_DES_DECRYPT][$ki - 1] = $val1;
- $keys[$des_round][CRYPT_DES_ENCRYPT][ ] = $val2;
- $keys[$des_round][CRYPT_DES_DECRYPT][$ki ] = $val2;
- }
- }
-
- switch ($this->des_rounds) {
- case 3: // 3DES keys
- $this->keys = array(
- CRYPT_DES_ENCRYPT => array_merge(
- $keys[0][CRYPT_DES_ENCRYPT],
- $keys[1][CRYPT_DES_DECRYPT],
- $keys[2][CRYPT_DES_ENCRYPT]
- ),
- CRYPT_DES_DECRYPT => array_merge(
- $keys[2][CRYPT_DES_DECRYPT],
- $keys[1][CRYPT_DES_ENCRYPT],
- $keys[0][CRYPT_DES_DECRYPT]
- )
- );
- break;
- // case 1: // DES keys
- default:
- $this->keys = array(
- CRYPT_DES_ENCRYPT => $keys[0][CRYPT_DES_ENCRYPT],
- CRYPT_DES_DECRYPT => $keys[0][CRYPT_DES_DECRYPT]
- );
- }
- }
-
- /**
- * Setup the performance-optimized function for de/encrypt()
- *
- * @see Crypt_Base::_setupInlineCrypt()
- * @access private
- */
- function _setupInlineCrypt()
- {
- $lambda_functions =& Crypt_DES::_getLambdaFunctions();
-
- // Engine configuration for:
- // - DES ($des_rounds == 1) or
- // - 3DES ($des_rounds == 3)
- $des_rounds = $this->des_rounds;
-
- // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function.
- // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one
- $gen_hi_opt_code = (bool)( count($lambda_functions) < 10 );
-
- // Generation of a uniqe hash for our generated code
- switch (true) {
- case $gen_hi_opt_code:
- // For hi-optimized code, we create for each combination of
- // $mode, $des_rounds and $this->key its own encrypt/decrypt function.
- $code_hash = md5(str_pad("Crypt_DES, $des_rounds, {$this->mode}, ", 32, "\0") . $this->key);
- break;
- default:
- // After max 10 hi-optimized functions, we create generic
- // (still very fast.. but not ultra) functions for each $mode/$des_rounds
- // Currently 2 * 5 generic functions will be then max. possible.
- $code_hash = "Crypt_DES, $des_rounds, {$this->mode}";
- }
-
- // Is there a re-usable $lambda_functions in there? If not, we have to create it.
- if (!isset($lambda_functions[$code_hash])) {
- // Init code for both, encrypt and decrypt.
- $init_crypt = 'static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip;
- if (!$sbox1) {
- $sbox1 = array_map("intval", $self->sbox1);
- $sbox2 = array_map("intval", $self->sbox2);
- $sbox3 = array_map("intval", $self->sbox3);
- $sbox4 = array_map("intval", $self->sbox4);
- $sbox5 = array_map("intval", $self->sbox5);
- $sbox6 = array_map("intval", $self->sbox6);
- $sbox7 = array_map("intval", $self->sbox7);
- $sbox8 = array_map("intval", $self->sbox8);'
- /* Merge $shuffle with $[inv]ipmap */ . '
- for ($i = 0; $i < 256; ++$i) {
- $shuffleip[] = $self->shuffle[$self->ipmap[$i]];
- $shuffleinvip[] = $self->shuffle[$self->invipmap[$i]];
- }
- }
- ';
-
- switch (true) {
- case $gen_hi_opt_code:
- // In Hi-optimized code mode, we use our [3]DES key schedule as hardcoded integers.
- // No futher initialisation of the $keys schedule is necessary.
- // That is the extra performance boost.
- $k = array(
- CRYPT_DES_ENCRYPT => $this->keys[CRYPT_DES_ENCRYPT],
- CRYPT_DES_DECRYPT => $this->keys[CRYPT_DES_DECRYPT]
- );
- $init_encrypt = '';
- $init_decrypt = '';
- break;
- default:
- // In generic optimized code mode, we have to use, as the best compromise [currently],
- // our key schedule as $ke/$kd arrays. (with hardcoded indexes...)
- $k = array(
- CRYPT_DES_ENCRYPT => array(),
- CRYPT_DES_DECRYPT => array()
- );
- for ($i = 0, $c = count($this->keys[CRYPT_DES_ENCRYPT]); $i < $c; ++$i) {
- $k[CRYPT_DES_ENCRYPT][$i] = '$ke[' . $i . ']';
- $k[CRYPT_DES_DECRYPT][$i] = '$kd[' . $i . ']';
- }
- $init_encrypt = '$ke = $self->keys[CRYPT_DES_ENCRYPT];';
- $init_decrypt = '$kd = $self->keys[CRYPT_DES_DECRYPT];';
- break;
- }
-
- // Creating code for en- and decryption.
- $crypt_block = array();
- foreach (array(CRYPT_DES_ENCRYPT, CRYPT_DES_DECRYPT) as $c) {
-
- /* Do the initial IP permutation. */
- $crypt_block[$c] = '
- $in = unpack("N*", $in);
- $l = $in[1];
- $r = $in[2];
- $in = unpack("N*",
- ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") |
- ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") |
- ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") |
- ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") |
- ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") |
- ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") |
- ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") |
- ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01")
- );
- ' . /* Extract L0 and R0 */ '
- $l = $in[1];
- $r = $in[2];
- ';
-
- $l = '$l';
- $r = '$r';
-
- // Perform DES or 3DES.
- for ($ki = -1, $des_round = 0; $des_round < $des_rounds; ++$des_round) {
- // Perform the 16 steps.
- for ($i = 0; $i < 16; ++$i) {
- // start of "the Feistel (F) function" - see the following URL:
- // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png
- // Merge key schedule.
- $crypt_block[$c].= '
- $b1 = ((' . $r . ' >> 3) & 0x1FFFFFFF) ^ (' . $r . ' << 29) ^ ' . $k[$c][++$ki] . ';
- $b2 = ((' . $r . ' >> 31) & 0x00000001) ^ (' . $r . ' << 1) ^ ' . $k[$c][++$ki] . ';' .
- /* S-box indexing. */
- $l . ' = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^
- $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^
- $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^
- $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ ' . $l . ';
- ';
- // end of "the Feistel (F) function"
-
- // swap L & R
- list($l, $r) = array($r, $l);
- }
- list($l, $r) = array($r, $l);
- }
-
- // Perform the inverse IP permutation.
- $crypt_block[$c].= '$in =
- ($shuffleinvip[($l >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") |
- ($shuffleinvip[($r >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") |
- ($shuffleinvip[($l >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") |
- ($shuffleinvip[($r >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") |
- ($shuffleinvip[($l >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") |
- ($shuffleinvip[($r >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") |
- ($shuffleinvip[ $l & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") |
- ($shuffleinvip[ $r & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01");
- ';
- }
-
- // Creates the inline-crypt function
- $lambda_functions[$code_hash] = $this->_createInlineCryptFunction(
- array(
- 'init_crypt' => $init_crypt,
- 'init_encrypt' => $init_encrypt,
- 'init_decrypt' => $init_decrypt,
- 'encrypt_block' => $crypt_block[CRYPT_DES_ENCRYPT],
- 'decrypt_block' => $crypt_block[CRYPT_DES_DECRYPT]
- )
- );
- }
-
- // Set the inline-crypt function as callback in: $this->inline_crypt
- $this->inline_crypt = $lambda_functions[$code_hash];
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Hash.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Hash.php
deleted file mode 100644
index b156169d68b5d21e640a07e5748a499ac928158b..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Hash.php
+++ /dev/null
@@ -1,845 +0,0 @@
-
- * setKey('abcdefg');
- *
- * echo base64_encode($hash->hash('abcdefg'));
- * ?>
- *
- *
- * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @category Crypt
- * @package Crypt_Hash
- * @author Jim Wigginton
- * @copyright MMVII Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- */
-
-/**#@+
- * @access private
- * @see Crypt_Hash::Crypt_Hash()
- */
-/**
- * Toggles the internal implementation
- */
-define('CRYPT_HASH_MODE_INTERNAL', 1);
-/**
- * Toggles the mhash() implementation, which has been deprecated on PHP 5.3.0+.
- */
-define('CRYPT_HASH_MODE_MHASH', 2);
-/**
- * Toggles the hash() implementation, which works on PHP 5.1.2+.
- */
-define('CRYPT_HASH_MODE_HASH', 3);
-/**#@-*/
-
-/**
- * Pure-PHP implementations of keyed-hash message authentication codes (HMACs) and various cryptographic hashing functions.
- *
- * @package Crypt_Hash
- * @author Jim Wigginton
- * @version 0.1.0
- * @access public
- */
-class Crypt_Hash
-{
- /**
- * Hash Parameter
- *
- * @see Crypt_Hash::setHash()
- * @var Integer
- * @access private
- */
- var $hashParam;
-
- /**
- * Byte-length of compression blocks / key (Internal HMAC)
- *
- * @see Crypt_Hash::setAlgorithm()
- * @var Integer
- * @access private
- */
- var $b;
-
- /**
- * Byte-length of hash output (Internal HMAC)
- *
- * @see Crypt_Hash::setHash()
- * @var Integer
- * @access private
- */
- var $l = false;
-
- /**
- * Hash Algorithm
- *
- * @see Crypt_Hash::setHash()
- * @var String
- * @access private
- */
- var $hash;
-
- /**
- * Key
- *
- * @see Crypt_Hash::setKey()
- * @var String
- * @access private
- */
- var $key = false;
-
- /**
- * Outer XOR (Internal HMAC)
- *
- * @see Crypt_Hash::setKey()
- * @var String
- * @access private
- */
- var $opad;
-
- /**
- * Inner XOR (Internal HMAC)
- *
- * @see Crypt_Hash::setKey()
- * @var String
- * @access private
- */
- var $ipad;
-
- /**
- * Default Constructor.
- *
- * @param optional String $hash
- * @return Crypt_Hash
- * @access public
- */
- function Crypt_Hash($hash = 'sha1')
- {
- if ( !defined('CRYPT_HASH_MODE') ) {
- switch (true) {
- case extension_loaded('hash'):
- define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_HASH);
- break;
- case extension_loaded('mhash'):
- define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_MHASH);
- break;
- default:
- define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_INTERNAL);
- }
- }
-
- $this->setHash($hash);
- }
-
- /**
- * Sets the key for HMACs
- *
- * Keys can be of any length.
- *
- * @access public
- * @param optional String $key
- */
- function setKey($key = false)
- {
- $this->key = $key;
- }
-
- /**
- * Gets the hash function.
- *
- * As set by the constructor or by the setHash() method.
- *
- * @access public
- * @return String
- */
- function getHash()
- {
- return $this->hashParam;
- }
-
- /**
- * Sets the hash function.
- *
- * @access public
- * @param String $hash
- */
- function setHash($hash)
- {
- $this->hashParam = $hash = strtolower($hash);
- switch ($hash) {
- case 'md5-96':
- case 'sha1-96':
- $this->l = 12; // 96 / 8 = 12
- break;
- case 'md2':
- case 'md5':
- $this->l = 16;
- break;
- case 'sha1':
- $this->l = 20;
- break;
- case 'sha256':
- $this->l = 32;
- break;
- case 'sha384':
- $this->l = 48;
- break;
- case 'sha512':
- $this->l = 64;
- }
-
- switch ($hash) {
- case 'md2':
- $mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_HASH && in_array('md2', hash_algos()) ?
- CRYPT_HASH_MODE_HASH : CRYPT_HASH_MODE_INTERNAL;
- break;
- case 'sha384':
- case 'sha512':
- $mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_MHASH ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE;
- break;
- default:
- $mode = CRYPT_HASH_MODE;
- }
-
- switch ( $mode ) {
- case CRYPT_HASH_MODE_MHASH:
- switch ($hash) {
- case 'md5':
- case 'md5-96':
- $this->hash = MHASH_MD5;
- break;
- case 'sha256':
- $this->hash = MHASH_SHA256;
- break;
- case 'sha1':
- case 'sha1-96':
- default:
- $this->hash = MHASH_SHA1;
- }
- return;
- case CRYPT_HASH_MODE_HASH:
- switch ($hash) {
- case 'md5':
- case 'md5-96':
- $this->hash = 'md5';
- return;
- case 'md2':
- case 'sha256':
- case 'sha384':
- case 'sha512':
- $this->hash = $hash;
- return;
- case 'sha1':
- case 'sha1-96':
- default:
- $this->hash = 'sha1';
- }
- return;
- }
-
- switch ($hash) {
- case 'md2':
- $this->b = 16;
- $this->hash = array($this, '_md2');
- break;
- case 'md5':
- case 'md5-96':
- $this->b = 64;
- $this->hash = array($this, '_md5');
- break;
- case 'sha256':
- $this->b = 64;
- $this->hash = array($this, '_sha256');
- break;
- case 'sha384':
- case 'sha512':
- $this->b = 128;
- $this->hash = array($this, '_sha512');
- break;
- case 'sha1':
- case 'sha1-96':
- default:
- $this->b = 64;
- $this->hash = array($this, '_sha1');
- }
-
- $this->ipad = str_repeat(chr(0x36), $this->b);
- $this->opad = str_repeat(chr(0x5C), $this->b);
- }
-
- /**
- * Compute the HMAC.
- *
- * @access public
- * @param String $text
- * @return String
- */
- function hash($text)
- {
- $mode = is_array($this->hash) ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE;
-
- if (!empty($this->key) || is_string($this->key)) {
- switch ( $mode ) {
- case CRYPT_HASH_MODE_MHASH:
- $output = mhash($this->hash, $text, $this->key);
- break;
- case CRYPT_HASH_MODE_HASH:
- $output = hash_hmac($this->hash, $text, $this->key, true);
- break;
- case CRYPT_HASH_MODE_INTERNAL:
- /* "Applications that use keys longer than B bytes will first hash the key using H and then use the
- resultant L byte string as the actual key to HMAC."
-
- -- http://tools.ietf.org/html/rfc2104#section-2 */
- $key = strlen($this->key) > $this->b ? call_user_func($this->hash, $this->key) : $this->key;
-
- $key = str_pad($key, $this->b, chr(0)); // step 1
- $temp = $this->ipad ^ $key; // step 2
- $temp .= $text; // step 3
- $temp = call_user_func($this->hash, $temp); // step 4
- $output = $this->opad ^ $key; // step 5
- $output.= $temp; // step 6
- $output = call_user_func($this->hash, $output); // step 7
- }
- } else {
- switch ( $mode ) {
- case CRYPT_HASH_MODE_MHASH:
- $output = mhash($this->hash, $text);
- break;
- case CRYPT_HASH_MODE_HASH:
- $output = hash($this->hash, $text, true);
- break;
- case CRYPT_HASH_MODE_INTERNAL:
- $output = call_user_func($this->hash, $text);
- }
- }
-
- return substr($output, 0, $this->l);
- }
-
- /**
- * Returns the hash length (in bytes)
- *
- * @access public
- * @return Integer
- */
- function getLength()
- {
- return $this->l;
- }
-
- /**
- * Wrapper for MD5
- *
- * @access private
- * @param String $m
- */
- function _md5($m)
- {
- return pack('H*', md5($m));
- }
-
- /**
- * Wrapper for SHA1
- *
- * @access private
- * @param String $m
- */
- function _sha1($m)
- {
- return pack('H*', sha1($m));
- }
-
- /**
- * Pure-PHP implementation of MD2
- *
- * See {@link http://tools.ietf.org/html/rfc1319 RFC1319}.
- *
- * @access private
- * @param String $m
- */
- function _md2($m)
- {
- static $s = array(
- 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6,
- 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188,
- 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24,
- 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251,
- 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63,
- 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50,
- 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165,
- 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210,
- 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157,
- 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27,
- 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15,
- 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197,
- 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65,
- 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123,
- 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233,
- 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228,
- 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237,
- 31, 26, 219, 153, 141, 51, 159, 17, 131, 20
- );
-
- // Step 1. Append Padding Bytes
- $pad = 16 - (strlen($m) & 0xF);
- $m.= str_repeat(chr($pad), $pad);
-
- $length = strlen($m);
-
- // Step 2. Append Checksum
- $c = str_repeat(chr(0), 16);
- $l = chr(0);
- for ($i = 0; $i < $length; $i+= 16) {
- for ($j = 0; $j < 16; $j++) {
- // RFC1319 incorrectly states that C[j] should be set to S[c xor L]
- //$c[$j] = chr($s[ord($m[$i + $j] ^ $l)]);
- // per , however, C[j] should be set to S[c xor L] xor C[j]
- $c[$j] = chr($s[ord($m[$i + $j] ^ $l)] ^ ord($c[$j]));
- $l = $c[$j];
- }
- }
- $m.= $c;
-
- $length+= 16;
-
- // Step 3. Initialize MD Buffer
- $x = str_repeat(chr(0), 48);
-
- // Step 4. Process Message in 16-Byte Blocks
- for ($i = 0; $i < $length; $i+= 16) {
- for ($j = 0; $j < 16; $j++) {
- $x[$j + 16] = $m[$i + $j];
- $x[$j + 32] = $x[$j + 16] ^ $x[$j];
- }
- $t = chr(0);
- for ($j = 0; $j < 18; $j++) {
- for ($k = 0; $k < 48; $k++) {
- $x[$k] = $t = $x[$k] ^ chr($s[ord($t)]);
- //$t = $x[$k] = $x[$k] ^ chr($s[ord($t)]);
- }
- $t = chr(ord($t) + $j);
- }
- }
-
- // Step 5. Output
- return substr($x, 0, 16);
- }
-
- /**
- * Pure-PHP implementation of SHA256
- *
- * See {@link http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-256_.28a_SHA-2_variant.29_pseudocode SHA-256 (a SHA-2 variant) pseudocode - Wikipedia}.
- *
- * @access private
- * @param String $m
- */
- function _sha256($m)
- {
- if (extension_loaded('suhosin')) {
- return pack('H*', sha256($m));
- }
-
- // Initialize variables
- $hash = array(
- 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
- );
- // Initialize table of round constants
- // (first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311)
- static $k = array(
- 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
- 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
- 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
- 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
- 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
- 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
- 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
- 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
- );
-
- // Pre-processing
- $length = strlen($m);
- // to round to nearest 56 mod 64, we'll add 64 - (length + (64 - 56)) % 64
- $m.= str_repeat(chr(0), 64 - (($length + 8) & 0x3F));
- $m[$length] = chr(0x80);
- // we don't support hashing strings 512MB long
- $m.= pack('N2', 0, $length << 3);
-
- // Process the message in successive 512-bit chunks
- $chunks = str_split($m, 64);
- foreach ($chunks as $chunk) {
- $w = array();
- for ($i = 0; $i < 16; $i++) {
- extract(unpack('Ntemp', $this->_string_shift($chunk, 4)));
- $w[] = $temp;
- }
-
- // Extend the sixteen 32-bit words into sixty-four 32-bit words
- for ($i = 16; $i < 64; $i++) {
- $s0 = $this->_rightRotate($w[$i - 15], 7) ^
- $this->_rightRotate($w[$i - 15], 18) ^
- $this->_rightShift( $w[$i - 15], 3);
- $s1 = $this->_rightRotate($w[$i - 2], 17) ^
- $this->_rightRotate($w[$i - 2], 19) ^
- $this->_rightShift( $w[$i - 2], 10);
- $w[$i] = $this->_add($w[$i - 16], $s0, $w[$i - 7], $s1);
-
- }
-
- // Initialize hash value for this chunk
- list($a, $b, $c, $d, $e, $f, $g, $h) = $hash;
-
- // Main loop
- for ($i = 0; $i < 64; $i++) {
- $s0 = $this->_rightRotate($a, 2) ^
- $this->_rightRotate($a, 13) ^
- $this->_rightRotate($a, 22);
- $maj = ($a & $b) ^
- ($a & $c) ^
- ($b & $c);
- $t2 = $this->_add($s0, $maj);
-
- $s1 = $this->_rightRotate($e, 6) ^
- $this->_rightRotate($e, 11) ^
- $this->_rightRotate($e, 25);
- $ch = ($e & $f) ^
- ($this->_not($e) & $g);
- $t1 = $this->_add($h, $s1, $ch, $k[$i], $w[$i]);
-
- $h = $g;
- $g = $f;
- $f = $e;
- $e = $this->_add($d, $t1);
- $d = $c;
- $c = $b;
- $b = $a;
- $a = $this->_add($t1, $t2);
- }
-
- // Add this chunk's hash to result so far
- $hash = array(
- $this->_add($hash[0], $a),
- $this->_add($hash[1], $b),
- $this->_add($hash[2], $c),
- $this->_add($hash[3], $d),
- $this->_add($hash[4], $e),
- $this->_add($hash[5], $f),
- $this->_add($hash[6], $g),
- $this->_add($hash[7], $h)
- );
- }
-
- // Produce the final hash value (big-endian)
- return pack('N8', $hash[0], $hash[1], $hash[2], $hash[3], $hash[4], $hash[5], $hash[6], $hash[7]);
- }
-
- /**
- * Pure-PHP implementation of SHA384 and SHA512
- *
- * @access private
- * @param String $m
- */
- function _sha512($m)
- {
- if (!class_exists('Math_BigInteger')) {
- include_once 'Math/BigInteger.php';
- }
-
- static $init384, $init512, $k;
-
- if (!isset($k)) {
- // Initialize variables
- $init384 = array( // initial values for SHA384
- 'cbbb9d5dc1059ed8', '629a292a367cd507', '9159015a3070dd17', '152fecd8f70e5939',
- '67332667ffc00b31', '8eb44a8768581511', 'db0c2e0d64f98fa7', '47b5481dbefa4fa4'
- );
- $init512 = array( // initial values for SHA512
- '6a09e667f3bcc908', 'bb67ae8584caa73b', '3c6ef372fe94f82b', 'a54ff53a5f1d36f1',
- '510e527fade682d1', '9b05688c2b3e6c1f', '1f83d9abfb41bd6b', '5be0cd19137e2179'
- );
-
- for ($i = 0; $i < 8; $i++) {
- $init384[$i] = new Math_BigInteger($init384[$i], 16);
- $init384[$i]->setPrecision(64);
- $init512[$i] = new Math_BigInteger($init512[$i], 16);
- $init512[$i]->setPrecision(64);
- }
-
- // Initialize table of round constants
- // (first 64 bits of the fractional parts of the cube roots of the first 80 primes 2..409)
- $k = array(
- '428a2f98d728ae22', '7137449123ef65cd', 'b5c0fbcfec4d3b2f', 'e9b5dba58189dbbc',
- '3956c25bf348b538', '59f111f1b605d019', '923f82a4af194f9b', 'ab1c5ed5da6d8118',
- 'd807aa98a3030242', '12835b0145706fbe', '243185be4ee4b28c', '550c7dc3d5ffb4e2',
- '72be5d74f27b896f', '80deb1fe3b1696b1', '9bdc06a725c71235', 'c19bf174cf692694',
- 'e49b69c19ef14ad2', 'efbe4786384f25e3', '0fc19dc68b8cd5b5', '240ca1cc77ac9c65',
- '2de92c6f592b0275', '4a7484aa6ea6e483', '5cb0a9dcbd41fbd4', '76f988da831153b5',
- '983e5152ee66dfab', 'a831c66d2db43210', 'b00327c898fb213f', 'bf597fc7beef0ee4',
- 'c6e00bf33da88fc2', 'd5a79147930aa725', '06ca6351e003826f', '142929670a0e6e70',
- '27b70a8546d22ffc', '2e1b21385c26c926', '4d2c6dfc5ac42aed', '53380d139d95b3df',
- '650a73548baf63de', '766a0abb3c77b2a8', '81c2c92e47edaee6', '92722c851482353b',
- 'a2bfe8a14cf10364', 'a81a664bbc423001', 'c24b8b70d0f89791', 'c76c51a30654be30',
- 'd192e819d6ef5218', 'd69906245565a910', 'f40e35855771202a', '106aa07032bbd1b8',
- '19a4c116b8d2d0c8', '1e376c085141ab53', '2748774cdf8eeb99', '34b0bcb5e19b48a8',
- '391c0cb3c5c95a63', '4ed8aa4ae3418acb', '5b9cca4f7763e373', '682e6ff3d6b2b8a3',
- '748f82ee5defb2fc', '78a5636f43172f60', '84c87814a1f0ab72', '8cc702081a6439ec',
- '90befffa23631e28', 'a4506cebde82bde9', 'bef9a3f7b2c67915', 'c67178f2e372532b',
- 'ca273eceea26619c', 'd186b8c721c0c207', 'eada7dd6cde0eb1e', 'f57d4f7fee6ed178',
- '06f067aa72176fba', '0a637dc5a2c898a6', '113f9804bef90dae', '1b710b35131c471b',
- '28db77f523047d84', '32caab7b40c72493', '3c9ebe0a15c9bebc', '431d67c49c100d4c',
- '4cc5d4becb3e42b6', '597f299cfc657e2a', '5fcb6fab3ad6faec', '6c44198c4a475817'
- );
-
- for ($i = 0; $i < 80; $i++) {
- $k[$i] = new Math_BigInteger($k[$i], 16);
- }
- }
-
- $hash = $this->l == 48 ? $init384 : $init512;
-
- // Pre-processing
- $length = strlen($m);
- // to round to nearest 112 mod 128, we'll add 128 - (length + (128 - 112)) % 128
- $m.= str_repeat(chr(0), 128 - (($length + 16) & 0x7F));
- $m[$length] = chr(0x80);
- // we don't support hashing strings 512MB long
- $m.= pack('N4', 0, 0, 0, $length << 3);
-
- // Process the message in successive 1024-bit chunks
- $chunks = str_split($m, 128);
- foreach ($chunks as $chunk) {
- $w = array();
- for ($i = 0; $i < 16; $i++) {
- $temp = new Math_BigInteger($this->_string_shift($chunk, 8), 256);
- $temp->setPrecision(64);
- $w[] = $temp;
- }
-
- // Extend the sixteen 32-bit words into eighty 32-bit words
- for ($i = 16; $i < 80; $i++) {
- $temp = array(
- $w[$i - 15]->bitwise_rightRotate(1),
- $w[$i - 15]->bitwise_rightRotate(8),
- $w[$i - 15]->bitwise_rightShift(7)
- );
- $s0 = $temp[0]->bitwise_xor($temp[1]);
- $s0 = $s0->bitwise_xor($temp[2]);
- $temp = array(
- $w[$i - 2]->bitwise_rightRotate(19),
- $w[$i - 2]->bitwise_rightRotate(61),
- $w[$i - 2]->bitwise_rightShift(6)
- );
- $s1 = $temp[0]->bitwise_xor($temp[1]);
- $s1 = $s1->bitwise_xor($temp[2]);
- $w[$i] = $w[$i - 16]->copy();
- $w[$i] = $w[$i]->add($s0);
- $w[$i] = $w[$i]->add($w[$i - 7]);
- $w[$i] = $w[$i]->add($s1);
- }
-
- // Initialize hash value for this chunk
- $a = $hash[0]->copy();
- $b = $hash[1]->copy();
- $c = $hash[2]->copy();
- $d = $hash[3]->copy();
- $e = $hash[4]->copy();
- $f = $hash[5]->copy();
- $g = $hash[6]->copy();
- $h = $hash[7]->copy();
-
- // Main loop
- for ($i = 0; $i < 80; $i++) {
- $temp = array(
- $a->bitwise_rightRotate(28),
- $a->bitwise_rightRotate(34),
- $a->bitwise_rightRotate(39)
- );
- $s0 = $temp[0]->bitwise_xor($temp[1]);
- $s0 = $s0->bitwise_xor($temp[2]);
- $temp = array(
- $a->bitwise_and($b),
- $a->bitwise_and($c),
- $b->bitwise_and($c)
- );
- $maj = $temp[0]->bitwise_xor($temp[1]);
- $maj = $maj->bitwise_xor($temp[2]);
- $t2 = $s0->add($maj);
-
- $temp = array(
- $e->bitwise_rightRotate(14),
- $e->bitwise_rightRotate(18),
- $e->bitwise_rightRotate(41)
- );
- $s1 = $temp[0]->bitwise_xor($temp[1]);
- $s1 = $s1->bitwise_xor($temp[2]);
- $temp = array(
- $e->bitwise_and($f),
- $g->bitwise_and($e->bitwise_not())
- );
- $ch = $temp[0]->bitwise_xor($temp[1]);
- $t1 = $h->add($s1);
- $t1 = $t1->add($ch);
- $t1 = $t1->add($k[$i]);
- $t1 = $t1->add($w[$i]);
-
- $h = $g->copy();
- $g = $f->copy();
- $f = $e->copy();
- $e = $d->add($t1);
- $d = $c->copy();
- $c = $b->copy();
- $b = $a->copy();
- $a = $t1->add($t2);
- }
-
- // Add this chunk's hash to result so far
- $hash = array(
- $hash[0]->add($a),
- $hash[1]->add($b),
- $hash[2]->add($c),
- $hash[3]->add($d),
- $hash[4]->add($e),
- $hash[5]->add($f),
- $hash[6]->add($g),
- $hash[7]->add($h)
- );
- }
-
- // Produce the final hash value (big-endian)
- // (Crypt_Hash::hash() trims the output for hashes but not for HMACs. as such, we trim the output here)
- $temp = $hash[0]->toBytes() . $hash[1]->toBytes() . $hash[2]->toBytes() . $hash[3]->toBytes() .
- $hash[4]->toBytes() . $hash[5]->toBytes();
- if ($this->l != 48) {
- $temp.= $hash[6]->toBytes() . $hash[7]->toBytes();
- }
-
- return $temp;
- }
-
- /**
- * Right Rotate
- *
- * @access private
- * @param Integer $int
- * @param Integer $amt
- * @see _sha256()
- * @return Integer
- */
- function _rightRotate($int, $amt)
- {
- $invamt = 32 - $amt;
- $mask = (1 << $invamt) - 1;
- return (($int << $invamt) & 0xFFFFFFFF) | (($int >> $amt) & $mask);
- }
-
- /**
- * Right Shift
- *
- * @access private
- * @param Integer $int
- * @param Integer $amt
- * @see _sha256()
- * @return Integer
- */
- function _rightShift($int, $amt)
- {
- $mask = (1 << (32 - $amt)) - 1;
- return ($int >> $amt) & $mask;
- }
-
- /**
- * Not
- *
- * @access private
- * @param Integer $int
- * @see _sha256()
- * @return Integer
- */
- function _not($int)
- {
- return ~$int & 0xFFFFFFFF;
- }
-
- /**
- * Add
- *
- * _sha256() adds multiple unsigned 32-bit integers. Since PHP doesn't support unsigned integers and since the
- * possibility of overflow exists, care has to be taken. Math_BigInteger() could be used but this should be faster.
- *
- * @param Integer $...
- * @return Integer
- * @see _sha256()
- * @access private
- */
- function _add()
- {
- static $mod;
- if (!isset($mod)) {
- $mod = pow(2, 32);
- }
-
- $result = 0;
- $arguments = func_get_args();
- foreach ($arguments as $argument) {
- $result+= $argument < 0 ? ($argument & 0x7FFFFFFF) + 0x80000000 : $argument;
- }
-
- return fmod($result, $mod);
- }
-
- /**
- * String Shift
- *
- * Inspired by array_shift
- *
- * @param String $string
- * @param optional Integer $index
- * @return String
- * @access private
- */
- function _string_shift(&$string, $index = 1)
- {
- $substr = substr($string, 0, $index);
- $string = substr($string, $index);
- return $substr;
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/RC2.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/RC2.php
deleted file mode 100755
index de22d631a162af5be11b1aea07d35ed99239f3cc..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/RC2.php
+++ /dev/null
@@ -1,653 +0,0 @@
-
- * setKey('abcdefgh');
- *
- * $plaintext = str_repeat('a', 1024);
- *
- * echo $rc2->decrypt($rc2->encrypt($plaintext));
- * ?>
- *
- *
- * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @category Crypt
- * @package Crypt_RC2
- * @author Patrick Monnerat
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- */
-
-/**
- * Include Crypt_Base
- *
- * Base cipher class
- */
-if (!class_exists('Crypt_Base')) {
- include_once 'Base.php';
-}
-
-/**#@+
- * @access public
- * @see Crypt_RC2::encrypt()
- * @see Crypt_RC2::decrypt()
- */
-/**
- * Encrypt / decrypt using the Counter mode.
- *
- * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
- */
-define('CRYPT_RC2_MODE_CTR', CRYPT_MODE_CTR);
-/**
- * Encrypt / decrypt using the Electronic Code Book mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
- */
-define('CRYPT_RC2_MODE_ECB', CRYPT_MODE_ECB);
-/**
- * Encrypt / decrypt using the Code Book Chaining mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
- */
-define('CRYPT_RC2_MODE_CBC', CRYPT_MODE_CBC);
-/**
- * Encrypt / decrypt using the Cipher Feedback mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
- */
-define('CRYPT_RC2_MODE_CFB', CRYPT_MODE_CFB);
-/**
- * Encrypt / decrypt using the Cipher Feedback mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
- */
-define('CRYPT_RC2_MODE_OFB', CRYPT_MODE_OFB);
-/**#@-*/
-
-/**#@+
- * @access private
- * @see Crypt_RC2::Crypt_RC2()
- */
-/**
- * Toggles the internal implementation
- */
-define('CRYPT_RC2_MODE_INTERNAL', CRYPT_MODE_INTERNAL);
-/**
- * Toggles the mcrypt implementation
- */
-define('CRYPT_RC2_MODE_MCRYPT', CRYPT_MODE_MCRYPT);
-/**#@-*/
-
-/**
- * Pure-PHP implementation of RC2.
- *
- * @package Crypt_RC2
- * @version 0.1.1
- * @access public
- */
-class Crypt_RC2 extends Crypt_Base
-{
- /**
- * Block Length of the cipher
- *
- * @see Crypt_Base::block_size
- * @var Integer
- * @access private
- */
- var $block_size = 8;
-
- /**
- * The Key
- *
- * @see Crypt_Base::key
- * @see setKey()
- * @var String
- * @access private
- */
- var $key = "\0";
-
- /**
- * The default password key_size used by setPassword()
- *
- * @see Crypt_Base::password_key_size
- * @see Crypt_Base::setPassword()
- * @var Integer
- * @access private
- */
- var $password_key_size = 16; // = 128 bits
-
- /**
- * The namespace used by the cipher for its constants.
- *
- * @see Crypt_Base::const_namespace
- * @var String
- * @access private
- */
- var $const_namespace = 'RC2';
-
- /**
- * The mcrypt specific name of the cipher
- *
- * @see Crypt_Base::cipher_name_mcrypt
- * @var String
- * @access private
- */
- var $cipher_name_mcrypt = 'rc2';
-
- /**
- * Optimizing value while CFB-encrypting
- *
- * @see Crypt_Base::cfb_init_len
- * @var Integer
- * @access private
- */
- var $cfb_init_len = 500;
-
-/**
- * The key length in bits.
- *
- * @see Crypt_RC2::setKeyLength()
- * @see Crypt_RC2::setKey()
- * @var Integer
- * @access private
- * @internal Should be in range [1..1024].
- * @internal Changing this value after setting the key has no effect.
- */
- var $default_key_length = 1024;
-
- /**
- * The Key Schedule
- *
- * @see Crypt_RC2::_setupKey()
- * @var Array
- * @access private
- */
- var $keys;
-
- /**
- * Key expansion randomization table.
- * Twice the same 256-value sequence to save a modulus in key expansion.
- *
- * @see Crypt_RC2::setKey()
- * @var Array
- * @access private
- */
- var $pitable = array(
- 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED,
- 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D,
- 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E,
- 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2,
- 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13,
- 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32,
- 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B,
- 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82,
- 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C,
- 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC,
- 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1,
- 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26,
- 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57,
- 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03,
- 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7,
- 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7,
- 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7,
- 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A,
- 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74,
- 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC,
- 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC,
- 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39,
- 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A,
- 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31,
- 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE,
- 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9,
- 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C,
- 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9,
- 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0,
- 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E,
- 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77,
- 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD,
- 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED,
- 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D,
- 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E,
- 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2,
- 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13,
- 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32,
- 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B,
- 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82,
- 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C,
- 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC,
- 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1,
- 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26,
- 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57,
- 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03,
- 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7,
- 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7,
- 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7,
- 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A,
- 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74,
- 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC,
- 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC,
- 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39,
- 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A,
- 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31,
- 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE,
- 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9,
- 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C,
- 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9,
- 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0,
- 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E,
- 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77,
- 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD
- );
-
- /**
- * Inverse key expansion randomization table.
- *
- * @see Crypt_RC2::setKey()
- * @var Array
- * @access private
- */
- var $invpitable = array(
- 0xD1, 0xDA, 0xB9, 0x6F, 0x9C, 0xC8, 0x78, 0x66,
- 0x80, 0x2C, 0xF8, 0x37, 0xEA, 0xE0, 0x62, 0xA4,
- 0xCB, 0x71, 0x50, 0x27, 0x4B, 0x95, 0xD9, 0x20,
- 0x9D, 0x04, 0x91, 0xE3, 0x47, 0x6A, 0x7E, 0x53,
- 0xFA, 0x3A, 0x3B, 0xB4, 0xA8, 0xBC, 0x5F, 0x68,
- 0x08, 0xCA, 0x8F, 0x14, 0xD7, 0xC0, 0xEF, 0x7B,
- 0x5B, 0xBF, 0x2F, 0xE5, 0xE2, 0x8C, 0xBA, 0x12,
- 0xE1, 0xAF, 0xB2, 0x54, 0x5D, 0x59, 0x76, 0xDB,
- 0x32, 0xA2, 0x58, 0x6E, 0x1C, 0x29, 0x64, 0xF3,
- 0xE9, 0x96, 0x0C, 0x98, 0x19, 0x8D, 0x3E, 0x26,
- 0xAB, 0xA5, 0x85, 0x16, 0x40, 0xBD, 0x49, 0x67,
- 0xDC, 0x22, 0x94, 0xBB, 0x3C, 0xC1, 0x9B, 0xEB,
- 0x45, 0x28, 0x18, 0xD8, 0x1A, 0x42, 0x7D, 0xCC,
- 0xFB, 0x65, 0x8E, 0x3D, 0xCD, 0x2A, 0xA3, 0x60,
- 0xAE, 0x93, 0x8A, 0x48, 0x97, 0x51, 0x15, 0xF7,
- 0x01, 0x0B, 0xB7, 0x36, 0xB1, 0x2E, 0x11, 0xFD,
- 0x84, 0x2D, 0x3F, 0x13, 0x88, 0xB3, 0x34, 0x24,
- 0x1B, 0xDE, 0xC5, 0x1D, 0x4D, 0x2B, 0x17, 0x31,
- 0x74, 0xA9, 0xC6, 0x43, 0x6D, 0x39, 0x90, 0xBE,
- 0xC3, 0xB0, 0x21, 0x6B, 0xF6, 0x0F, 0xD5, 0x99,
- 0x0D, 0xAC, 0x1F, 0x5C, 0x9E, 0xF5, 0xF9, 0x4C,
- 0xD6, 0xDF, 0x89, 0xE4, 0x8B, 0xFF, 0xC7, 0xAA,
- 0xE7, 0xED, 0x46, 0x25, 0xB6, 0x06, 0x5E, 0x35,
- 0xB5, 0xEC, 0xCE, 0xE8, 0x6C, 0x30, 0x55, 0x61,
- 0x4A, 0xFE, 0xA0, 0x79, 0x03, 0xF0, 0x10, 0x72,
- 0x7C, 0xCF, 0x52, 0xA6, 0xA7, 0xEE, 0x44, 0xD3,
- 0x9A, 0x57, 0x92, 0xD0, 0x5A, 0x7A, 0x41, 0x7F,
- 0x0E, 0x00, 0x63, 0xF2, 0x4F, 0x05, 0x83, 0xC9,
- 0xA1, 0xD4, 0xDD, 0xC4, 0x56, 0xF4, 0xD2, 0x77,
- 0x81, 0x09, 0x82, 0x33, 0x9F, 0x07, 0x86, 0x75,
- 0x38, 0x4E, 0x69, 0xF1, 0xAD, 0x23, 0x73, 0x87,
- 0x70, 0x02, 0xC2, 0x1E, 0xB8, 0x0A, 0xFC, 0xE6
- );
-
- /**
- * Default Constructor.
- *
- * Determines whether or not the mcrypt extension should be used.
- *
- * $mode could be:
- *
- * - CRYPT_RC2_MODE_ECB
- *
- * - CRYPT_RC2_MODE_CBC
- *
- * - CRYPT_RC2_MODE_CTR
- *
- * - CRYPT_RC2_MODE_CFB
- *
- * - CRYPT_RC2_MODE_OFB
- *
- * If not explictly set, CRYPT_RC2_MODE_CBC will be used.
- *
- * @see Crypt_Base::Crypt_Base()
- * @param optional Integer $mode
- * @access public
- */
- function Crypt_RC2($mode = CRYPT_RC2_MODE_CBC)
- {
- parent::Crypt_Base($mode);
- $this->setKey('');
- }
-
- /**
- * Sets the key length
- *
- * Valid key lengths are 1 to 1024.
- * Calling this function after setting the key has no effect until the next
- * Crypt_RC2::setKey() call.
- *
- * @access public
- * @param Integer $length in bits
- */
- function setKeyLength($length)
- {
- if ($length >= 1 && $length <= 1024) {
- $this->default_key_length = $length;
- }
- }
-
- /**
- * Sets the key.
- *
- * Keys can be of any length. RC2, itself, uses 1 to 1024 bit keys (eg.
- * strlen($key) <= 128), however, we only use the first 128 bytes if $key
- * has more then 128 bytes in it, and set $key to a single null byte if
- * it is empty.
- *
- * If the key is not explicitly set, it'll be assumed to be a single
- * null byte.
- *
- * @see Crypt_Base::setKey()
- * @access public
- * @param String $key
- * @param Integer $t1 optional Effective key length in bits.
- */
- function setKey($key, $t1 = 0)
- {
- if ($t1 <= 0) {
- $t1 = $this->default_key_length;
- } else if ($t1 > 1024) {
- $t1 = 1024;
- }
- // Key byte count should be 1..128.
- $key = strlen($key) ? substr($key, 0, 128): "\x00";
- $t = strlen($key);
-
- // The mcrypt RC2 implementation only supports effective key length
- // of 1024 bits. It is however possible to handle effective key
- // lengths in range 1..1024 by expanding the key and applying
- // inverse pitable mapping to the first byte before submitting it
- // to mcrypt.
-
- // Key expansion.
- $l = array_values(unpack('C*', $key));
- $t8 = ($t1 + 7) >> 3;
- $tm = 0xFF >> (8 * $t8 - $t1);
-
- // Expand key.
- $pitable = $this->pitable;
- for ($i = $t; $i < 128; $i++) {
- $l[$i] = $pitable[$l[$i - 1] + $l[$i - $t]];
- }
- $i = 128 - $t8;
- $l[$i] = $pitable[$l[$i] & $tm];
- while ($i--) {
- $l[$i] = $pitable[$l[$i + 1] ^ $l[$i + $t8]];
- }
-
- // Prepare the key for mcrypt.
- $l[0] = $this->invpitable[$l[0]];
- array_unshift($l, 'C*');
- parent::setKey(call_user_func_array('pack', $l));
- }
-
- /**
- * Encrypts a block
- *
- * @see Crypt_Base::_encryptBlock()
- * @see Crypt_Base::encrypt()
- * @access private
- * @param String $in
- * @return String
- */
- function _encryptBlock($in)
- {
- list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in));
- $keys = $this->keys;
- $limit = 20;
- $actions = array($limit => 44, 44 => 64);
- $j = 0;
-
- for (;;) {
- // Mixing round.
- $r0 = (($r0 + $keys[$j++] + ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1;
- $r0 |= $r0 >> 16;
- $r1 = (($r1 + $keys[$j++] + ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2;
- $r1 |= $r1 >> 16;
- $r2 = (($r2 + $keys[$j++] + ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3;
- $r2 |= $r2 >> 16;
- $r3 = (($r3 + $keys[$j++] + ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5;
- $r3 |= $r3 >> 16;
-
- if ($j == $limit) {
- if ($limit == 64) {
- break;
- }
-
- // Mashing round.
- $r0 += $keys[$r3 & 0x3F];
- $r1 += $keys[$r0 & 0x3F];
- $r2 += $keys[$r1 & 0x3F];
- $r3 += $keys[$r2 & 0x3F];
- $limit = $actions[$limit];
- }
- }
-
- return pack('vvvv', $r0, $r1, $r2, $r3);
- }
-
- /**
- * Decrypts a block
- *
- * @see Crypt_Base::_decryptBlock()
- * @see Crypt_Base::decrypt()
- * @access private
- * @param String $in
- * @return String
- */
- function _decryptBlock($in)
- {
- list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in));
- $keys = $this->keys;
- $limit = 44;
- $actions = array($limit => 20, 20 => 0);
- $j = 64;
-
- for (;;) {
- // R-mixing round.
- $r3 = ($r3 | ($r3 << 16)) >> 5;
- $r3 = ($r3 - $keys[--$j] - ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF;
- $r2 = ($r2 | ($r2 << 16)) >> 3;
- $r2 = ($r2 - $keys[--$j] - ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF;
- $r1 = ($r1 | ($r1 << 16)) >> 2;
- $r1 = ($r1 - $keys[--$j] - ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF;
- $r0 = ($r0 | ($r0 << 16)) >> 1;
- $r0 = ($r0 - $keys[--$j] - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF;
-
- if ($j == $limit) {
- if (!$limit) {
- break;
- }
-
- // R-mashing round.
- $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF;
- $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF;
- $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF;
- $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF;
- $limit = $actions[$limit];
- }
- }
-
- return pack('vvvv', $r0, $r1, $r2, $r3);
- }
-
- /**
- * Creates the key schedule
- *
- * @see Crypt_Base::_setupKey()
- * @access private
- */
- function _setupKey()
- {
- // Key has already been expanded in Crypt_RC2::setKey():
- // Only the first value must be altered.
- $l = unpack('Ca/Cb/v*', $this->key);
- array_unshift($l, $this->pitable[$l['a']] | ($l['b'] << 8));
- unset($l['a']);
- unset($l['b']);
- $this->keys = $l;
- }
-
- /**
- * Setup the performance-optimized function for de/encrypt()
- *
- * @see Crypt_Base::_setupInlineCrypt()
- * @access private
- */
- function _setupInlineCrypt()
- {
- $lambda_functions = &Crypt_RC2::_getLambdaFunctions();
-
- // The first 10 generated $lambda_functions will use the $keys hardcoded as integers
- // for the mixing rounds, for better inline crypt performance [~20% faster].
- // But for memory reason we have to limit those ultra-optimized $lambda_functions to an amount of 10.
- $keys = $this->keys;
- if (count($lambda_functions) >= 10) {
- foreach ($this->keys as $k => $v) {
- $keys[$k] = '$keys[' . $k . ']';
- }
- }
-
- $code_hash = md5(str_pad("Crypt_RC2, {$this->mode}, ", 32, "\0") . implode(',', $keys));
-
- // Is there a re-usable $lambda_functions in there?
- // If not, we have to create it.
- if (!isset($lambda_functions[$code_hash])) {
- // Init code for both, encrypt and decrypt.
- $init_crypt = '$keys = $self->keys;';
-
- // $in is the current 8 bytes block which has to be en/decrypt
- $encrypt_block = $decrypt_block = '
- $in = unpack("v4", $in);
- $r0 = $in[1];
- $r1 = $in[2];
- $r2 = $in[3];
- $r3 = $in[4];
- ';
-
- // Create code for encryption.
- $limit = 20;
- $actions = array($limit => 44, 44 => 64);
- $j = 0;
-
- for (;;) {
- // Mixing round.
- $encrypt_block .= '
- $r0 = (($r0 + ' . $keys[$j++] . ' +
- ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1;
- $r0 |= $r0 >> 16;
- $r1 = (($r1 + ' . $keys[$j++] . ' +
- ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2;
- $r1 |= $r1 >> 16;
- $r2 = (($r2 + ' . $keys[$j++] . ' +
- ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3;
- $r2 |= $r2 >> 16;
- $r3 = (($r3 + ' . $keys[$j++] . ' +
- ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5;
- $r3 |= $r3 >> 16;';
-
- if ($j == $limit) {
- if ($limit == 64) {
- break;
- }
-
- // Mashing round.
- $encrypt_block .= '
- $r0 += $keys[$r3 & 0x3F];
- $r1 += $keys[$r0 & 0x3F];
- $r2 += $keys[$r1 & 0x3F];
- $r3 += $keys[$r2 & 0x3F];';
- $limit = $actions[$limit];
- }
- }
-
- $encrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);';
-
- // Create code for decryption.
- $limit = 44;
- $actions = array($limit => 20, 20 => 0);
- $j = 64;
-
- for (;;) {
- // R-mixing round.
- $decrypt_block .= '
- $r3 = ($r3 | ($r3 << 16)) >> 5;
- $r3 = ($r3 - ' . $keys[--$j] . ' -
- ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF;
- $r2 = ($r2 | ($r2 << 16)) >> 3;
- $r2 = ($r2 - ' . $keys[--$j] . ' -
- ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF;
- $r1 = ($r1 | ($r1 << 16)) >> 2;
- $r1 = ($r1 - ' . $keys[--$j] . ' -
- ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF;
- $r0 = ($r0 | ($r0 << 16)) >> 1;
- $r0 = ($r0 - ' . $keys[--$j] . ' -
- ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF;';
-
- if ($j == $limit) {
- if (!$limit) {
- break;
- }
-
- // R-mashing round.
- $decrypt_block .= '
- $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF;
- $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF;
- $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF;
- $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF;';
- $limit = $actions[$limit];
- }
- }
-
- $decrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);';
-
- // Creates the inline-crypt function
- $lambda_functions[$code_hash] = $this->_createInlineCryptFunction(
- array(
- 'init_crypt' => $init_crypt,
- 'encrypt_block' => $encrypt_block,
- 'decrypt_block' => $decrypt_block
- )
- );
- }
-
- // Set the inline-crypt function as callback in: $this->inline_crypt
- $this->inline_crypt = $lambda_functions[$code_hash];
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/RC4.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/RC4.php
deleted file mode 100644
index d062be2573f041e3e52189afba3578dd8460fa87..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/RC4.php
+++ /dev/null
@@ -1,333 +0,0 @@
-
- * setKey('abcdefgh');
- *
- * $size = 10 * 1024;
- * $plaintext = '';
- * for ($i = 0; $i < $size; $i++) {
- * $plaintext.= 'a';
- * }
- *
- * echo $rc4->decrypt($rc4->encrypt($plaintext));
- * ?>
- *
- *
- * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @category Crypt
- * @package Crypt_RC4
- * @author Jim Wigginton
- * @copyright MMVII Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- */
-
-/**
- * Include Crypt_Base
- *
- * Base cipher class
- */
-if (!class_exists('Crypt_Base')) {
- include_once 'Base.php';
-}
-
-/**#@+
- * @access private
- * @see Crypt_RC4::Crypt_RC4()
- */
-/**
- * Toggles the internal implementation
- */
-define('CRYPT_RC4_MODE_INTERNAL', CRYPT_MODE_INTERNAL);
-/**
- * Toggles the mcrypt implementation
- */
-define('CRYPT_RC4_MODE_MCRYPT', CRYPT_MODE_MCRYPT);
-/**#@-*/
-
-/**#@+
- * @access private
- * @see Crypt_RC4::_crypt()
- */
-define('CRYPT_RC4_ENCRYPT', 0);
-define('CRYPT_RC4_DECRYPT', 1);
-/**#@-*/
-
-/**
- * Pure-PHP implementation of RC4.
- *
- * @package Crypt_RC4
- * @author Jim Wigginton
- * @version 0.1.0
- * @access public
- */
-class Crypt_RC4 extends Crypt_Base
-{
- /**
- * Block Length of the cipher
- *
- * RC4 is a stream cipher
- * so we the block_size to 0
- *
- * @see Crypt_Base::block_size
- * @var Integer
- * @access private
- */
- var $block_size = 0;
-
- /**
- * The default password key_size used by setPassword()
- *
- * @see Crypt_Base::password_key_size
- * @see Crypt_Base::setPassword()
- * @var Integer
- * @access private
- */
- var $password_key_size = 128; // = 1024 bits
-
- /**
- * The namespace used by the cipher for its constants.
- *
- * @see Crypt_Base::const_namespace
- * @var String
- * @access private
- */
- var $const_namespace = 'RC4';
-
- /**
- * The mcrypt specific name of the cipher
- *
- * @see Crypt_Base::cipher_name_mcrypt
- * @var String
- * @access private
- */
- var $cipher_name_mcrypt = 'arcfour';
-
- /**
- * Holds whether performance-optimized $inline_crypt() can/should be used.
- *
- * @see Crypt_Base::inline_crypt
- * @var mixed
- * @access private
- */
- var $use_inline_crypt = false; // currently not available
-
- /**
- * The Key
- *
- * @see Crypt_RC4::setKey()
- * @var String
- * @access private
- */
- var $key = "\0";
-
- /**
- * The Key Stream for decryption and encryption
- *
- * @see Crypt_RC4::setKey()
- * @var Array
- * @access private
- */
- var $stream;
-
- /**
- * Default Constructor.
- *
- * Determines whether or not the mcrypt extension should be used.
- *
- * @see Crypt_Base::Crypt_Base()
- * @return Crypt_RC4
- * @access public
- */
- function Crypt_RC4()
- {
- parent::Crypt_Base(CRYPT_MODE_STREAM);
- }
-
- /**
- * Dummy function.
- *
- * Some protocols, such as WEP, prepend an "initialization vector" to the key, effectively creating a new key [1].
- * If you need to use an initialization vector in this manner, feel free to prepend it to the key, yourself, before
- * calling setKey().
- *
- * [1] WEP's initialization vectors (IV's) are used in a somewhat insecure way. Since, in that protocol,
- * the IV's are relatively easy to predict, an attack described by
- * {@link http://www.drizzle.com/~aboba/IEEE/rc4_ksaproc.pdf Scott Fluhrer, Itsik Mantin, and Adi Shamir}
- * can be used to quickly guess at the rest of the key. The following links elaborate:
- *
- * {@link http://www.rsa.com/rsalabs/node.asp?id=2009 http://www.rsa.com/rsalabs/node.asp?id=2009}
- * {@link http://en.wikipedia.org/wiki/Related_key_attack http://en.wikipedia.org/wiki/Related_key_attack}
- *
- * @param String $iv
- * @see Crypt_RC4::setKey()
- * @access public
- */
- function setIV($iv)
- {
- }
-
- /**
- * Sets the key.
- *
- * Keys can be between 1 and 256 bytes long. If they are longer then 256 bytes, the first 256 bytes will
- * be used. If no key is explicitly set, it'll be assumed to be a single null byte.
- *
- * @access public
- * @see Crypt_Base::setKey()
- * @param String $key
- */
- function setKey($key)
- {
- parent::setKey(substr($key, 0, 256));
- }
-
- /**
- * Encrypts a message.
- *
- * @see Crypt_Base::decrypt()
- * @see Crypt_RC4::_crypt()
- * @access public
- * @param String $plaintext
- * @return String $ciphertext
- */
- function encrypt($plaintext)
- {
- if ($this->engine == CRYPT_MODE_MCRYPT) {
- return parent::encrypt($plaintext);
- }
- return $this->_crypt($plaintext, CRYPT_RC4_ENCRYPT);
- }
-
- /**
- * Decrypts a message.
- *
- * $this->decrypt($this->encrypt($plaintext)) == $this->encrypt($this->encrypt($plaintext)).
- * Atleast if the continuous buffer is disabled.
- *
- * @see Crypt_Base::encrypt()
- * @see Crypt_RC4::_crypt()
- * @access public
- * @param String $ciphertext
- * @return String $plaintext
- */
- function decrypt($ciphertext)
- {
- if ($this->engine == CRYPT_MODE_MCRYPT) {
- return parent::decrypt($ciphertext);
- }
- return $this->_crypt($ciphertext, CRYPT_RC4_DECRYPT);
- }
-
-
- /**
- * Setup the key (expansion)
- *
- * @see Crypt_Base::_setupKey()
- * @access private
- */
- function _setupKey()
- {
- $key = $this->key;
- $keyLength = strlen($key);
- $keyStream = array();
- for ($i = 0; $i < 256; $i++) {
- $keyStream[$i] = $i;
- }
- $j = 0;
- for ($i = 0; $i < 256; $i++) {
- $j = ($j + $keyStream[$i] + ord($key[$i % $keyLength])) & 255;
- $temp = $keyStream[$i];
- $keyStream[$i] = $keyStream[$j];
- $keyStream[$j] = $temp;
- }
-
- $this->stream = array();
- $this->stream[CRYPT_RC4_DECRYPT] = $this->stream[CRYPT_RC4_ENCRYPT] = array(
- 0, // index $i
- 0, // index $j
- $keyStream
- );
- }
-
- /**
- * Encrypts or decrypts a message.
- *
- * @see Crypt_RC4::encrypt()
- * @see Crypt_RC4::decrypt()
- * @access private
- * @param String $text
- * @param Integer $mode
- * @return String $text
- */
- function _crypt($text, $mode)
- {
- if ($this->changed) {
- $this->_setup();
- $this->changed = false;
- }
-
- $stream = &$this->stream[$mode];
- if ($this->continuousBuffer) {
- $i = &$stream[0];
- $j = &$stream[1];
- $keyStream = &$stream[2];
- } else {
- $i = $stream[0];
- $j = $stream[1];
- $keyStream = $stream[2];
- }
-
- $len = strlen($text);
- for ($k = 0; $k < $len; ++$k) {
- $i = ($i + 1) & 255;
- $ksi = $keyStream[$i];
- $j = ($j + $ksi) & 255;
- $ksj = $keyStream[$j];
-
- $keyStream[$i] = $ksj;
- $keyStream[$j] = $ksi;
- $text[$k] = chr(ord($text[$k]) ^ $keyStream[($ksj + $ksi) & 255]);
- }
-
- return $text;
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/RSA.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/RSA.php
deleted file mode 100644
index feb887c70318e0a4308214878a43d344a9cb61dd..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/RSA.php
+++ /dev/null
@@ -1,2811 +0,0 @@
-
- * createKey());
- *
- * $plaintext = 'terrafrost';
- *
- * $rsa->loadKey($privatekey);
- * $ciphertext = $rsa->encrypt($plaintext);
- *
- * $rsa->loadKey($publickey);
- * echo $rsa->decrypt($ciphertext);
- * ?>
- *
- *
- * Here's an example of how to create signatures and verify signatures with this library:
- *
- * createKey());
- *
- * $plaintext = 'terrafrost';
- *
- * $rsa->loadKey($privatekey);
- * $signature = $rsa->sign($plaintext);
- *
- * $rsa->loadKey($publickey);
- * echo $rsa->verify($plaintext, $signature) ? 'verified' : 'unverified';
- * ?>
- *
- *
- * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @category Crypt
- * @package Crypt_RSA
- * @author Jim Wigginton
- * @copyright MMIX Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- */
-
-/**
- * Include Crypt_Random
- */
-// the class_exists() will only be called if the crypt_random_string function hasn't been defined and
-// will trigger a call to __autoload() if you're wanting to auto-load classes
-// call function_exists() a second time to stop the include_once from being called outside
-// of the auto loader
-if (!function_exists('crypt_random_string')) {
- include_once 'Random.php';
-}
-
-/**
- * Include Crypt_Hash
- */
-if (!class_exists('Crypt_Hash')) {
- include_once 'Hash.php';
-}
-
-/**#@+
- * @access public
- * @see Crypt_RSA::encrypt()
- * @see Crypt_RSA::decrypt()
- */
-/**
- * Use {@link http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding Optimal Asymmetric Encryption Padding}
- * (OAEP) for encryption / decryption.
- *
- * Uses sha1 by default.
- *
- * @see Crypt_RSA::setHash()
- * @see Crypt_RSA::setMGFHash()
- */
-define('CRYPT_RSA_ENCRYPTION_OAEP', 1);
-/**
- * Use PKCS#1 padding.
- *
- * Although CRYPT_RSA_ENCRYPTION_OAEP offers more security, including PKCS#1 padding is necessary for purposes of backwards
- * compatability with protocols (like SSH-1) written before OAEP's introduction.
- */
-define('CRYPT_RSA_ENCRYPTION_PKCS1', 2);
-/**#@-*/
-
-/**#@+
- * @access public
- * @see Crypt_RSA::sign()
- * @see Crypt_RSA::verify()
- * @see Crypt_RSA::setHash()
- */
-/**
- * Use the Probabilistic Signature Scheme for signing
- *
- * Uses sha1 by default.
- *
- * @see Crypt_RSA::setSaltLength()
- * @see Crypt_RSA::setMGFHash()
- */
-define('CRYPT_RSA_SIGNATURE_PSS', 1);
-/**
- * Use the PKCS#1 scheme by default.
- *
- * Although CRYPT_RSA_SIGNATURE_PSS offers more security, including PKCS#1 signing is necessary for purposes of backwards
- * compatability with protocols (like SSH-2) written before PSS's introduction.
- */
-define('CRYPT_RSA_SIGNATURE_PKCS1', 2);
-/**#@-*/
-
-/**#@+
- * @access private
- * @see Crypt_RSA::createKey()
- */
-/**
- * ASN1 Integer
- */
-define('CRYPT_RSA_ASN1_INTEGER', 2);
-/**
- * ASN1 Bit String
- */
-define('CRYPT_RSA_ASN1_BITSTRING', 3);
-/**
- * ASN1 Sequence (with the constucted bit set)
- */
-define('CRYPT_RSA_ASN1_SEQUENCE', 48);
-/**#@-*/
-
-/**#@+
- * @access private
- * @see Crypt_RSA::Crypt_RSA()
- */
-/**
- * To use the pure-PHP implementation
- */
-define('CRYPT_RSA_MODE_INTERNAL', 1);
-/**
- * To use the OpenSSL library
- *
- * (if enabled; otherwise, the internal implementation will be used)
- */
-define('CRYPT_RSA_MODE_OPENSSL', 2);
-/**#@-*/
-
-/**
- * Default openSSL configuration file.
- */
-define('CRYPT_RSA_OPENSSL_CONFIG', dirname(__FILE__) . '/../openssl.cnf');
-
-/**#@+
- * @access public
- * @see Crypt_RSA::createKey()
- * @see Crypt_RSA::setPrivateKeyFormat()
- */
-/**
- * PKCS#1 formatted private key
- *
- * Used by OpenSSH
- */
-define('CRYPT_RSA_PRIVATE_FORMAT_PKCS1', 0);
-/**
- * PuTTY formatted private key
- */
-define('CRYPT_RSA_PRIVATE_FORMAT_PUTTY', 1);
-/**
- * XML formatted private key
- */
-define('CRYPT_RSA_PRIVATE_FORMAT_XML', 2);
-/**#@-*/
-
-/**#@+
- * @access public
- * @see Crypt_RSA::createKey()
- * @see Crypt_RSA::setPublicKeyFormat()
- */
-/**
- * Raw public key
- *
- * An array containing two Math_BigInteger objects.
- *
- * The exponent can be indexed with any of the following:
- *
- * 0, e, exponent, publicExponent
- *
- * The modulus can be indexed with any of the following:
- *
- * 1, n, modulo, modulus
- */
-define('CRYPT_RSA_PUBLIC_FORMAT_RAW', 3);
-/**
- * PKCS#1 formatted public key (raw)
- *
- * Used by File/X509.php
- */
-define('CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW', 4);
-/**
- * XML formatted public key
- */
-define('CRYPT_RSA_PUBLIC_FORMAT_XML', 5);
-/**
- * OpenSSH formatted public key
- *
- * Place in $HOME/.ssh/authorized_keys
- */
-define('CRYPT_RSA_PUBLIC_FORMAT_OPENSSH', 6);
-/**
- * PKCS#1 formatted public key (encapsulated)
- *
- * Used by PHP's openssl_public_encrypt() and openssl's rsautl (when -pubin is set)
- */
-define('CRYPT_RSA_PUBLIC_FORMAT_PKCS1', 7);
-/**#@-*/
-
-/**
- * Pure-PHP PKCS#1 compliant implementation of RSA.
- *
- * @package Crypt_RSA
- * @author Jim Wigginton
- * @version 0.1.0
- * @access public
- */
-class Crypt_RSA
-{
- /**
- * Precomputed Zero
- *
- * @var Array
- * @access private
- */
- var $zero;
-
- /**
- * Precomputed One
- *
- * @var Array
- * @access private
- */
- var $one;
-
- /**
- * Private Key Format
- *
- * @var Integer
- * @access private
- */
- var $privateKeyFormat = CRYPT_RSA_PRIVATE_FORMAT_PKCS1;
-
- /**
- * Public Key Format
- *
- * @var Integer
- * @access public
- */
- var $publicKeyFormat = CRYPT_RSA_PUBLIC_FORMAT_PKCS1;
-
- /**
- * Modulus (ie. n)
- *
- * @var Math_BigInteger
- * @access private
- */
- var $modulus;
-
- /**
- * Modulus length
- *
- * @var Math_BigInteger
- * @access private
- */
- var $k;
-
- /**
- * Exponent (ie. e or d)
- *
- * @var Math_BigInteger
- * @access private
- */
- var $exponent;
-
- /**
- * Primes for Chinese Remainder Theorem (ie. p and q)
- *
- * @var Array
- * @access private
- */
- var $primes;
-
- /**
- * Exponents for Chinese Remainder Theorem (ie. dP and dQ)
- *
- * @var Array
- * @access private
- */
- var $exponents;
-
- /**
- * Coefficients for Chinese Remainder Theorem (ie. qInv)
- *
- * @var Array
- * @access private
- */
- var $coefficients;
-
- /**
- * Hash name
- *
- * @var String
- * @access private
- */
- var $hashName;
-
- /**
- * Hash function
- *
- * @var Crypt_Hash
- * @access private
- */
- var $hash;
-
- /**
- * Length of hash function output
- *
- * @var Integer
- * @access private
- */
- var $hLen;
-
- /**
- * Length of salt
- *
- * @var Integer
- * @access private
- */
- var $sLen;
-
- /**
- * Hash function for the Mask Generation Function
- *
- * @var Crypt_Hash
- * @access private
- */
- var $mgfHash;
-
- /**
- * Length of MGF hash function output
- *
- * @var Integer
- * @access private
- */
- var $mgfHLen;
-
- /**
- * Encryption mode
- *
- * @var Integer
- * @access private
- */
- var $encryptionMode = CRYPT_RSA_ENCRYPTION_OAEP;
-
- /**
- * Signature mode
- *
- * @var Integer
- * @access private
- */
- var $signatureMode = CRYPT_RSA_SIGNATURE_PSS;
-
- /**
- * Public Exponent
- *
- * @var Mixed
- * @access private
- */
- var $publicExponent = false;
-
- /**
- * Password
- *
- * @var String
- * @access private
- */
- var $password = false;
-
- /**
- * Components
- *
- * For use with parsing XML formatted keys. PHP's XML Parser functions use utilized - instead of PHP's DOM functions -
- * because PHP's XML Parser functions work on PHP4 whereas PHP's DOM functions - although surperior - don't.
- *
- * @see Crypt_RSA::_start_element_handler()
- * @var Array
- * @access private
- */
- var $components = array();
-
- /**
- * Current String
- *
- * For use with parsing XML formatted keys.
- *
- * @see Crypt_RSA::_character_handler()
- * @see Crypt_RSA::_stop_element_handler()
- * @var Mixed
- * @access private
- */
- var $current;
-
- /**
- * OpenSSL configuration file name.
- *
- * Set to null to use system configuration file.
- * @see Crypt_RSA::createKey()
- * @var Mixed
- * @Access public
- */
- var $configFile;
-
- /**
- * Public key comment field.
- *
- * @var String
- * @access private
- */
- var $comment = 'phpseclib-generated-key';
-
- /**
- * The constructor
- *
- * If you want to make use of the openssl extension, you'll need to set the mode manually, yourself. The reason
- * Crypt_RSA doesn't do it is because OpenSSL doesn't fail gracefully. openssl_pkey_new(), in particular, requires
- * openssl.cnf be present somewhere and, unfortunately, the only real way to find out is too late.
- *
- * @return Crypt_RSA
- * @access public
- */
- function Crypt_RSA()
- {
- if (!class_exists('Math_BigInteger')) {
- include_once 'Math/BigInteger.php';
- }
-
- $this->configFile = CRYPT_RSA_OPENSSL_CONFIG;
-
- if ( !defined('CRYPT_RSA_MODE') ) {
- // Math/BigInteger's openssl requirements are a little less stringent than Crypt/RSA's. in particular,
- // Math/BigInteger doesn't require an openssl.cfg file whereas Crypt/RSA does. so if Math/BigInteger
- // can't use OpenSSL it can be pretty trivially assumed, then, that Crypt/RSA can't either.
- if ( defined('MATH_BIGINTEGER_OPENSSL_DISABLE') ) {
- define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL);
- }
-
- switch ( !defined('CRYPT_RSA_MODE') ) { // ie. only run this if the above didn't set CRYPT_RSA_MODE already
- case extension_loaded('openssl') && version_compare(PHP_VERSION, '4.2.0', '>=') && file_exists($this->configFile):
- // some versions of XAMPP have mismatched versions of OpenSSL which causes it not to work
- ob_start();
- phpinfo();
- $content = ob_get_contents();
- ob_end_clean();
-
- preg_match_all('#OpenSSL (Header|Library) Version(.*)#im', $content, $matches);
-
- $versions = array();
- if (!empty($matches[1])) {
- for ($i = 0; $i < count($matches[1]); $i++) {
- $versions[$matches[1][$i]] = trim(str_replace('=>', '', strip_tags($matches[2][$i])));
- }
- }
-
- // it doesn't appear that OpenSSL versions were reported upon until PHP 5.3+
- switch (true) {
- case !isset($versions['Header']):
- case !isset($versions['Library']):
- case $versions['Header'] == $versions['Library']:
- define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_OPENSSL);
- break;
- default:
- define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL);
- define('MATH_BIGINTEGER_OPENSSL_DISABLE', true);
- }
- break;
- case true:
- define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL);
- }
- }
-
- $this->zero = new Math_BigInteger();
- $this->one = new Math_BigInteger(1);
-
- $this->hash = new Crypt_Hash('sha1');
- $this->hLen = $this->hash->getLength();
- $this->hashName = 'sha1';
- $this->mgfHash = new Crypt_Hash('sha1');
- $this->mgfHLen = $this->mgfHash->getLength();
- }
-
- /**
- * Create public / private key pair
- *
- * Returns an array with the following three elements:
- * - 'privatekey': The private key.
- * - 'publickey': The public key.
- * - 'partialkey': A partially computed key (if the execution time exceeded $timeout).
- * Will need to be passed back to Crypt_RSA::createKey() as the third parameter for further processing.
- *
- * @access public
- * @param optional Integer $bits
- * @param optional Integer $timeout
- * @param optional Math_BigInteger $p
- */
- function createKey($bits = 1024, $timeout = false, $partial = array())
- {
- if (!defined('CRYPT_RSA_EXPONENT')) {
- // http://en.wikipedia.org/wiki/65537_%28number%29
- define('CRYPT_RSA_EXPONENT', '65537');
- }
- // per , this number ought not result in primes smaller
- // than 256 bits. as a consequence if the key you're trying to create is 1024 bits and you've set CRYPT_RSA_SMALLEST_PRIME
- // to 384 bits then you're going to get a 384 bit prime and a 640 bit prime (384 + 1024 % 384). at least if
- // CRYPT_RSA_MODE is set to CRYPT_RSA_MODE_INTERNAL. if CRYPT_RSA_MODE is set to CRYPT_RSA_MODE_OPENSSL then
- // CRYPT_RSA_SMALLEST_PRIME is ignored (ie. multi-prime RSA support is more intended as a way to speed up RSA key
- // generation when there's a chance neither gmp nor OpenSSL are installed)
- if (!defined('CRYPT_RSA_SMALLEST_PRIME')) {
- define('CRYPT_RSA_SMALLEST_PRIME', 4096);
- }
-
- // OpenSSL uses 65537 as the exponent and requires RSA keys be 384 bits minimum
- if ( CRYPT_RSA_MODE == CRYPT_RSA_MODE_OPENSSL && $bits >= 384 && CRYPT_RSA_EXPONENT == 65537) {
- $config = array();
- if (isset($this->configFile)) {
- $config['config'] = $this->configFile;
- }
- $rsa = openssl_pkey_new(array('private_key_bits' => $bits) + $config);
- openssl_pkey_export($rsa, $privatekey, null, $config);
- $publickey = openssl_pkey_get_details($rsa);
- $publickey = $publickey['key'];
-
- $privatekey = call_user_func_array(array($this, '_convertPrivateKey'), array_values($this->_parseKey($privatekey, CRYPT_RSA_PRIVATE_FORMAT_PKCS1)));
- $publickey = call_user_func_array(array($this, '_convertPublicKey'), array_values($this->_parseKey($publickey, CRYPT_RSA_PUBLIC_FORMAT_PKCS1)));
-
- // clear the buffer of error strings stemming from a minimalistic openssl.cnf
- while (openssl_error_string() !== false);
-
- return array(
- 'privatekey' => $privatekey,
- 'publickey' => $publickey,
- 'partialkey' => false
- );
- }
-
- static $e;
- if (!isset($e)) {
- $e = new Math_BigInteger(CRYPT_RSA_EXPONENT);
- }
-
- extract($this->_generateMinMax($bits));
- $absoluteMin = $min;
- $temp = $bits >> 1; // divide by two to see how many bits P and Q would be
- if ($temp > CRYPT_RSA_SMALLEST_PRIME) {
- $num_primes = floor($bits / CRYPT_RSA_SMALLEST_PRIME);
- $temp = CRYPT_RSA_SMALLEST_PRIME;
- } else {
- $num_primes = 2;
- }
- extract($this->_generateMinMax($temp + $bits % $temp));
- $finalMax = $max;
- extract($this->_generateMinMax($temp));
-
- $generator = new Math_BigInteger();
-
- $n = $this->one->copy();
- if (!empty($partial)) {
- extract(unserialize($partial));
- } else {
- $exponents = $coefficients = $primes = array();
- $lcm = array(
- 'top' => $this->one->copy(),
- 'bottom' => false
- );
- }
-
- $start = time();
- $i0 = count($primes) + 1;
-
- do {
- for ($i = $i0; $i <= $num_primes; $i++) {
- if ($timeout !== false) {
- $timeout-= time() - $start;
- $start = time();
- if ($timeout <= 0) {
- return array(
- 'privatekey' => '',
- 'publickey' => '',
- 'partialkey' => serialize(array(
- 'primes' => $primes,
- 'coefficients' => $coefficients,
- 'lcm' => $lcm,
- 'exponents' => $exponents
- ))
- );
- }
- }
-
- if ($i == $num_primes) {
- list($min, $temp) = $absoluteMin->divide($n);
- if (!$temp->equals($this->zero)) {
- $min = $min->add($this->one); // ie. ceil()
- }
- $primes[$i] = $generator->randomPrime($min, $finalMax, $timeout);
- } else {
- $primes[$i] = $generator->randomPrime($min, $max, $timeout);
- }
-
- if ($primes[$i] === false) { // if we've reached the timeout
- if (count($primes) > 1) {
- $partialkey = '';
- } else {
- array_pop($primes);
- $partialkey = serialize(array(
- 'primes' => $primes,
- 'coefficients' => $coefficients,
- 'lcm' => $lcm,
- 'exponents' => $exponents
- ));
- }
-
- return array(
- 'privatekey' => '',
- 'publickey' => '',
- 'partialkey' => $partialkey
- );
- }
-
- // the first coefficient is calculated differently from the rest
- // ie. instead of being $primes[1]->modInverse($primes[2]), it's $primes[2]->modInverse($primes[1])
- if ($i > 2) {
- $coefficients[$i] = $n->modInverse($primes[$i]);
- }
-
- $n = $n->multiply($primes[$i]);
-
- $temp = $primes[$i]->subtract($this->one);
-
- // textbook RSA implementations use Euler's totient function instead of the least common multiple.
- // see http://en.wikipedia.org/wiki/Euler%27s_totient_function
- $lcm['top'] = $lcm['top']->multiply($temp);
- $lcm['bottom'] = $lcm['bottom'] === false ? $temp : $lcm['bottom']->gcd($temp);
-
- $exponents[$i] = $e->modInverse($temp);
- }
-
- list($temp) = $lcm['top']->divide($lcm['bottom']);
- $gcd = $temp->gcd($e);
- $i0 = 1;
- } while (!$gcd->equals($this->one));
-
- $d = $e->modInverse($temp);
-
- $coefficients[2] = $primes[2]->modInverse($primes[1]);
-
- // from :
- // RSAPrivateKey ::= SEQUENCE {
- // version Version,
- // modulus INTEGER, -- n
- // publicExponent INTEGER, -- e
- // privateExponent INTEGER, -- d
- // prime1 INTEGER, -- p
- // prime2 INTEGER, -- q
- // exponent1 INTEGER, -- d mod (p-1)
- // exponent2 INTEGER, -- d mod (q-1)
- // coefficient INTEGER, -- (inverse of q) mod p
- // otherPrimeInfos OtherPrimeInfos OPTIONAL
- // }
-
- return array(
- 'privatekey' => $this->_convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients),
- 'publickey' => $this->_convertPublicKey($n, $e),
- 'partialkey' => false
- );
- }
-
- /**
- * Convert a private key to the appropriate format.
- *
- * @access private
- * @see setPrivateKeyFormat()
- * @param String $RSAPrivateKey
- * @return String
- */
- function _convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients)
- {
- $num_primes = count($primes);
- $raw = array(
- 'version' => $num_primes == 2 ? chr(0) : chr(1), // two-prime vs. multi
- 'modulus' => $n->toBytes(true),
- 'publicExponent' => $e->toBytes(true),
- 'privateExponent' => $d->toBytes(true),
- 'prime1' => $primes[1]->toBytes(true),
- 'prime2' => $primes[2]->toBytes(true),
- 'exponent1' => $exponents[1]->toBytes(true),
- 'exponent2' => $exponents[2]->toBytes(true),
- 'coefficient' => $coefficients[2]->toBytes(true)
- );
-
- // if the format in question does not support multi-prime rsa and multi-prime rsa was used,
- // call _convertPublicKey() instead.
- switch ($this->privateKeyFormat) {
- case CRYPT_RSA_PRIVATE_FORMAT_XML:
- if ($num_primes != 2) {
- return false;
- }
- return "\r\n" .
- ' ' . base64_encode($raw['modulus']) . " \r\n" .
- ' ' . base64_encode($raw['publicExponent']) . " \r\n" .
- ' ' . base64_encode($raw['prime1']) . "
\r\n" .
- ' ' . base64_encode($raw['prime2']) . " \r\n" .
- ' ' . base64_encode($raw['exponent1']) . " \r\n" .
- ' ' . base64_encode($raw['exponent2']) . " \r\n" .
- ' ' . base64_encode($raw['coefficient']) . " \r\n" .
- ' ' . base64_encode($raw['privateExponent']) . " \r\n" .
- ' ';
- break;
- case CRYPT_RSA_PRIVATE_FORMAT_PUTTY:
- if ($num_primes != 2) {
- return false;
- }
- $key = "PuTTY-User-Key-File-2: ssh-rsa\r\nEncryption: ";
- $encryption = (!empty($this->password) || is_string($this->password)) ? 'aes256-cbc' : 'none';
- $key.= $encryption;
- $key.= "\r\nComment: " . $this->comment . "\r\n";
- $public = pack('Na*Na*Na*',
- strlen('ssh-rsa'), 'ssh-rsa', strlen($raw['publicExponent']), $raw['publicExponent'], strlen($raw['modulus']), $raw['modulus']
- );
- $source = pack('Na*Na*Na*Na*',
- strlen('ssh-rsa'), 'ssh-rsa', strlen($encryption), $encryption,
- strlen($this->comment), $this->comment, strlen($public), $public
- );
- $public = base64_encode($public);
- $key.= "Public-Lines: " . ((strlen($public) + 63) >> 6) . "\r\n";
- $key.= chunk_split($public, 64);
- $private = pack('Na*Na*Na*Na*',
- strlen($raw['privateExponent']), $raw['privateExponent'], strlen($raw['prime1']), $raw['prime1'],
- strlen($raw['prime2']), $raw['prime2'], strlen($raw['coefficient']), $raw['coefficient']
- );
- if (empty($this->password) && !is_string($this->password)) {
- $source.= pack('Na*', strlen($private), $private);
- $hashkey = 'putty-private-key-file-mac-key';
- } else {
- $private.= crypt_random_string(16 - (strlen($private) & 15));
- $source.= pack('Na*', strlen($private), $private);
- if (!class_exists('Crypt_AES')) {
- include_once 'Crypt/AES.php';
- }
- $sequence = 0;
- $symkey = '';
- while (strlen($symkey) < 32) {
- $temp = pack('Na*', $sequence++, $this->password);
- $symkey.= pack('H*', sha1($temp));
- }
- $symkey = substr($symkey, 0, 32);
- $crypto = new Crypt_AES();
-
- $crypto->setKey($symkey);
- $crypto->disablePadding();
- $private = $crypto->encrypt($private);
- $hashkey = 'putty-private-key-file-mac-key' . $this->password;
- }
-
- $private = base64_encode($private);
- $key.= 'Private-Lines: ' . ((strlen($private) + 63) >> 6) . "\r\n";
- $key.= chunk_split($private, 64);
- if (!class_exists('Crypt_Hash')) {
- include_once 'Crypt/Hash.php';
- }
- $hash = new Crypt_Hash('sha1');
- $hash->setKey(pack('H*', sha1($hashkey)));
- $key.= 'Private-MAC: ' . bin2hex($hash->hash($source)) . "\r\n";
-
- return $key;
- default: // eg. CRYPT_RSA_PRIVATE_FORMAT_PKCS1
- $components = array();
- foreach ($raw as $name => $value) {
- $components[$name] = pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($value)), $value);
- }
-
- $RSAPrivateKey = implode('', $components);
-
- if ($num_primes > 2) {
- $OtherPrimeInfos = '';
- for ($i = 3; $i <= $num_primes; $i++) {
- // OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo
- //
- // OtherPrimeInfo ::= SEQUENCE {
- // prime INTEGER, -- ri
- // exponent INTEGER, -- di
- // coefficient INTEGER -- ti
- // }
- $OtherPrimeInfo = pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($primes[$i]->toBytes(true))), $primes[$i]->toBytes(true));
- $OtherPrimeInfo.= pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($exponents[$i]->toBytes(true))), $exponents[$i]->toBytes(true));
- $OtherPrimeInfo.= pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($coefficients[$i]->toBytes(true))), $coefficients[$i]->toBytes(true));
- $OtherPrimeInfos.= pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfo)), $OtherPrimeInfo);
- }
- $RSAPrivateKey.= pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfos)), $OtherPrimeInfos);
- }
-
- $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey);
-
- if (!empty($this->password) || is_string($this->password)) {
- $iv = crypt_random_string(8);
- $symkey = pack('H*', md5($this->password . $iv)); // symkey is short for symmetric key
- $symkey.= substr(pack('H*', md5($symkey . $this->password . $iv)), 0, 8);
- if (!class_exists('Crypt_TripleDES')) {
- include_once 'Crypt/TripleDES.php';
- }
- $des = new Crypt_TripleDES();
- $des->setKey($symkey);
- $des->setIV($iv);
- $iv = strtoupper(bin2hex($iv));
- $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" .
- "Proc-Type: 4,ENCRYPTED\r\n" .
- "DEK-Info: DES-EDE3-CBC,$iv\r\n" .
- "\r\n" .
- chunk_split(base64_encode($des->encrypt($RSAPrivateKey)), 64) .
- '-----END RSA PRIVATE KEY-----';
- } else {
- $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" .
- chunk_split(base64_encode($RSAPrivateKey), 64) .
- '-----END RSA PRIVATE KEY-----';
- }
-
- return $RSAPrivateKey;
- }
- }
-
- /**
- * Convert a public key to the appropriate format
- *
- * @access private
- * @see setPublicKeyFormat()
- * @param String $RSAPrivateKey
- * @return String
- */
- function _convertPublicKey($n, $e)
- {
- $modulus = $n->toBytes(true);
- $publicExponent = $e->toBytes(true);
-
- switch ($this->publicKeyFormat) {
- case CRYPT_RSA_PUBLIC_FORMAT_RAW:
- return array('e' => $e->copy(), 'n' => $n->copy());
- case CRYPT_RSA_PUBLIC_FORMAT_XML:
- return "\r\n" .
- ' ' . base64_encode($modulus) . " \r\n" .
- ' ' . base64_encode($publicExponent) . " \r\n" .
- ' ';
- break;
- case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH:
- // from :
- // string "ssh-rsa"
- // mpint e
- // mpint n
- $RSAPublicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publicExponent), $publicExponent, strlen($modulus), $modulus);
- $RSAPublicKey = 'ssh-rsa ' . base64_encode($RSAPublicKey) . ' ' . $this->comment;
-
- return $RSAPublicKey;
- default: // eg. CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW or CRYPT_RSA_PUBLIC_FORMAT_PKCS1
- // from :
- // RSAPublicKey ::= SEQUENCE {
- // modulus INTEGER, -- n
- // publicExponent INTEGER -- e
- // }
- $components = array(
- 'modulus' => pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($modulus)), $modulus),
- 'publicExponent' => pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($publicExponent)), $publicExponent)
- );
-
- $RSAPublicKey = pack('Ca*a*a*',
- CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($components['modulus']) + strlen($components['publicExponent'])),
- $components['modulus'], $components['publicExponent']
- );
-
- if ($this->publicKeyFormat == CRYPT_RSA_PUBLIC_FORMAT_PKCS1) {
- // sequence(oid(1.2.840.113549.1.1.1), null)) = rsaEncryption.
- $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA
- $RSAPublicKey = chr(0) . $RSAPublicKey;
- $RSAPublicKey = chr(3) . $this->_encodeLength(strlen($RSAPublicKey)) . $RSAPublicKey;
-
- $RSAPublicKey = pack('Ca*a*',
- CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($rsaOID . $RSAPublicKey)), $rsaOID . $RSAPublicKey
- );
- }
-
- $RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" .
- chunk_split(base64_encode($RSAPublicKey), 64) .
- '-----END PUBLIC KEY-----';
-
- return $RSAPublicKey;
- }
- }
-
- /**
- * Break a public or private key down into its constituant components
- *
- * @access private
- * @see _convertPublicKey()
- * @see _convertPrivateKey()
- * @param String $key
- * @param Integer $type
- * @return Array
- */
- function _parseKey($key, $type)
- {
- if ($type != CRYPT_RSA_PUBLIC_FORMAT_RAW && !is_string($key)) {
- return false;
- }
-
- switch ($type) {
- case CRYPT_RSA_PUBLIC_FORMAT_RAW:
- if (!is_array($key)) {
- return false;
- }
- $components = array();
- switch (true) {
- case isset($key['e']):
- $components['publicExponent'] = $key['e']->copy();
- break;
- case isset($key['exponent']):
- $components['publicExponent'] = $key['exponent']->copy();
- break;
- case isset($key['publicExponent']):
- $components['publicExponent'] = $key['publicExponent']->copy();
- break;
- case isset($key[0]):
- $components['publicExponent'] = $key[0]->copy();
- }
- switch (true) {
- case isset($key['n']):
- $components['modulus'] = $key['n']->copy();
- break;
- case isset($key['modulo']):
- $components['modulus'] = $key['modulo']->copy();
- break;
- case isset($key['modulus']):
- $components['modulus'] = $key['modulus']->copy();
- break;
- case isset($key[1]):
- $components['modulus'] = $key[1]->copy();
- }
- return isset($components['modulus']) && isset($components['publicExponent']) ? $components : false;
- case CRYPT_RSA_PRIVATE_FORMAT_PKCS1:
- case CRYPT_RSA_PUBLIC_FORMAT_PKCS1:
- /* Although PKCS#1 proposes a format that public and private keys can use, encrypting them is
- "outside the scope" of PKCS#1. PKCS#1 then refers you to PKCS#12 and PKCS#15 if you're wanting to
- protect private keys, however, that's not what OpenSSL* does. OpenSSL protects private keys by adding
- two new "fields" to the key - DEK-Info and Proc-Type. These fields are discussed here:
-
- http://tools.ietf.org/html/rfc1421#section-4.6.1.1
- http://tools.ietf.org/html/rfc1421#section-4.6.1.3
-
- DES-EDE3-CBC as an algorithm, however, is not discussed anywhere, near as I can tell.
- DES-CBC and DES-EDE are discussed in RFC1423, however, DES-EDE3-CBC isn't, nor is its key derivation
- function. As is, the definitive authority on this encoding scheme isn't the IETF but rather OpenSSL's
- own implementation. ie. the implementation *is* the standard and any bugs that may exist in that
- implementation are part of the standard, as well.
-
- * OpenSSL is the de facto standard. It's utilized by OpenSSH and other projects */
- if (preg_match('#DEK-Info: (.+),(.+)#', $key, $matches)) {
- $iv = pack('H*', trim($matches[2]));
- $symkey = pack('H*', md5($this->password . substr($iv, 0, 8))); // symkey is short for symmetric key
- $symkey.= pack('H*', md5($symkey . $this->password . substr($iv, 0, 8)));
- // remove the Proc-Type / DEK-Info sections as they're no longer needed
- $key = preg_replace('#^(?:Proc-Type|DEK-Info): .*#m', '', $key);
- $ciphertext = $this->_extractBER($key);
- if ($ciphertext === false) {
- $ciphertext = $key;
- }
- switch ($matches[1]) {
- case 'AES-256-CBC':
- if (!class_exists('Crypt_AES')) {
- include_once 'Crypt/AES.php';
- }
- $crypto = new Crypt_AES();
- break;
- case 'AES-128-CBC':
- if (!class_exists('Crypt_AES')) {
- include_once 'Crypt/AES.php';
- }
- $symkey = substr($symkey, 0, 16);
- $crypto = new Crypt_AES();
- break;
- case 'DES-EDE3-CFB':
- if (!class_exists('Crypt_TripleDES')) {
- include_once 'Crypt/TripleDES.php';
- }
- $crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CFB);
- break;
- case 'DES-EDE3-CBC':
- if (!class_exists('Crypt_TripleDES')) {
- include_once 'Crypt/TripleDES.php';
- }
- $symkey = substr($symkey, 0, 24);
- $crypto = new Crypt_TripleDES();
- break;
- case 'DES-CBC':
- if (!class_exists('Crypt_DES')) {
- include_once 'Crypt/DES.php';
- }
- $crypto = new Crypt_DES();
- break;
- default:
- return false;
- }
- $crypto->setKey($symkey);
- $crypto->setIV($iv);
- $decoded = $crypto->decrypt($ciphertext);
- } else {
- $decoded = $this->_extractBER($key);
- }
-
- if ($decoded !== false) {
- $key = $decoded;
- }
-
- $components = array();
-
- if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) {
- return false;
- }
- if ($this->_decodeLength($key) != strlen($key)) {
- return false;
- }
-
- $tag = ord($this->_string_shift($key));
- /* intended for keys for which OpenSSL's asn1parse returns the following:
-
- 0:d=0 hl=4 l= 631 cons: SEQUENCE
- 4:d=1 hl=2 l= 1 prim: INTEGER :00
- 7:d=1 hl=2 l= 13 cons: SEQUENCE
- 9:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption
- 20:d=2 hl=2 l= 0 prim: NULL
- 22:d=1 hl=4 l= 609 prim: OCTET STRING */
-
- if ($tag == CRYPT_RSA_ASN1_INTEGER && substr($key, 0, 3) == "\x01\x00\x30") {
- $this->_string_shift($key, 3);
- $tag = CRYPT_RSA_ASN1_SEQUENCE;
- }
-
- if ($tag == CRYPT_RSA_ASN1_SEQUENCE) {
- /* intended for keys for which OpenSSL's asn1parse returns the following:
-
- 0:d=0 hl=4 l= 290 cons: SEQUENCE
- 4:d=1 hl=2 l= 13 cons: SEQUENCE
- 6:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption
- 17:d=2 hl=2 l= 0 prim: NULL
- 19:d=1 hl=4 l= 271 prim: BIT STRING */
- $this->_string_shift($key, $this->_decodeLength($key));
- $tag = ord($this->_string_shift($key)); // skip over the BIT STRING / OCTET STRING tag
- $this->_decodeLength($key); // skip over the BIT STRING / OCTET STRING length
- // "The initial octet shall encode, as an unsigned binary integer wtih bit 1 as the least significant bit, the number of
- // unused bits in the final subsequent octet. The number shall be in the range zero to seven."
- // -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf (section 8.6.2.2)
- if ($tag == CRYPT_RSA_ASN1_BITSTRING) {
- $this->_string_shift($key);
- }
- if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) {
- return false;
- }
- if ($this->_decodeLength($key) != strlen($key)) {
- return false;
- }
- $tag = ord($this->_string_shift($key));
- }
- if ($tag != CRYPT_RSA_ASN1_INTEGER) {
- return false;
- }
-
- $length = $this->_decodeLength($key);
- $temp = $this->_string_shift($key, $length);
- if (strlen($temp) != 1 || ord($temp) > 2) {
- $components['modulus'] = new Math_BigInteger($temp, 256);
- $this->_string_shift($key); // skip over CRYPT_RSA_ASN1_INTEGER
- $length = $this->_decodeLength($key);
- $components[$type == CRYPT_RSA_PUBLIC_FORMAT_PKCS1 ? 'publicExponent' : 'privateExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256);
-
- return $components;
- }
- if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_INTEGER) {
- return false;
- }
- $length = $this->_decodeLength($key);
- $components['modulus'] = new Math_BigInteger($this->_string_shift($key, $length), 256);
- $this->_string_shift($key);
- $length = $this->_decodeLength($key);
- $components['publicExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256);
- $this->_string_shift($key);
- $length = $this->_decodeLength($key);
- $components['privateExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256);
- $this->_string_shift($key);
- $length = $this->_decodeLength($key);
- $components['primes'] = array(1 => new Math_BigInteger($this->_string_shift($key, $length), 256));
- $this->_string_shift($key);
- $length = $this->_decodeLength($key);
- $components['primes'][] = new Math_BigInteger($this->_string_shift($key, $length), 256);
- $this->_string_shift($key);
- $length = $this->_decodeLength($key);
- $components['exponents'] = array(1 => new Math_BigInteger($this->_string_shift($key, $length), 256));
- $this->_string_shift($key);
- $length = $this->_decodeLength($key);
- $components['exponents'][] = new Math_BigInteger($this->_string_shift($key, $length), 256);
- $this->_string_shift($key);
- $length = $this->_decodeLength($key);
- $components['coefficients'] = array(2 => new Math_BigInteger($this->_string_shift($key, $length), 256));
-
- if (!empty($key)) {
- if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) {
- return false;
- }
- $this->_decodeLength($key);
- while (!empty($key)) {
- if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) {
- return false;
- }
- $this->_decodeLength($key);
- $key = substr($key, 1);
- $length = $this->_decodeLength($key);
- $components['primes'][] = new Math_BigInteger($this->_string_shift($key, $length), 256);
- $this->_string_shift($key);
- $length = $this->_decodeLength($key);
- $components['exponents'][] = new Math_BigInteger($this->_string_shift($key, $length), 256);
- $this->_string_shift($key);
- $length = $this->_decodeLength($key);
- $components['coefficients'][] = new Math_BigInteger($this->_string_shift($key, $length), 256);
- }
- }
-
- return $components;
- case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH:
- $parts = explode(' ', $key, 3);
-
- $key = isset($parts[1]) ? base64_decode($parts[1]) : false;
- if ($key === false) {
- return false;
- }
-
- $comment = isset($parts[2]) ? $parts[2] : false;
-
- $cleanup = substr($key, 0, 11) == "\0\0\0\7ssh-rsa";
-
- if (strlen($key) <= 4) {
- return false;
- }
- extract(unpack('Nlength', $this->_string_shift($key, 4)));
- $publicExponent = new Math_BigInteger($this->_string_shift($key, $length), -256);
- if (strlen($key) <= 4) {
- return false;
- }
- extract(unpack('Nlength', $this->_string_shift($key, 4)));
- $modulus = new Math_BigInteger($this->_string_shift($key, $length), -256);
-
- if ($cleanup && strlen($key)) {
- if (strlen($key) <= 4) {
- return false;
- }
- extract(unpack('Nlength', $this->_string_shift($key, 4)));
- $realModulus = new Math_BigInteger($this->_string_shift($key, $length), -256);
- return strlen($key) ? false : array(
- 'modulus' => $realModulus,
- 'publicExponent' => $modulus,
- 'comment' => $comment
- );
- } else {
- return strlen($key) ? false : array(
- 'modulus' => $modulus,
- 'publicExponent' => $publicExponent,
- 'comment' => $comment
- );
- }
- // http://www.w3.org/TR/xmldsig-core/#sec-RSAKeyValue
- // http://en.wikipedia.org/wiki/XML_Signature
- case CRYPT_RSA_PRIVATE_FORMAT_XML:
- case CRYPT_RSA_PUBLIC_FORMAT_XML:
- $this->components = array();
-
- $xml = xml_parser_create('UTF-8');
- xml_set_object($xml, $this);
- xml_set_element_handler($xml, '_start_element_handler', '_stop_element_handler');
- xml_set_character_data_handler($xml, '_data_handler');
- // add to account for "dangling" tags like ... that are sometimes added
- if (!xml_parse($xml, '' . $key . ' ')) {
- return false;
- }
-
- return isset($this->components['modulus']) && isset($this->components['publicExponent']) ? $this->components : false;
- // from PuTTY's SSHPUBK.C
- case CRYPT_RSA_PRIVATE_FORMAT_PUTTY:
- $components = array();
- $key = preg_split('#\r\n|\r|\n#', $key);
- $type = trim(preg_replace('#PuTTY-User-Key-File-2: (.+)#', '$1', $key[0]));
- if ($type != 'ssh-rsa') {
- return false;
- }
- $encryption = trim(preg_replace('#Encryption: (.+)#', '$1', $key[1]));
- $comment = trim(preg_replace('#Comment: (.+)#', '$1', $key[2]));
-
- $publicLength = trim(preg_replace('#Public-Lines: (\d+)#', '$1', $key[3]));
- $public = base64_decode(implode('', array_map('trim', array_slice($key, 4, $publicLength))));
- $public = substr($public, 11);
- extract(unpack('Nlength', $this->_string_shift($public, 4)));
- $components['publicExponent'] = new Math_BigInteger($this->_string_shift($public, $length), -256);
- extract(unpack('Nlength', $this->_string_shift($public, 4)));
- $components['modulus'] = new Math_BigInteger($this->_string_shift($public, $length), -256);
-
- $privateLength = trim(preg_replace('#Private-Lines: (\d+)#', '$1', $key[$publicLength + 4]));
- $private = base64_decode(implode('', array_map('trim', array_slice($key, $publicLength + 5, $privateLength))));
-
- switch ($encryption) {
- case 'aes256-cbc':
- if (!class_exists('Crypt_AES')) {
- include_once 'Crypt/AES.php';
- }
- $symkey = '';
- $sequence = 0;
- while (strlen($symkey) < 32) {
- $temp = pack('Na*', $sequence++, $this->password);
- $symkey.= pack('H*', sha1($temp));
- }
- $symkey = substr($symkey, 0, 32);
- $crypto = new Crypt_AES();
- }
-
- if ($encryption != 'none') {
- $crypto->setKey($symkey);
- $crypto->disablePadding();
- $private = $crypto->decrypt($private);
- if ($private === false) {
- return false;
- }
- }
-
- extract(unpack('Nlength', $this->_string_shift($private, 4)));
- if (strlen($private) < $length) {
- return false;
- }
- $components['privateExponent'] = new Math_BigInteger($this->_string_shift($private, $length), -256);
- extract(unpack('Nlength', $this->_string_shift($private, 4)));
- if (strlen($private) < $length) {
- return false;
- }
- $components['primes'] = array(1 => new Math_BigInteger($this->_string_shift($private, $length), -256));
- extract(unpack('Nlength', $this->_string_shift($private, 4)));
- if (strlen($private) < $length) {
- return false;
- }
- $components['primes'][] = new Math_BigInteger($this->_string_shift($private, $length), -256);
-
- $temp = $components['primes'][1]->subtract($this->one);
- $components['exponents'] = array(1 => $components['publicExponent']->modInverse($temp));
- $temp = $components['primes'][2]->subtract($this->one);
- $components['exponents'][] = $components['publicExponent']->modInverse($temp);
-
- extract(unpack('Nlength', $this->_string_shift($private, 4)));
- if (strlen($private) < $length) {
- return false;
- }
- $components['coefficients'] = array(2 => new Math_BigInteger($this->_string_shift($private, $length), -256));
-
- return $components;
- }
- }
-
- /**
- * Returns the key size
- *
- * More specifically, this returns the size of the modulo in bits.
- *
- * @access public
- * @return Integer
- */
- function getSize()
- {
- return !isset($this->modulus) ? 0 : strlen($this->modulus->toBits());
- }
-
- /**
- * Start Element Handler
- *
- * Called by xml_set_element_handler()
- *
- * @access private
- * @param Resource $parser
- * @param String $name
- * @param Array $attribs
- */
- function _start_element_handler($parser, $name, $attribs)
- {
- //$name = strtoupper($name);
- switch ($name) {
- case 'MODULUS':
- $this->current = &$this->components['modulus'];
- break;
- case 'EXPONENT':
- $this->current = &$this->components['publicExponent'];
- break;
- case 'P':
- $this->current = &$this->components['primes'][1];
- break;
- case 'Q':
- $this->current = &$this->components['primes'][2];
- break;
- case 'DP':
- $this->current = &$this->components['exponents'][1];
- break;
- case 'DQ':
- $this->current = &$this->components['exponents'][2];
- break;
- case 'INVERSEQ':
- $this->current = &$this->components['coefficients'][2];
- break;
- case 'D':
- $this->current = &$this->components['privateExponent'];
- }
- $this->current = '';
- }
-
- /**
- * Stop Element Handler
- *
- * Called by xml_set_element_handler()
- *
- * @access private
- * @param Resource $parser
- * @param String $name
- */
- function _stop_element_handler($parser, $name)
- {
- if (isset($this->current)) {
- $this->current = new Math_BigInteger(base64_decode($this->current), 256);
- unset($this->current);
- }
- }
-
- /**
- * Data Handler
- *
- * Called by xml_set_character_data_handler()
- *
- * @access private
- * @param Resource $parser
- * @param String $data
- */
- function _data_handler($parser, $data)
- {
- if (!isset($this->current) || is_object($this->current)) {
- return;
- }
- $this->current.= trim($data);
- }
-
- /**
- * Loads a public or private key
- *
- * Returns true on success and false on failure (ie. an incorrect password was provided or the key was malformed)
- *
- * @access public
- * @param String $key
- * @param Integer $type optional
- */
- function loadKey($key, $type = false)
- {
- if (is_object($key) && strtolower(get_class($key)) == 'crypt_rsa') {
- $this->privateKeyFormat = $key->privateKeyFormat;
- $this->publicKeyFormat = $key->publicKeyFormat;
- $this->k = $key->k;
- $this->hLen = $key->hLen;
- $this->sLen = $key->sLen;
- $this->mgfHLen = $key->mgfHLen;
- $this->encryptionMode = $key->encryptionMode;
- $this->signatureMode = $key->signatureMode;
- $this->password = $key->password;
- $this->configFile = $key->configFile;
- $this->comment = $key->comment;
-
- if (is_object($key->hash)) {
- $this->hash = new Crypt_Hash($key->hash->getHash());
- }
- if (is_object($key->mgfHash)) {
- $this->mgfHash = new Crypt_Hash($key->mgfHash->getHash());
- }
-
- if (is_object($key->modulus)) {
- $this->modulus = $key->modulus->copy();
- }
- if (is_object($key->exponent)) {
- $this->exponent = $key->exponent->copy();
- }
- if (is_object($key->publicExponent)) {
- $this->publicExponent = $key->publicExponent->copy();
- }
-
- $this->primes = array();
- $this->exponents = array();
- $this->coefficients = array();
-
- foreach ($this->primes as $prime) {
- $this->primes[] = $prime->copy();
- }
- foreach ($this->exponents as $exponent) {
- $this->exponents[] = $exponent->copy();
- }
- foreach ($this->coefficients as $coefficient) {
- $this->coefficients[] = $coefficient->copy();
- }
-
- return true;
- }
-
- if ($type === false) {
- $types = array(
- CRYPT_RSA_PUBLIC_FORMAT_RAW,
- CRYPT_RSA_PRIVATE_FORMAT_PKCS1,
- CRYPT_RSA_PRIVATE_FORMAT_XML,
- CRYPT_RSA_PRIVATE_FORMAT_PUTTY,
- CRYPT_RSA_PUBLIC_FORMAT_OPENSSH
- );
- foreach ($types as $type) {
- $components = $this->_parseKey($key, $type);
- if ($components !== false) {
- break;
- }
- }
-
- } else {
- $components = $this->_parseKey($key, $type);
- }
-
- if ($components === false) {
- return false;
- }
-
- if (isset($components['comment']) && $components['comment'] !== false) {
- $this->comment = $components['comment'];
- }
- $this->modulus = $components['modulus'];
- $this->k = strlen($this->modulus->toBytes());
- $this->exponent = isset($components['privateExponent']) ? $components['privateExponent'] : $components['publicExponent'];
- if (isset($components['primes'])) {
- $this->primes = $components['primes'];
- $this->exponents = $components['exponents'];
- $this->coefficients = $components['coefficients'];
- $this->publicExponent = $components['publicExponent'];
- } else {
- $this->primes = array();
- $this->exponents = array();
- $this->coefficients = array();
- $this->publicExponent = false;
- }
-
- return true;
- }
-
- /**
- * Sets the password
- *
- * Private keys can be encrypted with a password. To unset the password, pass in the empty string or false.
- * Or rather, pass in $password such that empty($password) && !is_string($password) is true.
- *
- * @see createKey()
- * @see loadKey()
- * @access public
- * @param String $password
- */
- function setPassword($password = false)
- {
- $this->password = $password;
- }
-
- /**
- * Defines the public key
- *
- * Some private key formats define the public exponent and some don't. Those that don't define it are problematic when
- * used in certain contexts. For example, in SSH-2, RSA authentication works by sending the public key along with a
- * message signed by the private key to the server. The SSH-2 server looks the public key up in an index of public keys
- * and if it's present then proceeds to verify the signature. Problem is, if your private key doesn't include the public
- * exponent this won't work unless you manually add the public exponent.
- *
- * Do note that when a new key is loaded the index will be cleared.
- *
- * Returns true on success, false on failure
- *
- * @see getPublicKey()
- * @access public
- * @param String $key optional
- * @param Integer $type optional
- * @return Boolean
- */
- function setPublicKey($key = false, $type = false)
- {
- // if a public key has already been loaded return false
- if (!empty($this->publicExponent)) {
- return false;
- }
-
- if ($key === false && !empty($this->modulus)) {
- $this->publicExponent = $this->exponent;
- return true;
- }
-
- if ($type === false) {
- $types = array(
- CRYPT_RSA_PUBLIC_FORMAT_RAW,
- CRYPT_RSA_PUBLIC_FORMAT_PKCS1,
- CRYPT_RSA_PUBLIC_FORMAT_XML,
- CRYPT_RSA_PUBLIC_FORMAT_OPENSSH
- );
- foreach ($types as $type) {
- $components = $this->_parseKey($key, $type);
- if ($components !== false) {
- break;
- }
- }
- } else {
- $components = $this->_parseKey($key, $type);
- }
-
- if ($components === false) {
- return false;
- }
-
- if (empty($this->modulus) || !$this->modulus->equals($components['modulus'])) {
- $this->modulus = $components['modulus'];
- $this->exponent = $this->publicExponent = $components['publicExponent'];
- return true;
- }
-
- $this->publicExponent = $components['publicExponent'];
-
- return true;
- }
-
- /**
- * Returns the public key
- *
- * The public key is only returned under two circumstances - if the private key had the public key embedded within it
- * or if the public key was set via setPublicKey(). If the currently loaded key is supposed to be the public key this
- * function won't return it since this library, for the most part, doesn't distinguish between public and private keys.
- *
- * @see getPublicKey()
- * @access public
- * @param String $key
- * @param Integer $type optional
- */
- function getPublicKey($type = CRYPT_RSA_PUBLIC_FORMAT_PKCS1)
- {
- if (empty($this->modulus) || empty($this->publicExponent)) {
- return false;
- }
-
- $oldFormat = $this->publicKeyFormat;
- $this->publicKeyFormat = $type;
- $temp = $this->_convertPublicKey($this->modulus, $this->publicExponent);
- $this->publicKeyFormat = $oldFormat;
- return $temp;
- }
-
- /**
- * Returns the private key
- *
- * The private key is only returned if the currently loaded key contains the constituent prime numbers.
- *
- * @see getPublicKey()
- * @access public
- * @param String $key
- * @param Integer $type optional
- */
- function getPrivateKey($type = CRYPT_RSA_PUBLIC_FORMAT_PKCS1)
- {
- if (empty($this->primes)) {
- return false;
- }
-
- $oldFormat = $this->privateKeyFormat;
- $this->privateKeyFormat = $type;
- $temp = $this->_convertPrivateKey($this->modulus, $this->publicExponent, $this->exponent, $this->primes, $this->exponents, $this->coefficients);
- $this->privateKeyFormat = $oldFormat;
- return $temp;
- }
-
- /**
- * Returns a minimalistic private key
- *
- * Returns the private key without the prime number constituants. Structurally identical to a public key that
- * hasn't been set as the public key
- *
- * @see getPrivateKey()
- * @access private
- * @param String $key
- * @param Integer $type optional
- */
- function _getPrivatePublicKey($mode = CRYPT_RSA_PUBLIC_FORMAT_PKCS1)
- {
- if (empty($this->modulus) || empty($this->exponent)) {
- return false;
- }
-
- $oldFormat = $this->publicKeyFormat;
- $this->publicKeyFormat = $mode;
- $temp = $this->_convertPublicKey($this->modulus, $this->exponent);
- $this->publicKeyFormat = $oldFormat;
- return $temp;
- }
-
- /**
- * __toString() magic method
- *
- * @access public
- */
- function __toString()
- {
- $key = $this->getPrivateKey($this->privateKeyFormat);
- if ($key !== false) {
- return $key;
- }
- $key = $this->_getPrivatePublicKey($this->publicKeyFormat);
- return $key !== false ? $key : '';
- }
-
- /**
- * __clone() magic method
- *
- * @access public
- */
- function __clone()
- {
- $key = new Crypt_RSA();
- $key->loadKey($this);
- return $key;
- }
-
- /**
- * Generates the smallest and largest numbers requiring $bits bits
- *
- * @access private
- * @param Integer $bits
- * @return Array
- */
- function _generateMinMax($bits)
- {
- $bytes = $bits >> 3;
- $min = str_repeat(chr(0), $bytes);
- $max = str_repeat(chr(0xFF), $bytes);
- $msb = $bits & 7;
- if ($msb) {
- $min = chr(1 << ($msb - 1)) . $min;
- $max = chr((1 << $msb) - 1) . $max;
- } else {
- $min[0] = chr(0x80);
- }
-
- return array(
- 'min' => new Math_BigInteger($min, 256),
- 'max' => new Math_BigInteger($max, 256)
- );
- }
-
- /**
- * DER-decode the length
- *
- * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See
- * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information.
- *
- * @access private
- * @param String $string
- * @return Integer
- */
- function _decodeLength(&$string)
- {
- $length = ord($this->_string_shift($string));
- if ( $length & 0x80 ) { // definite length, long form
- $length&= 0x7F;
- $temp = $this->_string_shift($string, $length);
- list(, $length) = unpack('N', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4));
- }
- return $length;
- }
-
- /**
- * DER-encode the length
- *
- * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See
- * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information.
- *
- * @access private
- * @param Integer $length
- * @return String
- */
- function _encodeLength($length)
- {
- if ($length <= 0x7F) {
- return chr($length);
- }
-
- $temp = ltrim(pack('N', $length), chr(0));
- return pack('Ca*', 0x80 | strlen($temp), $temp);
- }
-
- /**
- * String Shift
- *
- * Inspired by array_shift
- *
- * @param String $string
- * @param optional Integer $index
- * @return String
- * @access private
- */
- function _string_shift(&$string, $index = 1)
- {
- $substr = substr($string, 0, $index);
- $string = substr($string, $index);
- return $substr;
- }
-
- /**
- * Determines the private key format
- *
- * @see createKey()
- * @access public
- * @param Integer $format
- */
- function setPrivateKeyFormat($format)
- {
- $this->privateKeyFormat = $format;
- }
-
- /**
- * Determines the public key format
- *
- * @see createKey()
- * @access public
- * @param Integer $format
- */
- function setPublicKeyFormat($format)
- {
- $this->publicKeyFormat = $format;
- }
-
- /**
- * Determines which hashing function should be used
- *
- * Used with signature production / verification and (if the encryption mode is CRYPT_RSA_ENCRYPTION_OAEP) encryption and
- * decryption. If $hash isn't supported, sha1 is used.
- *
- * @access public
- * @param String $hash
- */
- function setHash($hash)
- {
- // Crypt_Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example.
- switch ($hash) {
- case 'md2':
- case 'md5':
- case 'sha1':
- case 'sha256':
- case 'sha384':
- case 'sha512':
- $this->hash = new Crypt_Hash($hash);
- $this->hashName = $hash;
- break;
- default:
- $this->hash = new Crypt_Hash('sha1');
- $this->hashName = 'sha1';
- }
- $this->hLen = $this->hash->getLength();
- }
-
- /**
- * Determines which hashing function should be used for the mask generation function
- *
- * The mask generation function is used by CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_SIGNATURE_PSS and although it's
- * best if Hash and MGFHash are set to the same thing this is not a requirement.
- *
- * @access public
- * @param String $hash
- */
- function setMGFHash($hash)
- {
- // Crypt_Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example.
- switch ($hash) {
- case 'md2':
- case 'md5':
- case 'sha1':
- case 'sha256':
- case 'sha384':
- case 'sha512':
- $this->mgfHash = new Crypt_Hash($hash);
- break;
- default:
- $this->mgfHash = new Crypt_Hash('sha1');
- }
- $this->mgfHLen = $this->mgfHash->getLength();
- }
-
- /**
- * Determines the salt length
- *
- * To quote from {@link http://tools.ietf.org/html/rfc3447#page-38 RFC3447#page-38}:
- *
- * Typical salt lengths in octets are hLen (the length of the output
- * of the hash function Hash) and 0.
- *
- * @access public
- * @param Integer $format
- */
- function setSaltLength($sLen)
- {
- $this->sLen = $sLen;
- }
-
- /**
- * Integer-to-Octet-String primitive
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-4.1 RFC3447#section-4.1}.
- *
- * @access private
- * @param Math_BigInteger $x
- * @param Integer $xLen
- * @return String
- */
- function _i2osp($x, $xLen)
- {
- $x = $x->toBytes();
- if (strlen($x) > $xLen) {
- user_error('Integer too large');
- return false;
- }
- return str_pad($x, $xLen, chr(0), STR_PAD_LEFT);
- }
-
- /**
- * Octet-String-to-Integer primitive
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-4.2 RFC3447#section-4.2}.
- *
- * @access private
- * @param String $x
- * @return Math_BigInteger
- */
- function _os2ip($x)
- {
- return new Math_BigInteger($x, 256);
- }
-
- /**
- * Exponentiate with or without Chinese Remainder Theorem
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.2}.
- *
- * @access private
- * @param Math_BigInteger $x
- * @return Math_BigInteger
- */
- function _exponentiate($x)
- {
- if (empty($this->primes) || empty($this->coefficients) || empty($this->exponents)) {
- return $x->modPow($this->exponent, $this->modulus);
- }
-
- $num_primes = count($this->primes);
-
- if (defined('CRYPT_RSA_DISABLE_BLINDING')) {
- $m_i = array(
- 1 => $x->modPow($this->exponents[1], $this->primes[1]),
- 2 => $x->modPow($this->exponents[2], $this->primes[2])
- );
- $h = $m_i[1]->subtract($m_i[2]);
- $h = $h->multiply($this->coefficients[2]);
- list(, $h) = $h->divide($this->primes[1]);
- $m = $m_i[2]->add($h->multiply($this->primes[2]));
-
- $r = $this->primes[1];
- for ($i = 3; $i <= $num_primes; $i++) {
- $m_i = $x->modPow($this->exponents[$i], $this->primes[$i]);
-
- $r = $r->multiply($this->primes[$i - 1]);
-
- $h = $m_i->subtract($m);
- $h = $h->multiply($this->coefficients[$i]);
- list(, $h) = $h->divide($this->primes[$i]);
-
- $m = $m->add($r->multiply($h));
- }
- } else {
- $smallest = $this->primes[1];
- for ($i = 2; $i <= $num_primes; $i++) {
- if ($smallest->compare($this->primes[$i]) > 0) {
- $smallest = $this->primes[$i];
- }
- }
-
- $one = new Math_BigInteger(1);
-
- $r = $one->random($one, $smallest->subtract($one));
-
- $m_i = array(
- 1 => $this->_blind($x, $r, 1),
- 2 => $this->_blind($x, $r, 2)
- );
- $h = $m_i[1]->subtract($m_i[2]);
- $h = $h->multiply($this->coefficients[2]);
- list(, $h) = $h->divide($this->primes[1]);
- $m = $m_i[2]->add($h->multiply($this->primes[2]));
-
- $r = $this->primes[1];
- for ($i = 3; $i <= $num_primes; $i++) {
- $m_i = $this->_blind($x, $r, $i);
-
- $r = $r->multiply($this->primes[$i - 1]);
-
- $h = $m_i->subtract($m);
- $h = $h->multiply($this->coefficients[$i]);
- list(, $h) = $h->divide($this->primes[$i]);
-
- $m = $m->add($r->multiply($h));
- }
- }
-
- return $m;
- }
-
- /**
- * Performs RSA Blinding
- *
- * Protects against timing attacks by employing RSA Blinding.
- * Returns $x->modPow($this->exponents[$i], $this->primes[$i])
- *
- * @access private
- * @param Math_BigInteger $x
- * @param Math_BigInteger $r
- * @param Integer $i
- * @return Math_BigInteger
- */
- function _blind($x, $r, $i)
- {
- $x = $x->multiply($r->modPow($this->publicExponent, $this->primes[$i]));
- $x = $x->modPow($this->exponents[$i], $this->primes[$i]);
-
- $r = $r->modInverse($this->primes[$i]);
- $x = $x->multiply($r);
- list(, $x) = $x->divide($this->primes[$i]);
-
- return $x;
- }
-
- /**
- * Performs blinded RSA equality testing
- *
- * Protects against a particular type of timing attack described.
- *
- * See {@link http://codahale.com/a-lesson-in-timing-attacks/ A Lesson In Timing Attacks (or, Don't use MessageDigest.isEquals)}
- *
- * Thanks for the heads up singpolyma!
- *
- * @access private
- * @param String $x
- * @param String $y
- * @return Boolean
- */
- function _equals($x, $y)
- {
- if (strlen($x) != strlen($y)) {
- return false;
- }
-
- $result = 0;
- for ($i = 0; $i < strlen($x); $i++) {
- $result |= ord($x[$i]) ^ ord($y[$i]);
- }
-
- return $result == 0;
- }
-
- /**
- * RSAEP
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.1}.
- *
- * @access private
- * @param Math_BigInteger $m
- * @return Math_BigInteger
- */
- function _rsaep($m)
- {
- if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) {
- user_error('Message representative out of range');
- return false;
- }
- return $this->_exponentiate($m);
- }
-
- /**
- * RSADP
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.2 RFC3447#section-5.1.2}.
- *
- * @access private
- * @param Math_BigInteger $c
- * @return Math_BigInteger
- */
- function _rsadp($c)
- {
- if ($c->compare($this->zero) < 0 || $c->compare($this->modulus) > 0) {
- user_error('Ciphertext representative out of range');
- return false;
- }
- return $this->_exponentiate($c);
- }
-
- /**
- * RSASP1
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.1 RFC3447#section-5.2.1}.
- *
- * @access private
- * @param Math_BigInteger $m
- * @return Math_BigInteger
- */
- function _rsasp1($m)
- {
- if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) {
- user_error('Message representative out of range');
- return false;
- }
- return $this->_exponentiate($m);
- }
-
- /**
- * RSAVP1
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.2 RFC3447#section-5.2.2}.
- *
- * @access private
- * @param Math_BigInteger $s
- * @return Math_BigInteger
- */
- function _rsavp1($s)
- {
- if ($s->compare($this->zero) < 0 || $s->compare($this->modulus) > 0) {
- user_error('Signature representative out of range');
- return false;
- }
- return $this->_exponentiate($s);
- }
-
- /**
- * MGF1
- *
- * See {@link http://tools.ietf.org/html/rfc3447#appendix-B.2.1 RFC3447#appendix-B.2.1}.
- *
- * @access private
- * @param String $mgfSeed
- * @param Integer $mgfLen
- * @return String
- */
- function _mgf1($mgfSeed, $maskLen)
- {
- // if $maskLen would yield strings larger than 4GB, PKCS#1 suggests a "Mask too long" error be output.
-
- $t = '';
- $count = ceil($maskLen / $this->mgfHLen);
- for ($i = 0; $i < $count; $i++) {
- $c = pack('N', $i);
- $t.= $this->mgfHash->hash($mgfSeed . $c);
- }
-
- return substr($t, 0, $maskLen);
- }
-
- /**
- * RSAES-OAEP-ENCRYPT
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.1 RFC3447#section-7.1.1} and
- * {http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding OAES}.
- *
- * @access private
- * @param String $m
- * @param String $l
- * @return String
- */
- function _rsaes_oaep_encrypt($m, $l = '')
- {
- $mLen = strlen($m);
-
- // Length checking
-
- // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error
- // be output.
-
- if ($mLen > $this->k - 2 * $this->hLen - 2) {
- user_error('Message too long');
- return false;
- }
-
- // EME-OAEP encoding
-
- $lHash = $this->hash->hash($l);
- $ps = str_repeat(chr(0), $this->k - $mLen - 2 * $this->hLen - 2);
- $db = $lHash . $ps . chr(1) . $m;
- $seed = crypt_random_string($this->hLen);
- $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1);
- $maskedDB = $db ^ $dbMask;
- $seedMask = $this->_mgf1($maskedDB, $this->hLen);
- $maskedSeed = $seed ^ $seedMask;
- $em = chr(0) . $maskedSeed . $maskedDB;
-
- // RSA encryption
-
- $m = $this->_os2ip($em);
- $c = $this->_rsaep($m);
- $c = $this->_i2osp($c, $this->k);
-
- // Output the ciphertext C
-
- return $c;
- }
-
- /**
- * RSAES-OAEP-DECRYPT
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.2 RFC3447#section-7.1.2}. The fact that the error
- * messages aren't distinguishable from one another hinders debugging, but, to quote from RFC3447#section-7.1.2:
- *
- * Note. Care must be taken to ensure that an opponent cannot
- * distinguish the different error conditions in Step 3.g, whether by
- * error message or timing, or, more generally, learn partial
- * information about the encoded message EM. Otherwise an opponent may
- * be able to obtain useful information about the decryption of the
- * ciphertext C, leading to a chosen-ciphertext attack such as the one
- * observed by Manger [36].
- *
- * As for $l... to quote from {@link http://tools.ietf.org/html/rfc3447#page-17 RFC3447#page-17}:
- *
- * Both the encryption and the decryption operations of RSAES-OAEP take
- * the value of a label L as input. In this version of PKCS #1, L is
- * the empty string; other uses of the label are outside the scope of
- * this document.
- *
- * @access private
- * @param String $c
- * @param String $l
- * @return String
- */
- function _rsaes_oaep_decrypt($c, $l = '')
- {
- // Length checking
-
- // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error
- // be output.
-
- if (strlen($c) != $this->k || $this->k < 2 * $this->hLen + 2) {
- user_error('Decryption error');
- return false;
- }
-
- // RSA decryption
-
- $c = $this->_os2ip($c);
- $m = $this->_rsadp($c);
- if ($m === false) {
- user_error('Decryption error');
- return false;
- }
- $em = $this->_i2osp($m, $this->k);
-
- // EME-OAEP decoding
-
- $lHash = $this->hash->hash($l);
- $y = ord($em[0]);
- $maskedSeed = substr($em, 1, $this->hLen);
- $maskedDB = substr($em, $this->hLen + 1);
- $seedMask = $this->_mgf1($maskedDB, $this->hLen);
- $seed = $maskedSeed ^ $seedMask;
- $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1);
- $db = $maskedDB ^ $dbMask;
- $lHash2 = substr($db, 0, $this->hLen);
- $m = substr($db, $this->hLen);
- if ($lHash != $lHash2) {
- user_error('Decryption error');
- return false;
- }
- $m = ltrim($m, chr(0));
- if (ord($m[0]) != 1) {
- user_error('Decryption error');
- return false;
- }
-
- // Output the message M
-
- return substr($m, 1);
- }
-
- /**
- * RSAES-PKCS1-V1_5-ENCRYPT
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.1 RFC3447#section-7.2.1}.
- *
- * @access private
- * @param String $m
- * @return String
- */
- function _rsaes_pkcs1_v1_5_encrypt($m)
- {
- $mLen = strlen($m);
-
- // Length checking
-
- if ($mLen > $this->k - 11) {
- user_error('Message too long');
- return false;
- }
-
- // EME-PKCS1-v1_5 encoding
-
- $psLen = $this->k - $mLen - 3;
- $ps = '';
- while (strlen($ps) != $psLen) {
- $temp = crypt_random_string($psLen - strlen($ps));
- $temp = str_replace("\x00", '', $temp);
- $ps.= $temp;
- }
- $type = 2;
- // see the comments of _rsaes_pkcs1_v1_5_decrypt() to understand why this is being done
- if (defined('CRYPT_RSA_PKCS15_COMPAT') && (!isset($this->publicExponent) || $this->exponent !== $this->publicExponent)) {
- $type = 1;
- // "The padding string PS shall consist of k-3-||D|| octets. ... for block type 01, they shall have value FF"
- $ps = str_repeat("\xFF", $psLen);
- }
- $em = chr(0) . chr($type) . $ps . chr(0) . $m;
-
- // RSA encryption
- $m = $this->_os2ip($em);
- $c = $this->_rsaep($m);
- $c = $this->_i2osp($c, $this->k);
-
- // Output the ciphertext C
-
- return $c;
- }
-
- /**
- * RSAES-PKCS1-V1_5-DECRYPT
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.2 RFC3447#section-7.2.2}.
- *
- * For compatability purposes, this function departs slightly from the description given in RFC3447.
- * The reason being that RFC2313#section-8.1 (PKCS#1 v1.5) states that ciphertext's encrypted by the
- * private key should have the second byte set to either 0 or 1 and that ciphertext's encrypted by the
- * public key should have the second byte set to 2. In RFC3447 (PKCS#1 v2.1), the second byte is supposed
- * to be 2 regardless of which key is used. For compatability purposes, we'll just check to make sure the
- * second byte is 2 or less. If it is, we'll accept the decrypted string as valid.
- *
- * As a consequence of this, a private key encrypted ciphertext produced with Crypt_RSA may not decrypt
- * with a strictly PKCS#1 v1.5 compliant RSA implementation. Public key encrypted ciphertext's should but
- * not private key encrypted ciphertext's.
- *
- * @access private
- * @param String $c
- * @return String
- */
- function _rsaes_pkcs1_v1_5_decrypt($c)
- {
- // Length checking
-
- if (strlen($c) != $this->k) { // or if k < 11
- user_error('Decryption error');
- return false;
- }
-
- // RSA decryption
-
- $c = $this->_os2ip($c);
- $m = $this->_rsadp($c);
-
- if ($m === false) {
- user_error('Decryption error');
- return false;
- }
- $em = $this->_i2osp($m, $this->k);
-
- // EME-PKCS1-v1_5 decoding
-
- if (ord($em[0]) != 0 || ord($em[1]) > 2) {
- user_error('Decryption error');
- return false;
- }
-
- $ps = substr($em, 2, strpos($em, chr(0), 2) - 2);
- $m = substr($em, strlen($ps) + 3);
-
- if (strlen($ps) < 8) {
- user_error('Decryption error');
- return false;
- }
-
- // Output M
-
- return $m;
- }
-
- /**
- * EMSA-PSS-ENCODE
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.1 RFC3447#section-9.1.1}.
- *
- * @access private
- * @param String $m
- * @param Integer $emBits
- */
- function _emsa_pss_encode($m, $emBits)
- {
- // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error
- // be output.
-
- $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8)
- $sLen = $this->sLen == false ? $this->hLen : $this->sLen;
-
- $mHash = $this->hash->hash($m);
- if ($emLen < $this->hLen + $sLen + 2) {
- user_error('Encoding error');
- return false;
- }
-
- $salt = crypt_random_string($sLen);
- $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt;
- $h = $this->hash->hash($m2);
- $ps = str_repeat(chr(0), $emLen - $sLen - $this->hLen - 2);
- $db = $ps . chr(1) . $salt;
- $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1);
- $maskedDB = $db ^ $dbMask;
- $maskedDB[0] = ~chr(0xFF << ($emBits & 7)) & $maskedDB[0];
- $em = $maskedDB . $h . chr(0xBC);
-
- return $em;
- }
-
- /**
- * EMSA-PSS-VERIFY
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.2 RFC3447#section-9.1.2}.
- *
- * @access private
- * @param String $m
- * @param String $em
- * @param Integer $emBits
- * @return String
- */
- function _emsa_pss_verify($m, $em, $emBits)
- {
- // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error
- // be output.
-
- $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8);
- $sLen = $this->sLen == false ? $this->hLen : $this->sLen;
-
- $mHash = $this->hash->hash($m);
- if ($emLen < $this->hLen + $sLen + 2) {
- return false;
- }
-
- if ($em[strlen($em) - 1] != chr(0xBC)) {
- return false;
- }
-
- $maskedDB = substr($em, 0, -$this->hLen - 1);
- $h = substr($em, -$this->hLen - 1, $this->hLen);
- $temp = chr(0xFF << ($emBits & 7));
- if ((~$maskedDB[0] & $temp) != $temp) {
- return false;
- }
- $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1);
- $db = $maskedDB ^ $dbMask;
- $db[0] = ~chr(0xFF << ($emBits & 7)) & $db[0];
- $temp = $emLen - $this->hLen - $sLen - 2;
- if (substr($db, 0, $temp) != str_repeat(chr(0), $temp) || ord($db[$temp]) != 1) {
- return false;
- }
- $salt = substr($db, $temp + 1); // should be $sLen long
- $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt;
- $h2 = $this->hash->hash($m2);
- return $this->_equals($h, $h2);
- }
-
- /**
- * RSASSA-PSS-SIGN
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.1 RFC3447#section-8.1.1}.
- *
- * @access private
- * @param String $m
- * @return String
- */
- function _rsassa_pss_sign($m)
- {
- // EMSA-PSS encoding
-
- $em = $this->_emsa_pss_encode($m, 8 * $this->k - 1);
-
- // RSA signature
-
- $m = $this->_os2ip($em);
- $s = $this->_rsasp1($m);
- $s = $this->_i2osp($s, $this->k);
-
- // Output the signature S
-
- return $s;
- }
-
- /**
- * RSASSA-PSS-VERIFY
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.2 RFC3447#section-8.1.2}.
- *
- * @access private
- * @param String $m
- * @param String $s
- * @return String
- */
- function _rsassa_pss_verify($m, $s)
- {
- // Length checking
-
- if (strlen($s) != $this->k) {
- user_error('Invalid signature');
- return false;
- }
-
- // RSA verification
-
- $modBits = 8 * $this->k;
-
- $s2 = $this->_os2ip($s);
- $m2 = $this->_rsavp1($s2);
- if ($m2 === false) {
- user_error('Invalid signature');
- return false;
- }
- $em = $this->_i2osp($m2, $modBits >> 3);
- if ($em === false) {
- user_error('Invalid signature');
- return false;
- }
-
- // EMSA-PSS verification
-
- return $this->_emsa_pss_verify($m, $em, $modBits - 1);
- }
-
- /**
- * EMSA-PKCS1-V1_5-ENCODE
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-9.2 RFC3447#section-9.2}.
- *
- * @access private
- * @param String $m
- * @param Integer $emLen
- * @return String
- */
- function _emsa_pkcs1_v1_5_encode($m, $emLen)
- {
- $h = $this->hash->hash($m);
- if ($h === false) {
- return false;
- }
-
- // see http://tools.ietf.org/html/rfc3447#page-43
- switch ($this->hashName) {
- case 'md2':
- $t = pack('H*', '3020300c06082a864886f70d020205000410');
- break;
- case 'md5':
- $t = pack('H*', '3020300c06082a864886f70d020505000410');
- break;
- case 'sha1':
- $t = pack('H*', '3021300906052b0e03021a05000414');
- break;
- case 'sha256':
- $t = pack('H*', '3031300d060960864801650304020105000420');
- break;
- case 'sha384':
- $t = pack('H*', '3041300d060960864801650304020205000430');
- break;
- case 'sha512':
- $t = pack('H*', '3051300d060960864801650304020305000440');
- }
- $t.= $h;
- $tLen = strlen($t);
-
- if ($emLen < $tLen + 11) {
- user_error('Intended encoded message length too short');
- return false;
- }
-
- $ps = str_repeat(chr(0xFF), $emLen - $tLen - 3);
-
- $em = "\0\1$ps\0$t";
-
- return $em;
- }
-
- /**
- * RSASSA-PKCS1-V1_5-SIGN
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.1 RFC3447#section-8.2.1}.
- *
- * @access private
- * @param String $m
- * @return String
- */
- function _rsassa_pkcs1_v1_5_sign($m)
- {
- // EMSA-PKCS1-v1_5 encoding
-
- $em = $this->_emsa_pkcs1_v1_5_encode($m, $this->k);
- if ($em === false) {
- user_error('RSA modulus too short');
- return false;
- }
-
- // RSA signature
-
- $m = $this->_os2ip($em);
- $s = $this->_rsasp1($m);
- $s = $this->_i2osp($s, $this->k);
-
- // Output the signature S
-
- return $s;
- }
-
- /**
- * RSASSA-PKCS1-V1_5-VERIFY
- *
- * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.2 RFC3447#section-8.2.2}.
- *
- * @access private
- * @param String $m
- * @return String
- */
- function _rsassa_pkcs1_v1_5_verify($m, $s)
- {
- // Length checking
-
- if (strlen($s) != $this->k) {
- user_error('Invalid signature');
- return false;
- }
-
- // RSA verification
-
- $s = $this->_os2ip($s);
- $m2 = $this->_rsavp1($s);
- if ($m2 === false) {
- user_error('Invalid signature');
- return false;
- }
- $em = $this->_i2osp($m2, $this->k);
- if ($em === false) {
- user_error('Invalid signature');
- return false;
- }
-
- // EMSA-PKCS1-v1_5 encoding
-
- $em2 = $this->_emsa_pkcs1_v1_5_encode($m, $this->k);
- if ($em2 === false) {
- user_error('RSA modulus too short');
- return false;
- }
-
- // Compare
- return $this->_equals($em, $em2);
- }
-
- /**
- * Set Encryption Mode
- *
- * Valid values include CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_ENCRYPTION_PKCS1.
- *
- * @access public
- * @param Integer $mode
- */
- function setEncryptionMode($mode)
- {
- $this->encryptionMode = $mode;
- }
-
- /**
- * Set Signature Mode
- *
- * Valid values include CRYPT_RSA_SIGNATURE_PSS and CRYPT_RSA_SIGNATURE_PKCS1
- *
- * @access public
- * @param Integer $mode
- */
- function setSignatureMode($mode)
- {
- $this->signatureMode = $mode;
- }
-
- /**
- * Set public key comment.
- *
- * @access public
- * @param String $comment
- */
- function setComment($comment)
- {
- $this->comment = $comment;
- }
-
- /**
- * Get public key comment.
- *
- * @access public
- * @return String
- */
- function getComment()
- {
- return $this->comment;
- }
-
- /**
- * Encryption
- *
- * Both CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_ENCRYPTION_PKCS1 both place limits on how long $plaintext can be.
- * If $plaintext exceeds those limits it will be broken up so that it does and the resultant ciphertext's will
- * be concatenated together.
- *
- * @see decrypt()
- * @access public
- * @param String $plaintext
- * @return String
- */
- function encrypt($plaintext)
- {
- switch ($this->encryptionMode) {
- case CRYPT_RSA_ENCRYPTION_PKCS1:
- $length = $this->k - 11;
- if ($length <= 0) {
- return false;
- }
-
- $plaintext = str_split($plaintext, $length);
- $ciphertext = '';
- foreach ($plaintext as $m) {
- $ciphertext.= $this->_rsaes_pkcs1_v1_5_encrypt($m);
- }
- return $ciphertext;
- //case CRYPT_RSA_ENCRYPTION_OAEP:
- default:
- $length = $this->k - 2 * $this->hLen - 2;
- if ($length <= 0) {
- return false;
- }
-
- $plaintext = str_split($plaintext, $length);
- $ciphertext = '';
- foreach ($plaintext as $m) {
- $ciphertext.= $this->_rsaes_oaep_encrypt($m);
- }
- return $ciphertext;
- }
- }
-
- /**
- * Decryption
- *
- * @see encrypt()
- * @access public
- * @param String $plaintext
- * @return String
- */
- function decrypt($ciphertext)
- {
- if ($this->k <= 0) {
- return false;
- }
-
- $ciphertext = str_split($ciphertext, $this->k);
- $ciphertext[count($ciphertext) - 1] = str_pad($ciphertext[count($ciphertext) - 1], $this->k, chr(0), STR_PAD_LEFT);
-
- $plaintext = '';
-
- switch ($this->encryptionMode) {
- case CRYPT_RSA_ENCRYPTION_PKCS1:
- $decrypt = '_rsaes_pkcs1_v1_5_decrypt';
- break;
- //case CRYPT_RSA_ENCRYPTION_OAEP:
- default:
- $decrypt = '_rsaes_oaep_decrypt';
- }
-
- foreach ($ciphertext as $c) {
- $temp = $this->$decrypt($c);
- if ($temp === false) {
- return false;
- }
- $plaintext.= $temp;
- }
-
- return $plaintext;
- }
-
- /**
- * Create a signature
- *
- * @see verify()
- * @access public
- * @param String $message
- * @return String
- */
- function sign($message)
- {
- if (empty($this->modulus) || empty($this->exponent)) {
- return false;
- }
-
- switch ($this->signatureMode) {
- case CRYPT_RSA_SIGNATURE_PKCS1:
- return $this->_rsassa_pkcs1_v1_5_sign($message);
- //case CRYPT_RSA_SIGNATURE_PSS:
- default:
- return $this->_rsassa_pss_sign($message);
- }
- }
-
- /**
- * Verifies a signature
- *
- * @see sign()
- * @access public
- * @param String $message
- * @param String $signature
- * @return Boolean
- */
- function verify($message, $signature)
- {
- if (empty($this->modulus) || empty($this->exponent)) {
- return false;
- }
-
- switch ($this->signatureMode) {
- case CRYPT_RSA_SIGNATURE_PKCS1:
- return $this->_rsassa_pkcs1_v1_5_verify($message, $signature);
- //case CRYPT_RSA_SIGNATURE_PSS:
- default:
- return $this->_rsassa_pss_verify($message, $signature);
- }
- }
-
- /**
- * Extract raw BER from Base64 encoding
- *
- * @access private
- * @param String $str
- * @return String
- */
- function _extractBER($str)
- {
- /* X.509 certs are assumed to be base64 encoded but sometimes they'll have additional things in them
- * above and beyond the ceritificate.
- * ie. some may have the following preceding the -----BEGIN CERTIFICATE----- line:
- *
- * Bag Attributes
- * localKeyID: 01 00 00 00
- * subject=/O=organization/OU=org unit/CN=common name
- * issuer=/O=organization/CN=common name
- */
- $temp = preg_replace('#.*?^-+[^-]+-+#ms', '', $str, 1);
- // remove the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- stuff
- $temp = preg_replace('#-+[^-]+-+#', '', $temp);
- // remove new lines
- $temp = str_replace(array("\r", "\n", ' '), '', $temp);
- $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false;
- return $temp != false ? $temp : $str;
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Random.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Random.php
deleted file mode 100644
index 977ec79726b2a16c9259cc230ca240a3ee4e8f92..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Random.php
+++ /dev/null
@@ -1,246 +0,0 @@
-
- *
- *
- *
- * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @category Crypt
- * @package Crypt_Random
- * @author Jim Wigginton
- * @copyright MMVII Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- */
-
-/**
- * "Is Windows" test
- *
- * @access private
- */
-define('CRYPT_RANDOM_IS_WINDOWS', strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');
-
-/**
- * Generate a random string.
- *
- * Although microoptimizations are generally discouraged as they impair readability this function is ripe with
- * microoptimizations because this function has the potential of being called a huge number of times.
- * eg. for RSA key generation.
- *
- * @param Integer $length
- * @return String
- * @access public
- */
-function crypt_random_string($length)
-{
- if (CRYPT_RANDOM_IS_WINDOWS) {
- // method 1. prior to PHP 5.3 this would call rand() on windows hence the function_exists('class_alias') call.
- // ie. class_alias is a function that was introduced in PHP 5.3
- if (function_exists('mcrypt_create_iv') && function_exists('class_alias')) {
- return mcrypt_create_iv($length);
- }
- // method 2. openssl_random_pseudo_bytes was introduced in PHP 5.3.0 but prior to PHP 5.3.4 there was,
- // to quote , "possible blocking behavior". as of 5.3.4
- // openssl_random_pseudo_bytes and mcrypt_create_iv do the exact same thing on Windows. ie. they both
- // call php_win32_get_random_bytes():
- //
- // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/openssl/openssl.c#L5008
- // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1392
- //
- // php_win32_get_random_bytes() is defined thusly:
- //
- // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/win32/winutil.c#L80
- //
- // we're calling it, all the same, in the off chance that the mcrypt extension is not available
- if (function_exists('openssl_random_pseudo_bytes') && version_compare(PHP_VERSION, '5.3.4', '>=')) {
- return openssl_random_pseudo_bytes($length);
- }
- } else {
- // method 1. the fastest
- if (function_exists('openssl_random_pseudo_bytes')) {
- return openssl_random_pseudo_bytes($length);
- }
- // method 2
- static $fp = true;
- if ($fp === true) {
- // warning's will be output unles the error suppression operator is used. errors such as
- // "open_basedir restriction in effect", "Permission denied", "No such file or directory", etc.
- $fp = @fopen('/dev/urandom', 'rb');
- }
- if ($fp !== true && $fp !== false) { // surprisingly faster than !is_bool() or is_resource()
- return fread($fp, $length);
- }
- // method 3. pretty much does the same thing as method 2 per the following url:
- // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1391
- // surprisingly slower than method 2. maybe that's because mcrypt_create_iv does a bunch of error checking that we're
- // not doing. regardless, this'll only be called if this PHP script couldn't open /dev/urandom due to open_basedir
- // restrictions or some such
- if (function_exists('mcrypt_create_iv')) {
- return mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);
- }
- }
- // at this point we have no choice but to use a pure-PHP CSPRNG
-
- // cascade entropy across multiple PHP instances by fixing the session and collecting all
- // environmental variables, including the previous session data and the current session
- // data.
- //
- // mt_rand seeds itself by looking at the PID and the time, both of which are (relatively)
- // easy to guess at. linux uses mouse clicks, keyboard timings, etc, as entropy sources, but
- // PHP isn't low level to be able to use those as sources and on a web server there's not likely
- // going to be a ton of keyboard or mouse action. web servers do have one thing that we can use
- // however. a ton of people visiting the website. obviously you don't want to base your seeding
- // soley on parameters a potential attacker sends but (1) not everything in $_SERVER is controlled
- // by the user and (2) this isn't just looking at the data sent by the current user - it's based
- // on the data sent by all users. one user requests the page and a hash of their info is saved.
- // another user visits the page and the serialization of their data is utilized along with the
- // server envirnment stuff and a hash of the previous http request data (which itself utilizes
- // a hash of the session data before that). certainly an attacker should be assumed to have
- // full control over his own http requests. he, however, is not going to have control over
- // everyone's http requests.
- static $crypto = false, $v;
- if ($crypto === false) {
- // save old session data
- $old_session_id = session_id();
- $old_use_cookies = ini_get('session.use_cookies');
- $old_session_cache_limiter = session_cache_limiter();
- $_OLD_SESSION = isset($_SESSION) ? $_SESSION : false;
- if ($old_session_id != '') {
- session_write_close();
- }
-
- session_id(1);
- ini_set('session.use_cookies', 0);
- session_cache_limiter('');
- session_start();
-
- $v = $seed = $_SESSION['seed'] = pack('H*', sha1(
- serialize($_SERVER) .
- serialize($_POST) .
- serialize($_GET) .
- serialize($_COOKIE) .
- serialize($GLOBALS) .
- serialize($_SESSION) .
- serialize($_OLD_SESSION)
- ));
- if (!isset($_SESSION['count'])) {
- $_SESSION['count'] = 0;
- }
- $_SESSION['count']++;
-
- session_write_close();
-
- // restore old session data
- if ($old_session_id != '') {
- session_id($old_session_id);
- session_start();
- ini_set('session.use_cookies', $old_use_cookies);
- session_cache_limiter($old_session_cache_limiter);
- } else {
- if ($_OLD_SESSION !== false) {
- $_SESSION = $_OLD_SESSION;
- unset($_OLD_SESSION);
- } else {
- unset($_SESSION);
- }
- }
-
- // in SSH2 a shared secret and an exchange hash are generated through the key exchange process.
- // the IV client to server is the hash of that "nonce" with the letter A and for the encryption key it's the letter C.
- // if the hash doesn't produce enough a key or an IV that's long enough concat successive hashes of the
- // original hash and the current hash. we'll be emulating that. for more info see the following URL:
- //
- // http://tools.ietf.org/html/rfc4253#section-7.2
- //
- // see the is_string($crypto) part for an example of how to expand the keys
- $key = pack('H*', sha1($seed . 'A'));
- $iv = pack('H*', sha1($seed . 'C'));
-
- // ciphers are used as per the nist.gov link below. also, see this link:
- //
- // http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator#Designs_based_on_cryptographic_primitives
- switch (true) {
- case class_exists('Crypt_AES'):
- $crypto = new Crypt_AES(CRYPT_AES_MODE_CTR);
- break;
- case class_exists('Crypt_TripleDES'):
- $crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CTR);
- break;
- case class_exists('Crypt_DES'):
- $crypto = new Crypt_DES(CRYPT_DES_MODE_CTR);
- break;
- case class_exists('Crypt_RC4'):
- $crypto = new Crypt_RC4();
- break;
- default:
- $crypto = $seed;
- return crypt_random_string($length);
- }
-
- $crypto->setKey($key);
- $crypto->setIV($iv);
- $crypto->enableContinuousBuffer();
- }
-
- if (is_string($crypto)) {
- // the following is based off of ANSI X9.31:
- //
- // http://csrc.nist.gov/groups/STM/cavp/documents/rng/931rngext.pdf
- //
- // OpenSSL uses that same standard for it's random numbers:
- //
- // http://www.opensource.apple.com/source/OpenSSL/OpenSSL-38/openssl/fips-1.0/rand/fips_rand.c
- // (do a search for "ANS X9.31 A.2.4")
- //
- // ANSI X9.31 recommends ciphers be used and phpseclib does use them if they're available (see
- // later on in the code) but if they're not we'll use sha1
- $result = '';
- while (strlen($result) < $length) { // each loop adds 20 bytes
- // microtime() isn't packed as "densely" as it could be but then neither is that the idea.
- // the idea is simply to ensure that each "block" has a unique element to it.
- $i = pack('H*', sha1(microtime()));
- $r = pack('H*', sha1($i ^ $v));
- $v = pack('H*', sha1($r ^ $i));
- $result.= $r;
- }
- return substr($result, 0, $length);
- }
-
- //return $crypto->encrypt(str_repeat("\0", $length));
-
- $result = '';
- while (strlen($result) < $length) {
- $i = $crypto->encrypt(microtime());
- $r = $crypto->encrypt($i ^ $v);
- $v = $crypto->encrypt($r ^ $i);
- $result.= $r;
- }
- return substr($result, 0, $length);
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Rijndael.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Rijndael.php
deleted file mode 100644
index 42531516cf84fe16d9f6f5b4418b530f5f8e9d81..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Rijndael.php
+++ /dev/null
@@ -1,1371 +0,0 @@
-
- * setKey('abcdefghijklmnop');
- *
- * $size = 10 * 1024;
- * $plaintext = '';
- * for ($i = 0; $i < $size; $i++) {
- * $plaintext.= 'a';
- * }
- *
- * echo $rijndael->decrypt($rijndael->encrypt($plaintext));
- * ?>
- *
- *
- * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @category Crypt
- * @package Crypt_Rijndael
- * @author Jim Wigginton
- * @copyright MMVIII Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- */
-
-/**
- * Include Crypt_Base
- *
- * Base cipher class
- */
-if (!class_exists('Crypt_Base')) {
- include_once 'Base.php';
-}
-
-/**#@+
- * @access public
- * @see Crypt_Rijndael::encrypt()
- * @see Crypt_Rijndael::decrypt()
- */
-/**
- * Encrypt / decrypt using the Counter mode.
- *
- * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
- */
-define('CRYPT_RIJNDAEL_MODE_CTR', CRYPT_MODE_CTR);
-/**
- * Encrypt / decrypt using the Electronic Code Book mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
- */
-define('CRYPT_RIJNDAEL_MODE_ECB', CRYPT_MODE_ECB);
-/**
- * Encrypt / decrypt using the Code Book Chaining mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
- */
-define('CRYPT_RIJNDAEL_MODE_CBC', CRYPT_MODE_CBC);
-/**
- * Encrypt / decrypt using the Cipher Feedback mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
- */
-define('CRYPT_RIJNDAEL_MODE_CFB', CRYPT_MODE_CFB);
-/**
- * Encrypt / decrypt using the Cipher Feedback mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
- */
-define('CRYPT_RIJNDAEL_MODE_OFB', CRYPT_MODE_OFB);
-/**#@-*/
-
-/**#@+
- * @access private
- * @see Crypt_Rijndael::Crypt_Rijndael()
- */
-/**
- * Toggles the internal implementation
- */
-define('CRYPT_RIJNDAEL_MODE_INTERNAL', CRYPT_MODE_INTERNAL);
-/**
- * Toggles the mcrypt implementation
- */
-define('CRYPT_RIJNDAEL_MODE_MCRYPT', CRYPT_MODE_MCRYPT);
-/**#@-*/
-
-/**
- * Pure-PHP implementation of Rijndael.
- *
- * @package Crypt_Rijndael
- * @author Jim Wigginton
- * @version 0.1.0
- * @access public
- */
-class Crypt_Rijndael extends Crypt_Base
-{
- /**
- * The default password key_size used by setPassword()
- *
- * @see Crypt_Base::password_key_size
- * @see Crypt_Base::setPassword()
- * @var Integer
- * @access private
- */
- var $password_key_size = 16;
-
- /**
- * The namespace used by the cipher for its constants.
- *
- * @see Crypt_Base::const_namespace
- * @var String
- * @access private
- */
- var $const_namespace = 'RIJNDAEL';
-
- /**
- * The mcrypt specific name of the cipher
- *
- * Mcrypt is useable for 128/192/256-bit $block_size/$key_size. For 160/224 not.
- * Crypt_Rijndael determines automatically whether mcrypt is useable
- * or not for the current $block_size/$key_size.
- * In case of, $cipher_name_mcrypt will be set dynamicaly at run time accordingly.
- *
- * @see Crypt_Base::cipher_name_mcrypt
- * @see Crypt_Base::engine
- * @see _setupEngine()
- * @var String
- * @access private
- */
- var $cipher_name_mcrypt = 'rijndael-128';
-
- /**
- * The default salt used by setPassword()
- *
- * @see Crypt_Base::password_default_salt
- * @see Crypt_Base::setPassword()
- * @var String
- * @access private
- */
- var $password_default_salt = 'phpseclib';
-
- /**
- * Has the key length explicitly been set or should it be derived from the key, itself?
- *
- * @see setKeyLength()
- * @var Boolean
- * @access private
- */
- var $explicit_key_length = false;
-
- /**
- * The Key Schedule
- *
- * @see _setup()
- * @var Array
- * @access private
- */
- var $w;
-
- /**
- * The Inverse Key Schedule
- *
- * @see _setup()
- * @var Array
- * @access private
- */
- var $dw;
-
- /**
- * The Block Length divided by 32
- *
- * @see setBlockLength()
- * @var Integer
- * @access private
- * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4. Exists in conjunction with $block_size
- * because the encryption / decryption / key schedule creation requires this number and not $block_size. We could
- * derive this from $block_size or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu
- * of that, we'll just precompute it once.
- *
- */
- var $Nb = 4;
-
- /**
- * The Key Length
- *
- * @see setKeyLength()
- * @var Integer
- * @access private
- * @internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16. Exists in conjunction with $Nk
- * because the encryption / decryption / key schedule creation requires this number and not $key_size. We could
- * derive this from $key_size or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu
- * of that, we'll just precompute it once.
- */
- var $key_size = 16;
-
- /**
- * The Key Length divided by 32
- *
- * @see setKeyLength()
- * @var Integer
- * @access private
- * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4
- */
- var $Nk = 4;
-
- /**
- * The Number of Rounds
- *
- * @var Integer
- * @access private
- * @internal The max value is 14, the min value is 10.
- */
- var $Nr;
-
- /**
- * Shift offsets
- *
- * @var Array
- * @access private
- */
- var $c;
-
- /**
- * Holds the last used key- and block_size information
- *
- * @var Array
- * @access private
- */
- var $kl;
-
- /**
- * Precomputed mixColumns table
- *
- * According to (section 5.2.1),
- * precomputed tables can be used in the mixColumns phase. in that example, they're assigned t0...t3, so
- * those are the names we'll use.
- *
- * @see Crypt_Rijndael:_encryptBlock()
- * @see Crypt_Rijndael:_decryptBlock()
- * @var Array
- * @access private
- */
- var $t0 = array(
- 0xC66363A5, 0xF87C7C84, 0xEE777799, 0xF67B7B8D, 0xFFF2F20D, 0xD66B6BBD, 0xDE6F6FB1, 0x91C5C554,
- 0x60303050, 0x02010103, 0xCE6767A9, 0x562B2B7D, 0xE7FEFE19, 0xB5D7D762, 0x4DABABE6, 0xEC76769A,
- 0x8FCACA45, 0x1F82829D, 0x89C9C940, 0xFA7D7D87, 0xEFFAFA15, 0xB25959EB, 0x8E4747C9, 0xFBF0F00B,
- 0x41ADADEC, 0xB3D4D467, 0x5FA2A2FD, 0x45AFAFEA, 0x239C9CBF, 0x53A4A4F7, 0xE4727296, 0x9BC0C05B,
- 0x75B7B7C2, 0xE1FDFD1C, 0x3D9393AE, 0x4C26266A, 0x6C36365A, 0x7E3F3F41, 0xF5F7F702, 0x83CCCC4F,
- 0x6834345C, 0x51A5A5F4, 0xD1E5E534, 0xF9F1F108, 0xE2717193, 0xABD8D873, 0x62313153, 0x2A15153F,
- 0x0804040C, 0x95C7C752, 0x46232365, 0x9DC3C35E, 0x30181828, 0x379696A1, 0x0A05050F, 0x2F9A9AB5,
- 0x0E070709, 0x24121236, 0x1B80809B, 0xDFE2E23D, 0xCDEBEB26, 0x4E272769, 0x7FB2B2CD, 0xEA75759F,
- 0x1209091B, 0x1D83839E, 0x582C2C74, 0x341A1A2E, 0x361B1B2D, 0xDC6E6EB2, 0xB45A5AEE, 0x5BA0A0FB,
- 0xA45252F6, 0x763B3B4D, 0xB7D6D661, 0x7DB3B3CE, 0x5229297B, 0xDDE3E33E, 0x5E2F2F71, 0x13848497,
- 0xA65353F5, 0xB9D1D168, 0x00000000, 0xC1EDED2C, 0x40202060, 0xE3FCFC1F, 0x79B1B1C8, 0xB65B5BED,
- 0xD46A6ABE, 0x8DCBCB46, 0x67BEBED9, 0x7239394B, 0x944A4ADE, 0x984C4CD4, 0xB05858E8, 0x85CFCF4A,
- 0xBBD0D06B, 0xC5EFEF2A, 0x4FAAAAE5, 0xEDFBFB16, 0x864343C5, 0x9A4D4DD7, 0x66333355, 0x11858594,
- 0x8A4545CF, 0xE9F9F910, 0x04020206, 0xFE7F7F81, 0xA05050F0, 0x783C3C44, 0x259F9FBA, 0x4BA8A8E3,
- 0xA25151F3, 0x5DA3A3FE, 0x804040C0, 0x058F8F8A, 0x3F9292AD, 0x219D9DBC, 0x70383848, 0xF1F5F504,
- 0x63BCBCDF, 0x77B6B6C1, 0xAFDADA75, 0x42212163, 0x20101030, 0xE5FFFF1A, 0xFDF3F30E, 0xBFD2D26D,
- 0x81CDCD4C, 0x180C0C14, 0x26131335, 0xC3ECEC2F, 0xBE5F5FE1, 0x359797A2, 0x884444CC, 0x2E171739,
- 0x93C4C457, 0x55A7A7F2, 0xFC7E7E82, 0x7A3D3D47, 0xC86464AC, 0xBA5D5DE7, 0x3219192B, 0xE6737395,
- 0xC06060A0, 0x19818198, 0x9E4F4FD1, 0xA3DCDC7F, 0x44222266, 0x542A2A7E, 0x3B9090AB, 0x0B888883,
- 0x8C4646CA, 0xC7EEEE29, 0x6BB8B8D3, 0x2814143C, 0xA7DEDE79, 0xBC5E5EE2, 0x160B0B1D, 0xADDBDB76,
- 0xDBE0E03B, 0x64323256, 0x743A3A4E, 0x140A0A1E, 0x924949DB, 0x0C06060A, 0x4824246C, 0xB85C5CE4,
- 0x9FC2C25D, 0xBDD3D36E, 0x43ACACEF, 0xC46262A6, 0x399191A8, 0x319595A4, 0xD3E4E437, 0xF279798B,
- 0xD5E7E732, 0x8BC8C843, 0x6E373759, 0xDA6D6DB7, 0x018D8D8C, 0xB1D5D564, 0x9C4E4ED2, 0x49A9A9E0,
- 0xD86C6CB4, 0xAC5656FA, 0xF3F4F407, 0xCFEAEA25, 0xCA6565AF, 0xF47A7A8E, 0x47AEAEE9, 0x10080818,
- 0x6FBABAD5, 0xF0787888, 0x4A25256F, 0x5C2E2E72, 0x381C1C24, 0x57A6A6F1, 0x73B4B4C7, 0x97C6C651,
- 0xCBE8E823, 0xA1DDDD7C, 0xE874749C, 0x3E1F1F21, 0x964B4BDD, 0x61BDBDDC, 0x0D8B8B86, 0x0F8A8A85,
- 0xE0707090, 0x7C3E3E42, 0x71B5B5C4, 0xCC6666AA, 0x904848D8, 0x06030305, 0xF7F6F601, 0x1C0E0E12,
- 0xC26161A3, 0x6A35355F, 0xAE5757F9, 0x69B9B9D0, 0x17868691, 0x99C1C158, 0x3A1D1D27, 0x279E9EB9,
- 0xD9E1E138, 0xEBF8F813, 0x2B9898B3, 0x22111133, 0xD26969BB, 0xA9D9D970, 0x078E8E89, 0x339494A7,
- 0x2D9B9BB6, 0x3C1E1E22, 0x15878792, 0xC9E9E920, 0x87CECE49, 0xAA5555FF, 0x50282878, 0xA5DFDF7A,
- 0x038C8C8F, 0x59A1A1F8, 0x09898980, 0x1A0D0D17, 0x65BFBFDA, 0xD7E6E631, 0x844242C6, 0xD06868B8,
- 0x824141C3, 0x299999B0, 0x5A2D2D77, 0x1E0F0F11, 0x7BB0B0CB, 0xA85454FC, 0x6DBBBBD6, 0x2C16163A
- );
-
- /**
- * Precomputed mixColumns table
- *
- * @see Crypt_Rijndael:_encryptBlock()
- * @see Crypt_Rijndael:_decryptBlock()
- * @var Array
- * @access private
- */
- var $t1 = array(
- 0xA5C66363, 0x84F87C7C, 0x99EE7777, 0x8DF67B7B, 0x0DFFF2F2, 0xBDD66B6B, 0xB1DE6F6F, 0x5491C5C5,
- 0x50603030, 0x03020101, 0xA9CE6767, 0x7D562B2B, 0x19E7FEFE, 0x62B5D7D7, 0xE64DABAB, 0x9AEC7676,
- 0x458FCACA, 0x9D1F8282, 0x4089C9C9, 0x87FA7D7D, 0x15EFFAFA, 0xEBB25959, 0xC98E4747, 0x0BFBF0F0,
- 0xEC41ADAD, 0x67B3D4D4, 0xFD5FA2A2, 0xEA45AFAF, 0xBF239C9C, 0xF753A4A4, 0x96E47272, 0x5B9BC0C0,
- 0xC275B7B7, 0x1CE1FDFD, 0xAE3D9393, 0x6A4C2626, 0x5A6C3636, 0x417E3F3F, 0x02F5F7F7, 0x4F83CCCC,
- 0x5C683434, 0xF451A5A5, 0x34D1E5E5, 0x08F9F1F1, 0x93E27171, 0x73ABD8D8, 0x53623131, 0x3F2A1515,
- 0x0C080404, 0x5295C7C7, 0x65462323, 0x5E9DC3C3, 0x28301818, 0xA1379696, 0x0F0A0505, 0xB52F9A9A,
- 0x090E0707, 0x36241212, 0x9B1B8080, 0x3DDFE2E2, 0x26CDEBEB, 0x694E2727, 0xCD7FB2B2, 0x9FEA7575,
- 0x1B120909, 0x9E1D8383, 0x74582C2C, 0x2E341A1A, 0x2D361B1B, 0xB2DC6E6E, 0xEEB45A5A, 0xFB5BA0A0,
- 0xF6A45252, 0x4D763B3B, 0x61B7D6D6, 0xCE7DB3B3, 0x7B522929, 0x3EDDE3E3, 0x715E2F2F, 0x97138484,
- 0xF5A65353, 0x68B9D1D1, 0x00000000, 0x2CC1EDED, 0x60402020, 0x1FE3FCFC, 0xC879B1B1, 0xEDB65B5B,
- 0xBED46A6A, 0x468DCBCB, 0xD967BEBE, 0x4B723939, 0xDE944A4A, 0xD4984C4C, 0xE8B05858, 0x4A85CFCF,
- 0x6BBBD0D0, 0x2AC5EFEF, 0xE54FAAAA, 0x16EDFBFB, 0xC5864343, 0xD79A4D4D, 0x55663333, 0x94118585,
- 0xCF8A4545, 0x10E9F9F9, 0x06040202, 0x81FE7F7F, 0xF0A05050, 0x44783C3C, 0xBA259F9F, 0xE34BA8A8,
- 0xF3A25151, 0xFE5DA3A3, 0xC0804040, 0x8A058F8F, 0xAD3F9292, 0xBC219D9D, 0x48703838, 0x04F1F5F5,
- 0xDF63BCBC, 0xC177B6B6, 0x75AFDADA, 0x63422121, 0x30201010, 0x1AE5FFFF, 0x0EFDF3F3, 0x6DBFD2D2,
- 0x4C81CDCD, 0x14180C0C, 0x35261313, 0x2FC3ECEC, 0xE1BE5F5F, 0xA2359797, 0xCC884444, 0x392E1717,
- 0x5793C4C4, 0xF255A7A7, 0x82FC7E7E, 0x477A3D3D, 0xACC86464, 0xE7BA5D5D, 0x2B321919, 0x95E67373,
- 0xA0C06060, 0x98198181, 0xD19E4F4F, 0x7FA3DCDC, 0x66442222, 0x7E542A2A, 0xAB3B9090, 0x830B8888,
- 0xCA8C4646, 0x29C7EEEE, 0xD36BB8B8, 0x3C281414, 0x79A7DEDE, 0xE2BC5E5E, 0x1D160B0B, 0x76ADDBDB,
- 0x3BDBE0E0, 0x56643232, 0x4E743A3A, 0x1E140A0A, 0xDB924949, 0x0A0C0606, 0x6C482424, 0xE4B85C5C,
- 0x5D9FC2C2, 0x6EBDD3D3, 0xEF43ACAC, 0xA6C46262, 0xA8399191, 0xA4319595, 0x37D3E4E4, 0x8BF27979,
- 0x32D5E7E7, 0x438BC8C8, 0x596E3737, 0xB7DA6D6D, 0x8C018D8D, 0x64B1D5D5, 0xD29C4E4E, 0xE049A9A9,
- 0xB4D86C6C, 0xFAAC5656, 0x07F3F4F4, 0x25CFEAEA, 0xAFCA6565, 0x8EF47A7A, 0xE947AEAE, 0x18100808,
- 0xD56FBABA, 0x88F07878, 0x6F4A2525, 0x725C2E2E, 0x24381C1C, 0xF157A6A6, 0xC773B4B4, 0x5197C6C6,
- 0x23CBE8E8, 0x7CA1DDDD, 0x9CE87474, 0x213E1F1F, 0xDD964B4B, 0xDC61BDBD, 0x860D8B8B, 0x850F8A8A,
- 0x90E07070, 0x427C3E3E, 0xC471B5B5, 0xAACC6666, 0xD8904848, 0x05060303, 0x01F7F6F6, 0x121C0E0E,
- 0xA3C26161, 0x5F6A3535, 0xF9AE5757, 0xD069B9B9, 0x91178686, 0x5899C1C1, 0x273A1D1D, 0xB9279E9E,
- 0x38D9E1E1, 0x13EBF8F8, 0xB32B9898, 0x33221111, 0xBBD26969, 0x70A9D9D9, 0x89078E8E, 0xA7339494,
- 0xB62D9B9B, 0x223C1E1E, 0x92158787, 0x20C9E9E9, 0x4987CECE, 0xFFAA5555, 0x78502828, 0x7AA5DFDF,
- 0x8F038C8C, 0xF859A1A1, 0x80098989, 0x171A0D0D, 0xDA65BFBF, 0x31D7E6E6, 0xC6844242, 0xB8D06868,
- 0xC3824141, 0xB0299999, 0x775A2D2D, 0x111E0F0F, 0xCB7BB0B0, 0xFCA85454, 0xD66DBBBB, 0x3A2C1616
- );
-
- /**
- * Precomputed mixColumns table
- *
- * @see Crypt_Rijndael:_encryptBlock()
- * @see Crypt_Rijndael:_decryptBlock()
- * @var Array
- * @access private
- */
- var $t2 = array(
- 0x63A5C663, 0x7C84F87C, 0x7799EE77, 0x7B8DF67B, 0xF20DFFF2, 0x6BBDD66B, 0x6FB1DE6F, 0xC55491C5,
- 0x30506030, 0x01030201, 0x67A9CE67, 0x2B7D562B, 0xFE19E7FE, 0xD762B5D7, 0xABE64DAB, 0x769AEC76,
- 0xCA458FCA, 0x829D1F82, 0xC94089C9, 0x7D87FA7D, 0xFA15EFFA, 0x59EBB259, 0x47C98E47, 0xF00BFBF0,
- 0xADEC41AD, 0xD467B3D4, 0xA2FD5FA2, 0xAFEA45AF, 0x9CBF239C, 0xA4F753A4, 0x7296E472, 0xC05B9BC0,
- 0xB7C275B7, 0xFD1CE1FD, 0x93AE3D93, 0x266A4C26, 0x365A6C36, 0x3F417E3F, 0xF702F5F7, 0xCC4F83CC,
- 0x345C6834, 0xA5F451A5, 0xE534D1E5, 0xF108F9F1, 0x7193E271, 0xD873ABD8, 0x31536231, 0x153F2A15,
- 0x040C0804, 0xC75295C7, 0x23654623, 0xC35E9DC3, 0x18283018, 0x96A13796, 0x050F0A05, 0x9AB52F9A,
- 0x07090E07, 0x12362412, 0x809B1B80, 0xE23DDFE2, 0xEB26CDEB, 0x27694E27, 0xB2CD7FB2, 0x759FEA75,
- 0x091B1209, 0x839E1D83, 0x2C74582C, 0x1A2E341A, 0x1B2D361B, 0x6EB2DC6E, 0x5AEEB45A, 0xA0FB5BA0,
- 0x52F6A452, 0x3B4D763B, 0xD661B7D6, 0xB3CE7DB3, 0x297B5229, 0xE33EDDE3, 0x2F715E2F, 0x84971384,
- 0x53F5A653, 0xD168B9D1, 0x00000000, 0xED2CC1ED, 0x20604020, 0xFC1FE3FC, 0xB1C879B1, 0x5BEDB65B,
- 0x6ABED46A, 0xCB468DCB, 0xBED967BE, 0x394B7239, 0x4ADE944A, 0x4CD4984C, 0x58E8B058, 0xCF4A85CF,
- 0xD06BBBD0, 0xEF2AC5EF, 0xAAE54FAA, 0xFB16EDFB, 0x43C58643, 0x4DD79A4D, 0x33556633, 0x85941185,
- 0x45CF8A45, 0xF910E9F9, 0x02060402, 0x7F81FE7F, 0x50F0A050, 0x3C44783C, 0x9FBA259F, 0xA8E34BA8,
- 0x51F3A251, 0xA3FE5DA3, 0x40C08040, 0x8F8A058F, 0x92AD3F92, 0x9DBC219D, 0x38487038, 0xF504F1F5,
- 0xBCDF63BC, 0xB6C177B6, 0xDA75AFDA, 0x21634221, 0x10302010, 0xFF1AE5FF, 0xF30EFDF3, 0xD26DBFD2,
- 0xCD4C81CD, 0x0C14180C, 0x13352613, 0xEC2FC3EC, 0x5FE1BE5F, 0x97A23597, 0x44CC8844, 0x17392E17,
- 0xC45793C4, 0xA7F255A7, 0x7E82FC7E, 0x3D477A3D, 0x64ACC864, 0x5DE7BA5D, 0x192B3219, 0x7395E673,
- 0x60A0C060, 0x81981981, 0x4FD19E4F, 0xDC7FA3DC, 0x22664422, 0x2A7E542A, 0x90AB3B90, 0x88830B88,
- 0x46CA8C46, 0xEE29C7EE, 0xB8D36BB8, 0x143C2814, 0xDE79A7DE, 0x5EE2BC5E, 0x0B1D160B, 0xDB76ADDB,
- 0xE03BDBE0, 0x32566432, 0x3A4E743A, 0x0A1E140A, 0x49DB9249, 0x060A0C06, 0x246C4824, 0x5CE4B85C,
- 0xC25D9FC2, 0xD36EBDD3, 0xACEF43AC, 0x62A6C462, 0x91A83991, 0x95A43195, 0xE437D3E4, 0x798BF279,
- 0xE732D5E7, 0xC8438BC8, 0x37596E37, 0x6DB7DA6D, 0x8D8C018D, 0xD564B1D5, 0x4ED29C4E, 0xA9E049A9,
- 0x6CB4D86C, 0x56FAAC56, 0xF407F3F4, 0xEA25CFEA, 0x65AFCA65, 0x7A8EF47A, 0xAEE947AE, 0x08181008,
- 0xBAD56FBA, 0x7888F078, 0x256F4A25, 0x2E725C2E, 0x1C24381C, 0xA6F157A6, 0xB4C773B4, 0xC65197C6,
- 0xE823CBE8, 0xDD7CA1DD, 0x749CE874, 0x1F213E1F, 0x4BDD964B, 0xBDDC61BD, 0x8B860D8B, 0x8A850F8A,
- 0x7090E070, 0x3E427C3E, 0xB5C471B5, 0x66AACC66, 0x48D89048, 0x03050603, 0xF601F7F6, 0x0E121C0E,
- 0x61A3C261, 0x355F6A35, 0x57F9AE57, 0xB9D069B9, 0x86911786, 0xC15899C1, 0x1D273A1D, 0x9EB9279E,
- 0xE138D9E1, 0xF813EBF8, 0x98B32B98, 0x11332211, 0x69BBD269, 0xD970A9D9, 0x8E89078E, 0x94A73394,
- 0x9BB62D9B, 0x1E223C1E, 0x87921587, 0xE920C9E9, 0xCE4987CE, 0x55FFAA55, 0x28785028, 0xDF7AA5DF,
- 0x8C8F038C, 0xA1F859A1, 0x89800989, 0x0D171A0D, 0xBFDA65BF, 0xE631D7E6, 0x42C68442, 0x68B8D068,
- 0x41C38241, 0x99B02999, 0x2D775A2D, 0x0F111E0F, 0xB0CB7BB0, 0x54FCA854, 0xBBD66DBB, 0x163A2C16
- );
-
- /**
- * Precomputed mixColumns table
- *
- * @see Crypt_Rijndael:_encryptBlock()
- * @see Crypt_Rijndael:_decryptBlock()
- * @var Array
- * @access private
- */
- var $t3 = array(
- 0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491,
- 0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC,
- 0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB,
- 0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, 0x727296E4, 0xC0C05B9B,
- 0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83,
- 0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A,
- 0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, 0x05050F0A, 0x9A9AB52F,
- 0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA,
- 0x09091B12, 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B,
- 0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713,
- 0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6,
- 0x6A6ABED4, 0xCBCB468D, 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85,
- 0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411,
- 0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B,
- 0x5151F3A2, 0xA3A3FE5D, 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1,
- 0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF,
- 0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E,
- 0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6,
- 0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, 0x9090AB3B, 0x8888830B,
- 0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD,
- 0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8,
- 0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, 0xE4E437D3, 0x79798BF2,
- 0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049,
- 0x6C6CB4D8, 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810,
- 0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197,
- 0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F,
- 0x707090E0, 0x3E3E427C, 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C,
- 0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927,
- 0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733,
- 0x9B9BB62D, 0x1E1E223C, 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5,
- 0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, 0x4242C684, 0x6868B8D0,
- 0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C
- );
-
- /**
- * Precomputed invMixColumns table
- *
- * @see Crypt_Rijndael:_encryptBlock()
- * @see Crypt_Rijndael:_decryptBlock()
- * @var Array
- * @access private
- */
- var $dt0 = array(
- 0x51F4A750, 0x7E416553, 0x1A17A4C3, 0x3A275E96, 0x3BAB6BCB, 0x1F9D45F1, 0xACFA58AB, 0x4BE30393,
- 0x2030FA55, 0xAD766DF6, 0x88CC7691, 0xF5024C25, 0x4FE5D7FC, 0xC52ACBD7, 0x26354480, 0xB562A38F,
- 0xDEB15A49, 0x25BA1B67, 0x45EA0E98, 0x5DFEC0E1, 0xC32F7502, 0x814CF012, 0x8D4697A3, 0x6BD3F9C6,
- 0x038F5FE7, 0x15929C95, 0xBF6D7AEB, 0x955259DA, 0xD4BE832D, 0x587421D3, 0x49E06929, 0x8EC9C844,
- 0x75C2896A, 0xF48E7978, 0x99583E6B, 0x27B971DD, 0xBEE14FB6, 0xF088AD17, 0xC920AC66, 0x7DCE3AB4,
- 0x63DF4A18, 0xE51A3182, 0x97513360, 0x62537F45, 0xB16477E0, 0xBB6BAE84, 0xFE81A01C, 0xF9082B94,
- 0x70486858, 0x8F45FD19, 0x94DE6C87, 0x527BF8B7, 0xAB73D323, 0x724B02E2, 0xE31F8F57, 0x6655AB2A,
- 0xB2EB2807, 0x2FB5C203, 0x86C57B9A, 0xD33708A5, 0x302887F2, 0x23BFA5B2, 0x02036ABA, 0xED16825C,
- 0x8ACF1C2B, 0xA779B492, 0xF307F2F0, 0x4E69E2A1, 0x65DAF4CD, 0x0605BED5, 0xD134621F, 0xC4A6FE8A,
- 0x342E539D, 0xA2F355A0, 0x058AE132, 0xA4F6EB75, 0x0B83EC39, 0x4060EFAA, 0x5E719F06, 0xBD6E1051,
- 0x3E218AF9, 0x96DD063D, 0xDD3E05AE, 0x4DE6BD46, 0x91548DB5, 0x71C45D05, 0x0406D46F, 0x605015FF,
- 0x1998FB24, 0xD6BDE997, 0x894043CC, 0x67D99E77, 0xB0E842BD, 0x07898B88, 0xE7195B38, 0x79C8EEDB,
- 0xA17C0A47, 0x7C420FE9, 0xF8841EC9, 0x00000000, 0x09808683, 0x322BED48, 0x1E1170AC, 0x6C5A724E,
- 0xFD0EFFFB, 0x0F853856, 0x3DAED51E, 0x362D3927, 0x0A0FD964, 0x685CA621, 0x9B5B54D1, 0x24362E3A,
- 0x0C0A67B1, 0x9357E70F, 0xB4EE96D2, 0x1B9B919E, 0x80C0C54F, 0x61DC20A2, 0x5A774B69, 0x1C121A16,
- 0xE293BA0A, 0xC0A02AE5, 0x3C22E043, 0x121B171D, 0x0E090D0B, 0xF28BC7AD, 0x2DB6A8B9, 0x141EA9C8,
- 0x57F11985, 0xAF75074C, 0xEE99DDBB, 0xA37F60FD, 0xF701269F, 0x5C72F5BC, 0x44663BC5, 0x5BFB7E34,
- 0x8B432976, 0xCB23C6DC, 0xB6EDFC68, 0xB8E4F163, 0xD731DCCA, 0x42638510, 0x13972240, 0x84C61120,
- 0x854A247D, 0xD2BB3DF8, 0xAEF93211, 0xC729A16D, 0x1D9E2F4B, 0xDCB230F3, 0x0D8652EC, 0x77C1E3D0,
- 0x2BB3166C, 0xA970B999, 0x119448FA, 0x47E96422, 0xA8FC8CC4, 0xA0F03F1A, 0x567D2CD8, 0x223390EF,
- 0x87494EC7, 0xD938D1C1, 0x8CCAA2FE, 0x98D40B36, 0xA6F581CF, 0xA57ADE28, 0xDAB78E26, 0x3FADBFA4,
- 0x2C3A9DE4, 0x5078920D, 0x6A5FCC9B, 0x547E4662, 0xF68D13C2, 0x90D8B8E8, 0x2E39F75E, 0x82C3AFF5,
- 0x9F5D80BE, 0x69D0937C, 0x6FD52DA9, 0xCF2512B3, 0xC8AC993B, 0x10187DA7, 0xE89C636E, 0xDB3BBB7B,
- 0xCD267809, 0x6E5918F4, 0xEC9AB701, 0x834F9AA8, 0xE6956E65, 0xAAFFE67E, 0x21BCCF08, 0xEF15E8E6,
- 0xBAE79BD9, 0x4A6F36CE, 0xEA9F09D4, 0x29B07CD6, 0x31A4B2AF, 0x2A3F2331, 0xC6A59430, 0x35A266C0,
- 0x744EBC37, 0xFC82CAA6, 0xE090D0B0, 0x33A7D815, 0xF104984A, 0x41ECDAF7, 0x7FCD500E, 0x1791F62F,
- 0x764DD68D, 0x43EFB04D, 0xCCAA4D54, 0xE49604DF, 0x9ED1B5E3, 0x4C6A881B, 0xC12C1FB8, 0x4665517F,
- 0x9D5EEA04, 0x018C355D, 0xFA877473, 0xFB0B412E, 0xB3671D5A, 0x92DBD252, 0xE9105633, 0x6DD64713,
- 0x9AD7618C, 0x37A10C7A, 0x59F8148E, 0xEB133C89, 0xCEA927EE, 0xB761C935, 0xE11CE5ED, 0x7A47B13C,
- 0x9CD2DF59, 0x55F2733F, 0x1814CE79, 0x73C737BF, 0x53F7CDEA, 0x5FFDAA5B, 0xDF3D6F14, 0x7844DB86,
- 0xCAAFF381, 0xB968C43E, 0x3824342C, 0xC2A3405F, 0x161DC372, 0xBCE2250C, 0x283C498B, 0xFF0D9541,
- 0x39A80171, 0x080CB3DE, 0xD8B4E49C, 0x6456C190, 0x7BCB8461, 0xD532B670, 0x486C5C74, 0xD0B85742
- );
-
- /**
- * Precomputed invMixColumns table
- *
- * @see Crypt_Rijndael:_encryptBlock()
- * @see Crypt_Rijndael:_decryptBlock()
- * @var Array
- * @access private
- */
- var $dt1 = array(
- 0x5051F4A7, 0x537E4165, 0xC31A17A4, 0x963A275E, 0xCB3BAB6B, 0xF11F9D45, 0xABACFA58, 0x934BE303,
- 0x552030FA, 0xF6AD766D, 0x9188CC76, 0x25F5024C, 0xFC4FE5D7, 0xD7C52ACB, 0x80263544, 0x8FB562A3,
- 0x49DEB15A, 0x6725BA1B, 0x9845EA0E, 0xE15DFEC0, 0x02C32F75, 0x12814CF0, 0xA38D4697, 0xC66BD3F9,
- 0xE7038F5F, 0x9515929C, 0xEBBF6D7A, 0xDA955259, 0x2DD4BE83, 0xD3587421, 0x2949E069, 0x448EC9C8,
- 0x6A75C289, 0x78F48E79, 0x6B99583E, 0xDD27B971, 0xB6BEE14F, 0x17F088AD, 0x66C920AC, 0xB47DCE3A,
- 0x1863DF4A, 0x82E51A31, 0x60975133, 0x4562537F, 0xE0B16477, 0x84BB6BAE, 0x1CFE81A0, 0x94F9082B,
- 0x58704868, 0x198F45FD, 0x8794DE6C, 0xB7527BF8, 0x23AB73D3, 0xE2724B02, 0x57E31F8F, 0x2A6655AB,
- 0x07B2EB28, 0x032FB5C2, 0x9A86C57B, 0xA5D33708, 0xF2302887, 0xB223BFA5, 0xBA02036A, 0x5CED1682,
- 0x2B8ACF1C, 0x92A779B4, 0xF0F307F2, 0xA14E69E2, 0xCD65DAF4, 0xD50605BE, 0x1FD13462, 0x8AC4A6FE,
- 0x9D342E53, 0xA0A2F355, 0x32058AE1, 0x75A4F6EB, 0x390B83EC, 0xAA4060EF, 0x065E719F, 0x51BD6E10,
- 0xF93E218A, 0x3D96DD06, 0xAEDD3E05, 0x464DE6BD, 0xB591548D, 0x0571C45D, 0x6F0406D4, 0xFF605015,
- 0x241998FB, 0x97D6BDE9, 0xCC894043, 0x7767D99E, 0xBDB0E842, 0x8807898B, 0x38E7195B, 0xDB79C8EE,
- 0x47A17C0A, 0xE97C420F, 0xC9F8841E, 0x00000000, 0x83098086, 0x48322BED, 0xAC1E1170, 0x4E6C5A72,
- 0xFBFD0EFF, 0x560F8538, 0x1E3DAED5, 0x27362D39, 0x640A0FD9, 0x21685CA6, 0xD19B5B54, 0x3A24362E,
- 0xB10C0A67, 0x0F9357E7, 0xD2B4EE96, 0x9E1B9B91, 0x4F80C0C5, 0xA261DC20, 0x695A774B, 0x161C121A,
- 0x0AE293BA, 0xE5C0A02A, 0x433C22E0, 0x1D121B17, 0x0B0E090D, 0xADF28BC7, 0xB92DB6A8, 0xC8141EA9,
- 0x8557F119, 0x4CAF7507, 0xBBEE99DD, 0xFDA37F60, 0x9FF70126, 0xBC5C72F5, 0xC544663B, 0x345BFB7E,
- 0x768B4329, 0xDCCB23C6, 0x68B6EDFC, 0x63B8E4F1, 0xCAD731DC, 0x10426385, 0x40139722, 0x2084C611,
- 0x7D854A24, 0xF8D2BB3D, 0x11AEF932, 0x6DC729A1, 0x4B1D9E2F, 0xF3DCB230, 0xEC0D8652, 0xD077C1E3,
- 0x6C2BB316, 0x99A970B9, 0xFA119448, 0x2247E964, 0xC4A8FC8C, 0x1AA0F03F, 0xD8567D2C, 0xEF223390,
- 0xC787494E, 0xC1D938D1, 0xFE8CCAA2, 0x3698D40B, 0xCFA6F581, 0x28A57ADE, 0x26DAB78E, 0xA43FADBF,
- 0xE42C3A9D, 0x0D507892, 0x9B6A5FCC, 0x62547E46, 0xC2F68D13, 0xE890D8B8, 0x5E2E39F7, 0xF582C3AF,
- 0xBE9F5D80, 0x7C69D093, 0xA96FD52D, 0xB3CF2512, 0x3BC8AC99, 0xA710187D, 0x6EE89C63, 0x7BDB3BBB,
- 0x09CD2678, 0xF46E5918, 0x01EC9AB7, 0xA8834F9A, 0x65E6956E, 0x7EAAFFE6, 0x0821BCCF, 0xE6EF15E8,
- 0xD9BAE79B, 0xCE4A6F36, 0xD4EA9F09, 0xD629B07C, 0xAF31A4B2, 0x312A3F23, 0x30C6A594, 0xC035A266,
- 0x37744EBC, 0xA6FC82CA, 0xB0E090D0, 0x1533A7D8, 0x4AF10498, 0xF741ECDA, 0x0E7FCD50, 0x2F1791F6,
- 0x8D764DD6, 0x4D43EFB0, 0x54CCAA4D, 0xDFE49604, 0xE39ED1B5, 0x1B4C6A88, 0xB8C12C1F, 0x7F466551,
- 0x049D5EEA, 0x5D018C35, 0x73FA8774, 0x2EFB0B41, 0x5AB3671D, 0x5292DBD2, 0x33E91056, 0x136DD647,
- 0x8C9AD761, 0x7A37A10C, 0x8E59F814, 0x89EB133C, 0xEECEA927, 0x35B761C9, 0xEDE11CE5, 0x3C7A47B1,
- 0x599CD2DF, 0x3F55F273, 0x791814CE, 0xBF73C737, 0xEA53F7CD, 0x5B5FFDAA, 0x14DF3D6F, 0x867844DB,
- 0x81CAAFF3, 0x3EB968C4, 0x2C382434, 0x5FC2A340, 0x72161DC3, 0x0CBCE225, 0x8B283C49, 0x41FF0D95,
- 0x7139A801, 0xDE080CB3, 0x9CD8B4E4, 0x906456C1, 0x617BCB84, 0x70D532B6, 0x74486C5C, 0x42D0B857
- );
-
- /**
- * Precomputed invMixColumns table
- *
- * @see Crypt_Rijndael:_encryptBlock()
- * @see Crypt_Rijndael:_decryptBlock()
- * @var Array
- * @access private
- */
- var $dt2 = array(
- 0xA75051F4, 0x65537E41, 0xA4C31A17, 0x5E963A27, 0x6BCB3BAB, 0x45F11F9D, 0x58ABACFA, 0x03934BE3,
- 0xFA552030, 0x6DF6AD76, 0x769188CC, 0x4C25F502, 0xD7FC4FE5, 0xCBD7C52A, 0x44802635, 0xA38FB562,
- 0x5A49DEB1, 0x1B6725BA, 0x0E9845EA, 0xC0E15DFE, 0x7502C32F, 0xF012814C, 0x97A38D46, 0xF9C66BD3,
- 0x5FE7038F, 0x9C951592, 0x7AEBBF6D, 0x59DA9552, 0x832DD4BE, 0x21D35874, 0x692949E0, 0xC8448EC9,
- 0x896A75C2, 0x7978F48E, 0x3E6B9958, 0x71DD27B9, 0x4FB6BEE1, 0xAD17F088, 0xAC66C920, 0x3AB47DCE,
- 0x4A1863DF, 0x3182E51A, 0x33609751, 0x7F456253, 0x77E0B164, 0xAE84BB6B, 0xA01CFE81, 0x2B94F908,
- 0x68587048, 0xFD198F45, 0x6C8794DE, 0xF8B7527B, 0xD323AB73, 0x02E2724B, 0x8F57E31F, 0xAB2A6655,
- 0x2807B2EB, 0xC2032FB5, 0x7B9A86C5, 0x08A5D337, 0x87F23028, 0xA5B223BF, 0x6ABA0203, 0x825CED16,
- 0x1C2B8ACF, 0xB492A779, 0xF2F0F307, 0xE2A14E69, 0xF4CD65DA, 0xBED50605, 0x621FD134, 0xFE8AC4A6,
- 0x539D342E, 0x55A0A2F3, 0xE132058A, 0xEB75A4F6, 0xEC390B83, 0xEFAA4060, 0x9F065E71, 0x1051BD6E,
- 0x8AF93E21, 0x063D96DD, 0x05AEDD3E, 0xBD464DE6, 0x8DB59154, 0x5D0571C4, 0xD46F0406, 0x15FF6050,
- 0xFB241998, 0xE997D6BD, 0x43CC8940, 0x9E7767D9, 0x42BDB0E8, 0x8B880789, 0x5B38E719, 0xEEDB79C8,
- 0x0A47A17C, 0x0FE97C42, 0x1EC9F884, 0x00000000, 0x86830980, 0xED48322B, 0x70AC1E11, 0x724E6C5A,
- 0xFFFBFD0E, 0x38560F85, 0xD51E3DAE, 0x3927362D, 0xD9640A0F, 0xA621685C, 0x54D19B5B, 0x2E3A2436,
- 0x67B10C0A, 0xE70F9357, 0x96D2B4EE, 0x919E1B9B, 0xC54F80C0, 0x20A261DC, 0x4B695A77, 0x1A161C12,
- 0xBA0AE293, 0x2AE5C0A0, 0xE0433C22, 0x171D121B, 0x0D0B0E09, 0xC7ADF28B, 0xA8B92DB6, 0xA9C8141E,
- 0x198557F1, 0x074CAF75, 0xDDBBEE99, 0x60FDA37F, 0x269FF701, 0xF5BC5C72, 0x3BC54466, 0x7E345BFB,
- 0x29768B43, 0xC6DCCB23, 0xFC68B6ED, 0xF163B8E4, 0xDCCAD731, 0x85104263, 0x22401397, 0x112084C6,
- 0x247D854A, 0x3DF8D2BB, 0x3211AEF9, 0xA16DC729, 0x2F4B1D9E, 0x30F3DCB2, 0x52EC0D86, 0xE3D077C1,
- 0x166C2BB3, 0xB999A970, 0x48FA1194, 0x642247E9, 0x8CC4A8FC, 0x3F1AA0F0, 0x2CD8567D, 0x90EF2233,
- 0x4EC78749, 0xD1C1D938, 0xA2FE8CCA, 0x0B3698D4, 0x81CFA6F5, 0xDE28A57A, 0x8E26DAB7, 0xBFA43FAD,
- 0x9DE42C3A, 0x920D5078, 0xCC9B6A5F, 0x4662547E, 0x13C2F68D, 0xB8E890D8, 0xF75E2E39, 0xAFF582C3,
- 0x80BE9F5D, 0x937C69D0, 0x2DA96FD5, 0x12B3CF25, 0x993BC8AC, 0x7DA71018, 0x636EE89C, 0xBB7BDB3B,
- 0x7809CD26, 0x18F46E59, 0xB701EC9A, 0x9AA8834F, 0x6E65E695, 0xE67EAAFF, 0xCF0821BC, 0xE8E6EF15,
- 0x9BD9BAE7, 0x36CE4A6F, 0x09D4EA9F, 0x7CD629B0, 0xB2AF31A4, 0x23312A3F, 0x9430C6A5, 0x66C035A2,
- 0xBC37744E, 0xCAA6FC82, 0xD0B0E090, 0xD81533A7, 0x984AF104, 0xDAF741EC, 0x500E7FCD, 0xF62F1791,
- 0xD68D764D, 0xB04D43EF, 0x4D54CCAA, 0x04DFE496, 0xB5E39ED1, 0x881B4C6A, 0x1FB8C12C, 0x517F4665,
- 0xEA049D5E, 0x355D018C, 0x7473FA87, 0x412EFB0B, 0x1D5AB367, 0xD25292DB, 0x5633E910, 0x47136DD6,
- 0x618C9AD7, 0x0C7A37A1, 0x148E59F8, 0x3C89EB13, 0x27EECEA9, 0xC935B761, 0xE5EDE11C, 0xB13C7A47,
- 0xDF599CD2, 0x733F55F2, 0xCE791814, 0x37BF73C7, 0xCDEA53F7, 0xAA5B5FFD, 0x6F14DF3D, 0xDB867844,
- 0xF381CAAF, 0xC43EB968, 0x342C3824, 0x405FC2A3, 0xC372161D, 0x250CBCE2, 0x498B283C, 0x9541FF0D,
- 0x017139A8, 0xB3DE080C, 0xE49CD8B4, 0xC1906456, 0x84617BCB, 0xB670D532, 0x5C74486C, 0x5742D0B8
- );
-
- /**
- * Precomputed invMixColumns table
- *
- * @see Crypt_Rijndael:_encryptBlock()
- * @see Crypt_Rijndael:_decryptBlock()
- * @var Array
- * @access private
- */
- var $dt3 = array(
- 0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, 0xFA58ABAC, 0xE303934B,
- 0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5,
- 0xB15A49DE, 0xBA1B6725, 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B,
- 0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, 0xE0692949, 0xC9C8448E,
- 0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D,
- 0xDF4A1863, 0x1A3182E5, 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9,
- 0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, 0x1F8F57E3, 0x55AB2A66,
- 0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED,
- 0xCF1C2B8A, 0x79B492A7, 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4,
- 0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, 0x719F065E, 0x6E1051BD,
- 0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60,
- 0x98FB2419, 0xBDE997D6, 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79,
- 0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, 0x1170AC1E, 0x5A724E6C,
- 0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24,
- 0x0A67B10C, 0x57E70F93, 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C,
- 0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, 0xB6A8B92D, 0x1EA9C814,
- 0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B,
- 0x4329768B, 0x23C6DCCB, 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084,
- 0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, 0x8652EC0D, 0xC1E3D077,
- 0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22,
- 0x494EC787, 0x38D1C1D9, 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F,
- 0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, 0x39F75E2E, 0xC3AFF582,
- 0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB,
- 0x267809CD, 0x5918F46E, 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF,
- 0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, 0xA59430C6, 0xA266C035,
- 0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17,
- 0x4DD68D76, 0xEFB04D43, 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46,
- 0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, 0x105633E9, 0xD647136D,
- 0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A,
- 0xD2DF599C, 0xF2733F55, 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678,
- 0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, 0x3C498B28, 0x0D9541FF,
- 0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0
- );
-
- /**
- * The SubByte S-Box
- *
- * @see Crypt_Rijndael::_encryptBlock()
- * @var Array
- * @access private
- */
- var $sbox = array(
- 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
- 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
- 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
- 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
- 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
- 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
- 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
- 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
- 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
- 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
- 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
- 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
- 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
- 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
- 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
- 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
- );
-
- /**
- * The inverse SubByte S-Box
- *
- * @see Crypt_Rijndael::_decryptBlock()
- * @var Array
- * @access private
- */
- var $isbox = array(
- 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
- 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
- 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
- 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
- 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
- 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
- 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
- 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
- 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
- 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
- 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
- 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
- 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
- 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
- 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
- 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
- );
-
- /**
- * Default Constructor.
- *
- * Determines whether or not the mcrypt extension should be used.
- *
- * $mode could be:
- *
- * - CRYPT_RIJNDAEL_MODE_ECB
- *
- * - CRYPT_RIJNDAEL_MODE_CBC
- *
- * - CRYPT_RIJNDAEL_MODE_CTR
- *
- * - CRYPT_RIJNDAEL_MODE_CFB
- *
- * - CRYPT_RIJNDAEL_MODE_OFB
- *
- * If not explictly set, CRYPT_RIJNDAEL_MODE_CBC will be used.
- *
- * @see Crypt_Base::Crypt_Base()
- * @param optional Integer $mode
- * @access public
- */
- function Crypt_Rijndael($mode = CRYPT_RIJNDAEL_MODE_CBC)
- {
- parent::Crypt_Base($mode);
- }
-
- /**
- * Sets the key.
- *
- * Keys can be of any length. Rijndael, itself, requires the use of a key that's between 128-bits and 256-bits long and
- * whose length is a multiple of 32. If the key is less than 256-bits and the key length isn't set, we round the length
- * up to the closest valid key length, padding $key with null bytes. If the key is more than 256-bits, we trim the
- * excess bits.
- *
- * If the key is not explicitly set, it'll be assumed to be all null bytes.
- *
- * Note: 160/224-bit keys must explicitly set by setKeyLength(), otherwise they will be round/pad up to 192/256 bits.
- *
- * @see Crypt_Base:setKey()
- * @see setKeyLength()
- * @access public
- * @param String $key
- */
- function setKey($key)
- {
- parent::setKey($key);
-
- if (!$this->explicit_key_length) {
- $length = strlen($key);
- switch (true) {
- case $length <= 16:
- $this->key_size = 16;
- break;
- case $length <= 24:
- $this->key_size = 24;
- break;
- default:
- $this->key_size = 32;
- }
- $this->_setupEngine();
- }
- }
-
- /**
- * Sets the key length
- *
- * Valid key lengths are 128, 160, 192, 224, and 256. If the length is less than 128, it will be rounded up to
- * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount.
- *
- * Note: phpseclib extends Rijndael (and AES) for using 160- and 224-bit keys but they are officially not defined
- * and the most (if not all) implementations are not able using 160/224-bit keys but round/pad them up to
- * 192/256 bits as, for example, mcrypt will do.
- *
- * That said, if you want be compatible with other Rijndael and AES implementations,
- * you should not setKeyLength(160) or setKeyLength(224).
- *
- * Additional: In case of 160- and 224-bit keys, phpseclib will/can, for that reason, not use
- * the mcrypt php extention, even if available.
- * This results then in slower encryption.
- *
- * @access public
- * @param Integer $length
- */
- function setKeyLength($length)
- {
- switch (true) {
- case $length == 160:
- $this->key_size = 20;
- break;
- case $length == 224:
- $this->key_size = 28;
- break;
- case $length <= 128:
- $this->key_size = 16;
- break;
- case $length <= 192:
- $this->key_size = 24;
- break;
- default:
- $this->key_size = 32;
- }
-
- $this->explicit_key_length = true;
- $this->changed = true;
- $this->_setupEngine();
- }
-
- /**
- * Sets the block length
- *
- * Valid block lengths are 128, 160, 192, 224, and 256. If the length is less than 128, it will be rounded up to
- * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount.
- *
- * @access public
- * @param Integer $length
- */
- function setBlockLength($length)
- {
- $length >>= 5;
- if ($length > 8) {
- $length = 8;
- } else if ($length < 4) {
- $length = 4;
- }
- $this->Nb = $length;
- $this->block_size = $length << 2;
- $this->changed = true;
- $this->_setupEngine();
- }
-
- /**
- * Setup the fastest possible $engine
- *
- * Determines if the mcrypt (MODE_MCRYPT) $engine available
- * and usable for the current $block_size and $key_size.
- *
- * If not, the slower MODE_INTERNAL $engine will be set.
- *
- * @see setKey()
- * @see setKeyLength()
- * @see setBlockLength()
- * @access private
- */
- function _setupEngine()
- {
- if (constant('CRYPT_' . $this->const_namespace . '_MODE') == CRYPT_MODE_INTERNAL) {
- // No mcrypt support at all for rijndael
- return;
- }
-
- // The required mcrypt module name for the current $block_size of rijndael
- $cipher_name_mcrypt = 'rijndael-' . ($this->block_size << 3);
-
- // Determining the availibility/usability of $cipher_name_mcrypt
- switch (true) {
- case $this->key_size % 8: // mcrypt is not usable for 160/224-bit keys, only for 128/192/256-bit keys
- case !in_array($cipher_name_mcrypt, mcrypt_list_algorithms()): // $cipher_name_mcrypt is not available for the current $block_size
- $engine = CRYPT_MODE_INTERNAL;
- break;
- default:
- $engine = CRYPT_MODE_MCRYPT;
- }
-
- if ($this->engine == $engine && $this->cipher_name_mcrypt == $cipher_name_mcrypt) {
- // allready set, so we not unnecessary close $this->enmcrypt/demcrypt/ecb
- return;
- }
-
- // Set the $engine
- $this->engine = $engine;
- $this->cipher_name_mcrypt = $cipher_name_mcrypt;
-
- if ($this->enmcrypt) {
- // Closing the current mcrypt resource(s). _mcryptSetup() will, if needed,
- // (re)open them with the module named in $this->cipher_name_mcrypt
- mcrypt_module_close($this->enmcrypt);
- mcrypt_module_close($this->demcrypt);
- $this->enmcrypt = null;
- $this->demcrypt = null;
-
- if ($this->ecb) {
- mcrypt_module_close($this->ecb);
- $this->ecb = null;
- }
- }
- }
-
- /**
- * Setup the CRYPT_MODE_MCRYPT $engine
- *
- * @see Crypt_Base::_setupMcrypt()
- * @access private
- */
- function _setupMcrypt()
- {
- $this->key = str_pad(substr($this->key, 0, $this->key_size), $this->key_size, "\0");
- parent::_setupMcrypt();
- }
-
- /**
- * Encrypts a block
- *
- * @access private
- * @param String $in
- * @return String
- */
- function _encryptBlock($in)
- {
- static $t0, $t1, $t2, $t3, $sbox;
- if (!$t0) {
- for ($i = 0; $i < 256; ++$i) {
- $t0[] = (int)$this->t0[$i];
- $t1[] = (int)$this->t1[$i];
- $t2[] = (int)$this->t2[$i];
- $t3[] = (int)$this->t3[$i];
- $sbox[] = (int)$this->sbox[$i];
- }
- }
-
- $state = array();
- $words = unpack('N*', $in);
-
- $c = $this->c;
- $w = $this->w;
- $Nb = $this->Nb;
- $Nr = $this->Nr;
-
- // addRoundKey
- $i = -1;
- foreach ($words as $word) {
- $state[] = $word ^ $w[0][++$i];
- }
-
- // fips-197.pdf#page=19, "Figure 5. Pseudo Code for the Cipher", states that this loop has four components -
- // subBytes, shiftRows, mixColumns, and addRoundKey. fips-197.pdf#page=30, "Implementation Suggestions Regarding
- // Various Platforms" suggests that performs enhanced implementations are described in Rijndael-ammended.pdf.
- // Rijndael-ammended.pdf#page=20, "Implementation aspects / 32-bit processor", discusses such an optimization.
- // Unfortunately, the description given there is not quite correct. Per aes.spec.v316.pdf#page=19 [1],
- // equation (7.4.7) is supposed to use addition instead of subtraction, so we'll do that here, as well.
-
- // [1] http://fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.v316.pdf
- $temp = array();
- for ($round = 1; $round < $Nr; ++$round) {
- $i = 0; // $c[0] == 0
- $j = $c[1];
- $k = $c[2];
- $l = $c[3];
-
- while ($i < $Nb) {
- $temp[$i] = $t0[$state[$i] >> 24 & 0x000000FF] ^
- $t1[$state[$j] >> 16 & 0x000000FF] ^
- $t2[$state[$k] >> 8 & 0x000000FF] ^
- $t3[$state[$l] & 0x000000FF] ^
- $w[$round][$i];
- ++$i;
- $j = ($j + 1) % $Nb;
- $k = ($k + 1) % $Nb;
- $l = ($l + 1) % $Nb;
- }
- $state = $temp;
- }
-
- // subWord
- for ($i = 0; $i < $Nb; ++$i) {
- $state[$i] = $sbox[$state[$i] & 0x000000FF] |
- ($sbox[$state[$i] >> 8 & 0x000000FF] << 8) |
- ($sbox[$state[$i] >> 16 & 0x000000FF] << 16) |
- ($sbox[$state[$i] >> 24 & 0x000000FF] << 24);
- }
-
- // shiftRows + addRoundKey
- $i = 0; // $c[0] == 0
- $j = $c[1];
- $k = $c[2];
- $l = $c[3];
- while ($i < $Nb) {
- $temp[$i] = ($state[$i] & 0xFF000000) ^
- ($state[$j] & 0x00FF0000) ^
- ($state[$k] & 0x0000FF00) ^
- ($state[$l] & 0x000000FF) ^
- $w[$Nr][$i];
- ++$i;
- $j = ($j + 1) % $Nb;
- $k = ($k + 1) % $Nb;
- $l = ($l + 1) % $Nb;
- }
-
- switch ($Nb) {
- case 8:
- return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]);
- case 7:
- return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]);
- case 6:
- return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]);
- case 5:
- return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]);
- default:
- return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]);
- }
- }
-
- /**
- * Decrypts a block
- *
- * @access private
- * @param String $in
- * @return String
- */
- function _decryptBlock($in)
- {
- static $dt0, $dt1, $dt2, $dt3, $isbox;
- if (!$dt0) {
- for ($i = 0; $i < 256; ++$i) {
- $dt0[] = (int)$this->dt0[$i];
- $dt1[] = (int)$this->dt1[$i];
- $dt2[] = (int)$this->dt2[$i];
- $dt3[] = (int)$this->dt3[$i];
- $isbox[] = (int)$this->isbox[$i];
- }
- }
-
- $state = array();
- $words = unpack('N*', $in);
-
- $c = $this->c;
- $dw = $this->dw;
- $Nb = $this->Nb;
- $Nr = $this->Nr;
-
- // addRoundKey
- $i = -1;
- foreach ($words as $word) {
- $state[] = $word ^ $dw[$Nr][++$i];
- }
-
- $temp = array();
- for ($round = $Nr - 1; $round > 0; --$round) {
- $i = 0; // $c[0] == 0
- $j = $Nb - $c[1];
- $k = $Nb - $c[2];
- $l = $Nb - $c[3];
-
- while ($i < $Nb) {
- $temp[$i] = $dt0[$state[$i] >> 24 & 0x000000FF] ^
- $dt1[$state[$j] >> 16 & 0x000000FF] ^
- $dt2[$state[$k] >> 8 & 0x000000FF] ^
- $dt3[$state[$l] & 0x000000FF] ^
- $dw[$round][$i];
- ++$i;
- $j = ($j + 1) % $Nb;
- $k = ($k + 1) % $Nb;
- $l = ($l + 1) % $Nb;
- }
- $state = $temp;
- }
-
- // invShiftRows + invSubWord + addRoundKey
- $i = 0; // $c[0] == 0
- $j = $Nb - $c[1];
- $k = $Nb - $c[2];
- $l = $Nb - $c[3];
-
- while ($i < $Nb) {
- $word = ($state[$i] & 0xFF000000) |
- ($state[$j] & 0x00FF0000) |
- ($state[$k] & 0x0000FF00) |
- ($state[$l] & 0x000000FF);
-
- $temp[$i] = $dw[0][$i] ^ ($isbox[$word & 0x000000FF] |
- ($isbox[$word >> 8 & 0x000000FF] << 8) |
- ($isbox[$word >> 16 & 0x000000FF] << 16) |
- ($isbox[$word >> 24 & 0x000000FF] << 24));
- ++$i;
- $j = ($j + 1) % $Nb;
- $k = ($k + 1) % $Nb;
- $l = ($l + 1) % $Nb;
- }
-
- switch ($Nb) {
- case 8:
- return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]);
- case 7:
- return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]);
- case 6:
- return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]);
- case 5:
- return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]);
- default:
- return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]);
- }
- }
-
- /**
- * Setup the key (expansion)
- *
- * @see Crypt_Base::_setupKey()
- * @access private
- */
- function _setupKey()
- {
- // Each number in $rcon is equal to the previous number multiplied by two in Rijndael's finite field.
- // See http://en.wikipedia.org/wiki/Finite_field_arithmetic#Multiplicative_inverse
- static $rcon = array(0,
- 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000,
- 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000,
- 0x6C000000, 0xD8000000, 0xAB000000, 0x4D000000, 0x9A000000,
- 0x2F000000, 0x5E000000, 0xBC000000, 0x63000000, 0xC6000000,
- 0x97000000, 0x35000000, 0x6A000000, 0xD4000000, 0xB3000000,
- 0x7D000000, 0xFA000000, 0xEF000000, 0xC5000000, 0x91000000
- );
-
- $this->key = str_pad(substr($this->key, 0, $this->key_size), $this->key_size, "\0");
-
- if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->key_size === $this->kl['key_size'] && $this->block_size === $this->kl['block_size']) {
- // already expanded
- return;
- }
- $this->kl = array('key' => $this->key, 'key_size' => $this->key_size, 'block_size' => $this->block_size);
-
- $this->Nk = $this->key_size >> 2;
- // see Rijndael-ammended.pdf#page=44
- $this->Nr = max($this->Nk, $this->Nb) + 6;
-
- // shift offsets for Nb = 5, 7 are defined in Rijndael-ammended.pdf#page=44,
- // "Table 8: Shift offsets in Shiftrow for the alternative block lengths"
- // shift offsets for Nb = 4, 6, 8 are defined in Rijndael-ammended.pdf#page=14,
- // "Table 2: Shift offsets for different block lengths"
- switch ($this->Nb) {
- case 4:
- case 5:
- case 6:
- $this->c = array(0, 1, 2, 3);
- break;
- case 7:
- $this->c = array(0, 1, 2, 4);
- break;
- case 8:
- $this->c = array(0, 1, 3, 4);
- }
-
- $w = array_values(unpack('N*words', $this->key));
-
- $length = $this->Nb * ($this->Nr + 1);
- for ($i = $this->Nk; $i < $length; $i++) {
- $temp = $w[$i - 1];
- if ($i % $this->Nk == 0) {
- // according to , "the size of an integer is platform-dependent".
- // on a 32-bit machine, it's 32-bits, and on a 64-bit machine, it's 64-bits. on a 32-bit machine,
- // 0xFFFFFFFF << 8 == 0xFFFFFF00, but on a 64-bit machine, it equals 0xFFFFFFFF00. as such, doing 'and'
- // with 0xFFFFFFFF (or 0xFFFFFF00) on a 32-bit machine is unnecessary, but on a 64-bit machine, it is.
- $temp = (($temp << 8) & 0xFFFFFF00) | (($temp >> 24) & 0x000000FF); // rotWord
- $temp = $this->_subWord($temp) ^ $rcon[$i / $this->Nk];
- } else if ($this->Nk > 6 && $i % $this->Nk == 4) {
- $temp = $this->_subWord($temp);
- }
- $w[$i] = $w[$i - $this->Nk] ^ $temp;
- }
-
- // convert the key schedule from a vector of $Nb * ($Nr + 1) length to a matrix with $Nr + 1 rows and $Nb columns
- // and generate the inverse key schedule. more specifically,
- // according to (section 5.3.3),
- // "The key expansion for the Inverse Cipher is defined as follows:
- // 1. Apply the Key Expansion.
- // 2. Apply InvMixColumn to all Round Keys except the first and the last one."
- // also, see fips-197.pdf#page=27, "5.3.5 Equivalent Inverse Cipher"
- $temp = $this->w = $this->dw = array();
- for ($i = $row = $col = 0; $i < $length; $i++, $col++) {
- if ($col == $this->Nb) {
- if ($row == 0) {
- $this->dw[0] = $this->w[0];
- } else {
- // subWord + invMixColumn + invSubWord = invMixColumn
- $j = 0;
- while ($j < $this->Nb) {
- $dw = $this->_subWord($this->w[$row][$j]);
- $temp[$j] = $this->dt0[$dw >> 24 & 0x000000FF] ^
- $this->dt1[$dw >> 16 & 0x000000FF] ^
- $this->dt2[$dw >> 8 & 0x000000FF] ^
- $this->dt3[$dw & 0x000000FF];
- $j++;
- }
- $this->dw[$row] = $temp;
- }
-
- $col = 0;
- $row++;
- }
- $this->w[$row][$col] = $w[$i];
- }
-
- $this->dw[$row] = $this->w[$row];
-
- // In case of $this->use_inline_crypt === true we have to use 1-dim key arrays (both ascending)
- if ($this->use_inline_crypt) {
- $this->dw = array_reverse($this->dw);
- $w = array_pop($this->w);
- $dw = array_pop($this->dw);
- foreach ($this->w as $r => $wr) {
- foreach ($wr as $c => $wc) {
- $w[] = $wc;
- $dw[] = $this->dw[$r][$c];
- }
- }
- $this->w = $w;
- $this->dw = $dw;
- }
- }
-
- /**
- * Performs S-Box substitutions
- *
- * @access private
- * @param Integer $word
- */
- function _subWord($word)
- {
- $sbox = $this->sbox;
-
- return $sbox[$word & 0x000000FF] |
- ($sbox[$word >> 8 & 0x000000FF] << 8) |
- ($sbox[$word >> 16 & 0x000000FF] << 16) |
- ($sbox[$word >> 24 & 0x000000FF] << 24);
- }
-
- /**
- * Setup the performance-optimized function for de/encrypt()
- *
- * @see Crypt_Base::_setupInlineCrypt()
- * @access private
- */
- function _setupInlineCrypt()
- {
- // Note: _setupInlineCrypt() will be called only if $this->changed === true
- // So here we are'nt under the same heavy timing-stress as we are in _de/encryptBlock() or de/encrypt().
- // However...the here generated function- $code, stored as php callback in $this->inline_crypt, must work as fast as even possible.
-
- $lambda_functions =& Crypt_Rijndael::_getLambdaFunctions();
-
- // The first 10 generated $lambda_functions will use the key-words hardcoded for better performance.
- // For memory reason we limit those ultra-optimized functions.
- // After that, we use pure (extracted) integer vars for the key-words which is faster than accessing them via array.
- if (count($lambda_functions) < 10) {
- $w = $this->w;
- $dw = $this->dw;
- $init_encrypt = '';
- $init_decrypt = '';
- } else {
- for ($i = 0, $cw = count($this->w); $i < $cw; ++$i) {
- $w[] = '$w[' . $i . ']';
- $dw[] = '$dw[' . $i . ']';
- }
- $init_encrypt = '$w = $self->w;';
- $init_decrypt = '$dw = $self->dw;';
- }
-
- $code_hash = md5(str_pad("Crypt_Rijndael, {$this->mode}, {$this->block_size}, ", 32, "\0") . implode(',', $w));
-
- if (!isset($lambda_functions[$code_hash])) {
- $Nr = $this->Nr;
- $Nb = $this->Nb;
- $c = $this->c;
-
- // Generating encrypt code:
- $init_encrypt.= '
- static $t0, $t1, $t2, $t3, $sbox;
- if (!$t0) {
- for ($i = 0; $i < 256; ++$i) {
- $t0[$i] = (int)$self->t0[$i];
- $t1[$i] = (int)$self->t1[$i];
- $t2[$i] = (int)$self->t2[$i];
- $t3[$i] = (int)$self->t3[$i];
- $sbox[$i] = (int)$self->sbox[$i];
- }
- }
- ';
-
- $s = 'e';
- $e = 's';
- $wc = $Nb - 1;
-
- // Preround: addRoundKey
- $encrypt_block = '$in = unpack("N*", $in);'."\n";
- for ($i = 0; $i < $Nb; ++$i) {
- $encrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$w[++$wc].";\n";
- }
-
- // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey
- for ($round = 1; $round < $Nr; ++$round) {
- list($s, $e) = array($e, $s);
- for ($i = 0; $i < $Nb; ++$i) {
- $encrypt_block.=
- '$'.$e.$i.' =
- $t0[($'.$s.$i .' >> 24) & 0xff] ^
- $t1[($'.$s.(($i + $c[1]) % $Nb).' >> 16) & 0xff] ^
- $t2[($'.$s.(($i + $c[2]) % $Nb).' >> 8) & 0xff] ^
- $t3[ $'.$s.(($i + $c[3]) % $Nb).' & 0xff] ^
- '.$w[++$wc].";\n";
- }
- }
-
- // Finalround: subWord + shiftRows + addRoundKey
- for ($i = 0; $i < $Nb; ++$i) {
- $encrypt_block.=
- '$'.$e.$i.' =
- $sbox[ $'.$e.$i.' & 0xff] |
- ($sbox[($'.$e.$i.' >> 8) & 0xff] << 8) |
- ($sbox[($'.$e.$i.' >> 16) & 0xff] << 16) |
- ($sbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n";
- }
- $encrypt_block .= '$in = pack("N*"'."\n";
- for ($i = 0; $i < $Nb; ++$i) {
- $encrypt_block.= ',
- ($'.$e.$i .' & 0xFF000000) ^
- ($'.$e.(($i + $c[1]) % $Nb).' & 0x00FF0000) ^
- ($'.$e.(($i + $c[2]) % $Nb).' & 0x0000FF00) ^
- ($'.$e.(($i + $c[3]) % $Nb).' & 0x000000FF) ^
- '.$w[$i]."\n";
- }
- $encrypt_block .= ');';
-
- // Generating decrypt code:
- $init_decrypt.= '
- static $dt0, $dt1, $dt2, $dt3, $isbox;
- if (!$dt0) {
- for ($i = 0; $i < 256; ++$i) {
- $dt0[$i] = (int)$self->dt0[$i];
- $dt1[$i] = (int)$self->dt1[$i];
- $dt2[$i] = (int)$self->dt2[$i];
- $dt3[$i] = (int)$self->dt3[$i];
- $isbox[$i] = (int)$self->isbox[$i];
- }
- }
- ';
-
- $s = 'e';
- $e = 's';
- $wc = $Nb - 1;
-
- // Preround: addRoundKey
- $decrypt_block = '$in = unpack("N*", $in);'."\n";
- for ($i = 0; $i < $Nb; ++$i) {
- $decrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$dw[++$wc].';'."\n";
- }
-
- // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey
- for ($round = 1; $round < $Nr; ++$round) {
- list($s, $e) = array($e, $s);
- for ($i = 0; $i < $Nb; ++$i) {
- $decrypt_block.=
- '$'.$e.$i.' =
- $dt0[($'.$s.$i .' >> 24) & 0xff] ^
- $dt1[($'.$s.(($Nb + $i - $c[1]) % $Nb).' >> 16) & 0xff] ^
- $dt2[($'.$s.(($Nb + $i - $c[2]) % $Nb).' >> 8) & 0xff] ^
- $dt3[ $'.$s.(($Nb + $i - $c[3]) % $Nb).' & 0xff] ^
- '.$dw[++$wc].";\n";
- }
- }
-
- // Finalround: subWord + shiftRows + addRoundKey
- for ($i = 0; $i < $Nb; ++$i) {
- $decrypt_block.=
- '$'.$e.$i.' =
- $isbox[ $'.$e.$i.' & 0xff] |
- ($isbox[($'.$e.$i.' >> 8) & 0xff] << 8) |
- ($isbox[($'.$e.$i.' >> 16) & 0xff] << 16) |
- ($isbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n";
- }
- $decrypt_block .= '$in = pack("N*"'."\n";
- for ($i = 0; $i < $Nb; ++$i) {
- $decrypt_block.= ',
- ($'.$e.$i. ' & 0xFF000000) ^
- ($'.$e.(($Nb + $i - $c[1]) % $Nb).' & 0x00FF0000) ^
- ($'.$e.(($Nb + $i - $c[2]) % $Nb).' & 0x0000FF00) ^
- ($'.$e.(($Nb + $i - $c[3]) % $Nb).' & 0x000000FF) ^
- '.$dw[$i]."\n";
- }
- $decrypt_block .= ');';
-
- $lambda_functions[$code_hash] = $this->_createInlineCryptFunction(
- array(
- 'init_crypt' => '',
- 'init_encrypt' => $init_encrypt,
- 'init_decrypt' => $init_decrypt,
- 'encrypt_block' => $encrypt_block,
- 'decrypt_block' => $decrypt_block
- )
- );
- }
- $this->inline_crypt = $lambda_functions[$code_hash];
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/TripleDES.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/TripleDES.php
deleted file mode 100644
index 21318209fe296c6fcf168856fbc01818b7d5ac59..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/TripleDES.php
+++ /dev/null
@@ -1,419 +0,0 @@
-
- * setKey('abcdefghijklmnopqrstuvwx');
- *
- * $size = 10 * 1024;
- * $plaintext = '';
- * for ($i = 0; $i < $size; $i++) {
- * $plaintext.= 'a';
- * }
- *
- * echo $des->decrypt($des->encrypt($plaintext));
- * ?>
- *
- *
- * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @category Crypt
- * @package Crypt_TripleDES
- * @author Jim Wigginton
- * @copyright MMVII Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- */
-
-/**
- * Include Crypt_DES
- */
-if (!class_exists('Crypt_DES')) {
- include_once 'DES.php';
-}
-
-/**
- * Encrypt / decrypt using inner chaining
- *
- * Inner chaining is used by SSH-1 and is generally considered to be less secure then outer chaining (CRYPT_DES_MODE_CBC3).
- */
-define('CRYPT_DES_MODE_3CBC', -2);
-
-/**
- * Encrypt / decrypt using outer chaining
- *
- * Outer chaining is used by SSH-2 and when the mode is set to CRYPT_DES_MODE_CBC.
- */
-define('CRYPT_DES_MODE_CBC3', CRYPT_DES_MODE_CBC);
-
-/**
- * Pure-PHP implementation of Triple DES.
- *
- * @package Crypt_TripleDES
- * @author Jim Wigginton
- * @version 0.1.0
- * @access public
- */
-class Crypt_TripleDES extends Crypt_DES
-{
- /**
- * The default password key_size used by setPassword()
- *
- * @see Crypt_DES::password_key_size
- * @see Crypt_Base::password_key_size
- * @see Crypt_Base::setPassword()
- * @var Integer
- * @access private
- */
- var $password_key_size = 24;
-
- /**
- * The default salt used by setPassword()
- *
- * @see Crypt_Base::password_default_salt
- * @see Crypt_Base::setPassword()
- * @var String
- * @access private
- */
- var $password_default_salt = 'phpseclib';
-
- /**
- * The namespace used by the cipher for its constants.
- *
- * @see Crypt_DES::const_namespace
- * @see Crypt_Base::const_namespace
- * @var String
- * @access private
- */
- var $const_namespace = 'DES';
-
- /**
- * The mcrypt specific name of the cipher
- *
- * @see Crypt_DES::cipher_name_mcrypt
- * @see Crypt_Base::cipher_name_mcrypt
- * @var String
- * @access private
- */
- var $cipher_name_mcrypt = 'tripledes';
-
- /**
- * Optimizing value while CFB-encrypting
- *
- * @see Crypt_Base::cfb_init_len
- * @var Integer
- * @access private
- */
- var $cfb_init_len = 750;
-
- /**
- * max possible size of $key
- *
- * @see Crypt_TripleDES::setKey()
- * @see Crypt_DES::setKey()
- * @var String
- * @access private
- */
- var $key_size_max = 24;
-
- /**
- * Internal flag whether using CRYPT_DES_MODE_3CBC or not
- *
- * @var Boolean
- * @access private
- */
- var $mode_3cbc;
-
- /**
- * The Crypt_DES objects
- *
- * Used only if $mode_3cbc === true
- *
- * @var Array
- * @access private
- */
- var $des;
-
- /**
- * Default Constructor.
- *
- * Determines whether or not the mcrypt extension should be used.
- *
- * $mode could be:
- *
- * - CRYPT_DES_MODE_ECB
- *
- * - CRYPT_DES_MODE_CBC
- *
- * - CRYPT_DES_MODE_CTR
- *
- * - CRYPT_DES_MODE_CFB
- *
- * - CRYPT_DES_MODE_OFB
- *
- * - CRYPT_DES_MODE_3CBC
- *
- * If not explictly set, CRYPT_DES_MODE_CBC will be used.
- *
- * @see Crypt_DES::Crypt_DES()
- * @see Crypt_Base::Crypt_Base()
- * @param optional Integer $mode
- * @access public
- */
- function Crypt_TripleDES($mode = CRYPT_DES_MODE_CBC)
- {
- switch ($mode) {
- // In case of CRYPT_DES_MODE_3CBC, we init as CRYPT_DES_MODE_CBC
- // and additional flag us internally as 3CBC
- case CRYPT_DES_MODE_3CBC:
- parent::Crypt_DES(CRYPT_DES_MODE_CBC);
- $this->mode_3cbc = true;
-
- // This three $des'es will do the 3CBC work (if $key > 64bits)
- $this->des = array(
- new Crypt_DES(CRYPT_DES_MODE_CBC),
- new Crypt_DES(CRYPT_DES_MODE_CBC),
- new Crypt_DES(CRYPT_DES_MODE_CBC),
- );
-
- // we're going to be doing the padding, ourselves, so disable it in the Crypt_DES objects
- $this->des[0]->disablePadding();
- $this->des[1]->disablePadding();
- $this->des[2]->disablePadding();
- break;
- // If not 3CBC, we init as usual
- default:
- parent::Crypt_DES($mode);
- }
- }
-
- /**
- * Sets the initialization vector. (optional)
- *
- * SetIV is not required when CRYPT_DES_MODE_ECB is being used. If not explictly set, it'll be assumed
- * to be all zero's.
- *
- * @see Crypt_Base::setIV()
- * @access public
- * @param String $iv
- */
- function setIV($iv)
- {
- parent::setIV($iv);
- if ($this->mode_3cbc) {
- $this->des[0]->setIV($iv);
- $this->des[1]->setIV($iv);
- $this->des[2]->setIV($iv);
- }
- }
-
- /**
- * Sets the key.
- *
- * Keys can be of any length. Triple DES, itself, can use 128-bit (eg. strlen($key) == 16) or
- * 192-bit (eg. strlen($key) == 24) keys. This function pads and truncates $key as appropriate.
- *
- * DES also requires that every eighth bit be a parity bit, however, we'll ignore that.
- *
- * If the key is not explicitly set, it'll be assumed to be all null bytes.
- *
- * @access public
- * @see Crypt_DES::setKey()
- * @see Crypt_Base::setKey()
- * @param String $key
- */
- function setKey($key)
- {
- $length = strlen($key);
- if ($length > 8) {
- $key = str_pad(substr($key, 0, 24), 24, chr(0));
- // if $key is between 64 and 128-bits, use the first 64-bits as the last, per this:
- // http://php.net/function.mcrypt-encrypt#47973
- //$key = $length <= 16 ? substr_replace($key, substr($key, 0, 8), 16) : substr($key, 0, 24);
- } else {
- $key = str_pad($key, 8, chr(0));
- }
- parent::setKey($key);
-
- // And in case of CRYPT_DES_MODE_3CBC:
- // if key <= 64bits we not need the 3 $des to work,
- // because we will then act as regular DES-CBC with just a <= 64bit key.
- // So only if the key > 64bits (> 8 bytes) we will call setKey() for the 3 $des.
- if ($this->mode_3cbc && $length > 8) {
- $this->des[0]->setKey(substr($key, 0, 8));
- $this->des[1]->setKey(substr($key, 8, 8));
- $this->des[2]->setKey(substr($key, 16, 8));
- }
- }
-
- /**
- * Encrypts a message.
- *
- * @see Crypt_Base::encrypt()
- * @access public
- * @param String $plaintext
- * @return String $cipertext
- */
- function encrypt($plaintext)
- {
- // parent::en/decrypt() is able to do all the work for all modes and keylengths,
- // except for: CRYPT_DES_MODE_3CBC (inner chaining CBC) with a key > 64bits
-
- // if the key is smaller then 8, do what we'd normally do
- if ($this->mode_3cbc && strlen($this->key) > 8) {
- return $this->des[2]->encrypt(
- $this->des[1]->decrypt(
- $this->des[0]->encrypt($this->_pad($plaintext))));
- }
-
- return parent::encrypt($plaintext);
- }
-
- /**
- * Decrypts a message.
- *
- * @see Crypt_Base::decrypt()
- * @access public
- * @param String $ciphertext
- * @return String $plaintext
- */
- function decrypt($ciphertext)
- {
- if ($this->mode_3cbc && strlen($this->key) > 8) {
- return $this->_unpad($this->des[0]->decrypt(
- $this->des[1]->encrypt(
- $this->des[2]->decrypt(str_pad($ciphertext, (strlen($ciphertext) + 7) & 0xFFFFFFF8, "\0")))));
- }
-
- return parent::decrypt($ciphertext);
- }
-
- /**
- * Treat consecutive "packets" as if they are a continuous buffer.
- *
- * Say you have a 16-byte plaintext $plaintext. Using the default behavior, the two following code snippets
- * will yield different outputs:
- *
- *
- * echo $des->encrypt(substr($plaintext, 0, 8));
- * echo $des->encrypt(substr($plaintext, 8, 8));
- *
- *
- * echo $des->encrypt($plaintext);
- *
- *
- * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates
- * another, as demonstrated with the following:
- *
- *
- * $des->encrypt(substr($plaintext, 0, 8));
- * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8)));
- *
- *
- * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8)));
- *
- *
- * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different
- * outputs. The reason is due to the fact that the initialization vector's change after every encryption /
- * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant.
- *
- * Put another way, when the continuous buffer is enabled, the state of the Crypt_DES() object changes after each
- * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that
- * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them),
- * however, they are also less intuitive and more likely to cause you problems.
- *
- * @see Crypt_Base::enableContinuousBuffer()
- * @see Crypt_TripleDES::disableContinuousBuffer()
- * @access public
- */
- function enableContinuousBuffer()
- {
- parent::enableContinuousBuffer();
- if ($this->mode_3cbc) {
- $this->des[0]->enableContinuousBuffer();
- $this->des[1]->enableContinuousBuffer();
- $this->des[2]->enableContinuousBuffer();
- }
- }
-
- /**
- * Treat consecutive packets as if they are a discontinuous buffer.
- *
- * The default behavior.
- *
- * @see Crypt_Base::disableContinuousBuffer()
- * @see Crypt_TripleDES::enableContinuousBuffer()
- * @access public
- */
- function disableContinuousBuffer()
- {
- parent::disableContinuousBuffer();
- if ($this->mode_3cbc) {
- $this->des[0]->disableContinuousBuffer();
- $this->des[1]->disableContinuousBuffer();
- $this->des[2]->disableContinuousBuffer();
- }
- }
-
- /**
- * Creates the key schedule
- *
- * @see Crypt_DES::_setupKey()
- * @see Crypt_Base::_setupKey()
- * @access private
- */
- function _setupKey()
- {
- switch (true) {
- // if $key <= 64bits we configure our internal pure-php cipher engine
- // to act as regular [1]DES, not as 3DES. mcrypt.so::tripledes does the same.
- case strlen($this->key) <= 8:
- $this->des_rounds = 1;
- break;
-
- // otherwise, if $key > 64bits, we configure our engine to work as 3DES.
- default:
- $this->des_rounds = 3;
-
- // (only) if 3CBC is used we have, of course, to setup the $des[0-2] keys also separately.
- if ($this->mode_3cbc) {
- $this->des[0]->_setupKey();
- $this->des[1]->_setupKey();
- $this->des[2]->_setupKey();
-
- // because $des[0-2] will, now, do all the work we can return here
- // not need unnecessary stress parent::_setupKey() with our, now unused, $key.
- return;
- }
- }
- // setup our key
- parent::_setupKey();
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Twofish.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Twofish.php
deleted file mode 100644
index 9be5fd10997101c40532b7a8de52bef602460336..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Twofish.php
+++ /dev/null
@@ -1,921 +0,0 @@
-
- * setKey('12345678901234567890123456789012');
- *
- * $plaintext = str_repeat('a', 1024);
- *
- * echo $twofish->decrypt($twofish->encrypt($plaintext));
- * ?>
- *
- *
- * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @category Crypt
- * @package Crypt_Twofish
- * @author Jim Wigginton
- * @author Hans-Juergen Petrich
- * @copyright MMVII Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @version 1.0
- * @link http://phpseclib.sourceforge.net
- */
-
-/**
- * Include Crypt_Base
- *
- * Base cipher class
- */
-if (!class_exists('Crypt_Base')) {
- include_once 'Base.php';
-}
-
-/**#@+
- * @access public
- * @see Crypt_Twofish::encrypt()
- * @see Crypt_Twofish::decrypt()
- */
-/**
- * Encrypt / decrypt using the Counter mode.
- *
- * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
- */
-define('CRYPT_TWOFISH_MODE_CTR', CRYPT_MODE_CTR);
-/**
- * Encrypt / decrypt using the Electronic Code Book mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
- */
-define('CRYPT_TWOFISH_MODE_ECB', CRYPT_MODE_ECB);
-/**
- * Encrypt / decrypt using the Code Book Chaining mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
- */
-define('CRYPT_TWOFISH_MODE_CBC', CRYPT_MODE_CBC);
-/**
- * Encrypt / decrypt using the Cipher Feedback mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
- */
-define('CRYPT_TWOFISH_MODE_CFB', CRYPT_MODE_CFB);
-/**
- * Encrypt / decrypt using the Cipher Feedback mode.
- *
- * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
- */
-define('CRYPT_TWOFISH_MODE_OFB', CRYPT_MODE_OFB);
-/**#@-*/
-
-/**#@+
- * @access private
- * @see Crypt_Twofish::Crypt_Twofish()
- */
-/**
- * Toggles the internal implementation
- */
-define('CRYPT_TWOFISH_MODE_INTERNAL', CRYPT_MODE_INTERNAL);
-/**
- * Toggles the mcrypt implementation
- */
-define('CRYPT_TWOFISH_MODE_MCRYPT', CRYPT_MODE_MCRYPT);
-/**#@-*/
-
-/**
- * Pure-PHP implementation of Twofish.
- *
- * @package Crypt_Twofish
- * @author Jim Wigginton
- * @author Hans-Juergen Petrich
- * @version 1.0
- * @access public
- */
-class Crypt_Twofish extends Crypt_Base
-{
- /**
- * The namespace used by the cipher for its constants.
- *
- * @see Crypt_Base::const_namespace
- * @var String
- * @access private
- */
- var $const_namespace = 'TWOFISH';
-
- /**
- * The mcrypt specific name of the cipher
- *
- * @see Crypt_Base::cipher_name_mcrypt
- * @var String
- * @access private
- */
- var $cipher_name_mcrypt = 'twofish';
-
- /**
- * Optimizing value while CFB-encrypting
- *
- * @see Crypt_Base::cfb_init_len
- * @var Integer
- * @access private
- */
- var $cfb_init_len = 800;
-
- /**
- * Q-Table
- *
- * @var Array
- * @access private
- */
- var $q0 = array (
- 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76,
- 0x9A, 0x92, 0x80, 0x78, 0xE4, 0xDD, 0xD1, 0x38,
- 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C,
- 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48,
- 0xF2, 0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23,
- 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82,
- 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C,
- 0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61,
- 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B,
- 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1,
- 0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66,
- 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7,
- 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA,
- 0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9, 0x62, 0x71,
- 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8,
- 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7,
- 0xA1, 0x1D, 0xAA, 0xED, 0x06, 0x70, 0xB2, 0xD2,
- 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90,
- 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB,
- 0x9E, 0x9C, 0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF,
- 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B,
- 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64,
- 0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A,
- 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A,
- 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02,
- 0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D,
- 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72,
- 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34,
- 0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB, 0xF8,
- 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4,
- 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00,
- 0x6F, 0x9D, 0x36, 0x42, 0x4A, 0x5E, 0xC1, 0xE0
- );
-
- /**
- * Q-Table
- *
- * @var Array
- * @access private
- */
- var $q1 = array (
- 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8,
- 0x4A, 0xD3, 0xE6, 0x6B, 0x45, 0x7D, 0xE8, 0x4B,
- 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1,
- 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F,
- 0x5E, 0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D,
- 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5,
- 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3,
- 0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51,
- 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96,
- 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C,
- 0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70,
- 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8,
- 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC,
- 0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7, 0x2B, 0xE2,
- 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9,
- 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17,
- 0x66, 0x94, 0xA1, 0x1D, 0x3D, 0xF0, 0xDE, 0xB3,
- 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E,
- 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49,
- 0x81, 0x88, 0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9,
- 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01,
- 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48,
- 0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19,
- 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64,
- 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5,
- 0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69,
- 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E,
- 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC,
- 0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED, 0xAB,
- 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9,
- 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2,
- 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xBE, 0x91
- );
-
- /**
- * M-Table
- *
- * @var Array
- * @access private
- */
- var $m0 = array (
- 0xBCBC3275, 0xECEC21F3, 0x202043C6, 0xB3B3C9F4, 0xDADA03DB, 0x02028B7B, 0xE2E22BFB, 0x9E9EFAC8,
- 0xC9C9EC4A, 0xD4D409D3, 0x18186BE6, 0x1E1E9F6B, 0x98980E45, 0xB2B2387D, 0xA6A6D2E8, 0x2626B74B,
- 0x3C3C57D6, 0x93938A32, 0x8282EED8, 0x525298FD, 0x7B7BD437, 0xBBBB3771, 0x5B5B97F1, 0x474783E1,
- 0x24243C30, 0x5151E20F, 0xBABAC6F8, 0x4A4AF31B, 0xBFBF4887, 0x0D0D70FA, 0xB0B0B306, 0x7575DE3F,
- 0xD2D2FD5E, 0x7D7D20BA, 0x666631AE, 0x3A3AA35B, 0x59591C8A, 0x00000000, 0xCDCD93BC, 0x1A1AE09D,
- 0xAEAE2C6D, 0x7F7FABC1, 0x2B2BC7B1, 0xBEBEB90E, 0xE0E0A080, 0x8A8A105D, 0x3B3B52D2, 0x6464BAD5,
- 0xD8D888A0, 0xE7E7A584, 0x5F5FE807, 0x1B1B1114, 0x2C2CC2B5, 0xFCFCB490, 0x3131272C, 0x808065A3,
- 0x73732AB2, 0x0C0C8173, 0x79795F4C, 0x6B6B4154, 0x4B4B0292, 0x53536974, 0x94948F36, 0x83831F51,
- 0x2A2A3638, 0xC4C49CB0, 0x2222C8BD, 0xD5D5F85A, 0xBDBDC3FC, 0x48487860, 0xFFFFCE62, 0x4C4C0796,
- 0x4141776C, 0xC7C7E642, 0xEBEB24F7, 0x1C1C1410, 0x5D5D637C, 0x36362228, 0x6767C027, 0xE9E9AF8C,
- 0x4444F913, 0x1414EA95, 0xF5F5BB9C, 0xCFCF18C7, 0x3F3F2D24, 0xC0C0E346, 0x7272DB3B, 0x54546C70,
- 0x29294CCA, 0xF0F035E3, 0x0808FE85, 0xC6C617CB, 0xF3F34F11, 0x8C8CE4D0, 0xA4A45993, 0xCACA96B8,
- 0x68683BA6, 0xB8B84D83, 0x38382820, 0xE5E52EFF, 0xADAD569F, 0x0B0B8477, 0xC8C81DC3, 0x9999FFCC,
- 0x5858ED03, 0x19199A6F, 0x0E0E0A08, 0x95957EBF, 0x70705040, 0xF7F730E7, 0x6E6ECF2B, 0x1F1F6EE2,
- 0xB5B53D79, 0x09090F0C, 0x616134AA, 0x57571682, 0x9F9F0B41, 0x9D9D803A, 0x111164EA, 0x2525CDB9,
- 0xAFAFDDE4, 0x4545089A, 0xDFDF8DA4, 0xA3A35C97, 0xEAEAD57E, 0x353558DA, 0xEDEDD07A, 0x4343FC17,
- 0xF8F8CB66, 0xFBFBB194, 0x3737D3A1, 0xFAFA401D, 0xC2C2683D, 0xB4B4CCF0, 0x32325DDE, 0x9C9C71B3,
- 0x5656E70B, 0xE3E3DA72, 0x878760A7, 0x15151B1C, 0xF9F93AEF, 0x6363BFD1, 0x3434A953, 0x9A9A853E,
- 0xB1B1428F, 0x7C7CD133, 0x88889B26, 0x3D3DA65F, 0xA1A1D7EC, 0xE4E4DF76, 0x8181942A, 0x91910149,
- 0x0F0FFB81, 0xEEEEAA88, 0x161661EE, 0xD7D77321, 0x9797F5C4, 0xA5A5A81A, 0xFEFE3FEB, 0x6D6DB5D9,
- 0x7878AEC5, 0xC5C56D39, 0x1D1DE599, 0x7676A4CD, 0x3E3EDCAD, 0xCBCB6731, 0xB6B6478B, 0xEFEF5B01,
- 0x12121E18, 0x6060C523, 0x6A6AB0DD, 0x4D4DF61F, 0xCECEE94E, 0xDEDE7C2D, 0x55559DF9, 0x7E7E5A48,
- 0x2121B24F, 0x03037AF2, 0xA0A02665, 0x5E5E198E, 0x5A5A6678, 0x65654B5C, 0x62624E58, 0xFDFD4519,
- 0x0606F48D, 0x404086E5, 0xF2F2BE98, 0x3333AC57, 0x17179067, 0x05058E7F, 0xE8E85E05, 0x4F4F7D64,
- 0x89896AAF, 0x10109563, 0x74742FB6, 0x0A0A75FE, 0x5C5C92F5, 0x9B9B74B7, 0x2D2D333C, 0x3030D6A5,
- 0x2E2E49CE, 0x494989E9, 0x46467268, 0x77775544, 0xA8A8D8E0, 0x9696044D, 0x2828BD43, 0xA9A92969,
- 0xD9D97929, 0x8686912E, 0xD1D187AC, 0xF4F44A15, 0x8D8D1559, 0xD6D682A8, 0xB9B9BC0A, 0x42420D9E,
- 0xF6F6C16E, 0x2F2FB847, 0xDDDD06DF, 0x23233934, 0xCCCC6235, 0xF1F1C46A, 0xC1C112CF, 0x8585EBDC,
- 0x8F8F9E22, 0x7171A1C9, 0x9090F0C0, 0xAAAA539B, 0x0101F189, 0x8B8BE1D4, 0x4E4E8CED, 0x8E8E6FAB,
- 0xABABA212, 0x6F6F3EA2, 0xE6E6540D, 0xDBDBF252, 0x92927BBB, 0xB7B7B602, 0x6969CA2F, 0x3939D9A9,
- 0xD3D30CD7, 0xA7A72361, 0xA2A2AD1E, 0xC3C399B4, 0x6C6C4450, 0x07070504, 0x04047FF6, 0x272746C2,
- 0xACACA716, 0xD0D07625, 0x50501386, 0xDCDCF756, 0x84841A55, 0xE1E15109, 0x7A7A25BE, 0x1313EF91
- );
-
- /**
- * M-Table
- *
- * @var Array
- * @access private
- */
- var $m1 = array (
- 0xA9D93939, 0x67901717, 0xB3719C9C, 0xE8D2A6A6, 0x04050707, 0xFD985252, 0xA3658080, 0x76DFE4E4,
- 0x9A084545, 0x92024B4B, 0x80A0E0E0, 0x78665A5A, 0xE4DDAFAF, 0xDDB06A6A, 0xD1BF6363, 0x38362A2A,
- 0x0D54E6E6, 0xC6432020, 0x3562CCCC, 0x98BEF2F2, 0x181E1212, 0xF724EBEB, 0xECD7A1A1, 0x6C774141,
- 0x43BD2828, 0x7532BCBC, 0x37D47B7B, 0x269B8888, 0xFA700D0D, 0x13F94444, 0x94B1FBFB, 0x485A7E7E,
- 0xF27A0303, 0xD0E48C8C, 0x8B47B6B6, 0x303C2424, 0x84A5E7E7, 0x54416B6B, 0xDF06DDDD, 0x23C56060,
- 0x1945FDFD, 0x5BA33A3A, 0x3D68C2C2, 0x59158D8D, 0xF321ECEC, 0xAE316666, 0xA23E6F6F, 0x82165757,
- 0x63951010, 0x015BEFEF, 0x834DB8B8, 0x2E918686, 0xD9B56D6D, 0x511F8383, 0x9B53AAAA, 0x7C635D5D,
- 0xA63B6868, 0xEB3FFEFE, 0xA5D63030, 0xBE257A7A, 0x16A7ACAC, 0x0C0F0909, 0xE335F0F0, 0x6123A7A7,
- 0xC0F09090, 0x8CAFE9E9, 0x3A809D9D, 0xF5925C5C, 0x73810C0C, 0x2C273131, 0x2576D0D0, 0x0BE75656,
- 0xBB7B9292, 0x4EE9CECE, 0x89F10101, 0x6B9F1E1E, 0x53A93434, 0x6AC4F1F1, 0xB499C3C3, 0xF1975B5B,
- 0xE1834747, 0xE66B1818, 0xBDC82222, 0x450E9898, 0xE26E1F1F, 0xF4C9B3B3, 0xB62F7474, 0x66CBF8F8,
- 0xCCFF9999, 0x95EA1414, 0x03ED5858, 0x56F7DCDC, 0xD4E18B8B, 0x1C1B1515, 0x1EADA2A2, 0xD70CD3D3,
- 0xFB2BE2E2, 0xC31DC8C8, 0x8E195E5E, 0xB5C22C2C, 0xE9894949, 0xCF12C1C1, 0xBF7E9595, 0xBA207D7D,
- 0xEA641111, 0x77840B0B, 0x396DC5C5, 0xAF6A8989, 0x33D17C7C, 0xC9A17171, 0x62CEFFFF, 0x7137BBBB,
- 0x81FB0F0F, 0x793DB5B5, 0x0951E1E1, 0xADDC3E3E, 0x242D3F3F, 0xCDA47676, 0xF99D5555, 0xD8EE8282,
- 0xE5864040, 0xC5AE7878, 0xB9CD2525, 0x4D049696, 0x44557777, 0x080A0E0E, 0x86135050, 0xE730F7F7,
- 0xA1D33737, 0x1D40FAFA, 0xAA346161, 0xED8C4E4E, 0x06B3B0B0, 0x706C5454, 0xB22A7373, 0xD2523B3B,
- 0x410B9F9F, 0x7B8B0202, 0xA088D8D8, 0x114FF3F3, 0x3167CBCB, 0xC2462727, 0x27C06767, 0x90B4FCFC,
- 0x20283838, 0xF67F0404, 0x60784848, 0xFF2EE5E5, 0x96074C4C, 0x5C4B6565, 0xB1C72B2B, 0xAB6F8E8E,
- 0x9E0D4242, 0x9CBBF5F5, 0x52F2DBDB, 0x1BF34A4A, 0x5FA63D3D, 0x9359A4A4, 0x0ABCB9B9, 0xEF3AF9F9,
- 0x91EF1313, 0x85FE0808, 0x49019191, 0xEE611616, 0x2D7CDEDE, 0x4FB22121, 0x8F42B1B1, 0x3BDB7272,
- 0x47B82F2F, 0x8748BFBF, 0x6D2CAEAE, 0x46E3C0C0, 0xD6573C3C, 0x3E859A9A, 0x6929A9A9, 0x647D4F4F,
- 0x2A948181, 0xCE492E2E, 0xCB17C6C6, 0x2FCA6969, 0xFCC3BDBD, 0x975CA3A3, 0x055EE8E8, 0x7AD0EDED,
- 0xAC87D1D1, 0x7F8E0505, 0xD5BA6464, 0x1AA8A5A5, 0x4BB72626, 0x0EB9BEBE, 0xA7608787, 0x5AF8D5D5,
- 0x28223636, 0x14111B1B, 0x3FDE7575, 0x2979D9D9, 0x88AAEEEE, 0x3C332D2D, 0x4C5F7979, 0x02B6B7B7,
- 0xB896CACA, 0xDA583535, 0xB09CC4C4, 0x17FC4343, 0x551A8484, 0x1FF64D4D, 0x8A1C5959, 0x7D38B2B2,
- 0x57AC3333, 0xC718CFCF, 0x8DF40606, 0x74695353, 0xB7749B9B, 0xC4F59797, 0x9F56ADAD, 0x72DAE3E3,
- 0x7ED5EAEA, 0x154AF4F4, 0x229E8F8F, 0x12A2ABAB, 0x584E6262, 0x07E85F5F, 0x99E51D1D, 0x34392323,
- 0x6EC1F6F6, 0x50446C6C, 0xDE5D3232, 0x68724646, 0x6526A0A0, 0xBC93CDCD, 0xDB03DADA, 0xF8C6BABA,
- 0xC8FA9E9E, 0xA882D6D6, 0x2BCF6E6E, 0x40507070, 0xDCEB8585, 0xFE750A0A, 0x328A9393, 0xA48DDFDF,
- 0xCA4C2929, 0x10141C1C, 0x2173D7D7, 0xF0CCB4B4, 0xD309D4D4, 0x5D108A8A, 0x0FE25151, 0x00000000,
- 0x6F9A1919, 0x9DE01A1A, 0x368F9494, 0x42E6C7C7, 0x4AECC9C9, 0x5EFDD2D2, 0xC1AB7F7F, 0xE0D8A8A8
- );
-
- /**
- * M-Table
- *
- * @var Array
- * @access private
- */
- var $m2 = array (
- 0xBC75BC32, 0xECF3EC21, 0x20C62043, 0xB3F4B3C9, 0xDADBDA03, 0x027B028B, 0xE2FBE22B, 0x9EC89EFA,
- 0xC94AC9EC, 0xD4D3D409, 0x18E6186B, 0x1E6B1E9F, 0x9845980E, 0xB27DB238, 0xA6E8A6D2, 0x264B26B7,
- 0x3CD63C57, 0x9332938A, 0x82D882EE, 0x52FD5298, 0x7B377BD4, 0xBB71BB37, 0x5BF15B97, 0x47E14783,
- 0x2430243C, 0x510F51E2, 0xBAF8BAC6, 0x4A1B4AF3, 0xBF87BF48, 0x0DFA0D70, 0xB006B0B3, 0x753F75DE,
- 0xD25ED2FD, 0x7DBA7D20, 0x66AE6631, 0x3A5B3AA3, 0x598A591C, 0x00000000, 0xCDBCCD93, 0x1A9D1AE0,
- 0xAE6DAE2C, 0x7FC17FAB, 0x2BB12BC7, 0xBE0EBEB9, 0xE080E0A0, 0x8A5D8A10, 0x3BD23B52, 0x64D564BA,
- 0xD8A0D888, 0xE784E7A5, 0x5F075FE8, 0x1B141B11, 0x2CB52CC2, 0xFC90FCB4, 0x312C3127, 0x80A38065,
- 0x73B2732A, 0x0C730C81, 0x794C795F, 0x6B546B41, 0x4B924B02, 0x53745369, 0x9436948F, 0x8351831F,
- 0x2A382A36, 0xC4B0C49C, 0x22BD22C8, 0xD55AD5F8, 0xBDFCBDC3, 0x48604878, 0xFF62FFCE, 0x4C964C07,
- 0x416C4177, 0xC742C7E6, 0xEBF7EB24, 0x1C101C14, 0x5D7C5D63, 0x36283622, 0x672767C0, 0xE98CE9AF,
- 0x441344F9, 0x149514EA, 0xF59CF5BB, 0xCFC7CF18, 0x3F243F2D, 0xC046C0E3, 0x723B72DB, 0x5470546C,
- 0x29CA294C, 0xF0E3F035, 0x088508FE, 0xC6CBC617, 0xF311F34F, 0x8CD08CE4, 0xA493A459, 0xCAB8CA96,
- 0x68A6683B, 0xB883B84D, 0x38203828, 0xE5FFE52E, 0xAD9FAD56, 0x0B770B84, 0xC8C3C81D, 0x99CC99FF,
- 0x580358ED, 0x196F199A, 0x0E080E0A, 0x95BF957E, 0x70407050, 0xF7E7F730, 0x6E2B6ECF, 0x1FE21F6E,
- 0xB579B53D, 0x090C090F, 0x61AA6134, 0x57825716, 0x9F419F0B, 0x9D3A9D80, 0x11EA1164, 0x25B925CD,
- 0xAFE4AFDD, 0x459A4508, 0xDFA4DF8D, 0xA397A35C, 0xEA7EEAD5, 0x35DA3558, 0xED7AEDD0, 0x431743FC,
- 0xF866F8CB, 0xFB94FBB1, 0x37A137D3, 0xFA1DFA40, 0xC23DC268, 0xB4F0B4CC, 0x32DE325D, 0x9CB39C71,
- 0x560B56E7, 0xE372E3DA, 0x87A78760, 0x151C151B, 0xF9EFF93A, 0x63D163BF, 0x345334A9, 0x9A3E9A85,
- 0xB18FB142, 0x7C337CD1, 0x8826889B, 0x3D5F3DA6, 0xA1ECA1D7, 0xE476E4DF, 0x812A8194, 0x91499101,
- 0x0F810FFB, 0xEE88EEAA, 0x16EE1661, 0xD721D773, 0x97C497F5, 0xA51AA5A8, 0xFEEBFE3F, 0x6DD96DB5,
- 0x78C578AE, 0xC539C56D, 0x1D991DE5, 0x76CD76A4, 0x3EAD3EDC, 0xCB31CB67, 0xB68BB647, 0xEF01EF5B,
- 0x1218121E, 0x602360C5, 0x6ADD6AB0, 0x4D1F4DF6, 0xCE4ECEE9, 0xDE2DDE7C, 0x55F9559D, 0x7E487E5A,
- 0x214F21B2, 0x03F2037A, 0xA065A026, 0x5E8E5E19, 0x5A785A66, 0x655C654B, 0x6258624E, 0xFD19FD45,
- 0x068D06F4, 0x40E54086, 0xF298F2BE, 0x335733AC, 0x17671790, 0x057F058E, 0xE805E85E, 0x4F644F7D,
- 0x89AF896A, 0x10631095, 0x74B6742F, 0x0AFE0A75, 0x5CF55C92, 0x9BB79B74, 0x2D3C2D33, 0x30A530D6,
- 0x2ECE2E49, 0x49E94989, 0x46684672, 0x77447755, 0xA8E0A8D8, 0x964D9604, 0x284328BD, 0xA969A929,
- 0xD929D979, 0x862E8691, 0xD1ACD187, 0xF415F44A, 0x8D598D15, 0xD6A8D682, 0xB90AB9BC, 0x429E420D,
- 0xF66EF6C1, 0x2F472FB8, 0xDDDFDD06, 0x23342339, 0xCC35CC62, 0xF16AF1C4, 0xC1CFC112, 0x85DC85EB,
- 0x8F228F9E, 0x71C971A1, 0x90C090F0, 0xAA9BAA53, 0x018901F1, 0x8BD48BE1, 0x4EED4E8C, 0x8EAB8E6F,
- 0xAB12ABA2, 0x6FA26F3E, 0xE60DE654, 0xDB52DBF2, 0x92BB927B, 0xB702B7B6, 0x692F69CA, 0x39A939D9,
- 0xD3D7D30C, 0xA761A723, 0xA21EA2AD, 0xC3B4C399, 0x6C506C44, 0x07040705, 0x04F6047F, 0x27C22746,
- 0xAC16ACA7, 0xD025D076, 0x50865013, 0xDC56DCF7, 0x8455841A, 0xE109E151, 0x7ABE7A25, 0x139113EF
- );
-
- /**
- * M-Table
- *
- * @var Array
- * @access private
- */
- var $m3 = array (
- 0xD939A9D9, 0x90176790, 0x719CB371, 0xD2A6E8D2, 0x05070405, 0x9852FD98, 0x6580A365, 0xDFE476DF,
- 0x08459A08, 0x024B9202, 0xA0E080A0, 0x665A7866, 0xDDAFE4DD, 0xB06ADDB0, 0xBF63D1BF, 0x362A3836,
- 0x54E60D54, 0x4320C643, 0x62CC3562, 0xBEF298BE, 0x1E12181E, 0x24EBF724, 0xD7A1ECD7, 0x77416C77,
- 0xBD2843BD, 0x32BC7532, 0xD47B37D4, 0x9B88269B, 0x700DFA70, 0xF94413F9, 0xB1FB94B1, 0x5A7E485A,
- 0x7A03F27A, 0xE48CD0E4, 0x47B68B47, 0x3C24303C, 0xA5E784A5, 0x416B5441, 0x06DDDF06, 0xC56023C5,
- 0x45FD1945, 0xA33A5BA3, 0x68C23D68, 0x158D5915, 0x21ECF321, 0x3166AE31, 0x3E6FA23E, 0x16578216,
- 0x95106395, 0x5BEF015B, 0x4DB8834D, 0x91862E91, 0xB56DD9B5, 0x1F83511F, 0x53AA9B53, 0x635D7C63,
- 0x3B68A63B, 0x3FFEEB3F, 0xD630A5D6, 0x257ABE25, 0xA7AC16A7, 0x0F090C0F, 0x35F0E335, 0x23A76123,
- 0xF090C0F0, 0xAFE98CAF, 0x809D3A80, 0x925CF592, 0x810C7381, 0x27312C27, 0x76D02576, 0xE7560BE7,
- 0x7B92BB7B, 0xE9CE4EE9, 0xF10189F1, 0x9F1E6B9F, 0xA93453A9, 0xC4F16AC4, 0x99C3B499, 0x975BF197,
- 0x8347E183, 0x6B18E66B, 0xC822BDC8, 0x0E98450E, 0x6E1FE26E, 0xC9B3F4C9, 0x2F74B62F, 0xCBF866CB,
- 0xFF99CCFF, 0xEA1495EA, 0xED5803ED, 0xF7DC56F7, 0xE18BD4E1, 0x1B151C1B, 0xADA21EAD, 0x0CD3D70C,
- 0x2BE2FB2B, 0x1DC8C31D, 0x195E8E19, 0xC22CB5C2, 0x8949E989, 0x12C1CF12, 0x7E95BF7E, 0x207DBA20,
- 0x6411EA64, 0x840B7784, 0x6DC5396D, 0x6A89AF6A, 0xD17C33D1, 0xA171C9A1, 0xCEFF62CE, 0x37BB7137,
- 0xFB0F81FB, 0x3DB5793D, 0x51E10951, 0xDC3EADDC, 0x2D3F242D, 0xA476CDA4, 0x9D55F99D, 0xEE82D8EE,
- 0x8640E586, 0xAE78C5AE, 0xCD25B9CD, 0x04964D04, 0x55774455, 0x0A0E080A, 0x13508613, 0x30F7E730,
- 0xD337A1D3, 0x40FA1D40, 0x3461AA34, 0x8C4EED8C, 0xB3B006B3, 0x6C54706C, 0x2A73B22A, 0x523BD252,
- 0x0B9F410B, 0x8B027B8B, 0x88D8A088, 0x4FF3114F, 0x67CB3167, 0x4627C246, 0xC06727C0, 0xB4FC90B4,
- 0x28382028, 0x7F04F67F, 0x78486078, 0x2EE5FF2E, 0x074C9607, 0x4B655C4B, 0xC72BB1C7, 0x6F8EAB6F,
- 0x0D429E0D, 0xBBF59CBB, 0xF2DB52F2, 0xF34A1BF3, 0xA63D5FA6, 0x59A49359, 0xBCB90ABC, 0x3AF9EF3A,
- 0xEF1391EF, 0xFE0885FE, 0x01914901, 0x6116EE61, 0x7CDE2D7C, 0xB2214FB2, 0x42B18F42, 0xDB723BDB,
- 0xB82F47B8, 0x48BF8748, 0x2CAE6D2C, 0xE3C046E3, 0x573CD657, 0x859A3E85, 0x29A96929, 0x7D4F647D,
- 0x94812A94, 0x492ECE49, 0x17C6CB17, 0xCA692FCA, 0xC3BDFCC3, 0x5CA3975C, 0x5EE8055E, 0xD0ED7AD0,
- 0x87D1AC87, 0x8E057F8E, 0xBA64D5BA, 0xA8A51AA8, 0xB7264BB7, 0xB9BE0EB9, 0x6087A760, 0xF8D55AF8,
- 0x22362822, 0x111B1411, 0xDE753FDE, 0x79D92979, 0xAAEE88AA, 0x332D3C33, 0x5F794C5F, 0xB6B702B6,
- 0x96CAB896, 0x5835DA58, 0x9CC4B09C, 0xFC4317FC, 0x1A84551A, 0xF64D1FF6, 0x1C598A1C, 0x38B27D38,
- 0xAC3357AC, 0x18CFC718, 0xF4068DF4, 0x69537469, 0x749BB774, 0xF597C4F5, 0x56AD9F56, 0xDAE372DA,
- 0xD5EA7ED5, 0x4AF4154A, 0x9E8F229E, 0xA2AB12A2, 0x4E62584E, 0xE85F07E8, 0xE51D99E5, 0x39233439,
- 0xC1F66EC1, 0x446C5044, 0x5D32DE5D, 0x72466872, 0x26A06526, 0x93CDBC93, 0x03DADB03, 0xC6BAF8C6,
- 0xFA9EC8FA, 0x82D6A882, 0xCF6E2BCF, 0x50704050, 0xEB85DCEB, 0x750AFE75, 0x8A93328A, 0x8DDFA48D,
- 0x4C29CA4C, 0x141C1014, 0x73D72173, 0xCCB4F0CC, 0x09D4D309, 0x108A5D10, 0xE2510FE2, 0x00000000,
- 0x9A196F9A, 0xE01A9DE0, 0x8F94368F, 0xE6C742E6, 0xECC94AEC, 0xFDD25EFD, 0xAB7FC1AB, 0xD8A8E0D8
- );
-
- /**
- * The Key Schedule Array
- *
- * @var Array
- * @access private
- */
- var $K = array();
-
- /**
- * The Key depended S-Table 0
- *
- * @var Array
- * @access private
- */
- var $S0 = array();
-
- /**
- * The Key depended S-Table 1
- *
- * @var Array
- * @access private
- */
- var $S1 = array();
-
- /**
- * The Key depended S-Table 2
- *
- * @var Array
- * @access private
- */
- var $S2 = array();
-
- /**
- * The Key depended S-Table 3
- *
- * @var Array
- * @access private
- */
- var $S3 = array();
-
- /**
- * Holds the last used key
- *
- * @var Array
- * @access private
- */
- var $kl;
-
- /**
- * Default Constructor.
- *
- * Determines whether or not the mcrypt extension should be used.
- *
- * $mode could be:
- *
- * - CRYPT_TWOFISH_MODE_ECB
- *
- * - CRYPT_TWOFISH_MODE_CBC
- *
- * - CRYPT_TWOFISH_MODE_CTR
- *
- * - CRYPT_TWOFISH_MODE_CFB
- *
- * - CRYPT_TWOFISH_MODE_OFB
- *
- * If not explictly set, CRYPT_TWOFISH_MODE_CBC will be used.
- *
- * @see Crypt_Base::Crypt_Base()
- * @param optional Integer $mode
- * @access public
- */
- function Crypt_Twofish($mode = CRYPT_TWOFISH_MODE_CBC)
- {
- parent::Crypt_Base($mode);
- }
-
- /**
- * Sets the key.
- *
- * Keys can be of any length. Twofish, itself, requires the use of a key that's 128, 192 or 256-bits long.
- * If the key is less than 256-bits we round the length up to the closest valid key length,
- * padding $key with null bytes. If the key is more than 256-bits, we trim the excess bits.
- *
- * If the key is not explicitly set, it'll be assumed a 128 bits key to be all null bytes.
- *
- * @access public
- * @see Crypt_Base::setKey()
- * @param String $key
- */
- function setKey($key)
- {
- $keylength = strlen($key);
- switch (true) {
- case $keylength <= 16:
- $key = str_pad($key, 16, "\0");
- break;
- case $keylength <= 24:
- $key = str_pad($key, 24, "\0");
- break;
- case $keylength < 32:
- $key = str_pad($key, 32, "\0");
- break;
- case $keylength > 32:
- $key = substr($key, 0, 32);
- }
- parent::setKey($key);
- }
-
- /**
- * Setup the key (expansion)
- *
- * @see Crypt_Base::_setupKey()
- * @access private
- */
- function _setupKey()
- {
- if (isset($this->kl['key']) && $this->key === $this->kl['key']) {
- // already expanded
- return;
- }
- $this->kl = array('key' => $this->key);
-
- /* Key expanding and generating the key-depended s-boxes */
- $le_longs = unpack('V*', $this->key);
- $key = unpack('C*', $this->key);
- $m0 = $this->m0;
- $m1 = $this->m1;
- $m2 = $this->m2;
- $m3 = $this->m3;
- $q0 = $this->q0;
- $q1 = $this->q1;
-
- $K = $S0 = $S1 = $S2 = $S3 = array();
-
- switch (strlen($this->key)) {
- case 16:
- list ($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[1], $le_longs[2]);
- list ($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[3], $le_longs[4]);
- for ($i = 0, $j = 1; $i < 40; $i+= 2,$j+= 2) {
- $A = $m0[$q0[$q0[$i] ^ $key[ 9]] ^ $key[1]] ^
- $m1[$q0[$q1[$i] ^ $key[10]] ^ $key[2]] ^
- $m2[$q1[$q0[$i] ^ $key[11]] ^ $key[3]] ^
- $m3[$q1[$q1[$i] ^ $key[12]] ^ $key[4]];
- $B = $m0[$q0[$q0[$j] ^ $key[13]] ^ $key[5]] ^
- $m1[$q0[$q1[$j] ^ $key[14]] ^ $key[6]] ^
- $m2[$q1[$q0[$j] ^ $key[15]] ^ $key[7]] ^
- $m3[$q1[$q1[$j] ^ $key[16]] ^ $key[8]];
- $B = ($B << 8) | ($B >> 24 & 0xff);
- $K[] = $A+= $B;
- $K[] = (($A+= $B) << 9 | $A >> 23 & 0x1ff);
- }
- for ($i = 0; $i < 256; ++$i) {
- $S0[$i] = $m0[$q0[$q0[$i] ^ $s4] ^ $s0];
- $S1[$i] = $m1[$q0[$q1[$i] ^ $s5] ^ $s1];
- $S2[$i] = $m2[$q1[$q0[$i] ^ $s6] ^ $s2];
- $S3[$i] = $m3[$q1[$q1[$i] ^ $s7] ^ $s3];
- }
- break;
- case 24:
- list ($sb, $sa, $s9, $s8) = $this->_mdsrem($le_longs[1], $le_longs[2]);
- list ($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[3], $le_longs[4]);
- list ($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[5], $le_longs[6]);
- for ($i = 0, $j = 1; $i < 40; $i+= 2, $j+= 2) {
- $A = $m0[$q0[$q0[$q1[$i] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^
- $m1[$q0[$q1[$q1[$i] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^
- $m2[$q1[$q0[$q0[$i] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^
- $m3[$q1[$q1[$q0[$i] ^ $key[20]] ^ $key[12]] ^ $key[4]];
- $B = $m0[$q0[$q0[$q1[$j] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^
- $m1[$q0[$q1[$q1[$j] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^
- $m2[$q1[$q0[$q0[$j] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^
- $m3[$q1[$q1[$q0[$j] ^ $key[24]] ^ $key[16]] ^ $key[8]];
- $B = ($B << 8) | ($B >> 24 & 0xff);
- $K[] = $A+= $B;
- $K[] = (($A+= $B) << 9 | $A >> 23 & 0x1ff);
- }
- for ($i = 0; $i < 256; ++$i) {
- $S0[$i] = $m0[$q0[$q0[$q1[$i] ^ $s8] ^ $s4] ^ $s0];
- $S1[$i] = $m1[$q0[$q1[$q1[$i] ^ $s9] ^ $s5] ^ $s1];
- $S2[$i] = $m2[$q1[$q0[$q0[$i] ^ $sa] ^ $s6] ^ $s2];
- $S3[$i] = $m3[$q1[$q1[$q0[$i] ^ $sb] ^ $s7] ^ $s3];
- }
- break;
- default: // 32
- list ($sf, $se, $sd, $sc) = $this->_mdsrem($le_longs[1], $le_longs[2]);
- list ($sb, $sa, $s9, $s8) = $this->_mdsrem($le_longs[3], $le_longs[4]);
- list ($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[5], $le_longs[6]);
- list ($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[7], $le_longs[8]);
- for ($i = 0, $j = 1; $i < 40; $i+= 2, $j+= 2) {
- $A = $m0[$q0[$q0[$q1[$q1[$i] ^ $key[25]] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^
- $m1[$q0[$q1[$q1[$q0[$i] ^ $key[26]] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^
- $m2[$q1[$q0[$q0[$q0[$i] ^ $key[27]] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^
- $m3[$q1[$q1[$q0[$q1[$i] ^ $key[28]] ^ $key[20]] ^ $key[12]] ^ $key[4]];
- $B = $m0[$q0[$q0[$q1[$q1[$j] ^ $key[29]] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^
- $m1[$q0[$q1[$q1[$q0[$j] ^ $key[30]] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^
- $m2[$q1[$q0[$q0[$q0[$j] ^ $key[31]] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^
- $m3[$q1[$q1[$q0[$q1[$j] ^ $key[32]] ^ $key[24]] ^ $key[16]] ^ $key[8]];
- $B = ($B << 8) | ($B >> 24 & 0xff);
- $K[] = $A+= $B;
- $K[] = (($A+= $B) << 9 | $A >> 23 & 0x1ff);
- }
- for ($i = 0; $i < 256; ++$i) {
- $S0[$i] = $m0[$q0[$q0[$q1[$q1[$i] ^ $sc] ^ $s8] ^ $s4] ^ $s0];
- $S1[$i] = $m1[$q0[$q1[$q1[$q0[$i] ^ $sd] ^ $s9] ^ $s5] ^ $s1];
- $S2[$i] = $m2[$q1[$q0[$q0[$q0[$i] ^ $se] ^ $sa] ^ $s6] ^ $s2];
- $S3[$i] = $m3[$q1[$q1[$q0[$q1[$i] ^ $sf] ^ $sb] ^ $s7] ^ $s3];
- }
- }
-
- $this->K = $K;
- $this->S0 = $S0;
- $this->S1 = $S1;
- $this->S2 = $S2;
- $this->S3 = $S3;
- }
-
- /**
- * _mdsrem function using by the twofish cipher algorithm
- *
- * @access private
- * @param String $A
- * @param String $B
- * @return Array
- */
- function _mdsrem($A, $B)
- {
- // No gain by unrolling this loop.
- for ($i = 0; $i < 8; ++$i) {
- // Get most significant coefficient.
- $t = 0xff & ($B >> 24);
-
- // Shift the others up.
- $B = ($B << 8) | (0xff & ($A >> 24));
- $A<<= 8;
-
- $u = $t << 1;
-
- // Subtract the modular polynomial on overflow.
- if ($t & 0x80) {
- $u^= 0x14d;
- }
-
- // Remove t * (a * x^2 + 1).
- $B ^= $t ^ ($u << 16);
-
- // Form u = a*t + t/a = t*(a + 1/a).
- $u^= 0x7fffffff & ($t >> 1);
-
- // Add the modular polynomial on underflow.
- if ($t & 0x01) $u^= 0xa6 ;
-
- // Remove t * (a + 1/a) * (x^3 + x).
- $B^= ($u << 24) | ($u << 8);
- }
-
- return array(
- 0xff & $B >> 24,
- 0xff & $B >> 16,
- 0xff & $B >> 8,
- 0xff & $B);
- }
-
- /**
- * Encrypts a block
- *
- * @access private
- * @param String $in
- * @return String
- */
- function _encryptBlock($in)
- {
- $S0 = $this->S0;
- $S1 = $this->S1;
- $S2 = $this->S2;
- $S3 = $this->S3;
- $K = $this->K;
-
- $in = unpack("V4", $in);
- $R0 = $K[0] ^ $in[1];
- $R1 = $K[1] ^ $in[2];
- $R2 = $K[2] ^ $in[3];
- $R3 = $K[3] ^ $in[4];
-
- $ki = 7;
- while ($ki < 39) {
- $t0 = $S0[ $R0 & 0xff] ^
- $S1[($R0 >> 8) & 0xff] ^
- $S2[($R0 >> 16) & 0xff] ^
- $S3[($R0 >> 24) & 0xff];
- $t1 = $S0[($R1 >> 24) & 0xff] ^
- $S1[ $R1 & 0xff] ^
- $S2[($R1 >> 8) & 0xff] ^
- $S3[($R1 >> 16) & 0xff];
- $R2^= $t0 + $t1 + $K[++$ki];
- $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31);
- $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ($t0 + ($t1 << 1) + $K[++$ki]);
-
- $t0 = $S0[ $R2 & 0xff] ^
- $S1[($R2 >> 8) & 0xff] ^
- $S2[($R2 >> 16) & 0xff] ^
- $S3[($R2 >> 24) & 0xff];
- $t1 = $S0[($R3 >> 24) & 0xff] ^
- $S1[ $R3 & 0xff] ^
- $S2[($R3 >> 8) & 0xff] ^
- $S3[($R3 >> 16) & 0xff];
- $R0^= ($t0 + $t1 + $K[++$ki]);
- $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31);
- $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ($t0 + ($t1 << 1) + $K[++$ki]);
- }
-
- return pack("V4", $K[4] ^ $R2,
- $K[5] ^ $R3,
- $K[6] ^ $R0,
- $K[7] ^ $R1);
- }
-
- /**
- * Decrypts a block
- *
- * @access private
- * @param String $in
- * @return String
- */
- function _decryptBlock($in)
- {
- $S0 = $this->S0;
- $S1 = $this->S1;
- $S2 = $this->S2;
- $S3 = $this->S3;
- $K = $this->K;
-
- $in = unpack("V4", $in);
- $R0 = $K[4] ^ $in[1];
- $R1 = $K[5] ^ $in[2];
- $R2 = $K[6] ^ $in[3];
- $R3 = $K[7] ^ $in[4];
-
- $ki = 40;
- while ($ki > 8) {
- $t0 = $S0[$R0 & 0xff] ^
- $S1[$R0 >> 8 & 0xff] ^
- $S2[$R0 >> 16 & 0xff] ^
- $S3[$R0 >> 24 & 0xff];
- $t1 = $S0[$R1 >> 24 & 0xff] ^
- $S1[$R1 & 0xff] ^
- $S2[$R1 >> 8 & 0xff] ^
- $S3[$R1 >> 16 & 0xff];
- $R3^= $t0 + ($t1 << 1) + $K[--$ki];
- $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31;
- $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ($t0 + $t1 + $K[--$ki]);
-
- $t0 = $S0[$R2 & 0xff] ^
- $S1[$R2 >> 8 & 0xff] ^
- $S2[$R2 >> 16 & 0xff] ^
- $S3[$R2 >> 24 & 0xff];
- $t1 = $S0[$R3 >> 24 & 0xff] ^
- $S1[$R3 & 0xff] ^
- $S2[$R3 >> 8 & 0xff] ^
- $S3[$R3 >> 16 & 0xff];
- $R1^= $t0 + ($t1 << 1) + $K[--$ki];
- $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31;
- $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ($t0 + $t1 + $K[--$ki]);
- }
-
- return pack("V4", $K[0] ^ $R2,
- $K[1] ^ $R3,
- $K[2] ^ $R0,
- $K[3] ^ $R1);
- }
-
- /**
- * Setup the performance-optimized function for de/encrypt()
- *
- * @see Crypt_Base::_setupInlineCrypt()
- * @access private
- */
- function _setupInlineCrypt()
- {
- $lambda_functions =& Crypt_Twofish::_getLambdaFunctions();
-
- // Max. 10 Ultra-Hi-optimized inline-crypt functions. After that, we'll (still) create very fast code, but not the ultimate fast one.
- $gen_hi_opt_code = (bool)( count($lambda_functions) < 10 );
-
- switch (true) {
- case $gen_hi_opt_code:
- $code_hash = md5(str_pad("Crypt_Twofish, {$this->mode}, ", 32, "\0") . $this->key);
- break;
- default:
- $code_hash = "Crypt_Twofish, {$this->mode}";
- }
-
- if (!isset($lambda_functions[$code_hash])) {
- switch (true) {
- case $gen_hi_opt_code:
- $K = $this->K;
-
- $init_crypt = '
- static $S0, $S1, $S2, $S3;
- if (!$S0) {
- for ($i = 0; $i < 256; ++$i) {
- $S0[] = (int)$self->S0[$i];
- $S1[] = (int)$self->S1[$i];
- $S2[] = (int)$self->S2[$i];
- $S3[] = (int)$self->S3[$i];
- }
- }
- ';
- break;
- default:
- $K = array();
- for ($i = 0; $i < 40; ++$i) {
- $K[] = '$K_' . $i;
- }
-
- $init_crypt = '
- $S0 = $self->S0;
- $S1 = $self->S1;
- $S2 = $self->S2;
- $S3 = $self->S3;
- list(' . implode(',', $K) . ') = $self->K;
- ';
- }
-
- // Generating encrypt code:
- $encrypt_block = '
- $in = unpack("V4", $in);
- $R0 = '.$K[0].' ^ $in[1];
- $R1 = '.$K[1].' ^ $in[2];
- $R2 = '.$K[2].' ^ $in[3];
- $R3 = '.$K[3].' ^ $in[4];
- ';
- for ($ki = 7, $i = 0; $i < 8; ++$i) {
- $encrypt_block.= '
- $t0 = $S0[ $R0 & 0xff] ^
- $S1[($R0 >> 8) & 0xff] ^
- $S2[($R0 >> 16) & 0xff] ^
- $S3[($R0 >> 24) & 0xff];
- $t1 = $S0[($R1 >> 24) & 0xff] ^
- $S1[ $R1 & 0xff] ^
- $S2[($R1 >> 8) & 0xff] ^
- $S3[($R1 >> 16) & 0xff];
- $R2^= ($t0 + $t1 + '.$K[++$ki].');
- $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31);
- $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ($t0 + ($t1 << 1) + '.$K[++$ki].');
-
- $t0 = $S0[ $R2 & 0xff] ^
- $S1[($R2 >> 8) & 0xff] ^
- $S2[($R2 >> 16) & 0xff] ^
- $S3[($R2 >> 24) & 0xff];
- $t1 = $S0[($R3 >> 24) & 0xff] ^
- $S1[ $R3 & 0xff] ^
- $S2[($R3 >> 8) & 0xff] ^
- $S3[($R3 >> 16) & 0xff];
- $R0^= ($t0 + $t1 + '.$K[++$ki].');
- $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31);
- $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ($t0 + ($t1 << 1) + '.$K[++$ki].');
- ';
- }
- $encrypt_block.= '
- $in = pack("V4", '.$K[4].' ^ $R2,
- '.$K[5].' ^ $R3,
- '.$K[6].' ^ $R0,
- '.$K[7].' ^ $R1);
- ';
-
- // Generating decrypt code:
- $decrypt_block = '
- $in = unpack("V4", $in);
- $R0 = '.$K[4].' ^ $in[1];
- $R1 = '.$K[5].' ^ $in[2];
- $R2 = '.$K[6].' ^ $in[3];
- $R3 = '.$K[7].' ^ $in[4];
- ';
- for ($ki = 40, $i = 0; $i < 8; ++$i) {
- $decrypt_block.= '
- $t0 = $S0[$R0 & 0xff] ^
- $S1[$R0 >> 8 & 0xff] ^
- $S2[$R0 >> 16 & 0xff] ^
- $S3[$R0 >> 24 & 0xff];
- $t1 = $S0[$R1 >> 24 & 0xff] ^
- $S1[$R1 & 0xff] ^
- $S2[$R1 >> 8 & 0xff] ^
- $S3[$R1 >> 16 & 0xff];
- $R3^= $t0 + ($t1 << 1) + '.$K[--$ki].';
- $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31;
- $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ($t0 + $t1 + '.$K[--$ki].');
-
- $t0 = $S0[$R2 & 0xff] ^
- $S1[$R2 >> 8 & 0xff] ^
- $S2[$R2 >> 16 & 0xff] ^
- $S3[$R2 >> 24 & 0xff];
- $t1 = $S0[$R3 >> 24 & 0xff] ^
- $S1[$R3 & 0xff] ^
- $S2[$R3 >> 8 & 0xff] ^
- $S3[$R3 >> 16 & 0xff];
- $R1^= $t0 + ($t1 << 1) + '.$K[--$ki].';
- $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31;
- $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ($t0 + $t1 + '.$K[--$ki].');
- ';
- }
- $decrypt_block.= '
- $in = pack("V4", '.$K[0].' ^ $R2,
- '.$K[1].' ^ $R3,
- '.$K[2].' ^ $R0,
- '.$K[3].' ^ $R1);
- ';
-
- $lambda_functions[$code_hash] = $this->_createInlineCryptFunction(
- array(
- 'init_crypt' => $init_crypt,
- 'init_encrypt' => '',
- 'init_decrypt' => '',
- 'encrypt_block' => $encrypt_block,
- 'decrypt_block' => $decrypt_block
- )
- );
- }
- $this->inline_crypt = $lambda_functions[$code_hash];
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/File/ANSI.php b/apps/files_external/3rdparty/phpseclib/phpseclib/File/ANSI.php
deleted file mode 100644
index 0e0004ce27dd7acc809b30487265e8853d760691..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/File/ANSI.php
+++ /dev/null
@@ -1,560 +0,0 @@
-
- * @copyright MMXII Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- */
-
-/**
- * Pure-PHP ANSI Decoder
- *
- * @package File_ANSI
- * @author Jim Wigginton
- * @version 0.3.0
- * @access public
- */
-class File_ANSI
-{
- /**
- * Max Width
- *
- * @var Integer
- * @access private
- */
- var $max_x;
-
- /**
- * Max Height
- *
- * @var Integer
- * @access private
- */
- var $max_y;
-
- /**
- * Max History
- *
- * @var Integer
- * @access private
- */
- var $max_history;
-
- /**
- * History
- *
- * @var Array
- * @access private
- */
- var $history;
-
- /**
- * History Attributes
- *
- * @var Array
- * @access private
- */
- var $history_attrs;
-
- /**
- * Current Column
- *
- * @var Integer
- * @access private
- */
- var $x;
-
- /**
- * Current Row
- *
- * @var Integer
- * @access private
- */
- var $y;
-
- /**
- * Old Column
- *
- * @var Integer
- * @access private
- */
- var $old_x;
-
- /**
- * Old Row
- *
- * @var Integer
- * @access private
- */
- var $old_y;
-
- /**
- * An empty attribute row
- *
- * @var Array
- * @access private
- */
- var $attr_row;
-
- /**
- * The current screen text
- *
- * @var Array
- * @access private
- */
- var $screen;
-
- /**
- * The current screen attributes
- *
- * @var Array
- * @access private
- */
- var $attrs;
-
- /**
- * The current foreground color
- *
- * @var String
- * @access private
- */
- var $foreground;
-
- /**
- * The current background color
- *
- * @var String
- * @access private
- */
- var $background;
-
- /**
- * Bold flag
- *
- * @var Boolean
- * @access private
- */
- var $bold;
-
- /**
- * Underline flag
- *
- * @var Boolean
- * @access private
- */
- var $underline;
-
- /**
- * Blink flag
- *
- * @var Boolean
- * @access private
- */
- var $blink;
-
- /**
- * Reverse flag
- *
- * @var Boolean
- * @access private
- */
- var $reverse;
-
- /**
- * Color flag
- *
- * @var Boolean
- * @access private
- */
- var $color;
-
- /**
- * Current ANSI code
- *
- * @var String
- * @access private
- */
- var $ansi;
-
- /**
- * Default Constructor.
- *
- * @return File_ANSI
- * @access public
- */
- function File_ANSI()
- {
- $this->setHistory(200);
- $this->setDimensions(80, 24);
- }
-
- /**
- * Set terminal width and height
- *
- * Resets the screen as well
- *
- * @param Integer $x
- * @param Integer $y
- * @access public
- */
- function setDimensions($x, $y)
- {
- $this->max_x = $x - 1;
- $this->max_y = $y - 1;
- $this->x = $this->y = 0;
- $this->history = $this->history_attrs = array();
- $this->attr_row = array_fill(0, $this->max_x + 1, '');
- $this->screen = array_fill(0, $this->max_y + 1, '');
- $this->attrs = array_fill(0, $this->max_y + 1, $this->attr_row);
- $this->foreground = 'white';
- $this->background = 'black';
- $this->bold = false;
- $this->underline = false;
- $this->blink = false;
- $this->reverse = false;
- $this->color = false;
-
- $this->ansi = '';
- }
-
- /**
- * Set the number of lines that should be logged past the terminal height
- *
- * @param Integer $x
- * @param Integer $y
- * @access public
- */
- function setHistory($history)
- {
- $this->max_history = $history;
- }
-
- /**
- * Load a string
- *
- * @param String $source
- * @access public
- */
- function loadString($source)
- {
- $this->setDimensions($this->max_x + 1, $this->max_y + 1);
- $this->appendString($source);
- }
-
- /**
- * Appdend a string
- *
- * @param String $source
- * @access public
- */
- function appendString($source)
- {
- for ($i = 0; $i < strlen($source); $i++) {
- if (strlen($this->ansi)) {
- $this->ansi.= $source[$i];
- $chr = ord($source[$i]);
- // http://en.wikipedia.org/wiki/ANSI_escape_code#Sequence_elements
- // single character CSI's not currently supported
- switch (true) {
- case $this->ansi == "\x1B=":
- $this->ansi = '';
- continue 2;
- case strlen($this->ansi) == 2 && $chr >= 64 && $chr <= 95 && $chr != ord('['):
- case strlen($this->ansi) > 2 && $chr >= 64 && $chr <= 126:
- break;
- default:
- continue 2;
- }
- // http://ascii-table.com/ansi-escape-sequences-vt-100.php
- switch ($this->ansi) {
- case "\x1B[H": // Move cursor to upper left corner
- $this->old_x = $this->x;
- $this->old_y = $this->y;
- $this->x = $this->y = 0;
- break;
- case "\x1B[J": // Clear screen from cursor down
- $this->history = array_merge($this->history, array_slice(array_splice($this->screen, $this->y + 1), 0, $this->old_y));
- $this->screen = array_merge($this->screen, array_fill($this->y, $this->max_y, ''));
-
- $this->history_attrs = array_merge($this->history_attrs, array_slice(array_splice($this->attrs, $this->y + 1), 0, $this->old_y));
- $this->attrs = array_merge($this->attrs, array_fill($this->y, $this->max_y, $this->attr_row));
-
- if (count($this->history) == $this->max_history) {
- array_shift($this->history);
- array_shift($this->history_attrs);
- }
- case "\x1B[K": // Clear screen from cursor right
- $this->screen[$this->y] = substr($this->screen[$this->y], 0, $this->x);
-
- array_splice($this->attrs[$this->y], $this->x + 1);
- break;
- case "\x1B[2K": // Clear entire line
- $this->screen[$this->y] = str_repeat(' ', $this->x);
- $this->attrs[$this->y] = $this->attr_row;
- break;
- case "\x1B[?1h": // set cursor key to application
- case "\x1B[?25h": // show the cursor
- break;
- case "\x1BE": // Move to next line
- $this->_newLine();
- $this->x = 0;
- break;
- default:
- switch (true) {
- case preg_match('#\x1B\[(\d+);(\d+)H#', $this->ansi, $match): // Move cursor to screen location v,h
- $this->old_x = $this->x;
- $this->old_y = $this->y;
- $this->x = $match[2] - 1;
- $this->y = $match[1] - 1;
- break;
- case preg_match('#\x1B\[(\d+)C#', $this->ansi, $match): // Move cursor right n lines
- $this->old_x = $this->x;
- $x = $match[1] - 1;
- break;
- case preg_match('#\x1B\[(\d+);(\d+)r#', $this->ansi, $match): // Set top and bottom lines of a window
- break;
- case preg_match('#\x1B\[(\d*(?:;\d*)*)m#', $this->ansi, $match): // character attributes
- $mods = explode(';', $match[1]);
- foreach ($mods as $mod) {
- switch ($mod) {
- case 0: // Turn off character attributes
- $this->attrs[$this->y][$this->x] = '';
-
- if ($this->bold) $this->attrs[$this->y][$this->x].= '';
- if ($this->underline) $this->attrs[$this->y][$this->x].= '';
- if ($this->blink) $this->attrs[$this->y][$this->x].= '';
- if ($this->color) $this->attrs[$this->y][$this->x].= '';
-
- if ($this->reverse) {
- $temp = $this->background;
- $this->background = $this->foreground;
- $this->foreground = $temp;
- }
-
- $this->bold = $this->underline = $this->blink = $this->color = $this->reverse = false;
- break;
- case 1: // Turn bold mode on
- if (!$this->bold) {
- $this->attrs[$this->y][$this->x] = '';
- $this->bold = true;
- }
- break;
- case 4: // Turn underline mode on
- if (!$this->underline) {
- $this->attrs[$this->y][$this->x] = '';
- $this->underline = true;
- }
- break;
- case 5: // Turn blinking mode on
- if (!$this->blink) {
- $this->attrs[$this->y][$this->x] = '';
- $this->blink = true;
- }
- break;
- case 7: // Turn reverse video on
- $this->reverse = !$this->reverse;
- $temp = $this->background;
- $this->background = $this->foreground;
- $this->foreground = $temp;
- $this->attrs[$this->y][$this->x] = '';
- if ($this->color) {
- $this->attrs[$this->y][$this->x] = ' ' . $this->attrs[$this->y][$this->x];
- }
- $this->color = true;
- break;
- default: // set colors
- //$front = $this->reverse ? &$this->background : &$this->foreground;
- $front = &$this->{ $this->reverse ? 'background' : 'foreground' };
- //$back = $this->reverse ? &$this->foreground : &$this->background;
- $back = &$this->{ $this->reverse ? 'foreground' : 'background' };
- switch ($mod) {
- case 30: $front = 'black'; break;
- case 31: $front = 'red'; break;
- case 32: $front = 'green'; break;
- case 33: $front = 'yellow'; break;
- case 34: $front = 'blue'; break;
- case 35: $front = 'magenta'; break;
- case 36: $front = 'cyan'; break;
- case 37: $front = 'white'; break;
-
- case 40: $back = 'black'; break;
- case 41: $back = 'red'; break;
- case 42: $back = 'green'; break;
- case 43: $back = 'yellow'; break;
- case 44: $back = 'blue'; break;
- case 45: $back = 'magenta'; break;
- case 46: $back = 'cyan'; break;
- case 47: $back = 'white'; break;
-
- default:
- user_error('Unsupported attribute: ' . $mod);
- $this->ansi = '';
- break 2;
- }
-
- unset($temp);
- $this->attrs[$this->y][$this->x] = '';
- if ($this->color) {
- $this->attrs[$this->y][$this->x] = ' ' . $this->attrs[$this->y][$this->x];
- }
- $this->color = true;
- }
- }
- break;
- default:
- user_error("{$this->ansi} unsupported\r\n");
- }
- }
- $this->ansi = '';
- continue;
- }
-
- switch ($source[$i]) {
- case "\r":
- $this->x = 0;
- break;
- case "\n":
- $this->_newLine();
- break;
- case "\x0F": // shift
- break;
- case "\x1B": // start ANSI escape code
- $this->ansi.= "\x1B";
- break;
- default:
- $this->screen[$this->y] = substr_replace(
- $this->screen[$this->y],
- $source[$i],
- $this->x,
- 1
- );
-
- if ($this->x > $this->max_x) {
- $this->x = 0;
- $this->y++;
- } else {
- $this->x++;
- }
- }
- }
- }
-
- /**
- * Add a new line
- *
- * Also update the $this->screen and $this->history buffers
- *
- * @access private
- */
- function _newLine()
- {
- //if ($this->y < $this->max_y) {
- // $this->y++;
- //}
-
- while ($this->y >= $this->max_y) {
- $this->history = array_merge($this->history, array(array_shift($this->screen)));
- $this->screen[] = '';
-
- $this->history_attrs = array_merge($this->history_attrs, array(array_shift($this->attrs)));
- $this->attrs[] = $this->attr_row;
-
- if (count($this->history) >= $this->max_history) {
- array_shift($this->history);
- array_shift($this->history_attrs);
- }
-
- $this->y--;
- }
- $this->y++;
- }
-
- /**
- * Returns the current screen without preformating
- *
- * @access private
- * @return String
- */
- function _getScreen()
- {
- $output = '';
- for ($i = 0; $i <= $this->max_y; $i++) {
- for ($j = 0; $j <= $this->max_x + 1; $j++) {
- if (isset($this->attrs[$i][$j])) {
- $output.= $this->attrs[$i][$j];
- }
- if (isset($this->screen[$i][$j])) {
- $output.= htmlspecialchars($this->screen[$i][$j]);
- }
- }
- $output.= "\r\n";
- }
- return rtrim($output);
- }
-
- /**
- * Returns the current screen
- *
- * @access public
- * @return String
- */
- function getScreen()
- {
- return '' . $this->_getScreen() . ' ';
- }
-
- /**
- * Returns the current screen and the x previous lines
- *
- * @access public
- * @return String
- */
- function getHistory()
- {
- $scrollback = '';
- for ($i = 0; $i < count($this->history); $i++) {
- for ($j = 0; $j <= $this->max_x + 1; $j++) {
- if (isset($this->history_attrs[$i][$j])) {
- $scrollback.= $this->history_attrs[$i][$j];
- }
- if (isset($this->history[$i][$j])) {
- $scrollback.= htmlspecialchars($this->history[$i][$j]);
- }
- }
- $scrollback.= "\r\n";
- }
- $scrollback.= $this->_getScreen();
-
- return '' . $scrollback . ' ';
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/File/ASN1.php b/apps/files_external/3rdparty/phpseclib/phpseclib/File/ASN1.php
deleted file mode 100644
index 67d1f6dc7901c315e0fc1e06440f5521b5ab6fda..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/File/ASN1.php
+++ /dev/null
@@ -1,1319 +0,0 @@
-
- * @copyright MMXII Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- */
-
-/**#@+
- * Tag Classes
- *
- * @access private
- * @link http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=12
- */
-define('FILE_ASN1_CLASS_UNIVERSAL', 0);
-define('FILE_ASN1_CLASS_APPLICATION', 1);
-define('FILE_ASN1_CLASS_CONTEXT_SPECIFIC', 2);
-define('FILE_ASN1_CLASS_PRIVATE', 3);
-/**#@-*/
-
-/**#@+
- * Tag Classes
- *
- * @access private
- * @link http://www.obj-sys.com/asn1tutorial/node124.html
- */
-define('FILE_ASN1_TYPE_BOOLEAN', 1);
-define('FILE_ASN1_TYPE_INTEGER', 2);
-define('FILE_ASN1_TYPE_BIT_STRING', 3);
-define('FILE_ASN1_TYPE_OCTET_STRING', 4);
-define('FILE_ASN1_TYPE_NULL', 5);
-define('FILE_ASN1_TYPE_OBJECT_IDENTIFIER', 6);
-//define('FILE_ASN1_TYPE_OBJECT_DESCRIPTOR', 7);
-//define('FILE_ASN1_TYPE_INSTANCE_OF', 8); // EXTERNAL
-define('FILE_ASN1_TYPE_REAL', 9);
-define('FILE_ASN1_TYPE_ENUMERATED', 10);
-//define('FILE_ASN1_TYPE_EMBEDDED', 11);
-define('FILE_ASN1_TYPE_UTF8_STRING', 12);
-//define('FILE_ASN1_TYPE_RELATIVE_OID', 13);
-define('FILE_ASN1_TYPE_SEQUENCE', 16); // SEQUENCE OF
-define('FILE_ASN1_TYPE_SET', 17); // SET OF
-/**#@-*/
-/**#@+
- * More Tag Classes
- *
- * @access private
- * @link http://www.obj-sys.com/asn1tutorial/node10.html
- */
-define('FILE_ASN1_TYPE_NUMERIC_STRING', 18);
-define('FILE_ASN1_TYPE_PRINTABLE_STRING', 19);
-define('FILE_ASN1_TYPE_TELETEX_STRING', 20); // T61String
-define('FILE_ASN1_TYPE_VIDEOTEX_STRING', 21);
-define('FILE_ASN1_TYPE_IA5_STRING', 22);
-define('FILE_ASN1_TYPE_UTC_TIME', 23);
-define('FILE_ASN1_TYPE_GENERALIZED_TIME', 24);
-define('FILE_ASN1_TYPE_GRAPHIC_STRING', 25);
-define('FILE_ASN1_TYPE_VISIBLE_STRING', 26); // ISO646String
-define('FILE_ASN1_TYPE_GENERAL_STRING', 27);
-define('FILE_ASN1_TYPE_UNIVERSAL_STRING', 28);
-//define('FILE_ASN1_TYPE_CHARACTER_STRING', 29);
-define('FILE_ASN1_TYPE_BMP_STRING', 30);
-/**#@-*/
-
-/**#@+
- * Tag Aliases
- *
- * These tags are kinda place holders for other tags.
- *
- * @access private
- */
-define('FILE_ASN1_TYPE_CHOICE', -1);
-define('FILE_ASN1_TYPE_ANY', -2);
-/**#@-*/
-
-/**
- * ASN.1 Element
- *
- * Bypass normal encoding rules in File_ASN1::encodeDER()
- *
- * @package File_ASN1
- * @author Jim Wigginton
- * @version 0.3.0
- * @access public
- */
-class File_ASN1_Element
-{
- /**
- * Raw element value
- *
- * @var String
- * @access private
- */
- var $element;
-
- /**
- * Constructor
- *
- * @param String $encoded
- * @return File_ASN1_Element
- * @access public
- */
- function File_ASN1_Element($encoded)
- {
- $this->element = $encoded;
- }
-}
-
-/**
- * Pure-PHP ASN.1 Parser
- *
- * @package File_ASN1
- * @author Jim Wigginton
- * @version 0.3.0
- * @access public
- */
-class File_ASN1
-{
- /**
- * ASN.1 object identifier
- *
- * @var Array
- * @access private
- * @link http://en.wikipedia.org/wiki/Object_identifier
- */
- var $oids = array();
-
- /**
- * Default date format
- *
- * @var String
- * @access private
- * @link http://php.net/class.datetime
- */
- var $format = 'D, d M y H:i:s O';
-
- /**
- * Default date format
- *
- * @var Array
- * @access private
- * @see File_ASN1::setTimeFormat()
- * @see File_ASN1::asn1map()
- * @link http://php.net/class.datetime
- */
- var $encoded;
-
- /**
- * Filters
- *
- * If the mapping type is FILE_ASN1_TYPE_ANY what do we actually encode it as?
- *
- * @var Array
- * @access private
- * @see File_ASN1::_encode_der()
- */
- var $filters;
-
- /**
- * Type mapping table for the ANY type.
- *
- * Structured or unknown types are mapped to a FILE_ASN1_Element.
- * Unambiguous types get the direct mapping (int/real/bool).
- * Others are mapped as a choice, with an extra indexing level.
- *
- * @var Array
- * @access public
- */
- var $ANYmap = array(
- FILE_ASN1_TYPE_BOOLEAN => true,
- FILE_ASN1_TYPE_INTEGER => true,
- FILE_ASN1_TYPE_BIT_STRING => 'bitString',
- FILE_ASN1_TYPE_OCTET_STRING => 'octetString',
- FILE_ASN1_TYPE_NULL => 'null',
- FILE_ASN1_TYPE_OBJECT_IDENTIFIER => 'objectIdentifier',
- FILE_ASN1_TYPE_REAL => true,
- FILE_ASN1_TYPE_ENUMERATED => 'enumerated',
- FILE_ASN1_TYPE_UTF8_STRING => 'utf8String',
- FILE_ASN1_TYPE_NUMERIC_STRING => 'numericString',
- FILE_ASN1_TYPE_PRINTABLE_STRING => 'printableString',
- FILE_ASN1_TYPE_TELETEX_STRING => 'teletexString',
- FILE_ASN1_TYPE_VIDEOTEX_STRING => 'videotexString',
- FILE_ASN1_TYPE_IA5_STRING => 'ia5String',
- FILE_ASN1_TYPE_UTC_TIME => 'utcTime',
- FILE_ASN1_TYPE_GENERALIZED_TIME => 'generalTime',
- FILE_ASN1_TYPE_GRAPHIC_STRING => 'graphicString',
- FILE_ASN1_TYPE_VISIBLE_STRING => 'visibleString',
- FILE_ASN1_TYPE_GENERAL_STRING => 'generalString',
- FILE_ASN1_TYPE_UNIVERSAL_STRING => 'universalString',
- //FILE_ASN1_TYPE_CHARACTER_STRING => 'characterString',
- FILE_ASN1_TYPE_BMP_STRING => 'bmpString'
- );
-
- /**
- * String type to character size mapping table.
- *
- * Non-convertable types are absent from this table.
- * size == 0 indicates variable length encoding.
- *
- * @var Array
- * @access public
- */
- var $stringTypeSize = array(
- FILE_ASN1_TYPE_UTF8_STRING => 0,
- FILE_ASN1_TYPE_BMP_STRING => 2,
- FILE_ASN1_TYPE_UNIVERSAL_STRING => 4,
- FILE_ASN1_TYPE_PRINTABLE_STRING => 1,
- FILE_ASN1_TYPE_TELETEX_STRING => 1,
- FILE_ASN1_TYPE_IA5_STRING => 1,
- FILE_ASN1_TYPE_VISIBLE_STRING => 1,
- );
-
- /**
- * Default Constructor.
- *
- * @access public
- */
- function File_ASN1()
- {
- static $static_init = null;
- if (!$static_init) {
- $static_init = true;
- if (!class_exists('Math_BigInteger')) {
- include_once 'Math/BigInteger.php';
- }
- }
- }
-
- /**
- * Parse BER-encoding
- *
- * Serves a similar purpose to openssl's asn1parse
- *
- * @param String $encoded
- * @return Array
- * @access public
- */
- function decodeBER($encoded)
- {
- if (is_object($encoded) && strtolower(get_class($encoded)) == 'file_asn1_element') {
- $encoded = $encoded->element;
- }
-
- $this->encoded = $encoded;
- return $this->_decode_ber($encoded);
- }
-
- /**
- * Parse BER-encoding (Helper function)
- *
- * Sometimes we want to get the BER encoding of a particular tag. $start lets us do that without having to reencode.
- * $encoded is passed by reference for the recursive calls done for FILE_ASN1_TYPE_BIT_STRING and
- * FILE_ASN1_TYPE_OCTET_STRING. In those cases, the indefinite length is used.
- *
- * @param String $encoded
- * @param Integer $start
- * @return Array
- * @access private
- */
- function _decode_ber(&$encoded, $start = 0)
- {
- $decoded = array();
-
- while ( strlen($encoded) ) {
- $current = array('start' => $start);
-
- $type = ord($this->_string_shift($encoded));
- $start++;
-
- $constructed = ($type >> 5) & 1;
-
- $tag = $type & 0x1F;
- if ($tag == 0x1F) {
- $tag = 0;
- // process septets (since the eighth bit is ignored, it's not an octet)
- do {
- $loop = ord($encoded[0]) >> 7;
- $tag <<= 7;
- $tag |= ord($this->_string_shift($encoded)) & 0x7F;
- $start++;
- } while ( $loop );
- }
-
- // Length, as discussed in paragraph 8.1.3 of X.690-0207.pdf#page=13
- $length = ord($this->_string_shift($encoded));
- $start++;
- if ( $length == 0x80 ) { // indefinite length
- // "[A sender shall] use the indefinite form (see 8.1.3.6) if the encoding is constructed and is not all
- // immediately available." -- paragraph 8.1.3.2.c
- //if ( !$constructed ) {
- // return false;
- //}
- $length = strlen($encoded);
- } elseif ( $length & 0x80 ) { // definite length, long form
- // technically, the long form of the length can be represented by up to 126 octets (bytes), but we'll only
- // support it up to four.
- $length&= 0x7F;
- $temp = $this->_string_shift($encoded, $length);
- // tags of indefinite length don't really have a header length; this length includes the tag
- $current+= array('headerlength' => $length + 2);
- $start+= $length;
- extract(unpack('Nlength', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4)));
- } else {
- $current+= array('headerlength' => 2);
- }
-
- // End-of-content, see paragraphs 8.1.1.3, 8.1.3.2, 8.1.3.6, 8.1.5, and (for an example) 8.6.4.2
- if (!$type && !$length) {
- return $decoded;
- }
- $content = $this->_string_shift($encoded, $length);
-
- /* Class is UNIVERSAL, APPLICATION, PRIVATE, or CONTEXT-SPECIFIC. The UNIVERSAL class is restricted to the ASN.1
- built-in types. It defines an application-independent data type that must be distinguishable from all other
- data types. The other three classes are user defined. The APPLICATION class distinguishes data types that
- have a wide, scattered use within a particular presentation context. PRIVATE distinguishes data types within
- a particular organization or country. CONTEXT-SPECIFIC distinguishes members of a sequence or set, the
- alternatives of a CHOICE, or universally tagged set members. Only the class number appears in braces for this
- data type; the term CONTEXT-SPECIFIC does not appear.
-
- -- http://www.obj-sys.com/asn1tutorial/node12.html */
- $class = ($type >> 6) & 3;
- switch ($class) {
- case FILE_ASN1_CLASS_APPLICATION:
- case FILE_ASN1_CLASS_PRIVATE:
- case FILE_ASN1_CLASS_CONTEXT_SPECIFIC:
- $decoded[] = array(
- 'type' => $class,
- 'constant' => $tag,
- 'content' => $constructed ? $this->_decode_ber($content, $start) : $content,
- 'length' => $length + $start - $current['start']
- ) + $current;
- $start+= $length;
- continue 2;
- }
-
- $current+= array('type' => $tag);
-
- // decode UNIVERSAL tags
- switch ($tag) {
- case FILE_ASN1_TYPE_BOOLEAN:
- // "The contents octets shall consist of a single octet." -- paragraph 8.2.1
- //if (strlen($content) != 1) {
- // return false;
- //}
- $current['content'] = (bool) ord($content[0]);
- break;
- case FILE_ASN1_TYPE_INTEGER:
- case FILE_ASN1_TYPE_ENUMERATED:
- $current['content'] = new Math_BigInteger($content, -256);
- break;
- case FILE_ASN1_TYPE_REAL: // not currently supported
- return false;
- case FILE_ASN1_TYPE_BIT_STRING:
- // The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit,
- // the number of unused bits in the final subsequent octet. The number shall be in the range zero to
- // seven.
- if (!$constructed) {
- $current['content'] = $content;
- } else {
- $temp = $this->_decode_ber($content, $start);
- $length-= strlen($content);
- $last = count($temp) - 1;
- for ($i = 0; $i < $last; $i++) {
- // all subtags should be bit strings
- //if ($temp[$i]['type'] != FILE_ASN1_TYPE_BIT_STRING) {
- // return false;
- //}
- $current['content'].= substr($temp[$i]['content'], 1);
- }
- // all subtags should be bit strings
- //if ($temp[$last]['type'] != FILE_ASN1_TYPE_BIT_STRING) {
- // return false;
- //}
- $current['content'] = $temp[$last]['content'][0] . $current['content'] . substr($temp[$i]['content'], 1);
- }
- break;
- case FILE_ASN1_TYPE_OCTET_STRING:
- if (!$constructed) {
- $current['content'] = $content;
- } else {
- $temp = $this->_decode_ber($content, $start);
- $length-= strlen($content);
- for ($i = 0, $size = count($temp); $i < $size; $i++) {
- // all subtags should be octet strings
- //if ($temp[$i]['type'] != FILE_ASN1_TYPE_OCTET_STRING) {
- // return false;
- //}
- $current['content'].= $temp[$i]['content'];
- }
- // $length =
- }
- break;
- case FILE_ASN1_TYPE_NULL:
- // "The contents octets shall not contain any octets." -- paragraph 8.8.2
- //if (strlen($content)) {
- // return false;
- //}
- break;
- case FILE_ASN1_TYPE_SEQUENCE:
- case FILE_ASN1_TYPE_SET:
- $current['content'] = $this->_decode_ber($content, $start);
- break;
- case FILE_ASN1_TYPE_OBJECT_IDENTIFIER:
- $temp = ord($this->_string_shift($content));
- $current['content'] = sprintf('%d.%d', floor($temp / 40), $temp % 40);
- $valuen = 0;
- // process septets
- while (strlen($content)) {
- $temp = ord($this->_string_shift($content));
- $valuen <<= 7;
- $valuen |= $temp & 0x7F;
- if (~$temp & 0x80) {
- $current['content'].= ".$valuen";
- $valuen = 0;
- }
- }
- // the eighth bit of the last byte should not be 1
- //if ($temp >> 7) {
- // return false;
- //}
- break;
- /* Each character string type shall be encoded as if it had been declared:
- [UNIVERSAL x] IMPLICIT OCTET STRING
-
- -- X.690-0207.pdf#page=23 (paragraph 8.21.3)
-
- Per that, we're not going to do any validation. If there are any illegal characters in the string,
- we don't really care */
- case FILE_ASN1_TYPE_NUMERIC_STRING:
- // 0,1,2,3,4,5,6,7,8,9, and space
- case FILE_ASN1_TYPE_PRINTABLE_STRING:
- // Upper and lower case letters, digits, space, apostrophe, left/right parenthesis, plus sign, comma,
- // hyphen, full stop, solidus, colon, equal sign, question mark
- case FILE_ASN1_TYPE_TELETEX_STRING:
- // The Teletex character set in CCITT's T61, space, and delete
- // see http://en.wikipedia.org/wiki/Teletex#Character_sets
- case FILE_ASN1_TYPE_VIDEOTEX_STRING:
- // The Videotex character set in CCITT's T.100 and T.101, space, and delete
- case FILE_ASN1_TYPE_VISIBLE_STRING:
- // Printing character sets of international ASCII, and space
- case FILE_ASN1_TYPE_IA5_STRING:
- // International Alphabet 5 (International ASCII)
- case FILE_ASN1_TYPE_GRAPHIC_STRING:
- // All registered G sets, and space
- case FILE_ASN1_TYPE_GENERAL_STRING:
- // All registered C and G sets, space and delete
- case FILE_ASN1_TYPE_UTF8_STRING:
- // ????
- case FILE_ASN1_TYPE_BMP_STRING:
- $current['content'] = $content;
- break;
- case FILE_ASN1_TYPE_UTC_TIME:
- case FILE_ASN1_TYPE_GENERALIZED_TIME:
- $current['content'] = $this->_decodeTime($content, $tag);
- default:
-
- }
-
- $start+= $length;
- $decoded[] = $current + array('length' => $start - $current['start']);
- }
-
- return $decoded;
- }
-
- /**
- * ASN.1 Decode
- *
- * Provides an ASN.1 semantic mapping ($mapping) from a parsed BER-encoding to a human readable format.
- *
- * "Special" mappings may be applied on a per tag-name basis via $special.
- *
- * @param Array $decoded
- * @param Array $mapping
- * @param Array $special
- * @return Array
- * @access public
- */
- function asn1map($decoded, $mapping, $special = array())
- {
- if (isset($mapping['explicit'])) {
- $decoded = $decoded['content'][0];
- }
-
- switch (true) {
- case $mapping['type'] == FILE_ASN1_TYPE_ANY:
- $intype = $decoded['type'];
- if (isset($decoded['constant']) || !isset($this->ANYmap[$intype]) || ($this->encoded[$decoded['start']] & 0x20)) {
- return new File_ASN1_Element(substr($this->encoded, $decoded['start'], $decoded['length']));
- }
- $inmap = $this->ANYmap[$intype];
- if (is_string($inmap)) {
- return array($inmap => $this->asn1map($decoded, array('type' => $intype) + $mapping, $special));
- }
- break;
- case $mapping['type'] == FILE_ASN1_TYPE_CHOICE:
- foreach ($mapping['children'] as $key => $option) {
- switch (true) {
- case isset($option['constant']) && $option['constant'] == $decoded['constant']:
- case !isset($option['constant']) && $option['type'] == $decoded['type']:
- $value = $this->asn1map($decoded, $option, $special);
- break;
- case !isset($option['constant']) && $option['type'] == FILE_ASN1_TYPE_CHOICE:
- $v = $this->asn1map($decoded, $option, $special);
- if (isset($v)) {
- $value = $v;
- }
- }
- if (isset($value)) {
- if (isset($special[$key])) {
- $value = call_user_func($special[$key], $value);
- }
- return array($key => $value);
- }
- }
- return null;
- case isset($mapping['implicit']):
- case isset($mapping['explicit']):
- case $decoded['type'] == $mapping['type']:
- break;
- default:
- return null;
- }
-
- if (isset($mapping['implicit'])) {
- $decoded['type'] = $mapping['type'];
- }
-
- switch ($decoded['type']) {
- case FILE_ASN1_TYPE_SEQUENCE:
- $map = array();
-
- // ignore the min and max
- if (isset($mapping['min']) && isset($mapping['max'])) {
- $child = $mapping['children'];
- foreach ($decoded['content'] as $content) {
- if (($map[] = $this->asn1map($content, $child, $special)) === null) {
- return null;
- }
- }
-
- return $map;
- }
-
- $n = count($decoded['content']);
- $i = 0;
-
- foreach ($mapping['children'] as $key => $child) {
- $maymatch = $i < $n; // Match only existing input.
- if ($maymatch) {
- $temp = $decoded['content'][$i];
-
- if ($child['type'] != FILE_ASN1_TYPE_CHOICE) {
- // Get the mapping and input class & constant.
- $childClass = $tempClass = FILE_ASN1_CLASS_UNIVERSAL;
- $constant = null;
- if (isset($temp['constant'])) {
- $tempClass = isset($temp['class']) ? $temp['class'] : FILE_ASN1_CLASS_CONTEXT_SPECIFIC;
- }
- if (isset($child['class'])) {
- $childClass = $child['class'];
- $constant = $child['cast'];
- } elseif (isset($child['constant'])) {
- $childClass = FILE_ASN1_CLASS_CONTEXT_SPECIFIC;
- $constant = $child['constant'];
- }
-
- if (isset($constant) && isset($temp['constant'])) {
- // Can only match if constants and class match.
- $maymatch = $constant == $temp['constant'] && $childClass == $tempClass;
- } else {
- // Can only match if no constant expected and type matches or is generic.
- $maymatch = !isset($child['constant']) && array_search($child['type'], array($temp['type'], FILE_ASN1_TYPE_ANY, FILE_ASN1_TYPE_CHOICE)) !== false;
- }
- }
- }
-
- if ($maymatch) {
- // Attempt submapping.
- $candidate = $this->asn1map($temp, $child, $special);
- $maymatch = $candidate !== null;
- }
-
- if ($maymatch) {
- // Got the match: use it.
- if (isset($special[$key])) {
- $candidate = call_user_func($special[$key], $candidate);
- }
- $map[$key] = $candidate;
- $i++;
- } elseif (isset($child['default'])) {
- $map[$key] = $child['default']; // Use default.
- } elseif (!isset($child['optional'])) {
- return null; // Syntax error.
- }
- }
-
- // Fail mapping if all input items have not been consumed.
- return $i < $n? null: $map;
-
- // the main diff between sets and sequences is the encapsulation of the foreach in another for loop
- case FILE_ASN1_TYPE_SET:
- $map = array();
-
- // ignore the min and max
- if (isset($mapping['min']) && isset($mapping['max'])) {
- $child = $mapping['children'];
- foreach ($decoded['content'] as $content) {
- if (($map[] = $this->asn1map($content, $child, $special)) === null) {
- return null;
- }
- }
-
- return $map;
- }
-
- for ($i = 0; $i < count($decoded['content']); $i++) {
- $temp = $decoded['content'][$i];
- $tempClass = FILE_ASN1_CLASS_UNIVERSAL;
- if (isset($temp['constant'])) {
- $tempClass = isset($temp['class']) ? $temp['class'] : FILE_ASN1_CLASS_CONTEXT_SPECIFIC;
- }
-
- foreach ($mapping['children'] as $key => $child) {
- if (isset($map[$key])) {
- continue;
- }
- $maymatch = true;
- if ($child['type'] != FILE_ASN1_TYPE_CHOICE) {
- $childClass = FILE_ASN1_CLASS_UNIVERSAL;
- $constant = null;
- if (isset($child['class'])) {
- $childClass = $child['class'];
- $constant = $child['cast'];
- } elseif (isset($child['constant'])) {
- $childClass = FILE_ASN1_CLASS_CONTEXT_SPECIFIC;
- $constant = $child['constant'];
- }
-
- if (isset($constant) && isset($temp['constant'])) {
- // Can only match if constants and class match.
- $maymatch = $constant == $temp['constant'] && $childClass == $tempClass;
- } else {
- // Can only match if no constant expected and type matches or is generic.
- $maymatch = !isset($child['constant']) && array_search($child['type'], array($temp['type'], FILE_ASN1_TYPE_ANY, FILE_ASN1_TYPE_CHOICE)) !== false;
- }
- }
-
- if ($maymatch) {
- // Attempt submapping.
- $candidate = $this->asn1map($temp, $child, $special);
- $maymatch = $candidate !== null;
- }
-
- if (!$maymatch) {
- break;
- }
-
- // Got the match: use it.
- if (isset($special[$key])) {
- $candidate = call_user_func($special[$key], $candidate);
- }
- $map[$key] = $candidate;
- break;
- }
- }
-
- foreach ($mapping['children'] as $key => $child) {
- if (!isset($map[$key])) {
- if (isset($child['default'])) {
- $map[$key] = $child['default'];
- } elseif (!isset($child['optional'])) {
- return null;
- }
- }
- }
- return $map;
- case FILE_ASN1_TYPE_OBJECT_IDENTIFIER:
- return isset($this->oids[$decoded['content']]) ? $this->oids[$decoded['content']] : $decoded['content'];
- case FILE_ASN1_TYPE_UTC_TIME:
- case FILE_ASN1_TYPE_GENERALIZED_TIME:
- if (isset($mapping['implicit'])) {
- $decoded['content'] = $this->_decodeTime($decoded['content'], $decoded['type']);
- }
- return @date($this->format, $decoded['content']);
- case FILE_ASN1_TYPE_BIT_STRING:
- if (isset($mapping['mapping'])) {
- $offset = ord($decoded['content'][0]);
- $size = (strlen($decoded['content']) - 1) * 8 - $offset;
- /*
- From X.680-0207.pdf#page=46 (21.7):
-
- "When a "NamedBitList" is used in defining a bitstring type ASN.1 encoding rules are free to add (or remove)
- arbitrarily any trailing 0 bits to (or from) values that are being encoded or decoded. Application designers should
- therefore ensure that different semantics are not associated with such values which differ only in the number of trailing
- 0 bits."
- */
- $bits = count($mapping['mapping']) == $size ? array() : array_fill(0, count($mapping['mapping']) - $size, false);
- for ($i = strlen($decoded['content']) - 1; $i > 0; $i--) {
- $current = ord($decoded['content'][$i]);
- for ($j = $offset; $j < 8; $j++) {
- $bits[] = (bool) ($current & (1 << $j));
- }
- $offset = 0;
- }
- $values = array();
- $map = array_reverse($mapping['mapping']);
- foreach ($map as $i => $value) {
- if ($bits[$i]) {
- $values[] = $value;
- }
- }
- return $values;
- }
- case FILE_ASN1_TYPE_OCTET_STRING:
- return base64_encode($decoded['content']);
- case FILE_ASN1_TYPE_NULL:
- return '';
- case FILE_ASN1_TYPE_BOOLEAN:
- return $decoded['content'];
- case FILE_ASN1_TYPE_NUMERIC_STRING:
- case FILE_ASN1_TYPE_PRINTABLE_STRING:
- case FILE_ASN1_TYPE_TELETEX_STRING:
- case FILE_ASN1_TYPE_VIDEOTEX_STRING:
- case FILE_ASN1_TYPE_IA5_STRING:
- case FILE_ASN1_TYPE_GRAPHIC_STRING:
- case FILE_ASN1_TYPE_VISIBLE_STRING:
- case FILE_ASN1_TYPE_GENERAL_STRING:
- case FILE_ASN1_TYPE_UNIVERSAL_STRING:
- case FILE_ASN1_TYPE_UTF8_STRING:
- case FILE_ASN1_TYPE_BMP_STRING:
- return $decoded['content'];
- case FILE_ASN1_TYPE_INTEGER:
- case FILE_ASN1_TYPE_ENUMERATED:
- $temp = $decoded['content'];
- if (isset($mapping['implicit'])) {
- $temp = new Math_BigInteger($decoded['content'], -256);
- }
- if (isset($mapping['mapping'])) {
- $temp = (int) $temp->toString();
- return isset($mapping['mapping'][$temp]) ?
- $mapping['mapping'][$temp] :
- false;
- }
- return $temp;
- }
- }
-
- /**
- * ASN.1 Encode
- *
- * DER-encodes an ASN.1 semantic mapping ($mapping). Some libraries would probably call this function
- * an ASN.1 compiler.
- *
- * "Special" mappings can be applied via $special.
- *
- * @param String $source
- * @param String $mapping
- * @param Integer $idx
- * @return String
- * @access public
- */
- function encodeDER($source, $mapping, $special = array())
- {
- $this->location = array();
- return $this->_encode_der($source, $mapping, null, $special);
- }
-
- /**
- * ASN.1 Encode (Helper function)
- *
- * @param String $source
- * @param Array $mapping
- * @param Integer $idx
- * @param Array $special
- * @return String
- * @access private
- */
- /**
- * ASN.1 Encode (Helper function)
- *
- * @param String $source
- * @param String $mapping
- * @param Integer $idx
- * @return String
- * @access private
- */
- function _encode_der($source, $mapping, $idx = null, $special = array())
- {
- if (is_object($source) && strtolower(get_class($source)) == 'file_asn1_element') {
- return $source->element;
- }
-
- // do not encode (implicitly optional) fields with value set to default
- if (isset($mapping['default']) && $source === $mapping['default']) {
- return '';
- }
-
- if (isset($idx)) {
- if (isset($special[$idx])) {
- $source = call_user_func($special[$idx], $source);
- }
- $this->location[] = $idx;
- }
-
- $tag = $mapping['type'];
-
- switch ($tag) {
- case FILE_ASN1_TYPE_SET: // Children order is not important, thus process in sequence.
- case FILE_ASN1_TYPE_SEQUENCE:
- $tag|= 0x20; // set the constructed bit
- $value = '';
-
- // ignore the min and max
- if (isset($mapping['min']) && isset($mapping['max'])) {
- $child = $mapping['children'];
-
- foreach ($source as $content) {
- $temp = $this->_encode_der($content, $child, null, $special);
- if ($temp === false) {
- return false;
- }
- $value.= $temp;
- }
- break;
- }
-
- foreach ($mapping['children'] as $key => $child) {
- if (!isset($source[$key])) {
- if (!isset($child['optional'])) {
- return false;
- }
- continue;
- }
-
- $temp = $this->_encode_der($source[$key], $child, $key, $special);
- if ($temp === false) {
- return false;
- }
-
- // An empty child encoding means it has been optimized out.
- // Else we should have at least one tag byte.
- if ($temp === '') {
- continue;
- }
-
- // if isset($child['constant']) is true then isset($child['optional']) should be true as well
- if (isset($child['constant'])) {
- /*
- From X.680-0207.pdf#page=58 (30.6):
-
- "The tagging construction specifies explicit tagging if any of the following holds:
- ...
- c) the "Tag Type" alternative is used and the value of "TagDefault" for the module is IMPLICIT TAGS or
- AUTOMATIC TAGS, but the type defined by "Type" is an untagged choice type, an untagged open type, or
- an untagged "DummyReference" (see ITU-T Rec. X.683 | ISO/IEC 8824-4, 8.3)."
- */
- if (isset($child['explicit']) || $child['type'] == FILE_ASN1_TYPE_CHOICE) {
- $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']);
- $temp = $subtag . $this->_encodeLength(strlen($temp)) . $temp;
- } else {
- $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']);
- $temp = $subtag . substr($temp, 1);
- }
- }
- $value.= $temp;
- }
- break;
- case FILE_ASN1_TYPE_CHOICE:
- $temp = false;
-
- foreach ($mapping['children'] as $key => $child) {
- if (!isset($source[$key])) {
- continue;
- }
-
- $temp = $this->_encode_der($source[$key], $child, $key, $special);
- if ($temp === false) {
- return false;
- }
-
- // An empty child encoding means it has been optimized out.
- // Else we should have at least one tag byte.
- if ($temp === '') {
- continue;
- }
-
- $tag = ord($temp[0]);
-
- // if isset($child['constant']) is true then isset($child['optional']) should be true as well
- if (isset($child['constant'])) {
- if (isset($child['explicit']) || $child['type'] == FILE_ASN1_TYPE_CHOICE) {
- $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']);
- $temp = $subtag . $this->_encodeLength(strlen($temp)) . $temp;
- } else {
- $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']);
- $temp = $subtag . substr($temp, 1);
- }
- }
- }
-
- if (isset($idx)) {
- array_pop($this->location);
- }
-
- if ($temp && isset($mapping['cast'])) {
- $temp[0] = chr(($mapping['class'] << 6) | ($tag & 0x20) | $mapping['cast']);
- }
-
- return $temp;
- case FILE_ASN1_TYPE_INTEGER:
- case FILE_ASN1_TYPE_ENUMERATED:
- if (!isset($mapping['mapping'])) {
- $value = $source->toBytes(true);
- } else {
- $value = array_search($source, $mapping['mapping']);
- if ($value === false) {
- return false;
- }
- $value = new Math_BigInteger($value);
- $value = $value->toBytes(true);
- }
- if (!strlen($value)) {
- $value = chr(0);
- }
- break;
- case FILE_ASN1_TYPE_UTC_TIME:
- case FILE_ASN1_TYPE_GENERALIZED_TIME:
- $format = $mapping['type'] == FILE_ASN1_TYPE_UTC_TIME ? 'y' : 'Y';
- $format.= 'mdHis';
- $value = @gmdate($format, strtotime($source)) . 'Z';
- break;
- case FILE_ASN1_TYPE_BIT_STRING:
- if (isset($mapping['mapping'])) {
- $bits = array_fill(0, count($mapping['mapping']), 0);
- $size = 0;
- for ($i = 0; $i < count($mapping['mapping']); $i++) {
- if (in_array($mapping['mapping'][$i], $source)) {
- $bits[$i] = 1;
- $size = $i;
- }
- }
-
- $offset = 8 - (($size + 1) & 7);
- $offset = $offset !== 8 ? $offset : 0;
-
- $value = chr($offset);
-
- for ($i = $size + 1; $i < count($mapping['mapping']); $i++) {
- unset($bits[$i]);
- }
-
- $bits = implode('', array_pad($bits, $size + $offset + 1, 0));
- $bytes = explode(' ', rtrim(chunk_split($bits, 8, ' ')));
- foreach ($bytes as $byte) {
- $value.= chr(bindec($byte));
- }
-
- break;
- }
- case FILE_ASN1_TYPE_OCTET_STRING:
- /* The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit,
- the number of unused bits in the final subsequent octet. The number shall be in the range zero to seven.
-
- -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=16 */
- $value = base64_decode($source);
- break;
- case FILE_ASN1_TYPE_OBJECT_IDENTIFIER:
- $oid = preg_match('#(?:\d+\.)+#', $source) ? $source : array_search($source, $this->oids);
- if ($oid === false) {
- user_error('Invalid OID');
- return false;
- }
- $value = '';
- $parts = explode('.', $oid);
- $value = chr(40 * $parts[0] + $parts[1]);
- for ($i = 2; $i < count($parts); $i++) {
- $temp = '';
- if (!$parts[$i]) {
- $temp = "\0";
- } else {
- while ($parts[$i]) {
- $temp = chr(0x80 | ($parts[$i] & 0x7F)) . $temp;
- $parts[$i] >>= 7;
- }
- $temp[strlen($temp) - 1] = $temp[strlen($temp) - 1] & chr(0x7F);
- }
- $value.= $temp;
- }
- break;
- case FILE_ASN1_TYPE_ANY:
- $loc = $this->location;
- if (isset($idx)) {
- array_pop($this->location);
- }
-
- switch (true) {
- case !isset($source):
- return $this->_encode_der(null, array('type' => FILE_ASN1_TYPE_NULL) + $mapping, null, $special);
- case is_int($source):
- case is_object($source) && strtolower(get_class($source)) == 'math_biginteger':
- return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_INTEGER) + $mapping, null, $special);
- case is_float($source):
- return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_REAL) + $mapping, null, $special);
- case is_bool($source):
- return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_BOOLEAN) + $mapping, null, $special);
- case is_array($source) && count($source) == 1:
- $typename = implode('', array_keys($source));
- $outtype = array_search($typename, $this->ANYmap, true);
- if ($outtype !== false) {
- return $this->_encode_der($source[$typename], array('type' => $outtype) + $mapping, null, $special);
- }
- }
-
- $filters = $this->filters;
- foreach ($loc as $part) {
- if (!isset($filters[$part])) {
- $filters = false;
- break;
- }
- $filters = $filters[$part];
- }
- if ($filters === false) {
- user_error('No filters defined for ' . implode('/', $loc));
- return false;
- }
- return $this->_encode_der($source, $filters + $mapping, null, $special);
- case FILE_ASN1_TYPE_NULL:
- $value = '';
- break;
- case FILE_ASN1_TYPE_NUMERIC_STRING:
- case FILE_ASN1_TYPE_TELETEX_STRING:
- case FILE_ASN1_TYPE_PRINTABLE_STRING:
- case FILE_ASN1_TYPE_UNIVERSAL_STRING:
- case FILE_ASN1_TYPE_UTF8_STRING:
- case FILE_ASN1_TYPE_BMP_STRING:
- case FILE_ASN1_TYPE_IA5_STRING:
- case FILE_ASN1_TYPE_VISIBLE_STRING:
- case FILE_ASN1_TYPE_VIDEOTEX_STRING:
- case FILE_ASN1_TYPE_GRAPHIC_STRING:
- case FILE_ASN1_TYPE_GENERAL_STRING:
- $value = $source;
- break;
- case FILE_ASN1_TYPE_BOOLEAN:
- $value = $source ? "\xFF" : "\x00";
- break;
- default:
- user_error('Mapping provides no type definition for ' . implode('/', $this->location));
- return false;
- }
-
- if (isset($idx)) {
- array_pop($this->location);
- }
-
- if (isset($mapping['cast'])) {
- $tag = ($mapping['class'] << 6) | ($tag & 0x20) | $mapping['cast'];
- }
-
- return chr($tag) . $this->_encodeLength(strlen($value)) . $value;
- }
-
- /**
- * DER-encode the length
- *
- * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See
- * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information.
- *
- * @access private
- * @param Integer $length
- * @return String
- */
- function _encodeLength($length)
- {
- if ($length <= 0x7F) {
- return chr($length);
- }
-
- $temp = ltrim(pack('N', $length), chr(0));
- return pack('Ca*', 0x80 | strlen($temp), $temp);
- }
-
- /**
- * BER-decode the time
- *
- * Called by _decode_ber() and in the case of implicit tags asn1map().
- *
- * @access private
- * @param String $content
- * @param Integer $tag
- * @return String
- */
- function _decodeTime($content, $tag)
- {
- /* UTCTime:
- http://tools.ietf.org/html/rfc5280#section-4.1.2.5.1
- http://www.obj-sys.com/asn1tutorial/node15.html
-
- GeneralizedTime:
- http://tools.ietf.org/html/rfc5280#section-4.1.2.5.2
- http://www.obj-sys.com/asn1tutorial/node14.html */
-
- $pattern = $tag == FILE_ASN1_TYPE_UTC_TIME ?
- '#(..)(..)(..)(..)(..)(..)(.*)#' :
- '#(....)(..)(..)(..)(..)(..).*([Z+-].*)$#';
-
- preg_match($pattern, $content, $matches);
-
- list(, $year, $month, $day, $hour, $minute, $second, $timezone) = $matches;
-
- if ($tag == FILE_ASN1_TYPE_UTC_TIME) {
- $year = $year >= 50 ? "19$year" : "20$year";
- }
-
- if ($timezone == 'Z') {
- $mktime = 'gmmktime';
- $timezone = 0;
- } elseif (preg_match('#([+-])(\d\d)(\d\d)#', $timezone, $matches)) {
- $mktime = 'gmmktime';
- $timezone = 60 * $matches[3] + 3600 * $matches[2];
- if ($matches[1] == '-') {
- $timezone = -$timezone;
- }
- } else {
- $mktime = 'mktime';
- $timezone = 0;
- }
-
- return @$mktime($hour, $minute, $second, $month, $day, $year) + $timezone;
- }
-
- /**
- * Set the time format
- *
- * Sets the time / date format for asn1map().
- *
- * @access public
- * @param String $format
- */
- function setTimeFormat($format)
- {
- $this->format = $format;
- }
-
- /**
- * Load OIDs
- *
- * Load the relevant OIDs for a particular ASN.1 semantic mapping.
- *
- * @access public
- * @param Array $oids
- */
- function loadOIDs($oids)
- {
- $this->oids = $oids;
- }
-
- /**
- * Load filters
- *
- * See File_X509, etc, for an example.
- *
- * @access public
- * @param Array $filters
- */
- function loadFilters($filters)
- {
- $this->filters = $filters;
- }
-
- /**
- * String Shift
- *
- * Inspired by array_shift
- *
- * @param String $string
- * @param optional Integer $index
- * @return String
- * @access private
- */
- function _string_shift(&$string, $index = 1)
- {
- $substr = substr($string, 0, $index);
- $string = substr($string, $index);
- return $substr;
- }
-
- /**
- * String type conversion
- *
- * This is a lazy conversion, dealing only with character size.
- * No real conversion table is used.
- *
- * @param String $in
- * @param optional Integer $from
- * @param optional Integer $to
- * @return String
- * @access public
- */
- function convert($in, $from = FILE_ASN1_TYPE_UTF8_STRING, $to = FILE_ASN1_TYPE_UTF8_STRING)
- {
- if (!isset($this->stringTypeSize[$from]) || !isset($this->stringTypeSize[$to])) {
- return false;
- }
- $insize = $this->stringTypeSize[$from];
- $outsize = $this->stringTypeSize[$to];
- $inlength = strlen($in);
- $out = '';
-
- for ($i = 0; $i < $inlength;) {
- if ($inlength - $i < $insize) {
- return false;
- }
-
- // Get an input character as a 32-bit value.
- $c = ord($in[$i++]);
- switch (true) {
- case $insize == 4:
- $c = ($c << 8) | ord($in[$i++]);
- $c = ($c << 8) | ord($in[$i++]);
- case $insize == 2:
- $c = ($c << 8) | ord($in[$i++]);
- case $insize == 1:
- break;
- case ($c & 0x80) == 0x00:
- break;
- case ($c & 0x40) == 0x00:
- return false;
- default:
- $bit = 6;
- do {
- if ($bit > 25 || $i >= $inlength || (ord($in[$i]) & 0xC0) != 0x80) {
- return false;
- }
- $c = ($c << 6) | (ord($in[$i++]) & 0x3F);
- $bit += 5;
- $mask = 1 << $bit;
- } while ($c & $bit);
- $c &= $mask - 1;
- break;
- }
-
- // Convert and append the character to output string.
- $v = '';
- switch (true) {
- case $outsize == 4:
- $v .= chr($c & 0xFF);
- $c >>= 8;
- $v .= chr($c & 0xFF);
- $c >>= 8;
- case $outsize == 2:
- $v .= chr($c & 0xFF);
- $c >>= 8;
- case $outsize == 1:
- $v .= chr($c & 0xFF);
- $c >>= 8;
- if ($c) {
- return false;
- }
- break;
- case ($c & 0x80000000) != 0:
- return false;
- case $c >= 0x04000000:
- $v .= chr(0x80 | ($c & 0x3F));
- $c = ($c >> 6) | 0x04000000;
- case $c >= 0x00200000:
- $v .= chr(0x80 | ($c & 0x3F));
- $c = ($c >> 6) | 0x00200000;
- case $c >= 0x00010000:
- $v .= chr(0x80 | ($c & 0x3F));
- $c = ($c >> 6) | 0x00010000;
- case $c >= 0x00000800:
- $v .= chr(0x80 | ($c & 0x3F));
- $c = ($c >> 6) | 0x00000800;
- case $c >= 0x00000080:
- $v .= chr(0x80 | ($c & 0x3F));
- $c = ($c >> 6) | 0x000000C0;
- default:
- $v .= chr($c);
- break;
- }
- $out .= strrev($v);
- }
- return $out;
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/File/X509.php b/apps/files_external/3rdparty/phpseclib/phpseclib/File/X509.php
deleted file mode 100644
index 9e7b0b3b962445a14bff53a8a79283b728b53741..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/File/X509.php
+++ /dev/null
@@ -1,4433 +0,0 @@
-
- * @copyright MMXII Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- */
-
-/**
- * Include File_ASN1
- */
-if (!class_exists('File_ASN1')) {
- include_once 'ASN1.php';
-}
-
-/**
- * Flag to only accept signatures signed by certificate authorities
- *
- * Not really used anymore but retained all the same to suppress E_NOTICEs from old installs
- *
- * @access public
- */
-define('FILE_X509_VALIDATE_SIGNATURE_BY_CA', 1);
-
-/**#@+
- * @access public
- * @see File_X509::getDN()
- */
-/**
- * Return internal array representation
- */
-define('FILE_X509_DN_ARRAY', 0);
-/**
- * Return string
- */
-define('FILE_X509_DN_STRING', 1);
-/**
- * Return ASN.1 name string
- */
-define('FILE_X509_DN_ASN1', 2);
-/**
- * Return OpenSSL compatible array
- */
-define('FILE_X509_DN_OPENSSL', 3);
-/**
- * Return canonical ASN.1 RDNs string
- */
-define('FILE_X509_DN_CANON', 4);
-/**
- * Return name hash for file indexing
- */
-define('FILE_X509_DN_HASH', 5);
-/**#@-*/
-
-/**#@+
- * @access public
- * @see File_X509::saveX509()
- * @see File_X509::saveCSR()
- * @see File_X509::saveCRL()
- */
-/**
- * Save as PEM
- *
- * ie. a base64-encoded PEM with a header and a footer
- */
-define('FILE_X509_FORMAT_PEM', 0);
-/**
- * Save as DER
- */
-define('FILE_X509_FORMAT_DER', 1);
-/**
- * Save as a SPKAC
- *
- * Only works on CSRs. Not currently supported.
- */
-define('FILE_X509_FORMAT_SPKAC', 2);
-/**#@-*/
-
-/**
- * Attribute value disposition.
- * If disposition is >= 0, this is the index of the target value.
- */
-define('FILE_X509_ATTR_ALL', -1); // All attribute values (array).
-define('FILE_X509_ATTR_APPEND', -2); // Add a value.
-define('FILE_X509_ATTR_REPLACE', -3); // Clear first, then add a value.
-
-/**
- * Pure-PHP X.509 Parser
- *
- * @package File_X509
- * @author Jim Wigginton
- * @version 0.3.1
- * @access public
- */
-class File_X509
-{
- /**
- * ASN.1 syntax for X.509 certificates
- *
- * @var Array
- * @access private
- */
- var $Certificate;
-
- /**#@+
- * ASN.1 syntax for various extensions
- *
- * @access private
- */
- var $DirectoryString;
- var $PKCS9String;
- var $AttributeValue;
- var $Extensions;
- var $KeyUsage;
- var $ExtKeyUsageSyntax;
- var $BasicConstraints;
- var $KeyIdentifier;
- var $CRLDistributionPoints;
- var $AuthorityKeyIdentifier;
- var $CertificatePolicies;
- var $AuthorityInfoAccessSyntax;
- var $SubjectAltName;
- var $PrivateKeyUsagePeriod;
- var $IssuerAltName;
- var $PolicyMappings;
- var $NameConstraints;
-
- var $CPSuri;
- var $UserNotice;
-
- var $netscape_cert_type;
- var $netscape_comment;
- var $netscape_ca_policy_url;
-
- var $Name;
- var $RelativeDistinguishedName;
- var $CRLNumber;
- var $CRLReason;
- var $IssuingDistributionPoint;
- var $InvalidityDate;
- var $CertificateIssuer;
- var $HoldInstructionCode;
- var $SignedPublicKeyAndChallenge;
- /**#@-*/
-
- /**
- * ASN.1 syntax for Certificate Signing Requests (RFC2986)
- *
- * @var Array
- * @access private
- */
- var $CertificationRequest;
-
- /**
- * ASN.1 syntax for Certificate Revocation Lists (RFC5280)
- *
- * @var Array
- * @access private
- */
- var $CertificateList;
-
- /**
- * Distinguished Name
- *
- * @var Array
- * @access private
- */
- var $dn;
-
- /**
- * Public key
- *
- * @var String
- * @access private
- */
- var $publicKey;
-
- /**
- * Private key
- *
- * @var String
- * @access private
- */
- var $privateKey;
-
- /**
- * Object identifiers for X.509 certificates
- *
- * @var Array
- * @access private
- * @link http://en.wikipedia.org/wiki/Object_identifier
- */
- var $oids;
-
- /**
- * The certificate authorities
- *
- * @var Array
- * @access private
- */
- var $CAs;
-
- /**
- * The currently loaded certificate
- *
- * @var Array
- * @access private
- */
- var $currentCert;
-
- /**
- * The signature subject
- *
- * There's no guarantee File_X509 is going to reencode an X.509 cert in the same way it was originally
- * encoded so we take save the portion of the original cert that the signature would have made for.
- *
- * @var String
- * @access private
- */
- var $signatureSubject;
-
- /**
- * Certificate Start Date
- *
- * @var String
- * @access private
- */
- var $startDate;
-
- /**
- * Certificate End Date
- *
- * @var String
- * @access private
- */
- var $endDate;
-
- /**
- * Serial Number
- *
- * @var String
- * @access private
- */
- var $serialNumber;
-
- /**
- * Key Identifier
- *
- * See {@link http://tools.ietf.org/html/rfc5280#section-4.2.1.1 RFC5280#section-4.2.1.1} and
- * {@link http://tools.ietf.org/html/rfc5280#section-4.2.1.2 RFC5280#section-4.2.1.2}.
- *
- * @var String
- * @access private
- */
- var $currentKeyIdentifier;
-
- /**
- * CA Flag
- *
- * @var Boolean
- * @access private
- */
- var $caFlag = false;
-
- /**
- * Default Constructor.
- *
- * @return File_X509
- * @access public
- */
- function File_X509()
- {
- if (!class_exists('Math_BigInteger')) {
- include_once 'Math/BigInteger.php';
- }
-
- // Explicitly Tagged Module, 1988 Syntax
- // http://tools.ietf.org/html/rfc5280#appendix-A.1
-
- $this->DirectoryString = array(
- 'type' => FILE_ASN1_TYPE_CHOICE,
- 'children' => array(
- 'teletexString' => array('type' => FILE_ASN1_TYPE_TELETEX_STRING),
- 'printableString' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING),
- 'universalString' => array('type' => FILE_ASN1_TYPE_UNIVERSAL_STRING),
- 'utf8String' => array('type' => FILE_ASN1_TYPE_UTF8_STRING),
- 'bmpString' => array('type' => FILE_ASN1_TYPE_BMP_STRING)
- )
- );
-
- $this->PKCS9String = array(
- 'type' => FILE_ASN1_TYPE_CHOICE,
- 'children' => array(
- 'ia5String' => array('type' => FILE_ASN1_TYPE_IA5_STRING),
- 'directoryString' => $this->DirectoryString
- )
- );
-
- $this->AttributeValue = array('type' => FILE_ASN1_TYPE_ANY);
-
- $AttributeType = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER);
-
- $AttributeTypeAndValue = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'type' => $AttributeType,
- 'value'=> $this->AttributeValue
- )
- );
-
- /*
- In practice, RDNs containing multiple name-value pairs (called "multivalued RDNs") are rare,
- but they can be useful at times when either there is no unique attribute in the entry or you
- want to ensure that the entry's DN contains some useful identifying information.
-
- - https://www.opends.org/wiki/page/DefinitionRelativeDistinguishedName
- */
- $this->RelativeDistinguishedName = array(
- 'type' => FILE_ASN1_TYPE_SET,
- 'min' => 1,
- 'max' => -1,
- 'children' => $AttributeTypeAndValue
- );
-
- // http://tools.ietf.org/html/rfc5280#section-4.1.2.4
- $RDNSequence = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- // RDNSequence does not define a min or a max, which means it doesn't have one
- 'min' => 0,
- 'max' => -1,
- 'children' => $this->RelativeDistinguishedName
- );
-
- $this->Name = array(
- 'type' => FILE_ASN1_TYPE_CHOICE,
- 'children' => array(
- 'rdnSequence' => $RDNSequence
- )
- );
-
- // http://tools.ietf.org/html/rfc5280#section-4.1.1.2
- $AlgorithmIdentifier = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'algorithm' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER),
- 'parameters' => array(
- 'type' => FILE_ASN1_TYPE_ANY,
- 'optional' => true
- )
- )
- );
-
- /*
- A certificate using system MUST reject the certificate if it encounters
- a critical extension it does not recognize; however, a non-critical
- extension may be ignored if it is not recognized.
-
- http://tools.ietf.org/html/rfc5280#section-4.2
- */
- $Extension = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'extnId' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER),
- 'critical' => array(
- 'type' => FILE_ASN1_TYPE_BOOLEAN,
- 'optional' => true,
- 'default' => false
- ),
- 'extnValue' => array('type' => FILE_ASN1_TYPE_OCTET_STRING)
- )
- );
-
- $this->Extensions = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'min' => 1,
- // technically, it's MAX, but we'll assume anything < 0 is MAX
- 'max' => -1,
- // if 'children' isn't an array then 'min' and 'max' must be defined
- 'children' => $Extension
- );
-
- $SubjectPublicKeyInfo = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'algorithm' => $AlgorithmIdentifier,
- 'subjectPublicKey' => array('type' => FILE_ASN1_TYPE_BIT_STRING)
- )
- );
-
- $UniqueIdentifier = array('type' => FILE_ASN1_TYPE_BIT_STRING);
-
- $Time = array(
- 'type' => FILE_ASN1_TYPE_CHOICE,
- 'children' => array(
- 'utcTime' => array('type' => FILE_ASN1_TYPE_UTC_TIME),
- 'generalTime' => array('type' => FILE_ASN1_TYPE_GENERALIZED_TIME)
- )
- );
-
- // http://tools.ietf.org/html/rfc5280#section-4.1.2.5
- $Validity = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'notBefore' => $Time,
- 'notAfter' => $Time
- )
- );
-
- $CertificateSerialNumber = array('type' => FILE_ASN1_TYPE_INTEGER);
-
- $Version = array(
- 'type' => FILE_ASN1_TYPE_INTEGER,
- 'mapping' => array('v1', 'v2', 'v3')
- );
-
- // assert($TBSCertificate['children']['signature'] == $Certificate['children']['signatureAlgorithm'])
- $TBSCertificate = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- // technically, default implies optional, but we'll define it as being optional, none-the-less, just to
- // reenforce that fact
- 'version' => array(
- 'constant' => 0,
- 'optional' => true,
- 'explicit' => true,
- 'default' => 'v1'
- ) + $Version,
- 'serialNumber' => $CertificateSerialNumber,
- 'signature' => $AlgorithmIdentifier,
- 'issuer' => $this->Name,
- 'validity' => $Validity,
- 'subject' => $this->Name,
- 'subjectPublicKeyInfo' => $SubjectPublicKeyInfo,
- // implicit means that the T in the TLV structure is to be rewritten, regardless of the type
- 'issuerUniqueID' => array(
- 'constant' => 1,
- 'optional' => true,
- 'implicit' => true
- ) + $UniqueIdentifier,
- 'subjectUniqueID' => array(
- 'constant' => 2,
- 'optional' => true,
- 'implicit' => true
- ) + $UniqueIdentifier,
- // doesn't use the EXPLICIT keyword but if
- // it's not IMPLICIT, it's EXPLICIT
- 'extensions' => array(
- 'constant' => 3,
- 'optional' => true,
- 'explicit' => true
- ) + $this->Extensions
- )
- );
-
- $this->Certificate = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'tbsCertificate' => $TBSCertificate,
- 'signatureAlgorithm' => $AlgorithmIdentifier,
- 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING)
- )
- );
-
- $this->KeyUsage = array(
- 'type' => FILE_ASN1_TYPE_BIT_STRING,
- 'mapping' => array(
- 'digitalSignature',
- 'nonRepudiation',
- 'keyEncipherment',
- 'dataEncipherment',
- 'keyAgreement',
- 'keyCertSign',
- 'cRLSign',
- 'encipherOnly',
- 'decipherOnly'
- )
- );
-
- $this->BasicConstraints = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'cA' => array(
- 'type' => FILE_ASN1_TYPE_BOOLEAN,
- 'optional' => true,
- 'default' => false
- ),
- 'pathLenConstraint' => array(
- 'type' => FILE_ASN1_TYPE_INTEGER,
- 'optional' => true
- )
- )
- );
-
- $this->KeyIdentifier = array('type' => FILE_ASN1_TYPE_OCTET_STRING);
-
- $OrganizationalUnitNames = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'min' => 1,
- 'max' => 4, // ub-organizational-units
- 'children' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING)
- );
-
- $PersonalName = array(
- 'type' => FILE_ASN1_TYPE_SET,
- 'children' => array(
- 'surname' => array(
- 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING,
- 'constant' => 0,
- 'optional' => true,
- 'implicit' => true
- ),
- 'given-name' => array(
- 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING,
- 'constant' => 1,
- 'optional' => true,
- 'implicit' => true
- ),
- 'initials' => array(
- 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING,
- 'constant' => 2,
- 'optional' => true,
- 'implicit' => true
- ),
- 'generation-qualifier' => array(
- 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING,
- 'constant' => 3,
- 'optional' => true,
- 'implicit' => true
- )
- )
- );
-
- $NumericUserIdentifier = array('type' => FILE_ASN1_TYPE_NUMERIC_STRING);
-
- $OrganizationName = array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING);
-
- $PrivateDomainName = array(
- 'type' => FILE_ASN1_TYPE_CHOICE,
- 'children' => array(
- 'numeric' => array('type' => FILE_ASN1_TYPE_NUMERIC_STRING),
- 'printable' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING)
- )
- );
-
- $TerminalIdentifier = array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING);
-
- $NetworkAddress = array('type' => FILE_ASN1_TYPE_NUMERIC_STRING);
-
- $AdministrationDomainName = array(
- 'type' => FILE_ASN1_TYPE_CHOICE,
- // if class isn't present it's assumed to be FILE_ASN1_CLASS_UNIVERSAL or
- // (if constant is present) FILE_ASN1_CLASS_CONTEXT_SPECIFIC
- 'class' => FILE_ASN1_CLASS_APPLICATION,
- 'cast' => 2,
- 'children' => array(
- 'numeric' => array('type' => FILE_ASN1_TYPE_NUMERIC_STRING),
- 'printable' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING)
- )
- );
-
- $CountryName = array(
- 'type' => FILE_ASN1_TYPE_CHOICE,
- // if class isn't present it's assumed to be FILE_ASN1_CLASS_UNIVERSAL or
- // (if constant is present) FILE_ASN1_CLASS_CONTEXT_SPECIFIC
- 'class' => FILE_ASN1_CLASS_APPLICATION,
- 'cast' => 1,
- 'children' => array(
- 'x121-dcc-code' => array('type' => FILE_ASN1_TYPE_NUMERIC_STRING),
- 'iso-3166-alpha2-code' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING)
- )
- );
-
- $AnotherName = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'type-id' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER),
- 'value' => array(
- 'type' => FILE_ASN1_TYPE_ANY,
- 'constant' => 0,
- 'optional' => true,
- 'explicit' => true
- )
- )
- );
-
- $ExtensionAttribute = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'extension-attribute-type' => array(
- 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING,
- 'constant' => 0,
- 'optional' => true,
- 'implicit' => true
- ),
- 'extension-attribute-value' => array(
- 'type' => FILE_ASN1_TYPE_ANY,
- 'constant' => 1,
- 'optional' => true,
- 'explicit' => true
- )
- )
- );
-
- $ExtensionAttributes = array(
- 'type' => FILE_ASN1_TYPE_SET,
- 'min' => 1,
- 'max' => 256, // ub-extension-attributes
- 'children' => $ExtensionAttribute
- );
-
- $BuiltInDomainDefinedAttribute = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'type' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING),
- 'value' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING)
- )
- );
-
- $BuiltInDomainDefinedAttributes = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'min' => 1,
- 'max' => 4, // ub-domain-defined-attributes
- 'children' => $BuiltInDomainDefinedAttribute
- );
-
- $BuiltInStandardAttributes = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'country-name' => array('optional' => true) + $CountryName,
- 'administration-domain-name' => array('optional' => true) + $AdministrationDomainName,
- 'network-address' => array(
- 'constant' => 0,
- 'optional' => true,
- 'implicit' => true
- ) + $NetworkAddress,
- 'terminal-identifier' => array(
- 'constant' => 1,
- 'optional' => true,
- 'implicit' => true
- ) + $TerminalIdentifier,
- 'private-domain-name' => array(
- 'constant' => 2,
- 'optional' => true,
- 'explicit' => true
- ) + $PrivateDomainName,
- 'organization-name' => array(
- 'constant' => 3,
- 'optional' => true,
- 'implicit' => true
- ) + $OrganizationName,
- 'numeric-user-identifier' => array(
- 'constant' => 4,
- 'optional' => true,
- 'implicit' => true
- ) + $NumericUserIdentifier,
- 'personal-name' => array(
- 'constant' => 5,
- 'optional' => true,
- 'implicit' => true
- ) + $PersonalName,
- 'organizational-unit-names' => array(
- 'constant' => 6,
- 'optional' => true,
- 'implicit' => true
- ) + $OrganizationalUnitNames
- )
- );
-
- $ORAddress = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'built-in-standard-attributes' => $BuiltInStandardAttributes,
- 'built-in-domain-defined-attributes' => array('optional' => true) + $BuiltInDomainDefinedAttributes,
- 'extension-attributes' => array('optional' => true) + $ExtensionAttributes
- )
- );
-
- $EDIPartyName = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'nameAssigner' => array(
- 'constant' => 0,
- 'optional' => true,
- 'implicit' => true
- ) + $this->DirectoryString,
- // partyName is technically required but File_ASN1 doesn't currently support non-optional constants and
- // setting it to optional gets the job done in any event.
- 'partyName' => array(
- 'constant' => 1,
- 'optional' => true,
- 'implicit' => true
- ) + $this->DirectoryString
- )
- );
-
- $GeneralName = array(
- 'type' => FILE_ASN1_TYPE_CHOICE,
- 'children' => array(
- 'otherName' => array(
- 'constant' => 0,
- 'optional' => true,
- 'implicit' => true
- ) + $AnotherName,
- 'rfc822Name' => array(
- 'type' => FILE_ASN1_TYPE_IA5_STRING,
- 'constant' => 1,
- 'optional' => true,
- 'implicit' => true
- ),
- 'dNSName' => array(
- 'type' => FILE_ASN1_TYPE_IA5_STRING,
- 'constant' => 2,
- 'optional' => true,
- 'implicit' => true
- ),
- 'x400Address' => array(
- 'constant' => 3,
- 'optional' => true,
- 'implicit' => true
- ) + $ORAddress,
- 'directoryName' => array(
- 'constant' => 4,
- 'optional' => true,
- 'explicit' => true
- ) + $this->Name,
- 'ediPartyName' => array(
- 'constant' => 5,
- 'optional' => true,
- 'implicit' => true
- ) + $EDIPartyName,
- 'uniformResourceIdentifier' => array(
- 'type' => FILE_ASN1_TYPE_IA5_STRING,
- 'constant' => 6,
- 'optional' => true,
- 'implicit' => true
- ),
- 'iPAddress' => array(
- 'type' => FILE_ASN1_TYPE_OCTET_STRING,
- 'constant' => 7,
- 'optional' => true,
- 'implicit' => true
- ),
- 'registeredID' => array(
- 'type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER,
- 'constant' => 8,
- 'optional' => true,
- 'implicit' => true
- )
- )
- );
-
- $GeneralNames = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'min' => 1,
- 'max' => -1,
- 'children' => $GeneralName
- );
-
- $this->IssuerAltName = $GeneralNames;
-
- $ReasonFlags = array(
- 'type' => FILE_ASN1_TYPE_BIT_STRING,
- 'mapping' => array(
- 'unused',
- 'keyCompromise',
- 'cACompromise',
- 'affiliationChanged',
- 'superseded',
- 'cessationOfOperation',
- 'certificateHold',
- 'privilegeWithdrawn',
- 'aACompromise'
- )
- );
-
- $DistributionPointName = array(
- 'type' => FILE_ASN1_TYPE_CHOICE,
- 'children' => array(
- 'fullName' => array(
- 'constant' => 0,
- 'optional' => true,
- 'implicit' => true
- ) + $GeneralNames,
- 'nameRelativeToCRLIssuer' => array(
- 'constant' => 1,
- 'optional' => true,
- 'implicit' => true
- ) + $this->RelativeDistinguishedName
- )
- );
-
- $DistributionPoint = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'distributionPoint' => array(
- 'constant' => 0,
- 'optional' => true,
- 'explicit' => true
- ) + $DistributionPointName,
- 'reasons' => array(
- 'constant' => 1,
- 'optional' => true,
- 'implicit' => true
- ) + $ReasonFlags,
- 'cRLIssuer' => array(
- 'constant' => 2,
- 'optional' => true,
- 'implicit' => true
- ) + $GeneralNames
- )
- );
-
- $this->CRLDistributionPoints = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'min' => 1,
- 'max' => -1,
- 'children' => $DistributionPoint
- );
-
- $this->AuthorityKeyIdentifier = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'keyIdentifier' => array(
- 'constant' => 0,
- 'optional' => true,
- 'implicit' => true
- ) + $this->KeyIdentifier,
- 'authorityCertIssuer' => array(
- 'constant' => 1,
- 'optional' => true,
- 'implicit' => true
- ) + $GeneralNames,
- 'authorityCertSerialNumber' => array(
- 'constant' => 2,
- 'optional' => true,
- 'implicit' => true
- ) + $CertificateSerialNumber
- )
- );
-
- $PolicyQualifierId = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER);
-
- $PolicyQualifierInfo = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'policyQualifierId' => $PolicyQualifierId,
- 'qualifier' => array('type' => FILE_ASN1_TYPE_ANY)
- )
- );
-
- $CertPolicyId = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER);
-
- $PolicyInformation = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'policyIdentifier' => $CertPolicyId,
- 'policyQualifiers' => array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'min' => 0,
- 'max' => -1,
- 'optional' => true,
- 'children' => $PolicyQualifierInfo
- )
- )
- );
-
- $this->CertificatePolicies = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'min' => 1,
- 'max' => -1,
- 'children' => $PolicyInformation
- );
-
- $this->PolicyMappings = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'min' => 1,
- 'max' => -1,
- 'children' => array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'issuerDomainPolicy' => $CertPolicyId,
- 'subjectDomainPolicy' => $CertPolicyId
- )
- )
- );
-
- $KeyPurposeId = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER);
-
- $this->ExtKeyUsageSyntax = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'min' => 1,
- 'max' => -1,
- 'children' => $KeyPurposeId
- );
-
- $AccessDescription = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'accessMethod' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER),
- 'accessLocation' => $GeneralName
- )
- );
-
- $this->AuthorityInfoAccessSyntax = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'min' => 1,
- 'max' => -1,
- 'children' => $AccessDescription
- );
-
- $this->SubjectAltName = $GeneralNames;
-
- $this->PrivateKeyUsagePeriod = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'notBefore' => array(
- 'constant' => 0,
- 'optional' => true,
- 'implicit' => true,
- 'type' => FILE_ASN1_TYPE_GENERALIZED_TIME),
- 'notAfter' => array(
- 'constant' => 1,
- 'optional' => true,
- 'implicit' => true,
- 'type' => FILE_ASN1_TYPE_GENERALIZED_TIME)
- )
- );
-
- $BaseDistance = array('type' => FILE_ASN1_TYPE_INTEGER);
-
- $GeneralSubtree = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'base' => $GeneralName,
- 'minimum' => array(
- 'constant' => 0,
- 'optional' => true,
- 'implicit' => true,
- 'default' => new Math_BigInteger(0)
- ) + $BaseDistance,
- 'maximum' => array(
- 'constant' => 1,
- 'optional' => true,
- 'implicit' => true,
- ) + $BaseDistance
- )
- );
-
- $GeneralSubtrees = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'min' => 1,
- 'max' => -1,
- 'children' => $GeneralSubtree
- );
-
- $this->NameConstraints = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'permittedSubtrees' => array(
- 'constant' => 0,
- 'optional' => true,
- 'implicit' => true
- ) + $GeneralSubtrees,
- 'excludedSubtrees' => array(
- 'constant' => 1,
- 'optional' => true,
- 'implicit' => true
- ) + $GeneralSubtrees
- )
- );
-
- $this->CPSuri = array('type' => FILE_ASN1_TYPE_IA5_STRING);
-
- $DisplayText = array(
- 'type' => FILE_ASN1_TYPE_CHOICE,
- 'children' => array(
- 'ia5String' => array('type' => FILE_ASN1_TYPE_IA5_STRING),
- 'visibleString' => array('type' => FILE_ASN1_TYPE_VISIBLE_STRING),
- 'bmpString' => array('type' => FILE_ASN1_TYPE_BMP_STRING),
- 'utf8String' => array('type' => FILE_ASN1_TYPE_UTF8_STRING)
- )
- );
-
- $NoticeReference = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'organization' => $DisplayText,
- 'noticeNumbers' => array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'min' => 1,
- 'max' => 200,
- 'children' => array('type' => FILE_ASN1_TYPE_INTEGER)
- )
- )
- );
-
- $this->UserNotice = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'noticeRef' => array(
- 'optional' => true,
- 'implicit' => true
- ) + $NoticeReference,
- 'explicitText' => array(
- 'optional' => true,
- 'implicit' => true
- ) + $DisplayText
- )
- );
-
- // mapping is from
- $this->netscape_cert_type = array(
- 'type' => FILE_ASN1_TYPE_BIT_STRING,
- 'mapping' => array(
- 'SSLClient',
- 'SSLServer',
- 'Email',
- 'ObjectSigning',
- 'Reserved',
- 'SSLCA',
- 'EmailCA',
- 'ObjectSigningCA'
- )
- );
-
- $this->netscape_comment = array('type' => FILE_ASN1_TYPE_IA5_STRING);
- $this->netscape_ca_policy_url = array('type' => FILE_ASN1_TYPE_IA5_STRING);
-
- // attribute is used in RFC2986 but we're using the RFC5280 definition
-
- $Attribute = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'type' => $AttributeType,
- 'value'=> array(
- 'type' => FILE_ASN1_TYPE_SET,
- 'min' => 1,
- 'max' => -1,
- 'children' => $this->AttributeValue
- )
- )
- );
-
- // adapted from
-
- $Attributes = array(
- 'type' => FILE_ASN1_TYPE_SET,
- 'min' => 1,
- 'max' => -1,
- 'children' => $Attribute
- );
-
- $CertificationRequestInfo = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'version' => array(
- 'type' => FILE_ASN1_TYPE_INTEGER,
- 'mapping' => array('v1')
- ),
- 'subject' => $this->Name,
- 'subjectPKInfo' => $SubjectPublicKeyInfo,
- 'attributes' => array(
- 'constant' => 0,
- 'optional' => true,
- 'implicit' => true
- ) + $Attributes,
- )
- );
-
- $this->CertificationRequest = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'certificationRequestInfo' => $CertificationRequestInfo,
- 'signatureAlgorithm' => $AlgorithmIdentifier,
- 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING)
- )
- );
-
- $RevokedCertificate = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'userCertificate' => $CertificateSerialNumber,
- 'revocationDate' => $Time,
- 'crlEntryExtensions' => array(
- 'optional' => true
- ) + $this->Extensions
- )
- );
-
- $TBSCertList = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'version' => array(
- 'optional' => true,
- 'default' => 'v1'
- ) + $Version,
- 'signature' => $AlgorithmIdentifier,
- 'issuer' => $this->Name,
- 'thisUpdate' => $Time,
- 'nextUpdate' => array(
- 'optional' => true
- ) + $Time,
- 'revokedCertificates' => array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'optional' => true,
- 'min' => 0,
- 'max' => -1,
- 'children' => $RevokedCertificate
- ),
- 'crlExtensions' => array(
- 'constant' => 0,
- 'optional' => true,
- 'explicit' => true
- ) + $this->Extensions
- )
- );
-
- $this->CertificateList = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'tbsCertList' => $TBSCertList,
- 'signatureAlgorithm' => $AlgorithmIdentifier,
- 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING)
- )
- );
-
- $this->CRLNumber = array('type' => FILE_ASN1_TYPE_INTEGER);
-
- $this->CRLReason = array('type' => FILE_ASN1_TYPE_ENUMERATED,
- 'mapping' => array(
- 'unspecified',
- 'keyCompromise',
- 'cACompromise',
- 'affiliationChanged',
- 'superseded',
- 'cessationOfOperation',
- 'certificateHold',
- // Value 7 is not used.
- 8 => 'removeFromCRL',
- 'privilegeWithdrawn',
- 'aACompromise'
- )
- );
-
- $this->IssuingDistributionPoint = array('type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'distributionPoint' => array(
- 'constant' => 0,
- 'optional' => true,
- 'explicit' => true
- ) + $DistributionPointName,
- 'onlyContainsUserCerts' => array(
- 'type' => FILE_ASN1_TYPE_BOOLEAN,
- 'constant' => 1,
- 'optional' => true,
- 'default' => false,
- 'implicit' => true
- ),
- 'onlyContainsCACerts' => array(
- 'type' => FILE_ASN1_TYPE_BOOLEAN,
- 'constant' => 2,
- 'optional' => true,
- 'default' => false,
- 'implicit' => true
- ),
- 'onlySomeReasons' => array(
- 'constant' => 3,
- 'optional' => true,
- 'implicit' => true
- ) + $ReasonFlags,
- 'indirectCRL' => array(
- 'type' => FILE_ASN1_TYPE_BOOLEAN,
- 'constant' => 4,
- 'optional' => true,
- 'default' => false,
- 'implicit' => true
- ),
- 'onlyContainsAttributeCerts' => array(
- 'type' => FILE_ASN1_TYPE_BOOLEAN,
- 'constant' => 5,
- 'optional' => true,
- 'default' => false,
- 'implicit' => true
- )
- )
- );
-
- $this->InvalidityDate = array('type' => FILE_ASN1_TYPE_GENERALIZED_TIME);
-
- $this->CertificateIssuer = $GeneralNames;
-
- $this->HoldInstructionCode = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER);
-
- $PublicKeyAndChallenge = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'spki' => $SubjectPublicKeyInfo,
- 'challenge' => array('type' => FILE_ASN1_TYPE_IA5_STRING)
- )
- );
-
- $this->SignedPublicKeyAndChallenge = array(
- 'type' => FILE_ASN1_TYPE_SEQUENCE,
- 'children' => array(
- 'publicKeyAndChallenge' => $PublicKeyAndChallenge,
- 'signatureAlgorithm' => $AlgorithmIdentifier,
- 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING)
- )
- );
-
- // OIDs from RFC5280 and those RFCs mentioned in RFC5280#section-4.1.1.2
- $this->oids = array(
- '1.3.6.1.5.5.7' => 'id-pkix',
- '1.3.6.1.5.5.7.1' => 'id-pe',
- '1.3.6.1.5.5.7.2' => 'id-qt',
- '1.3.6.1.5.5.7.3' => 'id-kp',
- '1.3.6.1.5.5.7.48' => 'id-ad',
- '1.3.6.1.5.5.7.2.1' => 'id-qt-cps',
- '1.3.6.1.5.5.7.2.2' => 'id-qt-unotice',
- '1.3.6.1.5.5.7.48.1' =>'id-ad-ocsp',
- '1.3.6.1.5.5.7.48.2' => 'id-ad-caIssuers',
- '1.3.6.1.5.5.7.48.3' => 'id-ad-timeStamping',
- '1.3.6.1.5.5.7.48.5' => 'id-ad-caRepository',
- '2.5.4' => 'id-at',
- '2.5.4.41' => 'id-at-name',
- '2.5.4.4' => 'id-at-surname',
- '2.5.4.42' => 'id-at-givenName',
- '2.5.4.43' => 'id-at-initials',
- '2.5.4.44' => 'id-at-generationQualifier',
- '2.5.4.3' => 'id-at-commonName',
- '2.5.4.7' => 'id-at-localityName',
- '2.5.4.8' => 'id-at-stateOrProvinceName',
- '2.5.4.10' => 'id-at-organizationName',
- '2.5.4.11' => 'id-at-organizationalUnitName',
- '2.5.4.12' => 'id-at-title',
- '2.5.4.13' => 'id-at-description',
- '2.5.4.46' => 'id-at-dnQualifier',
- '2.5.4.6' => 'id-at-countryName',
- '2.5.4.5' => 'id-at-serialNumber',
- '2.5.4.65' => 'id-at-pseudonym',
- '2.5.4.17' => 'id-at-postalCode',
- '2.5.4.9' => 'id-at-streetAddress',
- '2.5.4.45' => 'id-at-uniqueIdentifier',
- '2.5.4.72' => 'id-at-role',
-
- '0.9.2342.19200300.100.1.25' => 'id-domainComponent',
- '1.2.840.113549.1.9' => 'pkcs-9',
- '1.2.840.113549.1.9.1' => 'pkcs-9-at-emailAddress',
- '2.5.29' => 'id-ce',
- '2.5.29.35' => 'id-ce-authorityKeyIdentifier',
- '2.5.29.14' => 'id-ce-subjectKeyIdentifier',
- '2.5.29.15' => 'id-ce-keyUsage',
- '2.5.29.16' => 'id-ce-privateKeyUsagePeriod',
- '2.5.29.32' => 'id-ce-certificatePolicies',
- '2.5.29.32.0' => 'anyPolicy',
-
- '2.5.29.33' => 'id-ce-policyMappings',
- '2.5.29.17' => 'id-ce-subjectAltName',
- '2.5.29.18' => 'id-ce-issuerAltName',
- '2.5.29.9' => 'id-ce-subjectDirectoryAttributes',
- '2.5.29.19' => 'id-ce-basicConstraints',
- '2.5.29.30' => 'id-ce-nameConstraints',
- '2.5.29.36' => 'id-ce-policyConstraints',
- '2.5.29.31' => 'id-ce-cRLDistributionPoints',
- '2.5.29.37' => 'id-ce-extKeyUsage',
- '2.5.29.37.0' => 'anyExtendedKeyUsage',
- '1.3.6.1.5.5.7.3.1' => 'id-kp-serverAuth',
- '1.3.6.1.5.5.7.3.2' => 'id-kp-clientAuth',
- '1.3.6.1.5.5.7.3.3' => 'id-kp-codeSigning',
- '1.3.6.1.5.5.7.3.4' => 'id-kp-emailProtection',
- '1.3.6.1.5.5.7.3.8' => 'id-kp-timeStamping',
- '1.3.6.1.5.5.7.3.9' => 'id-kp-OCSPSigning',
- '2.5.29.54' => 'id-ce-inhibitAnyPolicy',
- '2.5.29.46' => 'id-ce-freshestCRL',
- '1.3.6.1.5.5.7.1.1' => 'id-pe-authorityInfoAccess',
- '1.3.6.1.5.5.7.1.11' => 'id-pe-subjectInfoAccess',
- '2.5.29.20' => 'id-ce-cRLNumber',
- '2.5.29.28' => 'id-ce-issuingDistributionPoint',
- '2.5.29.27' => 'id-ce-deltaCRLIndicator',
- '2.5.29.21' => 'id-ce-cRLReasons',
- '2.5.29.29' => 'id-ce-certificateIssuer',
- '2.5.29.23' => 'id-ce-holdInstructionCode',
- '1.2.840.10040.2' => 'holdInstruction',
- '1.2.840.10040.2.1' => 'id-holdinstruction-none',
- '1.2.840.10040.2.2' => 'id-holdinstruction-callissuer',
- '1.2.840.10040.2.3' => 'id-holdinstruction-reject',
- '2.5.29.24' => 'id-ce-invalidityDate',
-
- '1.2.840.113549.2.2' => 'md2',
- '1.2.840.113549.2.5' => 'md5',
- '1.3.14.3.2.26' => 'id-sha1',
- '1.2.840.10040.4.1' => 'id-dsa',
- '1.2.840.10040.4.3' => 'id-dsa-with-sha1',
- '1.2.840.113549.1.1' => 'pkcs-1',
- '1.2.840.113549.1.1.1' => 'rsaEncryption',
- '1.2.840.113549.1.1.2' => 'md2WithRSAEncryption',
- '1.2.840.113549.1.1.4' => 'md5WithRSAEncryption',
- '1.2.840.113549.1.1.5' => 'sha1WithRSAEncryption',
- '1.2.840.10046.2.1' => 'dhpublicnumber',
- '2.16.840.1.101.2.1.1.22' => 'id-keyExchangeAlgorithm',
- '1.2.840.10045' => 'ansi-X9-62',
- '1.2.840.10045.4' => 'id-ecSigType',
- '1.2.840.10045.4.1' => 'ecdsa-with-SHA1',
- '1.2.840.10045.1' => 'id-fieldType',
- '1.2.840.10045.1.1' => 'prime-field',
- '1.2.840.10045.1.2' => 'characteristic-two-field',
- '1.2.840.10045.1.2.3' => 'id-characteristic-two-basis',
- '1.2.840.10045.1.2.3.1' => 'gnBasis',
- '1.2.840.10045.1.2.3.2' => 'tpBasis',
- '1.2.840.10045.1.2.3.3' => 'ppBasis',
- '1.2.840.10045.2' => 'id-publicKeyType',
- '1.2.840.10045.2.1' => 'id-ecPublicKey',
- '1.2.840.10045.3' => 'ellipticCurve',
- '1.2.840.10045.3.0' => 'c-TwoCurve',
- '1.2.840.10045.3.0.1' => 'c2pnb163v1',
- '1.2.840.10045.3.0.2' => 'c2pnb163v2',
- '1.2.840.10045.3.0.3' => 'c2pnb163v3',
- '1.2.840.10045.3.0.4' => 'c2pnb176w1',
- '1.2.840.10045.3.0.5' => 'c2pnb191v1',
- '1.2.840.10045.3.0.6' => 'c2pnb191v2',
- '1.2.840.10045.3.0.7' => 'c2pnb191v3',
- '1.2.840.10045.3.0.8' => 'c2pnb191v4',
- '1.2.840.10045.3.0.9' => 'c2pnb191v5',
- '1.2.840.10045.3.0.10' => 'c2pnb208w1',
- '1.2.840.10045.3.0.11' => 'c2pnb239v1',
- '1.2.840.10045.3.0.12' => 'c2pnb239v2',
- '1.2.840.10045.3.0.13' => 'c2pnb239v3',
- '1.2.840.10045.3.0.14' => 'c2pnb239v4',
- '1.2.840.10045.3.0.15' => 'c2pnb239v5',
- '1.2.840.10045.3.0.16' => 'c2pnb272w1',
- '1.2.840.10045.3.0.17' => 'c2pnb304w1',
- '1.2.840.10045.3.0.18' => 'c2pnb359v1',
- '1.2.840.10045.3.0.19' => 'c2pnb368w1',
- '1.2.840.10045.3.0.20' => 'c2pnb431r1',
- '1.2.840.10045.3.1' => 'primeCurve',
- '1.2.840.10045.3.1.1' => 'prime192v1',
- '1.2.840.10045.3.1.2' => 'prime192v2',
- '1.2.840.10045.3.1.3' => 'prime192v3',
- '1.2.840.10045.3.1.4' => 'prime239v1',
- '1.2.840.10045.3.1.5' => 'prime239v2',
- '1.2.840.10045.3.1.6' => 'prime239v3',
- '1.2.840.10045.3.1.7' => 'prime256v1',
- '1.2.840.113549.1.1.7' => 'id-RSAES-OAEP',
- '1.2.840.113549.1.1.9' => 'id-pSpecified',
- '1.2.840.113549.1.1.10' => 'id-RSASSA-PSS',
- '1.2.840.113549.1.1.8' => 'id-mgf1',
- '1.2.840.113549.1.1.14' => 'sha224WithRSAEncryption',
- '1.2.840.113549.1.1.11' => 'sha256WithRSAEncryption',
- '1.2.840.113549.1.1.12' => 'sha384WithRSAEncryption',
- '1.2.840.113549.1.1.13' => 'sha512WithRSAEncryption',
- '2.16.840.1.101.3.4.2.4' => 'id-sha224',
- '2.16.840.1.101.3.4.2.1' => 'id-sha256',
- '2.16.840.1.101.3.4.2.2' => 'id-sha384',
- '2.16.840.1.101.3.4.2.3' => 'id-sha512',
- '1.2.643.2.2.4' => 'id-GostR3411-94-with-GostR3410-94',
- '1.2.643.2.2.3' => 'id-GostR3411-94-with-GostR3410-2001',
- '1.2.643.2.2.20' => 'id-GostR3410-2001',
- '1.2.643.2.2.19' => 'id-GostR3410-94',
- // Netscape Object Identifiers from "Netscape Certificate Extensions"
- '2.16.840.1.113730' => 'netscape',
- '2.16.840.1.113730.1' => 'netscape-cert-extension',
- '2.16.840.1.113730.1.1' => 'netscape-cert-type',
- '2.16.840.1.113730.1.13' => 'netscape-comment',
- '2.16.840.1.113730.1.8' => 'netscape-ca-policy-url',
- // the following are X.509 extensions not supported by phpseclib
- '1.3.6.1.5.5.7.1.12' => 'id-pe-logotype',
- '1.2.840.113533.7.65.0' => 'entrustVersInfo',
- '2.16.840.1.113733.1.6.9' => 'verisignPrivate',
- // for Certificate Signing Requests
- // see http://tools.ietf.org/html/rfc2985
- '1.2.840.113549.1.9.2' => 'pkcs-9-at-unstructuredName', // PKCS #9 unstructured name
- '1.2.840.113549.1.9.7' => 'pkcs-9-at-challengePassword', // Challenge password for certificate revocations
- '1.2.840.113549.1.9.14' => 'pkcs-9-at-extensionRequest' // Certificate extension request
- );
- }
-
- /**
- * Load X.509 certificate
- *
- * Returns an associative array describing the X.509 cert or a false if the cert failed to load
- *
- * @param String $cert
- * @access public
- * @return Mixed
- */
- function loadX509($cert)
- {
- if (is_array($cert) && isset($cert['tbsCertificate'])) {
- unset($this->currentCert);
- unset($this->currentKeyIdentifier);
- $this->dn = $cert['tbsCertificate']['subject'];
- if (!isset($this->dn)) {
- return false;
- }
- $this->currentCert = $cert;
-
- $currentKeyIdentifier = $this->getExtension('id-ce-subjectKeyIdentifier');
- $this->currentKeyIdentifier = is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null;
-
- unset($this->signatureSubject);
-
- return $cert;
- }
-
- $asn1 = new File_ASN1();
-
- $cert = $this->_extractBER($cert);
-
- if ($cert === false) {
- $this->currentCert = false;
- return false;
- }
-
- $asn1->loadOIDs($this->oids);
- $decoded = $asn1->decodeBER($cert);
-
- if (!empty($decoded)) {
- $x509 = $asn1->asn1map($decoded[0], $this->Certificate);
- }
- if (!isset($x509) || $x509 === false) {
- $this->currentCert = false;
- return false;
- }
-
- $this->signatureSubject = substr($cert, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']);
-
- $this->_mapInExtensions($x509, 'tbsCertificate/extensions', $asn1);
-
- $key = &$x509['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'];
- $key = $this->_reformatKey($x509['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], $key);
-
- $this->currentCert = $x509;
- $this->dn = $x509['tbsCertificate']['subject'];
-
- $currentKeyIdentifier = $this->getExtension('id-ce-subjectKeyIdentifier');
- $this->currentKeyIdentifier = is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null;
-
- return $x509;
- }
-
- /**
- * Save X.509 certificate
- *
- * @param Array $cert
- * @param Integer $format optional
- * @access public
- * @return String
- */
- function saveX509($cert, $format = FILE_X509_FORMAT_PEM)
- {
- if (!is_array($cert) || !isset($cert['tbsCertificate'])) {
- return false;
- }
-
- switch (true) {
- // "case !$a: case !$b: break; default: whatever();" is the same thing as "if ($a && $b) whatever()"
- case !($algorithm = $this->_subArray($cert, 'tbsCertificate/subjectPublicKeyInfo/algorithm/algorithm')):
- case is_object($cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']):
- break;
- default:
- switch ($algorithm) {
- case 'rsaEncryption':
- $cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']
- = base64_encode("\0" . base64_decode(preg_replace('#-.+-|[\r\n]#', '', $cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'])));
- }
- }
-
- $asn1 = new File_ASN1();
- $asn1->loadOIDs($this->oids);
-
- $filters = array();
- $type_utf8_string = array('type' => FILE_ASN1_TYPE_UTF8_STRING);
- $filters['tbsCertificate']['signature']['parameters'] = $type_utf8_string;
- $filters['tbsCertificate']['signature']['issuer']['rdnSequence']['value'] = $type_utf8_string;
- $filters['tbsCertificate']['issuer']['rdnSequence']['value'] = $type_utf8_string;
- $filters['tbsCertificate']['subject']['rdnSequence']['value'] = $type_utf8_string;
- $filters['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['parameters'] = $type_utf8_string;
- $filters['signatureAlgorithm']['parameters'] = $type_utf8_string;
- $filters['authorityCertIssuer']['directoryName']['rdnSequence']['value'] = $type_utf8_string;
- //$filters['policyQualifiers']['qualifier'] = $type_utf8_string;
- $filters['distributionPoint']['fullName']['directoryName']['rdnSequence']['value'] = $type_utf8_string;
- $filters['directoryName']['rdnSequence']['value'] = $type_utf8_string;
-
- /* in the case of policyQualifiers/qualifier, the type has to be FILE_ASN1_TYPE_IA5_STRING.
- FILE_ASN1_TYPE_PRINTABLE_STRING will cause OpenSSL's X.509 parser to spit out random
- characters.
- */
- $filters['policyQualifiers']['qualifier']
- = array('type' => FILE_ASN1_TYPE_IA5_STRING);
-
- $asn1->loadFilters($filters);
-
- $this->_mapOutExtensions($cert, 'tbsCertificate/extensions', $asn1);
-
- $cert = $asn1->encodeDER($cert, $this->Certificate);
-
- switch ($format) {
- case FILE_X509_FORMAT_DER:
- return $cert;
- // case FILE_X509_FORMAT_PEM:
- default:
- return "-----BEGIN CERTIFICATE-----\r\n" . chunk_split(base64_encode($cert), 64) . '-----END CERTIFICATE-----';
- }
- }
-
- /**
- * Map extension values from octet string to extension-specific internal
- * format.
- *
- * @param Array ref $root
- * @param String $path
- * @param Object $asn1
- * @access private
- */
- function _mapInExtensions(&$root, $path, $asn1)
- {
- $extensions = &$this->_subArray($root, $path);
-
- if (is_array($extensions)) {
- for ($i = 0; $i < count($extensions); $i++) {
- $id = $extensions[$i]['extnId'];
- $value = &$extensions[$i]['extnValue'];
- $value = base64_decode($value);
- $decoded = $asn1->decodeBER($value);
- /* [extnValue] contains the DER encoding of an ASN.1 value
- corresponding to the extension type identified by extnID */
- $map = $this->_getMapping($id);
- if (!is_bool($map)) {
- $mapped = $asn1->asn1map($decoded[0], $map, array('iPAddress' => array($this, '_decodeIP')));
- $value = $mapped === false ? $decoded[0] : $mapped;
-
- if ($id == 'id-ce-certificatePolicies') {
- for ($j = 0; $j < count($value); $j++) {
- if (!isset($value[$j]['policyQualifiers'])) {
- continue;
- }
- for ($k = 0; $k < count($value[$j]['policyQualifiers']); $k++) {
- $subid = $value[$j]['policyQualifiers'][$k]['policyQualifierId'];
- $map = $this->_getMapping($subid);
- $subvalue = &$value[$j]['policyQualifiers'][$k]['qualifier'];
- if ($map !== false) {
- $decoded = $asn1->decodeBER($subvalue);
- $mapped = $asn1->asn1map($decoded[0], $map);
- $subvalue = $mapped === false ? $decoded[0] : $mapped;
- }
- }
- }
- }
- } elseif ($map) {
- $value = base64_encode($value);
- }
- }
- }
- }
-
- /**
- * Map extension values from extension-specific internal format to
- * octet string.
- *
- * @param Array ref $root
- * @param String $path
- * @param Object $asn1
- * @access private
- */
- function _mapOutExtensions(&$root, $path, $asn1)
- {
- $extensions = &$this->_subArray($root, $path);
-
- if (is_array($extensions)) {
- $size = count($extensions);
- for ($i = 0; $i < $size; $i++) {
- $id = $extensions[$i]['extnId'];
- $value = &$extensions[$i]['extnValue'];
-
- switch ($id) {
- case 'id-ce-certificatePolicies':
- for ($j = 0; $j < count($value); $j++) {
- if (!isset($value[$j]['policyQualifiers'])) {
- continue;
- }
- for ($k = 0; $k < count($value[$j]['policyQualifiers']); $k++) {
- $subid = $value[$j]['policyQualifiers'][$k]['policyQualifierId'];
- $map = $this->_getMapping($subid);
- $subvalue = &$value[$j]['policyQualifiers'][$k]['qualifier'];
- if ($map !== false) {
- // by default File_ASN1 will try to render qualifier as a FILE_ASN1_TYPE_IA5_STRING since it's
- // actual type is FILE_ASN1_TYPE_ANY
- $subvalue = new File_ASN1_Element($asn1->encodeDER($subvalue, $map));
- }
- }
- }
- break;
- case 'id-ce-authorityKeyIdentifier': // use 00 as the serial number instead of an empty string
- if (isset($value['authorityCertSerialNumber'])) {
- if ($value['authorityCertSerialNumber']->toBytes() == '') {
- $temp = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | 2) . "\1\0";
- $value['authorityCertSerialNumber'] = new File_ASN1_Element($temp);
- }
- }
- }
-
- /* [extnValue] contains the DER encoding of an ASN.1 value
- corresponding to the extension type identified by extnID */
- $map = $this->_getMapping($id);
- if (is_bool($map)) {
- if (!$map) {
- user_error($id . ' is not a currently supported extension');
- unset($extensions[$i]);
- }
- } else {
- $temp = $asn1->encodeDER($value, $map, array('iPAddress' => array($this, '_encodeIP')));
- $value = base64_encode($temp);
- }
- }
- }
- }
-
- /**
- * Map attribute values from ANY type to attribute-specific internal
- * format.
- *
- * @param Array ref $root
- * @param String $path
- * @param Object $asn1
- * @access private
- */
- function _mapInAttributes(&$root, $path, $asn1)
- {
- $attributes = &$this->_subArray($root, $path);
-
- if (is_array($attributes)) {
- for ($i = 0; $i < count($attributes); $i++) {
- $id = $attributes[$i]['type'];
- /* $value contains the DER encoding of an ASN.1 value
- corresponding to the attribute type identified by type */
- $map = $this->_getMapping($id);
- if (is_array($attributes[$i]['value'])) {
- $values = &$attributes[$i]['value'];
- for ($j = 0; $j < count($values); $j++) {
- $value = $asn1->encodeDER($values[$j], $this->AttributeValue);
- $decoded = $asn1->decodeBER($value);
- if (!is_bool($map)) {
- $mapped = $asn1->asn1map($decoded[0], $map);
- if ($mapped !== false) {
- $values[$j] = $mapped;
- }
- if ($id == 'pkcs-9-at-extensionRequest') {
- $this->_mapInExtensions($values, $j, $asn1);
- }
- } elseif ($map) {
- $values[$j] = base64_encode($value);
- }
- }
- }
- }
- }
- }
-
- /**
- * Map attribute values from attribute-specific internal format to
- * ANY type.
- *
- * @param Array ref $root
- * @param String $path
- * @param Object $asn1
- * @access private
- */
- function _mapOutAttributes(&$root, $path, $asn1)
- {
- $attributes = &$this->_subArray($root, $path);
-
- if (is_array($attributes)) {
- $size = count($attributes);
- for ($i = 0; $i < $size; $i++) {
- /* [value] contains the DER encoding of an ASN.1 value
- corresponding to the attribute type identified by type */
- $id = $attributes[$i]['type'];
- $map = $this->_getMapping($id);
- if ($map === false) {
- user_error($id . ' is not a currently supported attribute', E_USER_NOTICE);
- unset($attributes[$i]);
- } elseif (is_array($attributes[$i]['value'])) {
- $values = &$attributes[$i]['value'];
- for ($j = 0; $j < count($values); $j++) {
- switch ($id) {
- case 'pkcs-9-at-extensionRequest':
- $this->_mapOutExtensions($values, $j, $asn1);
- break;
- }
-
- if (!is_bool($map)) {
- $temp = $asn1->encodeDER($values[$j], $map);
- $decoded = $asn1->decodeBER($temp);
- $values[$j] = $asn1->asn1map($decoded[0], $this->AttributeValue);
- }
- }
- }
- }
- }
- }
-
- /**
- * Associate an extension ID to an extension mapping
- *
- * @param String $extnId
- * @access private
- * @return Mixed
- */
- function _getMapping($extnId)
- {
- if (!is_string($extnId)) { // eg. if it's a File_ASN1_Element object
- return true;
- }
-
- switch ($extnId) {
- case 'id-ce-keyUsage':
- return $this->KeyUsage;
- case 'id-ce-basicConstraints':
- return $this->BasicConstraints;
- case 'id-ce-subjectKeyIdentifier':
- return $this->KeyIdentifier;
- case 'id-ce-cRLDistributionPoints':
- return $this->CRLDistributionPoints;
- case 'id-ce-authorityKeyIdentifier':
- return $this->AuthorityKeyIdentifier;
- case 'id-ce-certificatePolicies':
- return $this->CertificatePolicies;
- case 'id-ce-extKeyUsage':
- return $this->ExtKeyUsageSyntax;
- case 'id-pe-authorityInfoAccess':
- return $this->AuthorityInfoAccessSyntax;
- case 'id-ce-subjectAltName':
- return $this->SubjectAltName;
- case 'id-ce-privateKeyUsagePeriod':
- return $this->PrivateKeyUsagePeriod;
- case 'id-ce-issuerAltName':
- return $this->IssuerAltName;
- case 'id-ce-policyMappings':
- return $this->PolicyMappings;
- case 'id-ce-nameConstraints':
- return $this->NameConstraints;
-
- case 'netscape-cert-type':
- return $this->netscape_cert_type;
- case 'netscape-comment':
- return $this->netscape_comment;
- case 'netscape-ca-policy-url':
- return $this->netscape_ca_policy_url;
-
- // since id-qt-cps isn't a constructed type it will have already been decoded as a string by the time it gets
- // back around to asn1map() and we don't want it decoded again.
- //case 'id-qt-cps':
- // return $this->CPSuri;
- case 'id-qt-unotice':
- return $this->UserNotice;
-
- // the following OIDs are unsupported but we don't want them to give notices when calling saveX509().
- case 'id-pe-logotype': // http://www.ietf.org/rfc/rfc3709.txt
- case 'entrustVersInfo':
- // http://support.microsoft.com/kb/287547
- case '1.3.6.1.4.1.311.20.2': // szOID_ENROLL_CERTTYPE_EXTENSION
- case '1.3.6.1.4.1.311.21.1': // szOID_CERTSRV_CA_VERSION
- // "SET Secure Electronic Transaction Specification"
- // http://www.maithean.com/docs/set_bk3.pdf
- case '2.23.42.7.0': // id-set-hashedRootKey
- return true;
-
- // CSR attributes
- case 'pkcs-9-at-unstructuredName':
- return $this->PKCS9String;
- case 'pkcs-9-at-challengePassword':
- return $this->DirectoryString;
- case 'pkcs-9-at-extensionRequest':
- return $this->Extensions;
-
- // CRL extensions.
- case 'id-ce-cRLNumber':
- return $this->CRLNumber;
- case 'id-ce-deltaCRLIndicator':
- return $this->CRLNumber;
- case 'id-ce-issuingDistributionPoint':
- return $this->IssuingDistributionPoint;
- case 'id-ce-freshestCRL':
- return $this->CRLDistributionPoints;
- case 'id-ce-cRLReasons':
- return $this->CRLReason;
- case 'id-ce-invalidityDate':
- return $this->InvalidityDate;
- case 'id-ce-certificateIssuer':
- return $this->CertificateIssuer;
- case 'id-ce-holdInstructionCode':
- return $this->HoldInstructionCode;
- }
-
- return false;
- }
-
- /**
- * Load an X.509 certificate as a certificate authority
- *
- * @param String $cert
- * @access public
- * @return Boolean
- */
- function loadCA($cert)
- {
- $olddn = $this->dn;
- $oldcert = $this->currentCert;
- $oldsigsubj = $this->signatureSubject;
- $oldkeyid = $this->currentKeyIdentifier;
-
- $cert = $this->loadX509($cert);
- if (!$cert) {
- $this->dn = $olddn;
- $this->currentCert = $oldcert;
- $this->signatureSubject = $oldsigsubj;
- $this->currentKeyIdentifier = $oldkeyid;
-
- return false;
- }
-
- /* From RFC5280 "PKIX Certificate and CRL Profile":
-
- If the keyUsage extension is present, then the subject public key
- MUST NOT be used to verify signatures on certificates or CRLs unless
- the corresponding keyCertSign or cRLSign bit is set. */
- //$keyUsage = $this->getExtension('id-ce-keyUsage');
- //if ($keyUsage && !in_array('keyCertSign', $keyUsage)) {
- // return false;
- //}
-
- /* From RFC5280 "PKIX Certificate and CRL Profile":
-
- The cA boolean indicates whether the certified public key may be used
- to verify certificate signatures. If the cA boolean is not asserted,
- then the keyCertSign bit in the key usage extension MUST NOT be
- asserted. If the basic constraints extension is not present in a
- version 3 certificate, or the extension is present but the cA boolean
- is not asserted, then the certified public key MUST NOT be used to
- verify certificate signatures. */
- //$basicConstraints = $this->getExtension('id-ce-basicConstraints');
- //if (!$basicConstraints || !$basicConstraints['cA']) {
- // return false;
- //}
-
- $this->CAs[] = $cert;
-
- $this->dn = $olddn;
- $this->currentCert = $oldcert;
- $this->signatureSubject = $oldsigsubj;
-
- return true;
- }
-
- /**
- * Validate an X.509 certificate against a URL
- *
- * From RFC2818 "HTTP over TLS":
- *
- * Matching is performed using the matching rules specified by
- * [RFC2459]. If more than one identity of a given type is present in
- * the certificate (e.g., more than one dNSName name, a match in any one
- * of the set is considered acceptable.) Names may contain the wildcard
- * character * which is considered to match any single domain name
- * component or component fragment. E.g., *.a.com matches foo.a.com but
- * not bar.foo.a.com. f*.com matches foo.com but not bar.com.
- *
- * @param String $url
- * @access public
- * @return Boolean
- */
- function validateURL($url)
- {
- if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) {
- return false;
- }
-
- $components = parse_url($url);
- if (!isset($components['host'])) {
- return false;
- }
-
- if ($names = $this->getExtension('id-ce-subjectAltName')) {
- foreach ($names as $key => $value) {
- $value = str_replace(array('.', '*'), array('\.', '[^.]*'), $value);
- switch ($key) {
- case 'dNSName':
- /* From RFC2818 "HTTP over TLS":
-
- If a subjectAltName extension of type dNSName is present, that MUST
- be used as the identity. Otherwise, the (most specific) Common Name
- field in the Subject field of the certificate MUST be used. Although
- the use of the Common Name is existing practice, it is deprecated and
- Certification Authorities are encouraged to use the dNSName instead. */
- if (preg_match('#^' . $value . '$#', $components['host'])) {
- return true;
- }
- break;
- case 'iPAddress':
- /* From RFC2818 "HTTP over TLS":
-
- In some cases, the URI is specified as an IP address rather than a
- hostname. In this case, the iPAddress subjectAltName must be present
- in the certificate and must exactly match the IP in the URI. */
- if (preg_match('#(?:\d{1-3}\.){4}#', $components['host'] . '.') && preg_match('#^' . $value . '$#', $components['host'])) {
- return true;
- }
- }
- }
- return false;
- }
-
- if ($value = $this->getDNProp('id-at-commonName')) {
- $value = str_replace(array('.', '*'), array('\.', '[^.]*'), $value[0]);
- return preg_match('#^' . $value . '$#', $components['host']);
- }
-
- return false;
- }
-
- /**
- * Validate a date
- *
- * If $date isn't defined it is assumed to be the current date.
- *
- * @param Integer $date optional
- * @access public
- */
- function validateDate($date = null)
- {
- if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) {
- return false;
- }
-
- if (!isset($date)) {
- $date = time();
- }
-
- $notBefore = $this->currentCert['tbsCertificate']['validity']['notBefore'];
- $notBefore = isset($notBefore['generalTime']) ? $notBefore['generalTime'] : $notBefore['utcTime'];
-
- $notAfter = $this->currentCert['tbsCertificate']['validity']['notAfter'];
- $notAfter = isset($notAfter['generalTime']) ? $notAfter['generalTime'] : $notAfter['utcTime'];
-
- switch (true) {
- case $date < @strtotime($notBefore):
- case $date > @strtotime($notAfter):
- return false;
- }
-
- return true;
- }
-
- /**
- * Validate a signature
- *
- * Works on X.509 certs, CSR's and CRL's.
- * Returns true if the signature is verified, false if it is not correct or null on error
- *
- * By default returns false for self-signed certs. Call validateSignature(false) to make this support
- * self-signed.
- *
- * The behavior of this function is inspired by {@link http://php.net/openssl-verify openssl_verify}.
- *
- * @param Boolean $caonly optional
- * @access public
- * @return Mixed
- */
- function validateSignature($caonly = true)
- {
- if (!is_array($this->currentCert) || !isset($this->signatureSubject)) {
- return null;
- }
-
- /* TODO:
- "emailAddress attribute values are not case-sensitive (e.g., "subscriber@example.com" is the same as "SUBSCRIBER@EXAMPLE.COM")."
- -- http://tools.ietf.org/html/rfc5280#section-4.1.2.6
-
- implement pathLenConstraint in the id-ce-basicConstraints extension */
-
- switch (true) {
- case isset($this->currentCert['tbsCertificate']):
- // self-signed cert
- if ($this->currentCert['tbsCertificate']['issuer'] === $this->currentCert['tbsCertificate']['subject']) {
- $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier');
- $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier');
- switch (true) {
- case !is_array($authorityKey):
- case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID:
- $signingCert = $this->currentCert; // working cert
- }
- }
-
- if (!empty($this->CAs)) {
- for ($i = 0; $i < count($this->CAs); $i++) {
- // even if the cert is a self-signed one we still want to see if it's a CA;
- // if not, we'll conditionally return an error
- $ca = $this->CAs[$i];
- if ($this->currentCert['tbsCertificate']['issuer'] === $ca['tbsCertificate']['subject']) {
- $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier');
- $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca);
- switch (true) {
- case !is_array($authorityKey):
- case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID:
- $signingCert = $ca; // working cert
- break 2;
- }
- }
- }
- if (count($this->CAs) == $i && $caonly) {
- return false;
- }
- } elseif (!isset($signingCert) || $caonly) {
- return false;
- }
- return $this->_validateSignature(
- $signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'],
- $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'],
- $this->currentCert['signatureAlgorithm']['algorithm'],
- substr(base64_decode($this->currentCert['signature']), 1),
- $this->signatureSubject
- );
- case isset($this->currentCert['certificationRequestInfo']):
- return $this->_validateSignature(
- $this->currentCert['certificationRequestInfo']['subjectPKInfo']['algorithm']['algorithm'],
- $this->currentCert['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'],
- $this->currentCert['signatureAlgorithm']['algorithm'],
- substr(base64_decode($this->currentCert['signature']), 1),
- $this->signatureSubject
- );
- case isset($this->currentCert['publicKeyAndChallenge']):
- return $this->_validateSignature(
- $this->currentCert['publicKeyAndChallenge']['spki']['algorithm']['algorithm'],
- $this->currentCert['publicKeyAndChallenge']['spki']['subjectPublicKey'],
- $this->currentCert['signatureAlgorithm']['algorithm'],
- substr(base64_decode($this->currentCert['signature']), 1),
- $this->signatureSubject
- );
- case isset($this->currentCert['tbsCertList']):
- if (!empty($this->CAs)) {
- for ($i = 0; $i < count($this->CAs); $i++) {
- $ca = $this->CAs[$i];
- if ($this->currentCert['tbsCertList']['issuer'] === $ca['tbsCertificate']['subject']) {
- $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier');
- $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca);
- switch (true) {
- case !is_array($authorityKey):
- case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID:
- $signingCert = $ca; // working cert
- break 2;
- }
- }
- }
- }
- if (!isset($signingCert)) {
- return false;
- }
- return $this->_validateSignature(
- $signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'],
- $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'],
- $this->currentCert['signatureAlgorithm']['algorithm'],
- substr(base64_decode($this->currentCert['signature']), 1),
- $this->signatureSubject
- );
- default:
- return false;
- }
- }
-
- /**
- * Validates a signature
- *
- * Returns true if the signature is verified, false if it is not correct or null on error
- *
- * @param String $publicKeyAlgorithm
- * @param String $publicKey
- * @param String $signatureAlgorithm
- * @param String $signature
- * @param String $signatureSubject
- * @access private
- * @return Integer
- */
- function _validateSignature($publicKeyAlgorithm, $publicKey, $signatureAlgorithm, $signature, $signatureSubject)
- {
- switch ($publicKeyAlgorithm) {
- case 'rsaEncryption':
- if (!class_exists('Crypt_RSA')) {
- include_once 'Crypt/RSA.php';
- }
- $rsa = new Crypt_RSA();
- $rsa->loadKey($publicKey);
-
- switch ($signatureAlgorithm) {
- case 'md2WithRSAEncryption':
- case 'md5WithRSAEncryption':
- case 'sha1WithRSAEncryption':
- case 'sha224WithRSAEncryption':
- case 'sha256WithRSAEncryption':
- case 'sha384WithRSAEncryption':
- case 'sha512WithRSAEncryption':
- $rsa->setHash(preg_replace('#WithRSAEncryption$#', '', $signatureAlgorithm));
- $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
- if (!@$rsa->verify($signatureSubject, $signature)) {
- return false;
- }
- break;
- default:
- return null;
- }
- break;
- default:
- return null;
- }
-
- return true;
- }
-
- /**
- * Reformat public keys
- *
- * Reformats a public key to a format supported by phpseclib (if applicable)
- *
- * @param String $algorithm
- * @param String $key
- * @access private
- * @return String
- */
- function _reformatKey($algorithm, $key)
- {
- switch ($algorithm) {
- case 'rsaEncryption':
- return
- "-----BEGIN PUBLIC KEY-----\r\n" .
- // subjectPublicKey is stored as a bit string in X.509 certs. the first byte of a bit string represents how many bits
- // in the last byte should be ignored. the following only supports non-zero stuff but as none of the X.509 certs Firefox
- // uses as a cert authority actually use a non-zero bit I think it's safe to assume that none do.
- chunk_split(base64_encode(substr(base64_decode($key), 1)), 64) .
- '-----END PUBLIC KEY-----';
- default:
- return $key;
- }
- }
-
- /**
- * Decodes an IP address
- *
- * Takes in a base64 encoded "blob" and returns a human readable IP address
- *
- * @param String $ip
- * @access private
- * @return String
- */
- function _decodeIP($ip)
- {
- $ip = base64_decode($ip);
- list(, $ip) = unpack('N', $ip);
- return long2ip($ip);
- }
-
- /**
- * Encodes an IP address
- *
- * Takes a human readable IP address into a base64-encoded "blob"
- *
- * @param String $ip
- * @access private
- * @return String
- */
- function _encodeIP($ip)
- {
- return base64_encode(pack('N', ip2long($ip)));
- }
-
- /**
- * "Normalizes" a Distinguished Name property
- *
- * @param String $propName
- * @access private
- * @return Mixed
- */
- function _translateDNProp($propName)
- {
- switch (strtolower($propName)) {
- case 'id-at-countryname':
- case 'countryname':
- case 'c':
- return 'id-at-countryName';
- case 'id-at-organizationname':
- case 'organizationname':
- case 'o':
- return 'id-at-organizationName';
- case 'id-at-dnqualifier':
- case 'dnqualifier':
- return 'id-at-dnQualifier';
- case 'id-at-commonname':
- case 'commonname':
- case 'cn':
- return 'id-at-commonName';
- case 'id-at-stateorprovincename':
- case 'stateorprovincename':
- case 'state':
- case 'province':
- case 'provincename':
- case 'st':
- return 'id-at-stateOrProvinceName';
- case 'id-at-localityname':
- case 'localityname':
- case 'l':
- return 'id-at-localityName';
- case 'id-emailaddress':
- case 'emailaddress':
- return 'pkcs-9-at-emailAddress';
- case 'id-at-serialnumber':
- case 'serialnumber':
- return 'id-at-serialNumber';
- case 'id-at-postalcode':
- case 'postalcode':
- return 'id-at-postalCode';
- case 'id-at-streetaddress':
- case 'streetaddress':
- return 'id-at-streetAddress';
- case 'id-at-name':
- case 'name':
- return 'id-at-name';
- case 'id-at-givenname':
- case 'givenname':
- return 'id-at-givenName';
- case 'id-at-surname':
- case 'surname':
- case 'sn':
- return 'id-at-surname';
- case 'id-at-initials':
- case 'initials':
- return 'id-at-initials';
- case 'id-at-generationqualifier':
- case 'generationqualifier':
- return 'id-at-generationQualifier';
- case 'id-at-organizationalunitname':
- case 'organizationalunitname':
- case 'ou':
- return 'id-at-organizationalUnitName';
- case 'id-at-pseudonym':
- case 'pseudonym':
- return 'id-at-pseudonym';
- case 'id-at-title':
- case 'title':
- return 'id-at-title';
- case 'id-at-description':
- case 'description':
- return 'id-at-description';
- case 'id-at-role':
- case 'role':
- return 'id-at-role';
- case 'id-at-uniqueidentifier':
- case 'uniqueidentifier':
- case 'x500uniqueidentifier':
- return 'id-at-uniqueIdentifier';
- default:
- return false;
- }
- }
-
- /**
- * Set a Distinguished Name property
- *
- * @param String $propName
- * @param Mixed $propValue
- * @param String $type optional
- * @access public
- * @return Boolean
- */
- function setDNProp($propName, $propValue, $type = 'utf8String')
- {
- if (empty($this->dn)) {
- $this->dn = array('rdnSequence' => array());
- }
-
- if (($propName = $this->_translateDNProp($propName)) === false) {
- return false;
- }
-
- foreach ((array) $propValue as $v) {
- if (!is_array($v) && isset($type)) {
- $v = array($type => $v);
- }
- $this->dn['rdnSequence'][] = array(
- array(
- 'type' => $propName,
- 'value'=> $v
- )
- );
- }
-
- return true;
- }
-
- /**
- * Remove Distinguished Name properties
- *
- * @param String $propName
- * @access public
- */
- function removeDNProp($propName)
- {
- if (empty($this->dn)) {
- return;
- }
-
- if (($propName = $this->_translateDNProp($propName)) === false) {
- return;
- }
-
- $dn = &$this->dn['rdnSequence'];
- $size = count($dn);
- for ($i = 0; $i < $size; $i++) {
- if ($dn[$i][0]['type'] == $propName) {
- unset($dn[$i]);
- }
- }
-
- $dn = array_values($dn);
- }
-
- /**
- * Get Distinguished Name properties
- *
- * @param String $propName
- * @param Array $dn optional
- * @param Boolean $withType optional
- * @return Mixed
- * @access public
- */
- function getDNProp($propName, $dn = null, $withType = false)
- {
- if (!isset($dn)) {
- $dn = $this->dn;
- }
-
- if (empty($dn)) {
- return false;
- }
-
- if (($propName = $this->_translateDNProp($propName)) === false) {
- return false;
- }
-
- $dn = $dn['rdnSequence'];
- $result = array();
- $asn1 = new File_ASN1();
- for ($i = 0; $i < count($dn); $i++) {
- if ($dn[$i][0]['type'] == $propName) {
- $v = $dn[$i][0]['value'];
- if (!$withType && is_array($v)) {
- foreach ($v as $type => $s) {
- $type = array_search($type, $asn1->ANYmap, true);
- if ($type !== false && isset($asn1->stringTypeSize[$type])) {
- $s = $asn1->convert($s, $type);
- if ($s !== false) {
- $v = $s;
- break;
- }
- }
- }
- if (is_array($v)) {
- $v = array_pop($v); // Always strip data type.
- }
- }
- $result[] = $v;
- }
- }
-
- return $result;
- }
-
- /**
- * Set a Distinguished Name
- *
- * @param Mixed $dn
- * @param Boolean $merge optional
- * @param String $type optional
- * @access public
- * @return Boolean
- */
- function setDN($dn, $merge = false, $type = 'utf8String')
- {
- if (!$merge) {
- $this->dn = null;
- }
-
- if (is_array($dn)) {
- if (isset($dn['rdnSequence'])) {
- $this->dn = $dn; // No merge here.
- return true;
- }
-
- // handles stuff generated by openssl_x509_parse()
- foreach ($dn as $prop => $value) {
- if (!$this->setDNProp($prop, $value, $type)) {
- return false;
- }
- }
- return true;
- }
-
- // handles everything else
- $results = preg_split('#((?:^|, *|/)(?:C=|O=|OU=|CN=|L=|ST=|SN=|postalCode=|streetAddress=|emailAddress=|serialNumber=|organizationalUnitName=|title=|description=|role=|x500UniqueIdentifier=))#', $dn, -1, PREG_SPLIT_DELIM_CAPTURE);
- for ($i = 1; $i < count($results); $i+=2) {
- $prop = trim($results[$i], ', =/');
- $value = $results[$i + 1];
- if (!$this->setDNProp($prop, $value, $type)) {
- return false;
- }
- }
-
- return true;
- }
-
- /**
- * Get the Distinguished Name for a certificates subject
- *
- * @param Mixed $format optional
- * @param Array $dn optional
- * @access public
- * @return Boolean
- */
- function getDN($format = FILE_X509_DN_ARRAY, $dn = null)
- {
- if (!isset($dn)) {
- $dn = isset($this->currentCert['tbsCertList']) ? $this->currentCert['tbsCertList']['issuer'] : $this->dn;
- }
-
- switch ((int) $format) {
- case FILE_X509_DN_ARRAY:
- return $dn;
- case FILE_X509_DN_ASN1:
- $asn1 = new File_ASN1();
- $asn1->loadOIDs($this->oids);
- $filters = array();
- $filters['rdnSequence']['value'] = array('type' => FILE_ASN1_TYPE_UTF8_STRING);
- $asn1->loadFilters($filters);
- return $asn1->encodeDER($dn, $this->Name);
- case FILE_X509_DN_OPENSSL:
- $dn = $this->getDN(FILE_X509_DN_STRING, $dn);
- if ($dn === false) {
- return false;
- }
- $attrs = preg_split('#((?:^|, *|/)[a-z][a-z0-9]*=)#i', $dn, -1, PREG_SPLIT_DELIM_CAPTURE);
- $dn = array();
- for ($i = 1; $i < count($attrs); $i += 2) {
- $prop = trim($attrs[$i], ', =/');
- $value = $attrs[$i + 1];
- if (!isset($dn[$prop])) {
- $dn[$prop] = $value;
- } else {
- $dn[$prop] = array_merge((array) $dn[$prop], array($value));
- }
- }
- return $dn;
- case FILE_X509_DN_CANON:
- // No SEQUENCE around RDNs and all string values normalized as
- // trimmed lowercase UTF-8 with all spacing as one blank.
- $asn1 = new File_ASN1();
- $asn1->loadOIDs($this->oids);
- $filters = array();
- $filters['value'] = array('type' => FILE_ASN1_TYPE_UTF8_STRING);
- $asn1->loadFilters($filters);
- $result = '';
- foreach ($dn['rdnSequence'] as $rdn) {
- foreach ($rdn as &$attr) {
- if (is_array($attr['value'])) {
- foreach ($attr['value'] as $type => $v) {
- $type = array_search($type, $asn1->ANYmap, true);
- if ($type !== false && isset($asn1->stringTypeSize[$type])) {
- $v = $asn1->convert($v, $type);
- if ($v !== false) {
- $v = preg_replace('/\s+/', ' ', $v);
- $attr['value'] = strtolower(trim($v));
- break;
- }
- }
- }
- }
- }
- $result .= $asn1->encodeDER($rdn, $this->RelativeDistinguishedName);
- }
- return $result;
- case FILE_X509_DN_HASH:
- $dn = $this->getDN(FILE_X509_DN_CANON, $dn);
- if (!class_exists('Crypt_Hash')) {
- include_once 'Crypt/Hash.php';
- }
- $hash = new Crypt_Hash('sha1');
- $hash = $hash->hash($dn);
- extract(unpack('Vhash', $hash));
- return strtolower(bin2hex(pack('N', $hash)));
- }
-
- // Defaut is to return a string.
- $start = true;
- $output = '';
- $asn1 = new File_ASN1();
- foreach ($dn['rdnSequence'] as $field) {
- $prop = $field[0]['type'];
- $value = $field[0]['value'];
-
- $delim = ', ';
- switch ($prop) {
- case 'id-at-countryName':
- $desc = 'C=';
- break;
- case 'id-at-stateOrProvinceName':
- $desc = 'ST=';
- break;
- case 'id-at-organizationName':
- $desc = 'O=';
- break;
- case 'id-at-organizationalUnitName':
- $desc = 'OU=';
- break;
- case 'id-at-commonName':
- $desc = 'CN=';
- break;
- case 'id-at-localityName':
- $desc = 'L=';
- break;
- case 'id-at-surname':
- $desc = 'SN=';
- break;
- case 'id-at-uniqueIdentifier':
- $delim = '/';
- $desc = 'x500UniqueIdentifier=';
- break;
- default:
- $delim = '/';
- $desc = preg_replace('#.+-([^-]+)$#', '$1', $prop) . '=';
- }
-
- if (!$start) {
- $output.= $delim;
- }
- if (is_array($value)) {
- foreach ($value as $type => $v) {
- $type = array_search($type, $asn1->ANYmap, true);
- if ($type !== false && isset($asn1->stringTypeSize[$type])) {
- $v = $asn1->convert($v, $type);
- if ($v !== false) {
- $value = $v;
- break;
- }
- }
- }
- if (is_array($value)) {
- $value = array_pop($value); // Always strip data type.
- }
- }
- $output.= $desc . $value;
- $start = false;
- }
-
- return $output;
- }
-
- /**
- * Get the Distinguished Name for a certificate/crl issuer
- *
- * @param Integer $format optional
- * @access public
- * @return Mixed
- */
- function getIssuerDN($format = FILE_X509_DN_ARRAY)
- {
- switch (true) {
- case !isset($this->currentCert) || !is_array($this->currentCert):
- break;
- case isset($this->currentCert['tbsCertificate']):
- return $this->getDN($format, $this->currentCert['tbsCertificate']['issuer']);
- case isset($this->currentCert['tbsCertList']):
- return $this->getDN($format, $this->currentCert['tbsCertList']['issuer']);
- }
-
- return false;
- }
-
- /**
- * Get the Distinguished Name for a certificate/csr subject
- * Alias of getDN()
- *
- * @param Integer $format optional
- * @access public
- * @return Mixed
- */
- function getSubjectDN($format = FILE_X509_DN_ARRAY)
- {
- switch (true) {
- case !empty($this->dn):
- return $this->getDN($format);
- case !isset($this->currentCert) || !is_array($this->currentCert):
- break;
- case isset($this->currentCert['tbsCertificate']):
- return $this->getDN($format, $this->currentCert['tbsCertificate']['subject']);
- case isset($this->currentCert['certificationRequestInfo']):
- return $this->getDN($format, $this->currentCert['certificationRequestInfo']['subject']);
- }
-
- return false;
- }
-
- /**
- * Get an individual Distinguished Name property for a certificate/crl issuer
- *
- * @param String $propName
- * @param Boolean $withType optional
- * @access public
- * @return Mixed
- */
- function getIssuerDNProp($propName, $withType = false)
- {
- switch (true) {
- case !isset($this->currentCert) || !is_array($this->currentCert):
- break;
- case isset($this->currentCert['tbsCertificate']):
- return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['issuer'], $withType);
- case isset($this->currentCert['tbsCertList']):
- return $this->getDNProp($propName, $this->currentCert['tbsCertList']['issuer'], $withType);
- }
-
- return false;
- }
-
- /**
- * Get an individual Distinguished Name property for a certificate/csr subject
- *
- * @param String $propName
- * @param Boolean $withType optional
- * @access public
- * @return Mixed
- */
- function getSubjectDNProp($propName, $withType = false)
- {
- switch (true) {
- case !empty($this->dn):
- return $this->getDNProp($propName, null, $withType);
- case !isset($this->currentCert) || !is_array($this->currentCert):
- break;
- case isset($this->currentCert['tbsCertificate']):
- return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['subject'], $withType);
- case isset($this->currentCert['certificationRequestInfo']):
- return $this->getDNProp($propName, $this->currentCert['certificationRequestInfo']['subject'], $withType);
- }
-
- return false;
- }
-
- /**
- * Get the certificate chain for the current cert
- *
- * @access public
- * @return Mixed
- */
- function getChain()
- {
- $chain = array($this->currentCert);
-
- if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) {
- return false;
- }
- if (empty($this->CAs)) {
- return $chain;
- }
- while (true) {
- $currentCert = $chain[count($chain) - 1];
- for ($i = 0; $i < count($this->CAs); $i++) {
- $ca = $this->CAs[$i];
- if ($currentCert['tbsCertificate']['issuer'] === $ca['tbsCertificate']['subject']) {
- $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier', $currentCert);
- $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca);
- switch (true) {
- case !is_array($authorityKey):
- case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID:
- if ($currentCert === $ca) {
- break 3;
- }
- $chain[] = $ca;
- break 2;
- }
- }
- }
- if ($i == count($this->CAs)) {
- break;
- }
- }
- foreach ($chain as $key=>$value) {
- $chain[$key] = new File_X509();
- $chain[$key]->loadX509($value);
- }
- return $chain;
- }
-
- /**
- * Set public key
- *
- * Key needs to be a Crypt_RSA object
- *
- * @param Object $key
- * @access public
- * @return Boolean
- */
- function setPublicKey($key)
- {
- $key->setPublicKey();
- $this->publicKey = $key;
- }
-
- /**
- * Set private key
- *
- * Key needs to be a Crypt_RSA object
- *
- * @param Object $key
- * @access public
- */
- function setPrivateKey($key)
- {
- $this->privateKey = $key;
- }
-
- /**
- * Gets the public key
- *
- * Returns a Crypt_RSA object or a false.
- *
- * @access public
- * @return Mixed
- */
- function getPublicKey()
- {
- if (isset($this->publicKey)) {
- return $this->publicKey;
- }
-
- if (isset($this->currentCert) && is_array($this->currentCert)) {
- foreach (array('tbsCertificate/subjectPublicKeyInfo', 'certificationRequestInfo/subjectPKInfo') as $path) {
- $keyinfo = $this->_subArray($this->currentCert, $path);
- if (!empty($keyinfo)) {
- break;
- }
- }
- }
- if (empty($keyinfo)) {
- return false;
- }
-
- $key = $keyinfo['subjectPublicKey'];
-
- switch ($keyinfo['algorithm']['algorithm']) {
- case 'rsaEncryption':
- if (!class_exists('Crypt_RSA')) {
- include_once 'Crypt/RSA.php';
- }
- $publicKey = new Crypt_RSA();
- $publicKey->loadKey($key);
- $publicKey->setPublicKey();
- break;
- default:
- return false;
- }
-
- return $publicKey;
- }
-
- /**
- * Load a Certificate Signing Request
- *
- * @param String $csr
- * @access public
- * @return Mixed
- */
- function loadCSR($csr)
- {
- if (is_array($csr) && isset($csr['certificationRequestInfo'])) {
- unset($this->currentCert);
- unset($this->currentKeyIdentifier);
- unset($this->signatureSubject);
- $this->dn = $csr['certificationRequestInfo']['subject'];
- if (!isset($this->dn)) {
- return false;
- }
-
- $this->currentCert = $csr;
- return $csr;
- }
-
- // see http://tools.ietf.org/html/rfc2986
-
- $asn1 = new File_ASN1();
-
- $csr = $this->_extractBER($csr);
- $orig = $csr;
-
- if ($csr === false) {
- $this->currentCert = false;
- return false;
- }
-
- $asn1->loadOIDs($this->oids);
- $decoded = $asn1->decodeBER($csr);
-
- if (empty($decoded)) {
- $this->currentCert = false;
- return false;
- }
-
- $csr = $asn1->asn1map($decoded[0], $this->CertificationRequest);
- if (!isset($csr) || $csr === false) {
- $this->currentCert = false;
- return false;
- }
-
- $this->dn = $csr['certificationRequestInfo']['subject'];
- $this->_mapInAttributes($csr, 'certificationRequestInfo/attributes', $asn1);
-
- $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']);
-
- $algorithm = &$csr['certificationRequestInfo']['subjectPKInfo']['algorithm']['algorithm'];
- $key = &$csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'];
- $key = $this->_reformatKey($algorithm, $key);
-
- switch ($algorithm) {
- case 'rsaEncryption':
- if (!class_exists('Crypt_RSA')) {
- include_once 'Crypt/RSA.php';
- }
- $this->publicKey = new Crypt_RSA();
- $this->publicKey->loadKey($key);
- $this->publicKey->setPublicKey();
- break;
- default:
- $this->publicKey = null;
- }
-
- $this->currentKeyIdentifier = null;
- $this->currentCert = $csr;
-
- return $csr;
- }
-
- /**
- * Save CSR request
- *
- * @param Array $csr
- * @param Integer $format optional
- * @access public
- * @return String
- */
- function saveCSR($csr, $format = FILE_X509_FORMAT_PEM)
- {
- if (!is_array($csr) || !isset($csr['certificationRequestInfo'])) {
- return false;
- }
-
- switch (true) {
- case !($algorithm = $this->_subArray($csr, 'certificationRequestInfo/subjectPKInfo/algorithm/algorithm')):
- case is_object($csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']);
- break;
- default:
- switch ($algorithm) {
- case 'rsaEncryption':
- $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']
- = base64_encode("\0" . base64_decode(preg_replace('#-.+-|[\r\n]#', '', $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'])));
- }
- }
-
- $asn1 = new File_ASN1();
-
- $asn1->loadOIDs($this->oids);
-
- $filters = array();
- $filters['certificationRequestInfo']['subject']['rdnSequence']['value']
- = array('type' => FILE_ASN1_TYPE_UTF8_STRING);
-
- $asn1->loadFilters($filters);
-
- $this->_mapOutAttributes($csr, 'certificationRequestInfo/attributes', $asn1);
- $csr = $asn1->encodeDER($csr, $this->CertificationRequest);
-
- switch ($format) {
- case FILE_X509_FORMAT_DER:
- return $csr;
- // case FILE_X509_FORMAT_PEM:
- default:
- return "-----BEGIN CERTIFICATE REQUEST-----\r\n" . chunk_split(base64_encode($csr), 64) . '-----END CERTIFICATE REQUEST-----';
- }
- }
-
- /**
- * Load a SPKAC CSR
- *
- * SPKAC's are produced by the HTML5 keygen element:
- *
- * https://developer.mozilla.org/en-US/docs/HTML/Element/keygen
- *
- * @param String $csr
- * @access public
- * @return Mixed
- */
- function loadSPKAC($spkac)
- {
- if (is_array($spkac) && isset($spkac['publicKeyAndChallenge'])) {
- unset($this->currentCert);
- unset($this->currentKeyIdentifier);
- unset($this->signatureSubject);
- $this->currentCert = $spkac;
- return $spkac;
- }
-
- // see http://www.w3.org/html/wg/drafts/html/master/forms.html#signedpublickeyandchallenge
-
- $asn1 = new File_ASN1();
-
- $temp = preg_replace('#(?:^[^=]+=)|[\r\n\\\]#', '', $spkac);
- $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false;
- if ($temp != false) {
- $spkac = $temp;
- }
- $orig = $spkac;
-
- if ($spkac === false) {
- $this->currentCert = false;
- return false;
- }
-
- $asn1->loadOIDs($this->oids);
- $decoded = $asn1->decodeBER($spkac);
-
- if (empty($decoded)) {
- $this->currentCert = false;
- return false;
- }
-
- $spkac = $asn1->asn1map($decoded[0], $this->SignedPublicKeyAndChallenge);
-
- if (!isset($spkac) || $spkac === false) {
- $this->currentCert = false;
- return false;
- }
-
- $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']);
-
- $algorithm = &$spkac['publicKeyAndChallenge']['spki']['algorithm']['algorithm'];
- $key = &$spkac['publicKeyAndChallenge']['spki']['subjectPublicKey'];
- $key = $this->_reformatKey($algorithm, $key);
-
- switch ($algorithm) {
- case 'rsaEncryption':
- if (!class_exists('Crypt_RSA')) {
- include_once 'Crypt/RSA.php';
- }
- $this->publicKey = new Crypt_RSA();
- $this->publicKey->loadKey($key);
- $this->publicKey->setPublicKey();
- break;
- default:
- $this->publicKey = null;
- }
-
- $this->currentKeyIdentifier = null;
- $this->currentCert = $spkac;
-
- return $spkac;
- }
-
- /**
- * Load a Certificate Revocation List
- *
- * @param String $crl
- * @access public
- * @return Mixed
- */
- function loadCRL($crl)
- {
- if (is_array($crl) && isset($crl['tbsCertList'])) {
- $this->currentCert = $crl;
- unset($this->signatureSubject);
- return $crl;
- }
-
- $asn1 = new File_ASN1();
-
- $crl = $this->_extractBER($crl);
- $orig = $crl;
-
- if ($crl === false) {
- $this->currentCert = false;
- return false;
- }
-
- $asn1->loadOIDs($this->oids);
- $decoded = $asn1->decodeBER($crl);
-
- if (empty($decoded)) {
- $this->currentCert = false;
- return false;
- }
-
- $crl = $asn1->asn1map($decoded[0], $this->CertificateList);
- if (!isset($crl) || $crl === false) {
- $this->currentCert = false;
- return false;
- }
-
- $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']);
-
- $this->_mapInExtensions($crl, 'tbsCertList/crlExtensions', $asn1);
- $rclist = &$this->_subArray($crl, 'tbsCertList/revokedCertificates');
- if (is_array($rclist)) {
- foreach ($rclist as $i => $extension) {
- $this->_mapInExtensions($rclist, "$i/crlEntryExtensions", $asn1);
- }
- }
-
- $this->currentKeyIdentifier = null;
- $this->currentCert = $crl;
-
- return $crl;
- }
-
- /**
- * Save Certificate Revocation List.
- *
- * @param Array $crl
- * @param Integer $format optional
- * @access public
- * @return String
- */
- function saveCRL($crl, $format = FILE_X509_FORMAT_PEM)
- {
- if (!is_array($crl) || !isset($crl['tbsCertList'])) {
- return false;
- }
-
- $asn1 = new File_ASN1();
-
- $asn1->loadOIDs($this->oids);
-
- $filters = array();
- $filters['tbsCertList']['issuer']['rdnSequence']['value']
- = array('type' => FILE_ASN1_TYPE_UTF8_STRING);
- $filters['tbsCertList']['signature']['parameters']
- = array('type' => FILE_ASN1_TYPE_UTF8_STRING);
- $filters['signatureAlgorithm']['parameters']
- = array('type' => FILE_ASN1_TYPE_UTF8_STRING);
-
- if (empty($crl['tbsCertList']['signature']['parameters'])) {
- $filters['tbsCertList']['signature']['parameters']
- = array('type' => FILE_ASN1_TYPE_NULL);
- }
-
- if (empty($crl['signatureAlgorithm']['parameters'])) {
- $filters['signatureAlgorithm']['parameters']
- = array('type' => FILE_ASN1_TYPE_NULL);
- }
-
- $asn1->loadFilters($filters);
-
- $this->_mapOutExtensions($crl, 'tbsCertList/crlExtensions', $asn1);
- $rclist = &$this->_subArray($crl, 'tbsCertList/revokedCertificates');
- if (is_array($rclist)) {
- foreach ($rclist as $i => $extension) {
- $this->_mapOutExtensions($rclist, "$i/crlEntryExtensions", $asn1);
- }
- }
-
- $crl = $asn1->encodeDER($crl, $this->CertificateList);
-
- switch ($format) {
- case FILE_X509_FORMAT_DER:
- return $crl;
- // case FILE_X509_FORMAT_PEM:
- default:
- return "-----BEGIN X509 CRL-----\r\n" . chunk_split(base64_encode($crl), 64) . '-----END X509 CRL-----';
- }
- }
-
- /**
- * Sign an X.509 certificate
- *
- * $issuer's private key needs to be loaded.
- * $subject can be either an existing X.509 cert (if you want to resign it),
- * a CSR or something with the DN and public key explicitly set.
- *
- * @param File_X509 $issuer
- * @param File_X509 $subject
- * @param String $signatureAlgorithm optional
- * @access public
- * @return Mixed
- */
- function sign($issuer, $subject, $signatureAlgorithm = 'sha1WithRSAEncryption')
- {
- if (!is_object($issuer->privateKey) || empty($issuer->dn)) {
- return false;
- }
-
- if (isset($subject->publicKey) && !($subjectPublicKey = $subject->_formatSubjectPublicKey())) {
- return false;
- }
-
- $currentCert = isset($this->currentCert) ? $this->currentCert : null;
- $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject: null;
-
- if (isset($subject->currentCert) && is_array($subject->currentCert) && isset($subject->currentCert['tbsCertificate'])) {
- $this->currentCert = $subject->currentCert;
- $this->currentCert['tbsCertificate']['signature']['algorithm'] = $signatureAlgorithm;
- $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm;
-
- if (!empty($this->startDate)) {
- $this->currentCert['tbsCertificate']['validity']['notBefore']['generalTime'] = $this->startDate;
- unset($this->currentCert['tbsCertificate']['validity']['notBefore']['utcTime']);
- }
- if (!empty($this->endDate)) {
- $this->currentCert['tbsCertificate']['validity']['notAfter']['generalTime'] = $this->endDate;
- unset($this->currentCert['tbsCertificate']['validity']['notAfter']['utcTime']);
- }
- if (!empty($this->serialNumber)) {
- $this->currentCert['tbsCertificate']['serialNumber'] = $this->serialNumber;
- }
- if (!empty($subject->dn)) {
- $this->currentCert['tbsCertificate']['subject'] = $subject->dn;
- }
- if (!empty($subject->publicKey)) {
- $this->currentCert['tbsCertificate']['subjectPublicKeyInfo'] = $subjectPublicKey;
- }
- $this->removeExtension('id-ce-authorityKeyIdentifier');
- if (isset($subject->domains)) {
- $this->removeExtension('id-ce-subjectAltName');
- }
- } else if (isset($subject->currentCert) && is_array($subject->currentCert) && isset($subject->currentCert['tbsCertList'])) {
- return false;
- } else {
- if (!isset($subject->publicKey)) {
- return false;
- }
-
- $startDate = !empty($this->startDate) ? $this->startDate : @date('D, d M y H:i:s O');
- $endDate = !empty($this->endDate) ? $this->endDate : @date('D, d M y H:i:s O', strtotime('+1 year'));
- $serialNumber = !empty($this->serialNumber) ? $this->serialNumber : new Math_BigInteger();
-
- $this->currentCert = array(
- 'tbsCertificate' =>
- array(
- 'version' => 'v3',
- 'serialNumber' => $serialNumber, // $this->setserialNumber()
- 'signature' => array('algorithm' => $signatureAlgorithm),
- 'issuer' => false, // this is going to be overwritten later
- 'validity' => array(
- 'notBefore' => array('generalTime' => $startDate), // $this->setStartDate()
- 'notAfter' => array('generalTime' => $endDate) // $this->setEndDate()
- ),
- 'subject' => $subject->dn,
- 'subjectPublicKeyInfo' => $subjectPublicKey
- ),
- 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm),
- 'signature' => false // this is going to be overwritten later
- );
-
- // Copy extensions from CSR.
- $csrexts = $subject->getAttribute('pkcs-9-at-extensionRequest', 0);
-
- if (!empty($csrexts)) {
- $this->currentCert['tbsCertificate']['extensions'] = $csrexts;
- }
- }
-
- $this->currentCert['tbsCertificate']['issuer'] = $issuer->dn;
-
- if (isset($issuer->currentKeyIdentifier)) {
- $this->setExtension('id-ce-authorityKeyIdentifier', array(
- //'authorityCertIssuer' => array(
- // array(
- // 'directoryName' => $issuer->dn
- // )
- //),
- 'keyIdentifier' => $issuer->currentKeyIdentifier
- )
- );
- //$extensions = &$this->currentCert['tbsCertificate']['extensions'];
- //if (isset($issuer->serialNumber)) {
- // $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber;
- //}
- //unset($extensions);
- }
-
- if (isset($subject->currentKeyIdentifier)) {
- $this->setExtension('id-ce-subjectKeyIdentifier', $subject->currentKeyIdentifier);
- }
-
- $altName = array();
-
- if (isset($subject->domains) && count($subject->domains) > 1) {
- $altName = array_map(array('File_X509', '_dnsName'), $subject->domains);
- }
-
- if (isset($subject->ipAddresses) && count($subject->ipAddresses)) {
- // should an IP address appear as the CN if no domain name is specified? idk
- //$ips = count($subject->domains) ? $subject->ipAddresses : array_slice($subject->ipAddresses, 1);
- $ipAddresses = array();
- foreach ($subject->ipAddresses as $ipAddress) {
- $encoded = $subject->_ipAddress($ipAddress);
- if ($encoded !== false) {
- $ipAddresses[] = $encoded;
- }
- }
- if (count($ipAddresses)) {
- $altName = array_merge($altName, $ipAddresses);
- }
- }
-
- if (!empty($altName)) {
- $this->setExtension('id-ce-subjectAltName', $altName);
- }
-
- if ($this->caFlag) {
- $keyUsage = $this->getExtension('id-ce-keyUsage');
- if (!$keyUsage) {
- $keyUsage = array();
- }
-
- $this->setExtension('id-ce-keyUsage',
- array_values(array_unique(array_merge($keyUsage, array('cRLSign', 'keyCertSign'))))
- );
-
- $basicConstraints = $this->getExtension('id-ce-basicConstraints');
- if (!$basicConstraints) {
- $basicConstraints = array();
- }
-
- $this->setExtension('id-ce-basicConstraints',
- array_unique(array_merge(array('cA' => true), $basicConstraints)), true);
-
- if (!isset($subject->currentKeyIdentifier)) {
- $this->setExtension('id-ce-subjectKeyIdentifier', base64_encode($this->computeKeyIdentifier($this->currentCert)), false, false);
- }
- }
-
- // resync $this->signatureSubject
- // save $tbsCertificate in case there are any File_ASN1_Element objects in it
- $tbsCertificate = $this->currentCert['tbsCertificate'];
- $this->loadX509($this->saveX509($this->currentCert));
-
- $result = $this->_sign($issuer->privateKey, $signatureAlgorithm);
- $result['tbsCertificate'] = $tbsCertificate;
-
- $this->currentCert = $currentCert;
- $this->signatureSubject = $signatureSubject;
-
- return $result;
- }
-
- /**
- * Sign a CSR
- *
- * @access public
- * @return Mixed
- */
- function signCSR($signatureAlgorithm = 'sha1WithRSAEncryption')
- {
- if (!is_object($this->privateKey) || empty($this->dn)) {
- return false;
- }
-
- $origPublicKey = $this->publicKey;
- $class = get_class($this->privateKey);
- $this->publicKey = new $class();
- $this->publicKey->loadKey($this->privateKey->getPublicKey());
- $this->publicKey->setPublicKey();
- if (!($publicKey = $this->_formatSubjectPublicKey())) {
- return false;
- }
- $this->publicKey = $origPublicKey;
-
- $currentCert = isset($this->currentCert) ? $this->currentCert : null;
- $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject: null;
-
- if (isset($this->currentCert) && is_array($this->currentCert) && isset($this->currentCert['certificationRequestInfo'])) {
- $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm;
- if (!empty($this->dn)) {
- $this->currentCert['certificationRequestInfo']['subject'] = $this->dn;
- }
- $this->currentCert['certificationRequestInfo']['subjectPKInfo'] = $publicKey;
- } else {
- $this->currentCert = array(
- 'certificationRequestInfo' =>
- array(
- 'version' => 'v1',
- 'subject' => $this->dn,
- 'subjectPKInfo' => $publicKey
- ),
- 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm),
- 'signature' => false // this is going to be overwritten later
- );
- }
-
- // resync $this->signatureSubject
- // save $certificationRequestInfo in case there are any File_ASN1_Element objects in it
- $certificationRequestInfo = $this->currentCert['certificationRequestInfo'];
- $this->loadCSR($this->saveCSR($this->currentCert));
-
- $result = $this->_sign($this->privateKey, $signatureAlgorithm);
- $result['certificationRequestInfo'] = $certificationRequestInfo;
-
- $this->currentCert = $currentCert;
- $this->signatureSubject = $signatureSubject;
-
- return $result;
- }
-
- /**
- * Sign a CRL
- *
- * $issuer's private key needs to be loaded.
- *
- * @param File_X509 $issuer
- * @param File_X509 $crl
- * @param String $signatureAlgorithm optional
- * @access public
- * @return Mixed
- */
- function signCRL($issuer, $crl, $signatureAlgorithm = 'sha1WithRSAEncryption')
- {
- if (!is_object($issuer->privateKey) || empty($issuer->dn)) {
- return false;
- }
-
- $currentCert = isset($this->currentCert) ? $this->currentCert : null;
- $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject : null;
- $thisUpdate = !empty($this->startDate) ? $this->startDate : @date('D, d M y H:i:s O');
-
- if (isset($crl->currentCert) && is_array($crl->currentCert) && isset($crl->currentCert['tbsCertList'])) {
- $this->currentCert = $crl->currentCert;
- $this->currentCert['tbsCertList']['signature']['algorithm'] = $signatureAlgorithm;
- $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm;
- } else {
- $this->currentCert = array(
- 'tbsCertList' =>
- array(
- 'version' => 'v2',
- 'signature' => array('algorithm' => $signatureAlgorithm),
- 'issuer' => false, // this is going to be overwritten later
- 'thisUpdate' => array('generalTime' => $thisUpdate) // $this->setStartDate()
- ),
- 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm),
- 'signature' => false // this is going to be overwritten later
- );
- }
-
- $tbsCertList = &$this->currentCert['tbsCertList'];
- $tbsCertList['issuer'] = $issuer->dn;
- $tbsCertList['thisUpdate'] = array('generalTime' => $thisUpdate);
-
- if (!empty($this->endDate)) {
- $tbsCertList['nextUpdate'] = array('generalTime' => $this->endDate); // $this->setEndDate()
- } else {
- unset($tbsCertList['nextUpdate']);
- }
-
- if (!empty($this->serialNumber)) {
- $crlNumber = $this->serialNumber;
- } else {
- $crlNumber = $this->getExtension('id-ce-cRLNumber');
- $crlNumber = $crlNumber !== false ? $crlNumber->add(new Math_BigInteger(1)) : null;
- }
-
- $this->removeExtension('id-ce-authorityKeyIdentifier');
- $this->removeExtension('id-ce-issuerAltName');
-
- // Be sure version >= v2 if some extension found.
- $version = isset($tbsCertList['version']) ? $tbsCertList['version'] : 0;
- if (!$version) {
- if (!empty($tbsCertList['crlExtensions'])) {
- $version = 1; // v2.
- } elseif (!empty($tbsCertList['revokedCertificates'])) {
- foreach ($tbsCertList['revokedCertificates'] as $cert) {
- if (!empty($cert['crlEntryExtensions'])) {
- $version = 1; // v2.
- }
- }
- }
-
- if ($version) {
- $tbsCertList['version'] = $version;
- }
- }
-
- // Store additional extensions.
- if (!empty($tbsCertList['version'])) { // At least v2.
- if (!empty($crlNumber)) {
- $this->setExtension('id-ce-cRLNumber', $crlNumber);
- }
-
- if (isset($issuer->currentKeyIdentifier)) {
- $this->setExtension('id-ce-authorityKeyIdentifier', array(
- //'authorityCertIssuer' => array(
- // array(
- // 'directoryName' => $issuer->dn
- // )
- //),
- 'keyIdentifier' => $issuer->currentKeyIdentifier
- )
- );
- //$extensions = &$tbsCertList['crlExtensions'];
- //if (isset($issuer->serialNumber)) {
- // $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber;
- //}
- //unset($extensions);
- }
-
- $issuerAltName = $this->getExtension('id-ce-subjectAltName', $issuer->currentCert);
-
- if ($issuerAltName !== false) {
- $this->setExtension('id-ce-issuerAltName', $issuerAltName);
- }
- }
-
- if (empty($tbsCertList['revokedCertificates'])) {
- unset($tbsCertList['revokedCertificates']);
- }
-
- unset($tbsCertList);
-
- // resync $this->signatureSubject
- // save $tbsCertList in case there are any File_ASN1_Element objects in it
- $tbsCertList = $this->currentCert['tbsCertList'];
- $this->loadCRL($this->saveCRL($this->currentCert));
-
- $result = $this->_sign($issuer->privateKey, $signatureAlgorithm);
- $result['tbsCertList'] = $tbsCertList;
-
- $this->currentCert = $currentCert;
- $this->signatureSubject = $signatureSubject;
-
- return $result;
- }
-
- /**
- * X.509 certificate signing helper function.
- *
- * @param Object $key
- * @param File_X509 $subject
- * @param String $signatureAlgorithm
- * @access public
- * @return Mixed
- */
- function _sign($key, $signatureAlgorithm)
- {
- switch (strtolower(get_class($key))) {
- case 'crypt_rsa':
- switch ($signatureAlgorithm) {
- case 'md2WithRSAEncryption':
- case 'md5WithRSAEncryption':
- case 'sha1WithRSAEncryption':
- case 'sha224WithRSAEncryption':
- case 'sha256WithRSAEncryption':
- case 'sha384WithRSAEncryption':
- case 'sha512WithRSAEncryption':
- $key->setHash(preg_replace('#WithRSAEncryption$#', '', $signatureAlgorithm));
- $key->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
-
- $this->currentCert['signature'] = base64_encode("\0" . $key->sign($this->signatureSubject));
- return $this->currentCert;
- }
- default:
- return false;
- }
- }
-
- /**
- * Set certificate start date
- *
- * @param String $date
- * @access public
- */
- function setStartDate($date)
- {
- $this->startDate = @date('D, d M y H:i:s O', @strtotime($date));
- }
-
- /**
- * Set certificate end date
- *
- * @param String $date
- * @access public
- */
- function setEndDate($date)
- {
- /*
- To indicate that a certificate has no well-defined expiration date,
- the notAfter SHOULD be assigned the GeneralizedTime value of
- 99991231235959Z.
-
- -- http://tools.ietf.org/html/rfc5280#section-4.1.2.5
- */
- if (strtolower($date) == 'lifetime') {
- $temp = '99991231235959Z';
- $asn1 = new File_ASN1();
- $temp = chr(FILE_ASN1_TYPE_GENERALIZED_TIME) . $asn1->_encodeLength(strlen($temp)) . $temp;
- $this->endDate = new File_ASN1_Element($temp);
- } else {
- $this->endDate = @date('D, d M y H:i:s O', @strtotime($date));
- }
- }
-
- /**
- * Set Serial Number
- *
- * @param String $serial
- * @param $base optional
- * @access public
- */
- function setSerialNumber($serial, $base = -256)
- {
- $this->serialNumber = new Math_BigInteger($serial, $base);
- }
-
- /**
- * Turns the certificate into a certificate authority
- *
- * @access public
- */
- function makeCA()
- {
- $this->caFlag = true;
- }
-
- /**
- * Get a reference to a subarray
- *
- * @param array $root
- * @param String $path absolute path with / as component separator
- * @param Boolean $create optional
- * @access private
- * @return array item ref or false
- */
- function &_subArray(&$root, $path, $create = false)
- {
- $false = false;
-
- if (!is_array($root)) {
- return $false;
- }
-
- foreach (explode('/', $path) as $i) {
- if (!is_array($root)) {
- return $false;
- }
-
- if (!isset($root[$i])) {
- if (!$create) {
- return $false;
- }
-
- $root[$i] = array();
- }
-
- $root = &$root[$i];
- }
-
- return $root;
- }
-
- /**
- * Get a reference to an extension subarray
- *
- * @param array $root
- * @param String $path optional absolute path with / as component separator
- * @param Boolean $create optional
- * @access private
- * @return array ref or false
- */
- function &_extensions(&$root, $path = null, $create = false)
- {
- if (!isset($root)) {
- $root = $this->currentCert;
- }
-
- switch (true) {
- case !empty($path):
- case !is_array($root):
- break;
- case isset($root['tbsCertificate']):
- $path = 'tbsCertificate/extensions';
- break;
- case isset($root['tbsCertList']):
- $path = 'tbsCertList/crlExtensions';
- break;
- case isset($root['certificationRequestInfo']):
- $pth = 'certificationRequestInfo/attributes';
- $attributes = &$this->_subArray($root, $pth, $create);
-
- if (is_array($attributes)) {
- foreach ($attributes as $key => $value) {
- if ($value['type'] == 'pkcs-9-at-extensionRequest') {
- $path = "$pth/$key/value/0";
- break 2;
- }
- }
- if ($create) {
- $key = count($attributes);
- $attributes[] = array('type' => 'pkcs-9-at-extensionRequest', 'value' => array());
- $path = "$pth/$key/value/0";
- }
- }
- break;
- }
-
- $extensions = &$this->_subArray($root, $path, $create);
-
- if (!is_array($extensions)) {
- $false = false;
- return $false;
- }
-
- return $extensions;
- }
-
- /**
- * Remove an Extension
- *
- * @param String $id
- * @param String $path optional
- * @access private
- * @return Boolean
- */
- function _removeExtension($id, $path = null)
- {
- $extensions = &$this->_extensions($this->currentCert, $path);
-
- if (!is_array($extensions)) {
- return false;
- }
-
- $result = false;
- foreach ($extensions as $key => $value) {
- if ($value['extnId'] == $id) {
- unset($extensions[$key]);
- $result = true;
- }
- }
-
- $extensions = array_values($extensions);
- return $result;
- }
-
- /**
- * Get an Extension
- *
- * Returns the extension if it exists and false if not
- *
- * @param String $id
- * @param Array $cert optional
- * @param String $path optional
- * @access private
- * @return Mixed
- */
- function _getExtension($id, $cert = null, $path = null)
- {
- $extensions = $this->_extensions($cert, $path);
-
- if (!is_array($extensions)) {
- return false;
- }
-
- foreach ($extensions as $key => $value) {
- if ($value['extnId'] == $id) {
- return $value['extnValue'];
- }
- }
-
- return false;
- }
-
- /**
- * Returns a list of all extensions in use
- *
- * @param array $cert optional
- * @param String $path optional
- * @access private
- * @return Array
- */
- function _getExtensions($cert = null, $path = null)
- {
- $exts = $this->_extensions($cert, $path);
- $extensions = array();
-
- if (is_array($exts)) {
- foreach ($exts as $extension) {
- $extensions[] = $extension['extnId'];
- }
- }
-
- return $extensions;
- }
-
- /**
- * Set an Extension
- *
- * @param String $id
- * @param Mixed $value
- * @param Boolean $critical optional
- * @param Boolean $replace optional
- * @param String $path optional
- * @access private
- * @return Boolean
- */
- function _setExtension($id, $value, $critical = false, $replace = true, $path = null)
- {
- $extensions = &$this->_extensions($this->currentCert, $path, true);
-
- if (!is_array($extensions)) {
- return false;
- }
-
- $newext = array('extnId' => $id, 'critical' => $critical, 'extnValue' => $value);
-
- foreach ($extensions as $key => $value) {
- if ($value['extnId'] == $id) {
- if (!$replace) {
- return false;
- }
-
- $extensions[$key] = $newext;
- return true;
- }
- }
-
- $extensions[] = $newext;
- return true;
- }
-
- /**
- * Remove a certificate, CSR or CRL Extension
- *
- * @param String $id
- * @access public
- * @return Boolean
- */
- function removeExtension($id)
- {
- return $this->_removeExtension($id);
- }
-
- /**
- * Get a certificate, CSR or CRL Extension
- *
- * Returns the extension if it exists and false if not
- *
- * @param String $id
- * @param Array $cert optional
- * @access public
- * @return Mixed
- */
- function getExtension($id, $cert = null)
- {
- return $this->_getExtension($id, $cert);
- }
-
- /**
- * Returns a list of all extensions in use in certificate, CSR or CRL
- *
- * @param array $cert optional
- * @access public
- * @return Array
- */
- function getExtensions($cert = null)
- {
- return $this->_getExtensions($cert);
- }
-
- /**
- * Set a certificate, CSR or CRL Extension
- *
- * @param String $id
- * @param Mixed $value
- * @param Boolean $critical optional
- * @param Boolean $replace optional
- * @access public
- * @return Boolean
- */
- function setExtension($id, $value, $critical = false, $replace = true)
- {
- return $this->_setExtension($id, $value, $critical, $replace);
- }
-
- /**
- * Remove a CSR attribute.
- *
- * @param String $id
- * @param Integer $disposition optional
- * @access public
- * @return Boolean
- */
- function removeAttribute($id, $disposition = FILE_X509_ATTR_ALL)
- {
- $attributes = &$this->_subArray($this->currentCert, 'certificationRequestInfo/attributes');
-
- if (!is_array($attributes)) {
- return false;
- }
-
- $result = false;
- foreach ($attributes as $key => $attribute) {
- if ($attribute['type'] == $id) {
- $n = count($attribute['value']);
- switch (true) {
- case $disposition == FILE_X509_ATTR_APPEND:
- case $disposition == FILE_X509_ATTR_REPLACE:
- return false;
- case $disposition >= $n:
- $disposition -= $n;
- break;
- case $disposition == FILE_X509_ATTR_ALL:
- case $n == 1:
- unset($attributes[$key]);
- $result = true;
- break;
- default:
- unset($attributes[$key]['value'][$disposition]);
- $attributes[$key]['value'] = array_values($attributes[$key]['value']);
- $result = true;
- break;
- }
- if ($result && $disposition != FILE_X509_ATTR_ALL) {
- break;
- }
- }
- }
-
- $attributes = array_values($attributes);
- return $result;
- }
-
- /**
- * Get a CSR attribute
- *
- * Returns the attribute if it exists and false if not
- *
- * @param String $id
- * @param Integer $disposition optional
- * @param Array $csr optional
- * @access public
- * @return Mixed
- */
- function getAttribute($id, $disposition = FILE_X509_ATTR_ALL, $csr = null)
- {
- if (empty($csr)) {
- $csr = $this->currentCert;
- }
-
- $attributes = $this->_subArray($csr, 'certificationRequestInfo/attributes');
-
- if (!is_array($attributes)) {
- return false;
- }
-
- foreach ($attributes as $key => $attribute) {
- if ($attribute['type'] == $id) {
- $n = count($attribute['value']);
- switch (true) {
- case $disposition == FILE_X509_ATTR_APPEND:
- case $disposition == FILE_X509_ATTR_REPLACE:
- return false;
- case $disposition == FILE_X509_ATTR_ALL:
- return $attribute['value'];
- case $disposition >= $n:
- $disposition -= $n;
- break;
- default:
- return $attribute['value'][$disposition];
- }
- }
- }
-
- return false;
- }
-
- /**
- * Returns a list of all CSR attributes in use
- *
- * @param array $csr optional
- * @access public
- * @return Array
- */
- function getAttributes($csr = null)
- {
- if (empty($csr)) {
- $csr = $this->currentCert;
- }
-
- $attributes = $this->_subArray($csr, 'certificationRequestInfo/attributes');
- $attrs = array();
-
- if (is_array($attributes)) {
- foreach ($attributes as $attribute) {
- $attrs[] = $attribute['type'];
- }
- }
-
- return $attrs;
- }
-
- /**
- * Set a CSR attribute
- *
- * @param String $id
- * @param Mixed $value
- * @param Boolean $disposition optional
- * @access public
- * @return Boolean
- */
- function setAttribute($id, $value, $disposition = FILE_X509_ATTR_ALL)
- {
- $attributes = &$this->_subArray($this->currentCert, 'certificationRequestInfo/attributes', true);
-
- if (!is_array($attributes)) {
- return false;
- }
-
- switch ($disposition) {
- case FILE_X509_ATTR_REPLACE:
- $disposition = FILE_X509_ATTR_APPEND;
- case FILE_X509_ATTR_ALL:
- $this->removeAttribute($id);
- break;
- }
-
- foreach ($attributes as $key => $attribute) {
- if ($attribute['type'] == $id) {
- $n = count($attribute['value']);
- switch (true) {
- case $disposition == FILE_X509_ATTR_APPEND:
- $last = $key;
- break;
- case $disposition >= $n;
- $disposition -= $n;
- break;
- default:
- $attributes[$key]['value'][$disposition] = $value;
- return true;
- }
- }
- }
-
- switch (true) {
- case $disposition >= 0:
- return false;
- case isset($last):
- $attributes[$last]['value'][] = $value;
- break;
- default:
- $attributes[] = array('type' => $id, 'value' => $disposition == FILE_X509_ATTR_ALL ? $value: array($value));
- break;
- }
-
- return true;
- }
-
- /**
- * Sets the subject key identifier
- *
- * This is used by the id-ce-authorityKeyIdentifier and the id-ce-subjectKeyIdentifier extensions.
- *
- * @param String $value
- * @access public
- */
- function setKeyIdentifier($value)
- {
- if (empty($value)) {
- unset($this->currentKeyIdentifier);
- } else {
- $this->currentKeyIdentifier = base64_encode($value);
- }
- }
-
- /**
- * Compute a public key identifier.
- *
- * Although key identifiers may be set to any unique value, this function
- * computes key identifiers from public key according to the two
- * recommended methods (4.2.1.2 RFC 3280).
- * Highly polymorphic: try to accept all possible forms of key:
- * - Key object
- * - File_X509 object with public or private key defined
- * - Certificate or CSR array
- * - File_ASN1_Element object
- * - PEM or DER string
- *
- * @param Mixed $key optional
- * @param Integer $method optional
- * @access public
- * @return String binary key identifier
- */
- function computeKeyIdentifier($key = null, $method = 1)
- {
- if (is_null($key)) {
- $key = $this;
- }
-
- switch (true) {
- case is_string($key):
- break;
- case is_array($key) && isset($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']):
- return $this->computeKeyIdentifier($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], $method);
- case is_array($key) && isset($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']):
- return $this->computeKeyIdentifier($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'], $method);
- case !is_object($key):
- return false;
- case strtolower(get_class($key)) == 'file_asn1_element':
- // Assume the element is a bitstring-packed key.
- $asn1 = new File_ASN1();
- $decoded = $asn1->decodeBER($key->element);
- if (empty($decoded)) {
- return false;
- }
- $raw = $asn1->asn1map($decoded[0], array('type' => FILE_ASN1_TYPE_BIT_STRING));
- if (empty($raw)) {
- return false;
- }
- $raw = base64_decode($raw);
- // If the key is private, compute identifier from its corresponding public key.
- if (!class_exists('Crypt_RSA')) {
- include_once 'Crypt/RSA.php';
- }
- $key = new Crypt_RSA();
- if (!$key->loadKey($raw)) {
- return false; // Not an unencrypted RSA key.
- }
- if ($key->getPrivateKey() !== false) { // If private.
- return $this->computeKeyIdentifier($key, $method);
- }
- $key = $raw; // Is a public key.
- break;
- case strtolower(get_class($key)) == 'file_x509':
- if (isset($key->publicKey)) {
- return $this->computeKeyIdentifier($key->publicKey, $method);
- }
- if (isset($key->privateKey)) {
- return $this->computeKeyIdentifier($key->privateKey, $method);
- }
- if (isset($key->currentCert['tbsCertificate']) || isset($key->currentCert['certificationRequestInfo'])) {
- return $this->computeKeyIdentifier($key->currentCert, $method);
- }
- return false;
- default: // Should be a key object (i.e.: Crypt_RSA).
- $key = $key->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW);
- break;
- }
-
- // If in PEM format, convert to binary.
- $key = $this->_extractBER($key);
-
- // Now we have the key string: compute its sha-1 sum.
- if (!class_exists('Crypt_Hash')) {
- include_once 'Crypt/Hash.php';
- }
- $hash = new Crypt_Hash('sha1');
- $hash = $hash->hash($key);
-
- if ($method == 2) {
- $hash = substr($hash, -8);
- $hash[0] = chr((ord($hash[0]) & 0x0F) | 0x40);
- }
-
- return $hash;
- }
-
- /**
- * Format a public key as appropriate
- *
- * @access private
- * @return Array
- */
- function _formatSubjectPublicKey()
- {
- if (!isset($this->publicKey) || !is_object($this->publicKey)) {
- return false;
- }
-
- switch (strtolower(get_class($this->publicKey))) {
- case 'crypt_rsa':
- // the following two return statements do the same thing. i dunno.. i just prefer the later for some reason.
- // the former is a good example of how to do fuzzing on the public key
- //return new File_ASN1_Element(base64_decode(preg_replace('#-.+-|[\r\n]#', '', $this->publicKey->getPublicKey())));
- return array(
- 'algorithm' => array('algorithm' => 'rsaEncryption'),
- 'subjectPublicKey' => $this->publicKey->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW)
- );
- default:
- return false;
- }
- }
-
- /**
- * Set the domain name's which the cert is to be valid for
- *
- * @access public
- * @return Array
- */
- function setDomain()
- {
- $this->domains = func_get_args();
- $this->removeDNProp('id-at-commonName');
- $this->setDNProp('id-at-commonName', $this->domains[0]);
- }
-
- /**
- * Set the IP Addresses's which the cert is to be valid for
- *
- * @access public
- * @param String $ipAddress optional
- */
- function setIPAddress()
- {
- $this->ipAddresses = func_get_args();
- /*
- if (!isset($this->domains)) {
- $this->removeDNProp('id-at-commonName');
- $this->setDNProp('id-at-commonName', $this->ipAddresses[0]);
- }
- */
- }
-
- /**
- * Helper function to build domain array
- *
- * @access private
- * @param String $domain
- * @return Array
- */
- function _dnsName($domain)
- {
- return array('dNSName' => $domain);
- }
-
- /**
- * Helper function to build IP Address array
- *
- * (IPv6 is not currently supported)
- *
- * @access private
- * @param String $address
- * @return Array
- */
- function _iPAddress($address)
- {
- return array('iPAddress' => $address);
- }
-
- /**
- * Get the index of a revoked certificate.
- *
- * @param array $rclist
- * @param String $serial
- * @param Boolean $create optional
- * @access private
- * @return Integer or false
- */
- function _revokedCertificate(&$rclist, $serial, $create = false)
- {
- $serial = new Math_BigInteger($serial);
-
- foreach ($rclist as $i => $rc) {
- if (!($serial->compare($rc['userCertificate']))) {
- return $i;
- }
- }
-
- if (!$create) {
- return false;
- }
-
- $i = count($rclist);
- $rclist[] = array('userCertificate' => $serial,
- 'revocationDate' => array('generalTime' => @date('D, d M y H:i:s O')));
- return $i;
- }
-
- /**
- * Revoke a certificate.
- *
- * @param String $serial
- * @param String $date optional
- * @access public
- * @return Boolean
- */
- function revoke($serial, $date = null)
- {
- if (isset($this->currentCert['tbsCertList'])) {
- if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates', true))) {
- if ($this->_revokedCertificate($rclist, $serial) === false) { // If not yet revoked
- if (($i = $this->_revokedCertificate($rclist, $serial, true)) !== false) {
-
- if (!empty($date)) {
- $rclist[$i]['revocationDate'] = array('generalTime' => $date);
- }
-
- return true;
- }
- }
- }
- }
-
- return false;
- }
-
- /**
- * Unrevoke a certificate.
- *
- * @param String $serial
- * @access public
- * @return Boolean
- */
- function unrevoke($serial)
- {
- if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) {
- if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) {
- unset($rclist[$i]);
- $rclist = array_values($rclist);
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Get a revoked certificate.
- *
- * @param String $serial
- * @access public
- * @return Mixed
- */
- function getRevoked($serial)
- {
- if (is_array($rclist = $this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) {
- if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) {
- return $rclist[$i];
- }
- }
-
- return false;
- }
-
- /**
- * List revoked certificates
- *
- * @param array $crl optional
- * @access public
- * @return array
- */
- function listRevoked($crl = null)
- {
- if (!isset($crl)) {
- $crl = $this->currentCert;
- }
-
- if (!isset($crl['tbsCertList'])) {
- return false;
- }
-
- $result = array();
-
- if (is_array($rclist = $this->_subArray($crl, 'tbsCertList/revokedCertificates'))) {
- foreach ($rclist as $rc) {
- $result[] = $rc['userCertificate']->toString();
- }
- }
-
- return $result;
- }
-
- /**
- * Remove a Revoked Certificate Extension
- *
- * @param String $serial
- * @param String $id
- * @access public
- * @return Boolean
- */
- function removeRevokedCertificateExtension($serial, $id)
- {
- if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) {
- if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) {
- return $this->_removeExtension($id, "tbsCertList/revokedCertificates/$i/crlEntryExtensions");
- }
- }
-
- return false;
- }
-
- /**
- * Get a Revoked Certificate Extension
- *
- * Returns the extension if it exists and false if not
- *
- * @param String $serial
- * @param String $id
- * @param Array $crl optional
- * @access public
- * @return Mixed
- */
- function getRevokedCertificateExtension($serial, $id, $crl = null)
- {
- if (!isset($crl)) {
- $crl = $this->currentCert;
- }
-
- if (is_array($rclist = $this->_subArray($crl, 'tbsCertList/revokedCertificates'))) {
- if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) {
- return $this->_getExtension($id, $crl, "tbsCertList/revokedCertificates/$i/crlEntryExtensions");
- }
- }
-
- return false;
- }
-
- /**
- * Returns a list of all extensions in use for a given revoked certificate
- *
- * @param String $serial
- * @param array $crl optional
- * @access public
- * @return Array
- */
- function getRevokedCertificateExtensions($serial, $crl = null)
- {
- if (!isset($crl)) {
- $crl = $this->currentCert;
- }
-
- if (is_array($rclist = $this->_subArray($crl, 'tbsCertList/revokedCertificates'))) {
- if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) {
- return $this->_getExtensions($crl, "tbsCertList/revokedCertificates/$i/crlEntryExtensions");
- }
- }
-
- return false;
- }
-
- /**
- * Set a Revoked Certificate Extension
- *
- * @param String $serial
- * @param String $id
- * @param Mixed $value
- * @param Boolean $critical optional
- * @param Boolean $replace optional
- * @access public
- * @return Boolean
- */
- function setRevokedCertificateExtension($serial, $id, $value, $critical = false, $replace = true)
- {
- if (isset($this->currentCert['tbsCertList'])) {
- if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates', true))) {
- if (($i = $this->_revokedCertificate($rclist, $serial, true)) !== false) {
- return $this->_setExtension($id, $value, $critical, $replace, "tbsCertList/revokedCertificates/$i/crlEntryExtensions");
- }
- }
- }
-
- return false;
- }
-
- /**
- * Extract raw BER from Base64 encoding
- *
- * @access private
- * @param String $str
- * @return String
- */
- function _extractBER($str)
- {
- /* X.509 certs are assumed to be base64 encoded but sometimes they'll have additional things in them
- * above and beyond the ceritificate.
- * ie. some may have the following preceding the -----BEGIN CERTIFICATE----- line:
- *
- * Bag Attributes
- * localKeyID: 01 00 00 00
- * subject=/O=organization/OU=org unit/CN=common name
- * issuer=/O=organization/CN=common name
- */
- $temp = preg_replace('#.*?^-+[^-]+-+#ms', '', $str, 1);
- // remove the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- stuff
- $temp = preg_replace('#-+[^-]+-+#', '', $temp);
- // remove new lines
- $temp = str_replace(array("\r", "\n", ' '), '', $temp);
- $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false;
- return $temp != false ? $temp : $str;
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Math/BigInteger.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Math/BigInteger.php
deleted file mode 100644
index 1b4ea675fcc92ba65564b238197ddb60bc059f11..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Math/BigInteger.php
+++ /dev/null
@@ -1,3706 +0,0 @@
-> and << cannot be used, nor can the modulo operator %,
- * which only supports integers. Although this fact will slow this library down, the fact that such a high
- * base is being used should more than compensate.
- *
- * When PHP version 6 is officially released, we'll be able to use 64-bit integers. This should, once again,
- * allow bitwise operators, and will increase the maximum possible base to 2**31 (or 2**62 for addition /
- * subtraction).
- *
- * Numbers are stored in {@link http://en.wikipedia.org/wiki/Endianness little endian} format. ie.
- * (new Math_BigInteger(pow(2, 26)))->value = array(0, 1)
- *
- * Useful resources are as follows:
- *
- * - {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf Handbook of Applied Cryptography (HAC)}
- * - {@link http://math.libtomcrypt.com/files/tommath.pdf Multi-Precision Math (MPM)}
- * - Java's BigInteger classes. See /j2se/src/share/classes/java/math in jdk-1_5_0-src-jrl.zip
- *
- * Here's an example of how to use this library:
- *
- * add($b);
- *
- * echo $c->toString(); // outputs 5
- * ?>
- *
- *
- * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @category Math
- * @package Math_BigInteger
- * @author Jim Wigginton
- * @copyright MMVI Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://pear.php.net/package/Math_BigInteger
- */
-
-/**#@+
- * Reduction constants
- *
- * @access private
- * @see Math_BigInteger::_reduce()
- */
-/**
- * @see Math_BigInteger::_montgomery()
- * @see Math_BigInteger::_prepMontgomery()
- */
-define('MATH_BIGINTEGER_MONTGOMERY', 0);
-/**
- * @see Math_BigInteger::_barrett()
- */
-define('MATH_BIGINTEGER_BARRETT', 1);
-/**
- * @see Math_BigInteger::_mod2()
- */
-define('MATH_BIGINTEGER_POWEROF2', 2);
-/**
- * @see Math_BigInteger::_remainder()
- */
-define('MATH_BIGINTEGER_CLASSIC', 3);
-/**
- * @see Math_BigInteger::__clone()
- */
-define('MATH_BIGINTEGER_NONE', 4);
-/**#@-*/
-
-/**#@+
- * Array constants
- *
- * Rather than create a thousands and thousands of new Math_BigInteger objects in repeated function calls to add() and
- * multiply() or whatever, we'll just work directly on arrays, taking them in as parameters and returning them.
- *
- * @access private
- */
-/**
- * $result[MATH_BIGINTEGER_VALUE] contains the value.
- */
-define('MATH_BIGINTEGER_VALUE', 0);
-/**
- * $result[MATH_BIGINTEGER_SIGN] contains the sign.
- */
-define('MATH_BIGINTEGER_SIGN', 1);
-/**#@-*/
-
-/**#@+
- * @access private
- * @see Math_BigInteger::_montgomery()
- * @see Math_BigInteger::_barrett()
- */
-/**
- * Cache constants
- *
- * $cache[MATH_BIGINTEGER_VARIABLE] tells us whether or not the cached data is still valid.
- */
-define('MATH_BIGINTEGER_VARIABLE', 0);
-/**
- * $cache[MATH_BIGINTEGER_DATA] contains the cached data.
- */
-define('MATH_BIGINTEGER_DATA', 1);
-/**#@-*/
-
-/**#@+
- * Mode constants.
- *
- * @access private
- * @see Math_BigInteger::Math_BigInteger()
- */
-/**
- * To use the pure-PHP implementation
- */
-define('MATH_BIGINTEGER_MODE_INTERNAL', 1);
-/**
- * To use the BCMath library
- *
- * (if enabled; otherwise, the internal implementation will be used)
- */
-define('MATH_BIGINTEGER_MODE_BCMATH', 2);
-/**
- * To use the GMP library
- *
- * (if present; otherwise, either the BCMath or the internal implementation will be used)
- */
-define('MATH_BIGINTEGER_MODE_GMP', 3);
-/**#@-*/
-
-/**
- * Karatsuba Cutoff
- *
- * At what point do we switch between Karatsuba multiplication and schoolbook long multiplication?
- *
- * @access private
- */
-define('MATH_BIGINTEGER_KARATSUBA_CUTOFF', 25);
-
-/**
- * Pure-PHP arbitrary precision integer arithmetic library. Supports base-2, base-10, base-16, and base-256
- * numbers.
- *
- * @package Math_BigInteger
- * @author Jim Wigginton
- * @version 1.0.0RC4
- * @access public
- */
-class Math_BigInteger
-{
- /**
- * Holds the BigInteger's value.
- *
- * @var Array
- * @access private
- */
- var $value;
-
- /**
- * Holds the BigInteger's magnitude.
- *
- * @var Boolean
- * @access private
- */
- var $is_negative = false;
-
- /**
- * Random number generator function
- *
- * @see setRandomGenerator()
- * @access private
- */
- var $generator = 'mt_rand';
-
- /**
- * Precision
- *
- * @see setPrecision()
- * @access private
- */
- var $precision = -1;
-
- /**
- * Precision Bitmask
- *
- * @see setPrecision()
- * @access private
- */
- var $bitmask = false;
-
- /**
- * Mode independent value used for serialization.
- *
- * If the bcmath or gmp extensions are installed $this->value will be a non-serializable resource, hence the need for
- * a variable that'll be serializable regardless of whether or not extensions are being used. Unlike $this->value,
- * however, $this->hex is only calculated when $this->__sleep() is called.
- *
- * @see __sleep()
- * @see __wakeup()
- * @var String
- * @access private
- */
- var $hex;
-
- /**
- * Converts base-2, base-10, base-16, and binary strings (base-256) to BigIntegers.
- *
- * If the second parameter - $base - is negative, then it will be assumed that the number's are encoded using
- * two's compliment. The sole exception to this is -10, which is treated the same as 10 is.
- *
- * Here's an example:
- *
- * <?php
- * include('Math/BigInteger.php');
- *
- * $a = new Math_BigInteger('0x32', 16); // 50 in base-16
- *
- * echo $a->toString(); // outputs 50
- * ?>
- *
- *
- * @param optional $x base-10 number or base-$base number if $base set.
- * @param optional integer $base
- * @return Math_BigInteger
- * @access public
- */
- function Math_BigInteger($x = 0, $base = 10)
- {
- if ( !defined('MATH_BIGINTEGER_MODE') ) {
- switch (true) {
- case extension_loaded('gmp'):
- define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_GMP);
- break;
- case extension_loaded('bcmath'):
- define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_BCMATH);
- break;
- default:
- define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_INTERNAL);
- }
- }
-
- if (function_exists('openssl_public_encrypt') && !defined('MATH_BIGINTEGER_OPENSSL_DISABLE') && !defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) {
- // some versions of XAMPP have mismatched versions of OpenSSL which causes it not to work
- ob_start();
- phpinfo();
- $content = ob_get_contents();
- ob_end_clean();
-
- preg_match_all('#OpenSSL (Header|Library) Version(.*)#im', $content, $matches);
-
- $versions = array();
- if (!empty($matches[1])) {
- for ($i = 0; $i < count($matches[1]); $i++) {
- $versions[$matches[1][$i]] = trim(str_replace('=>', '', strip_tags($matches[2][$i])));
- }
- }
-
- // it doesn't appear that OpenSSL versions were reported upon until PHP 5.3+
- switch (true) {
- case !isset($versions['Header']):
- case !isset($versions['Library']):
- case $versions['Header'] == $versions['Library']:
- define('MATH_BIGINTEGER_OPENSSL_ENABLED', true);
- break;
- default:
- define('MATH_BIGINTEGER_OPENSSL_DISABLE', true);
- }
- }
-
- if (!defined('PHP_INT_SIZE')) {
- define('PHP_INT_SIZE', 4);
- }
-
- if (!defined('MATH_BIGINTEGER_BASE') && MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_INTERNAL) {
- switch (PHP_INT_SIZE) {
- case 8: // use 64-bit integers if int size is 8 bytes
- define('MATH_BIGINTEGER_BASE', 31);
- define('MATH_BIGINTEGER_BASE_FULL', 0x80000000);
- define('MATH_BIGINTEGER_MAX_DIGIT', 0x7FFFFFFF);
- define('MATH_BIGINTEGER_MSB', 0x40000000);
- // 10**9 is the closest we can get to 2**31 without passing it
- define('MATH_BIGINTEGER_MAX10', 1000000000);
- define('MATH_BIGINTEGER_MAX10_LEN', 9);
- // the largest digit that may be used in addition / subtraction
- define('MATH_BIGINTEGER_MAX_DIGIT2', pow(2, 62));
- break;
- //case 4: // use 64-bit floats if int size is 4 bytes
- default:
- define('MATH_BIGINTEGER_BASE', 26);
- define('MATH_BIGINTEGER_BASE_FULL', 0x4000000);
- define('MATH_BIGINTEGER_MAX_DIGIT', 0x3FFFFFF);
- define('MATH_BIGINTEGER_MSB', 0x2000000);
- // 10**7 is the closest to 2**26 without passing it
- define('MATH_BIGINTEGER_MAX10', 10000000);
- define('MATH_BIGINTEGER_MAX10_LEN', 7);
- // the largest digit that may be used in addition / subtraction
- // we do pow(2, 52) instead of using 4503599627370496 directly because some
- // PHP installations will truncate 4503599627370496.
- define('MATH_BIGINTEGER_MAX_DIGIT2', pow(2, 52));
- }
- }
-
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- if (is_resource($x) && get_resource_type($x) == 'GMP integer') {
- $this->value = $x;
- return;
- }
- $this->value = gmp_init(0);
- break;
- case MATH_BIGINTEGER_MODE_BCMATH:
- $this->value = '0';
- break;
- default:
- $this->value = array();
- }
-
- // '0' counts as empty() but when the base is 256 '0' is equal to ord('0') or 48
- // '0' is the only value like this per http://php.net/empty
- if (empty($x) && (abs($base) != 256 || $x !== '0')) {
- return;
- }
-
- switch ($base) {
- case -256:
- if (ord($x[0]) & 0x80) {
- $x = ~$x;
- $this->is_negative = true;
- }
- case 256:
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- $sign = $this->is_negative ? '-' : '';
- $this->value = gmp_init($sign . '0x' . bin2hex($x));
- break;
- case MATH_BIGINTEGER_MODE_BCMATH:
- // round $len to the nearest 4 (thanks, DavidMJ!)
- $len = (strlen($x) + 3) & 0xFFFFFFFC;
-
- $x = str_pad($x, $len, chr(0), STR_PAD_LEFT);
-
- for ($i = 0; $i < $len; $i+= 4) {
- $this->value = bcmul($this->value, '4294967296', 0); // 4294967296 == 2**32
- $this->value = bcadd($this->value, 0x1000000 * ord($x[$i]) + ((ord($x[$i + 1]) << 16) | (ord($x[$i + 2]) << 8) | ord($x[$i + 3])), 0);
- }
-
- if ($this->is_negative) {
- $this->value = '-' . $this->value;
- }
-
- break;
- // converts a base-2**8 (big endian / msb) number to base-2**26 (little endian / lsb)
- default:
- while (strlen($x)) {
- $this->value[] = $this->_bytes2int($this->_base256_rshift($x, MATH_BIGINTEGER_BASE));
- }
- }
-
- if ($this->is_negative) {
- if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL) {
- $this->is_negative = false;
- }
- $temp = $this->add(new Math_BigInteger('-1'));
- $this->value = $temp->value;
- }
- break;
- case 16:
- case -16:
- if ($base > 0 && $x[0] == '-') {
- $this->is_negative = true;
- $x = substr($x, 1);
- }
-
- $x = preg_replace('#^(?:0x)?([A-Fa-f0-9]*).*#', '$1', $x);
-
- $is_negative = false;
- if ($base < 0 && hexdec($x[0]) >= 8) {
- $this->is_negative = $is_negative = true;
- $x = bin2hex(~pack('H*', $x));
- }
-
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- $temp = $this->is_negative ? '-0x' . $x : '0x' . $x;
- $this->value = gmp_init($temp);
- $this->is_negative = false;
- break;
- case MATH_BIGINTEGER_MODE_BCMATH:
- $x = ( strlen($x) & 1 ) ? '0' . $x : $x;
- $temp = new Math_BigInteger(pack('H*', $x), 256);
- $this->value = $this->is_negative ? '-' . $temp->value : $temp->value;
- $this->is_negative = false;
- break;
- default:
- $x = ( strlen($x) & 1 ) ? '0' . $x : $x;
- $temp = new Math_BigInteger(pack('H*', $x), 256);
- $this->value = $temp->value;
- }
-
- if ($is_negative) {
- $temp = $this->add(new Math_BigInteger('-1'));
- $this->value = $temp->value;
- }
- break;
- case 10:
- case -10:
- // (?value = gmp_init($x);
- break;
- case MATH_BIGINTEGER_MODE_BCMATH:
- // explicitly casting $x to a string is necessary, here, since doing $x[0] on -1 yields different
- // results then doing it on '-1' does (modInverse does $x[0])
- $this->value = $x === '-' ? '0' : (string) $x;
- break;
- default:
- $temp = new Math_BigInteger();
-
- $multiplier = new Math_BigInteger();
- $multiplier->value = array(MATH_BIGINTEGER_MAX10);
-
- if ($x[0] == '-') {
- $this->is_negative = true;
- $x = substr($x, 1);
- }
-
- $x = str_pad($x, strlen($x) + ((MATH_BIGINTEGER_MAX10_LEN - 1) * strlen($x)) % MATH_BIGINTEGER_MAX10_LEN, 0, STR_PAD_LEFT);
- while (strlen($x)) {
- $temp = $temp->multiply($multiplier);
- $temp = $temp->add(new Math_BigInteger($this->_int2bytes(substr($x, 0, MATH_BIGINTEGER_MAX10_LEN)), 256));
- $x = substr($x, MATH_BIGINTEGER_MAX10_LEN);
- }
-
- $this->value = $temp->value;
- }
- break;
- case 2: // base-2 support originally implemented by Lluis Pamies - thanks!
- case -2:
- if ($base > 0 && $x[0] == '-') {
- $this->is_negative = true;
- $x = substr($x, 1);
- }
-
- $x = preg_replace('#^([01]*).*#', '$1', $x);
- $x = str_pad($x, strlen($x) + (3 * strlen($x)) % 4, 0, STR_PAD_LEFT);
-
- $str = '0x';
- while (strlen($x)) {
- $part = substr($x, 0, 4);
- $str.= dechex(bindec($part));
- $x = substr($x, 4);
- }
-
- if ($this->is_negative) {
- $str = '-' . $str;
- }
-
- $temp = new Math_BigInteger($str, 8 * $base); // ie. either -16 or +16
- $this->value = $temp->value;
- $this->is_negative = $temp->is_negative;
-
- break;
- default:
- // base not supported, so we'll let $this == 0
- }
- }
-
- /**
- * Converts a BigInteger to a byte string (eg. base-256).
- *
- * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're
- * saved as two's compliment.
- *
- * Here's an example:
- *
- * toBytes(); // outputs chr(65)
- * ?>
- *
- *
- * @param Boolean $twos_compliment
- * @return String
- * @access public
- * @internal Converts a base-2**26 number to base-2**8
- */
- function toBytes($twos_compliment = false)
- {
- if ($twos_compliment) {
- $comparison = $this->compare(new Math_BigInteger());
- if ($comparison == 0) {
- return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : '';
- }
-
- $temp = $comparison < 0 ? $this->add(new Math_BigInteger(1)) : $this->copy();
- $bytes = $temp->toBytes();
-
- if (empty($bytes)) { // eg. if the number we're trying to convert is -1
- $bytes = chr(0);
- }
-
- if (ord($bytes[0]) & 0x80) {
- $bytes = chr(0) . $bytes;
- }
-
- return $comparison < 0 ? ~$bytes : $bytes;
- }
-
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- if (gmp_cmp($this->value, gmp_init(0)) == 0) {
- return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : '';
- }
-
- $temp = gmp_strval(gmp_abs($this->value), 16);
- $temp = ( strlen($temp) & 1 ) ? '0' . $temp : $temp;
- $temp = pack('H*', $temp);
-
- return $this->precision > 0 ?
- substr(str_pad($temp, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) :
- ltrim($temp, chr(0));
- case MATH_BIGINTEGER_MODE_BCMATH:
- if ($this->value === '0') {
- return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : '';
- }
-
- $value = '';
- $current = $this->value;
-
- if ($current[0] == '-') {
- $current = substr($current, 1);
- }
-
- while (bccomp($current, '0', 0) > 0) {
- $temp = bcmod($current, '16777216');
- $value = chr($temp >> 16) . chr($temp >> 8) . chr($temp) . $value;
- $current = bcdiv($current, '16777216', 0);
- }
-
- return $this->precision > 0 ?
- substr(str_pad($value, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) :
- ltrim($value, chr(0));
- }
-
- if (!count($this->value)) {
- return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : '';
- }
- $result = $this->_int2bytes($this->value[count($this->value) - 1]);
-
- $temp = $this->copy();
-
- for ($i = count($temp->value) - 2; $i >= 0; --$i) {
- $temp->_base256_lshift($result, MATH_BIGINTEGER_BASE);
- $result = $result | str_pad($temp->_int2bytes($temp->value[$i]), strlen($result), chr(0), STR_PAD_LEFT);
- }
-
- return $this->precision > 0 ?
- str_pad(substr($result, -(($this->precision + 7) >> 3)), ($this->precision + 7) >> 3, chr(0), STR_PAD_LEFT) :
- $result;
- }
-
- /**
- * Converts a BigInteger to a hex string (eg. base-16)).
- *
- * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're
- * saved as two's compliment.
- *
- * Here's an example:
- *
- * toHex(); // outputs '41'
- * ?>
- *
- *
- * @param Boolean $twos_compliment
- * @return String
- * @access public
- * @internal Converts a base-2**26 number to base-2**8
- */
- function toHex($twos_compliment = false)
- {
- return bin2hex($this->toBytes($twos_compliment));
- }
-
- /**
- * Converts a BigInteger to a bit string (eg. base-2).
- *
- * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're
- * saved as two's compliment.
- *
- * Here's an example:
- *
- * toBits(); // outputs '1000001'
- * ?>
- *
- *
- * @param Boolean $twos_compliment
- * @return String
- * @access public
- * @internal Converts a base-2**26 number to base-2**2
- */
- function toBits($twos_compliment = false)
- {
- $hex = $this->toHex($twos_compliment);
- $bits = '';
- for ($i = strlen($hex) - 8, $start = strlen($hex) & 7; $i >= $start; $i-=8) {
- $bits = str_pad(decbin(hexdec(substr($hex, $i, 8))), 32, '0', STR_PAD_LEFT) . $bits;
- }
- if ($start) { // hexdec('') == 0
- $bits = str_pad(decbin(hexdec(substr($hex, 0, $start))), 8, '0', STR_PAD_LEFT) . $bits;
- }
- $result = $this->precision > 0 ? substr($bits, -$this->precision) : ltrim($bits, '0');
-
- if ($twos_compliment && $this->compare(new Math_BigInteger()) > 0 && $this->precision <= 0) {
- return '0' . $result;
- }
-
- return $result;
- }
-
- /**
- * Converts a BigInteger to a base-10 number.
- *
- * Here's an example:
- *
- * toString(); // outputs 50
- * ?>
- *
- *
- * @return String
- * @access public
- * @internal Converts a base-2**26 number to base-10**7 (which is pretty much base-10)
- */
- function toString()
- {
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- return gmp_strval($this->value);
- case MATH_BIGINTEGER_MODE_BCMATH:
- if ($this->value === '0') {
- return '0';
- }
-
- return ltrim($this->value, '0');
- }
-
- if (!count($this->value)) {
- return '0';
- }
-
- $temp = $this->copy();
- $temp->is_negative = false;
-
- $divisor = new Math_BigInteger();
- $divisor->value = array(MATH_BIGINTEGER_MAX10);
- $result = '';
- while (count($temp->value)) {
- list($temp, $mod) = $temp->divide($divisor);
- $result = str_pad(isset($mod->value[0]) ? $mod->value[0] : '', MATH_BIGINTEGER_MAX10_LEN, '0', STR_PAD_LEFT) . $result;
- }
- $result = ltrim($result, '0');
- if (empty($result)) {
- $result = '0';
- }
-
- if ($this->is_negative) {
- $result = '-' . $result;
- }
-
- return $result;
- }
-
- /**
- * Copy an object
- *
- * PHP5 passes objects by reference while PHP4 passes by value. As such, we need a function to guarantee
- * that all objects are passed by value, when appropriate. More information can be found here:
- *
- * {@link http://php.net/language.oop5.basic#51624}
- *
- * @access public
- * @see __clone()
- * @return Math_BigInteger
- */
- function copy()
- {
- $temp = new Math_BigInteger();
- $temp->value = $this->value;
- $temp->is_negative = $this->is_negative;
- $temp->generator = $this->generator;
- $temp->precision = $this->precision;
- $temp->bitmask = $this->bitmask;
- return $temp;
- }
-
- /**
- * __toString() magic method
- *
- * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call
- * toString().
- *
- * @access public
- * @internal Implemented per a suggestion by Techie-Michael - thanks!
- */
- function __toString()
- {
- return $this->toString();
- }
-
- /**
- * __clone() magic method
- *
- * Although you can call Math_BigInteger::__toString() directly in PHP5, you cannot call Math_BigInteger::__clone()
- * directly in PHP5. You can in PHP4 since it's not a magic method, but in PHP5, you have to call it by using the PHP5
- * only syntax of $y = clone $x. As such, if you're trying to write an application that works on both PHP4 and PHP5,
- * call Math_BigInteger::copy(), instead.
- *
- * @access public
- * @see copy()
- * @return Math_BigInteger
- */
- function __clone()
- {
- return $this->copy();
- }
-
- /**
- * __sleep() magic method
- *
- * Will be called, automatically, when serialize() is called on a Math_BigInteger object.
- *
- * @see __wakeup()
- * @access public
- */
- function __sleep()
- {
- $this->hex = $this->toHex(true);
- $vars = array('hex');
- if ($this->generator != 'mt_rand') {
- $vars[] = 'generator';
- }
- if ($this->precision > 0) {
- $vars[] = 'precision';
- }
- return $vars;
-
- }
-
- /**
- * __wakeup() magic method
- *
- * Will be called, automatically, when unserialize() is called on a Math_BigInteger object.
- *
- * @see __sleep()
- * @access public
- */
- function __wakeup()
- {
- $temp = new Math_BigInteger($this->hex, -16);
- $this->value = $temp->value;
- $this->is_negative = $temp->is_negative;
- $this->setRandomGenerator($this->generator);
- if ($this->precision > 0) {
- // recalculate $this->bitmask
- $this->setPrecision($this->precision);
- }
- }
-
- /**
- * Adds two BigIntegers.
- *
- * Here's an example:
- *
- * add($b);
- *
- * echo $c->toString(); // outputs 30
- * ?>
- *
- *
- * @param Math_BigInteger $y
- * @return Math_BigInteger
- * @access public
- * @internal Performs base-2**52 addition
- */
- function add($y)
- {
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- $temp = new Math_BigInteger();
- $temp->value = gmp_add($this->value, $y->value);
-
- return $this->_normalize($temp);
- case MATH_BIGINTEGER_MODE_BCMATH:
- $temp = new Math_BigInteger();
- $temp->value = bcadd($this->value, $y->value, 0);
-
- return $this->_normalize($temp);
- }
-
- $temp = $this->_add($this->value, $this->is_negative, $y->value, $y->is_negative);
-
- $result = new Math_BigInteger();
- $result->value = $temp[MATH_BIGINTEGER_VALUE];
- $result->is_negative = $temp[MATH_BIGINTEGER_SIGN];
-
- return $this->_normalize($result);
- }
-
- /**
- * Performs addition.
- *
- * @param Array $x_value
- * @param Boolean $x_negative
- * @param Array $y_value
- * @param Boolean $y_negative
- * @return Array
- * @access private
- */
- function _add($x_value, $x_negative, $y_value, $y_negative)
- {
- $x_size = count($x_value);
- $y_size = count($y_value);
-
- if ($x_size == 0) {
- return array(
- MATH_BIGINTEGER_VALUE => $y_value,
- MATH_BIGINTEGER_SIGN => $y_negative
- );
- } else if ($y_size == 0) {
- return array(
- MATH_BIGINTEGER_VALUE => $x_value,
- MATH_BIGINTEGER_SIGN => $x_negative
- );
- }
-
- // subtract, if appropriate
- if ( $x_negative != $y_negative ) {
- if ( $x_value == $y_value ) {
- return array(
- MATH_BIGINTEGER_VALUE => array(),
- MATH_BIGINTEGER_SIGN => false
- );
- }
-
- $temp = $this->_subtract($x_value, false, $y_value, false);
- $temp[MATH_BIGINTEGER_SIGN] = $this->_compare($x_value, false, $y_value, false) > 0 ?
- $x_negative : $y_negative;
-
- return $temp;
- }
-
- if ($x_size < $y_size) {
- $size = $x_size;
- $value = $y_value;
- } else {
- $size = $y_size;
- $value = $x_value;
- }
-
- $value[] = 0; // just in case the carry adds an extra digit
-
- $carry = 0;
- for ($i = 0, $j = 1; $j < $size; $i+=2, $j+=2) {
- $sum = $x_value[$j] * MATH_BIGINTEGER_BASE_FULL + $x_value[$i] + $y_value[$j] * MATH_BIGINTEGER_BASE_FULL + $y_value[$i] + $carry;
- $carry = $sum >= MATH_BIGINTEGER_MAX_DIGIT2; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1
- $sum = $carry ? $sum - MATH_BIGINTEGER_MAX_DIGIT2 : $sum;
-
- $temp = (int) ($sum / MATH_BIGINTEGER_BASE_FULL);
-
- $value[$i] = (int) ($sum - MATH_BIGINTEGER_BASE_FULL * $temp); // eg. a faster alternative to fmod($sum, 0x4000000)
- $value[$j] = $temp;
- }
-
- if ($j == $size) { // ie. if $y_size is odd
- $sum = $x_value[$i] + $y_value[$i] + $carry;
- $carry = $sum >= MATH_BIGINTEGER_BASE_FULL;
- $value[$i] = $carry ? $sum - MATH_BIGINTEGER_BASE_FULL : $sum;
- ++$i; // ie. let $i = $j since we've just done $value[$i]
- }
-
- if ($carry) {
- for (; $value[$i] == MATH_BIGINTEGER_MAX_DIGIT; ++$i) {
- $value[$i] = 0;
- }
- ++$value[$i];
- }
-
- return array(
- MATH_BIGINTEGER_VALUE => $this->_trim($value),
- MATH_BIGINTEGER_SIGN => $x_negative
- );
- }
-
- /**
- * Subtracts two BigIntegers.
- *
- * Here's an example:
- *
- * subtract($b);
- *
- * echo $c->toString(); // outputs -10
- * ?>
- *
- *
- * @param Math_BigInteger $y
- * @return Math_BigInteger
- * @access public
- * @internal Performs base-2**52 subtraction
- */
- function subtract($y)
- {
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- $temp = new Math_BigInteger();
- $temp->value = gmp_sub($this->value, $y->value);
-
- return $this->_normalize($temp);
- case MATH_BIGINTEGER_MODE_BCMATH:
- $temp = new Math_BigInteger();
- $temp->value = bcsub($this->value, $y->value, 0);
-
- return $this->_normalize($temp);
- }
-
- $temp = $this->_subtract($this->value, $this->is_negative, $y->value, $y->is_negative);
-
- $result = new Math_BigInteger();
- $result->value = $temp[MATH_BIGINTEGER_VALUE];
- $result->is_negative = $temp[MATH_BIGINTEGER_SIGN];
-
- return $this->_normalize($result);
- }
-
- /**
- * Performs subtraction.
- *
- * @param Array $x_value
- * @param Boolean $x_negative
- * @param Array $y_value
- * @param Boolean $y_negative
- * @return Array
- * @access private
- */
- function _subtract($x_value, $x_negative, $y_value, $y_negative)
- {
- $x_size = count($x_value);
- $y_size = count($y_value);
-
- if ($x_size == 0) {
- return array(
- MATH_BIGINTEGER_VALUE => $y_value,
- MATH_BIGINTEGER_SIGN => !$y_negative
- );
- } else if ($y_size == 0) {
- return array(
- MATH_BIGINTEGER_VALUE => $x_value,
- MATH_BIGINTEGER_SIGN => $x_negative
- );
- }
-
- // add, if appropriate (ie. -$x - +$y or +$x - -$y)
- if ( $x_negative != $y_negative ) {
- $temp = $this->_add($x_value, false, $y_value, false);
- $temp[MATH_BIGINTEGER_SIGN] = $x_negative;
-
- return $temp;
- }
-
- $diff = $this->_compare($x_value, $x_negative, $y_value, $y_negative);
-
- if ( !$diff ) {
- return array(
- MATH_BIGINTEGER_VALUE => array(),
- MATH_BIGINTEGER_SIGN => false
- );
- }
-
- // switch $x and $y around, if appropriate.
- if ( (!$x_negative && $diff < 0) || ($x_negative && $diff > 0) ) {
- $temp = $x_value;
- $x_value = $y_value;
- $y_value = $temp;
-
- $x_negative = !$x_negative;
-
- $x_size = count($x_value);
- $y_size = count($y_value);
- }
-
- // at this point, $x_value should be at least as big as - if not bigger than - $y_value
-
- $carry = 0;
- for ($i = 0, $j = 1; $j < $y_size; $i+=2, $j+=2) {
- $sum = $x_value[$j] * MATH_BIGINTEGER_BASE_FULL + $x_value[$i] - $y_value[$j] * MATH_BIGINTEGER_BASE_FULL - $y_value[$i] - $carry;
- $carry = $sum < 0; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1
- $sum = $carry ? $sum + MATH_BIGINTEGER_MAX_DIGIT2 : $sum;
-
- $temp = (int) ($sum / MATH_BIGINTEGER_BASE_FULL);
-
- $x_value[$i] = (int) ($sum - MATH_BIGINTEGER_BASE_FULL * $temp);
- $x_value[$j] = $temp;
- }
-
- if ($j == $y_size) { // ie. if $y_size is odd
- $sum = $x_value[$i] - $y_value[$i] - $carry;
- $carry = $sum < 0;
- $x_value[$i] = $carry ? $sum + MATH_BIGINTEGER_BASE_FULL : $sum;
- ++$i;
- }
-
- if ($carry) {
- for (; !$x_value[$i]; ++$i) {
- $x_value[$i] = MATH_BIGINTEGER_MAX_DIGIT;
- }
- --$x_value[$i];
- }
-
- return array(
- MATH_BIGINTEGER_VALUE => $this->_trim($x_value),
- MATH_BIGINTEGER_SIGN => $x_negative
- );
- }
-
- /**
- * Multiplies two BigIntegers
- *
- * Here's an example:
- *
- * multiply($b);
- *
- * echo $c->toString(); // outputs 200
- * ?>
- *
- *
- * @param Math_BigInteger $x
- * @return Math_BigInteger
- * @access public
- */
- function multiply($x)
- {
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- $temp = new Math_BigInteger();
- $temp->value = gmp_mul($this->value, $x->value);
-
- return $this->_normalize($temp);
- case MATH_BIGINTEGER_MODE_BCMATH:
- $temp = new Math_BigInteger();
- $temp->value = bcmul($this->value, $x->value, 0);
-
- return $this->_normalize($temp);
- }
-
- $temp = $this->_multiply($this->value, $this->is_negative, $x->value, $x->is_negative);
-
- $product = new Math_BigInteger();
- $product->value = $temp[MATH_BIGINTEGER_VALUE];
- $product->is_negative = $temp[MATH_BIGINTEGER_SIGN];
-
- return $this->_normalize($product);
- }
-
- /**
- * Performs multiplication.
- *
- * @param Array $x_value
- * @param Boolean $x_negative
- * @param Array $y_value
- * @param Boolean $y_negative
- * @return Array
- * @access private
- */
- function _multiply($x_value, $x_negative, $y_value, $y_negative)
- {
- //if ( $x_value == $y_value ) {
- // return array(
- // MATH_BIGINTEGER_VALUE => $this->_square($x_value),
- // MATH_BIGINTEGER_SIGN => $x_sign != $y_value
- // );
- //}
-
- $x_length = count($x_value);
- $y_length = count($y_value);
-
- if ( !$x_length || !$y_length ) { // a 0 is being multiplied
- return array(
- MATH_BIGINTEGER_VALUE => array(),
- MATH_BIGINTEGER_SIGN => false
- );
- }
-
- return array(
- MATH_BIGINTEGER_VALUE => min($x_length, $y_length) < 2 * MATH_BIGINTEGER_KARATSUBA_CUTOFF ?
- $this->_trim($this->_regularMultiply($x_value, $y_value)) :
- $this->_trim($this->_karatsuba($x_value, $y_value)),
- MATH_BIGINTEGER_SIGN => $x_negative != $y_negative
- );
- }
-
- /**
- * Performs long multiplication on two BigIntegers
- *
- * Modeled after 'multiply' in MutableBigInteger.java.
- *
- * @param Array $x_value
- * @param Array $y_value
- * @return Array
- * @access private
- */
- function _regularMultiply($x_value, $y_value)
- {
- $x_length = count($x_value);
- $y_length = count($y_value);
-
- if ( !$x_length || !$y_length ) { // a 0 is being multiplied
- return array();
- }
-
- if ( $x_length < $y_length ) {
- $temp = $x_value;
- $x_value = $y_value;
- $y_value = $temp;
-
- $x_length = count($x_value);
- $y_length = count($y_value);
- }
-
- $product_value = $this->_array_repeat(0, $x_length + $y_length);
-
- // the following for loop could be removed if the for loop following it
- // (the one with nested for loops) initially set $i to 0, but
- // doing so would also make the result in one set of unnecessary adds,
- // since on the outermost loops first pass, $product->value[$k] is going
- // to always be 0
-
- $carry = 0;
-
- for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0
- $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0
- $carry = (int) ($temp / MATH_BIGINTEGER_BASE_FULL);
- $product_value[$j] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
- }
-
- $product_value[$j] = $carry;
-
- // the above for loop is what the previous comment was talking about. the
- // following for loop is the "one with nested for loops"
- for ($i = 1; $i < $y_length; ++$i) {
- $carry = 0;
-
- for ($j = 0, $k = $i; $j < $x_length; ++$j, ++$k) {
- $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry;
- $carry = (int) ($temp / MATH_BIGINTEGER_BASE_FULL);
- $product_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
- }
-
- $product_value[$k] = $carry;
- }
-
- return $product_value;
- }
-
- /**
- * Performs Karatsuba multiplication on two BigIntegers
- *
- * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and
- * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=120 MPM 5.2.3}.
- *
- * @param Array $x_value
- * @param Array $y_value
- * @return Array
- * @access private
- */
- function _karatsuba($x_value, $y_value)
- {
- $m = min(count($x_value) >> 1, count($y_value) >> 1);
-
- if ($m < MATH_BIGINTEGER_KARATSUBA_CUTOFF) {
- return $this->_regularMultiply($x_value, $y_value);
- }
-
- $x1 = array_slice($x_value, $m);
- $x0 = array_slice($x_value, 0, $m);
- $y1 = array_slice($y_value, $m);
- $y0 = array_slice($y_value, 0, $m);
-
- $z2 = $this->_karatsuba($x1, $y1);
- $z0 = $this->_karatsuba($x0, $y0);
-
- $z1 = $this->_add($x1, false, $x0, false);
- $temp = $this->_add($y1, false, $y0, false);
- $z1 = $this->_karatsuba($z1[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_VALUE]);
- $temp = $this->_add($z2, false, $z0, false);
- $z1 = $this->_subtract($z1, false, $temp[MATH_BIGINTEGER_VALUE], false);
-
- $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2);
- $z1[MATH_BIGINTEGER_VALUE] = array_merge(array_fill(0, $m, 0), $z1[MATH_BIGINTEGER_VALUE]);
-
- $xy = $this->_add($z2, false, $z1[MATH_BIGINTEGER_VALUE], $z1[MATH_BIGINTEGER_SIGN]);
- $xy = $this->_add($xy[MATH_BIGINTEGER_VALUE], $xy[MATH_BIGINTEGER_SIGN], $z0, false);
-
- return $xy[MATH_BIGINTEGER_VALUE];
- }
-
- /**
- * Performs squaring
- *
- * @param Array $x
- * @return Array
- * @access private
- */
- function _square($x = false)
- {
- return count($x) < 2 * MATH_BIGINTEGER_KARATSUBA_CUTOFF ?
- $this->_trim($this->_baseSquare($x)) :
- $this->_trim($this->_karatsubaSquare($x));
- }
-
- /**
- * Performs traditional squaring on two BigIntegers
- *
- * Squaring can be done faster than multiplying a number by itself can be. See
- * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=7 HAC 14.2.4} /
- * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=141 MPM 5.3} for more information.
- *
- * @param Array $value
- * @return Array
- * @access private
- */
- function _baseSquare($value)
- {
- if ( empty($value) ) {
- return array();
- }
- $square_value = $this->_array_repeat(0, 2 * count($value));
-
- for ($i = 0, $max_index = count($value) - 1; $i <= $max_index; ++$i) {
- $i2 = $i << 1;
-
- $temp = $square_value[$i2] + $value[$i] * $value[$i];
- $carry = (int) ($temp / MATH_BIGINTEGER_BASE_FULL);
- $square_value[$i2] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
-
- // note how we start from $i+1 instead of 0 as we do in multiplication.
- for ($j = $i + 1, $k = $i2 + 1; $j <= $max_index; ++$j, ++$k) {
- $temp = $square_value[$k] + 2 * $value[$j] * $value[$i] + $carry;
- $carry = (int) ($temp / MATH_BIGINTEGER_BASE_FULL);
- $square_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
- }
-
- // the following line can yield values larger 2**15. at this point, PHP should switch
- // over to floats.
- $square_value[$i + $max_index + 1] = $carry;
- }
-
- return $square_value;
- }
-
- /**
- * Performs Karatsuba "squaring" on two BigIntegers
- *
- * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and
- * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=151 MPM 5.3.4}.
- *
- * @param Array $value
- * @return Array
- * @access private
- */
- function _karatsubaSquare($value)
- {
- $m = count($value) >> 1;
-
- if ($m < MATH_BIGINTEGER_KARATSUBA_CUTOFF) {
- return $this->_baseSquare($value);
- }
-
- $x1 = array_slice($value, $m);
- $x0 = array_slice($value, 0, $m);
-
- $z2 = $this->_karatsubaSquare($x1);
- $z0 = $this->_karatsubaSquare($x0);
-
- $z1 = $this->_add($x1, false, $x0, false);
- $z1 = $this->_karatsubaSquare($z1[MATH_BIGINTEGER_VALUE]);
- $temp = $this->_add($z2, false, $z0, false);
- $z1 = $this->_subtract($z1, false, $temp[MATH_BIGINTEGER_VALUE], false);
-
- $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2);
- $z1[MATH_BIGINTEGER_VALUE] = array_merge(array_fill(0, $m, 0), $z1[MATH_BIGINTEGER_VALUE]);
-
- $xx = $this->_add($z2, false, $z1[MATH_BIGINTEGER_VALUE], $z1[MATH_BIGINTEGER_SIGN]);
- $xx = $this->_add($xx[MATH_BIGINTEGER_VALUE], $xx[MATH_BIGINTEGER_SIGN], $z0, false);
-
- return $xx[MATH_BIGINTEGER_VALUE];
- }
-
- /**
- * Divides two BigIntegers.
- *
- * Returns an array whose first element contains the quotient and whose second element contains the
- * "common residue". If the remainder would be positive, the "common residue" and the remainder are the
- * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder
- * and the divisor (basically, the "common residue" is the first positive modulo).
- *
- * Here's an example:
- *
- * divide($b);
- *
- * echo $quotient->toString(); // outputs 0
- * echo "\r\n";
- * echo $remainder->toString(); // outputs 10
- * ?>
- *
- *
- * @param Math_BigInteger $y
- * @return Array
- * @access public
- * @internal This function is based off of {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=9 HAC 14.20}.
- */
- function divide($y)
- {
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- $quotient = new Math_BigInteger();
- $remainder = new Math_BigInteger();
-
- list($quotient->value, $remainder->value) = gmp_div_qr($this->value, $y->value);
-
- if (gmp_sign($remainder->value) < 0) {
- $remainder->value = gmp_add($remainder->value, gmp_abs($y->value));
- }
-
- return array($this->_normalize($quotient), $this->_normalize($remainder));
- case MATH_BIGINTEGER_MODE_BCMATH:
- $quotient = new Math_BigInteger();
- $remainder = new Math_BigInteger();
-
- $quotient->value = bcdiv($this->value, $y->value, 0);
- $remainder->value = bcmod($this->value, $y->value);
-
- if ($remainder->value[0] == '-') {
- $remainder->value = bcadd($remainder->value, $y->value[0] == '-' ? substr($y->value, 1) : $y->value, 0);
- }
-
- return array($this->_normalize($quotient), $this->_normalize($remainder));
- }
-
- if (count($y->value) == 1) {
- list($q, $r) = $this->_divide_digit($this->value, $y->value[0]);
- $quotient = new Math_BigInteger();
- $remainder = new Math_BigInteger();
- $quotient->value = $q;
- $remainder->value = array($r);
- $quotient->is_negative = $this->is_negative != $y->is_negative;
- return array($this->_normalize($quotient), $this->_normalize($remainder));
- }
-
- static $zero;
- if ( !isset($zero) ) {
- $zero = new Math_BigInteger();
- }
-
- $x = $this->copy();
- $y = $y->copy();
-
- $x_sign = $x->is_negative;
- $y_sign = $y->is_negative;
-
- $x->is_negative = $y->is_negative = false;
-
- $diff = $x->compare($y);
-
- if ( !$diff ) {
- $temp = new Math_BigInteger();
- $temp->value = array(1);
- $temp->is_negative = $x_sign != $y_sign;
- return array($this->_normalize($temp), $this->_normalize(new Math_BigInteger()));
- }
-
- if ( $diff < 0 ) {
- // if $x is negative, "add" $y.
- if ( $x_sign ) {
- $x = $y->subtract($x);
- }
- return array($this->_normalize(new Math_BigInteger()), $this->_normalize($x));
- }
-
- // normalize $x and $y as described in HAC 14.23 / 14.24
- $msb = $y->value[count($y->value) - 1];
- for ($shift = 0; !($msb & MATH_BIGINTEGER_MSB); ++$shift) {
- $msb <<= 1;
- }
- $x->_lshift($shift);
- $y->_lshift($shift);
- $y_value = &$y->value;
-
- $x_max = count($x->value) - 1;
- $y_max = count($y->value) - 1;
-
- $quotient = new Math_BigInteger();
- $quotient_value = &$quotient->value;
- $quotient_value = $this->_array_repeat(0, $x_max - $y_max + 1);
-
- static $temp, $lhs, $rhs;
- if (!isset($temp)) {
- $temp = new Math_BigInteger();
- $lhs = new Math_BigInteger();
- $rhs = new Math_BigInteger();
- }
- $temp_value = &$temp->value;
- $rhs_value = &$rhs->value;
-
- // $temp = $y << ($x_max - $y_max-1) in base 2**26
- $temp_value = array_merge($this->_array_repeat(0, $x_max - $y_max), $y_value);
-
- while ( $x->compare($temp) >= 0 ) {
- // calculate the "common residue"
- ++$quotient_value[$x_max - $y_max];
- $x = $x->subtract($temp);
- $x_max = count($x->value) - 1;
- }
-
- for ($i = $x_max; $i >= $y_max + 1; --$i) {
- $x_value = &$x->value;
- $x_window = array(
- isset($x_value[$i]) ? $x_value[$i] : 0,
- isset($x_value[$i - 1]) ? $x_value[$i - 1] : 0,
- isset($x_value[$i - 2]) ? $x_value[$i - 2] : 0
- );
- $y_window = array(
- $y_value[$y_max],
- ( $y_max > 0 ) ? $y_value[$y_max - 1] : 0
- );
-
- $q_index = $i - $y_max - 1;
- if ($x_window[0] == $y_window[0]) {
- $quotient_value[$q_index] = MATH_BIGINTEGER_MAX_DIGIT;
- } else {
- $quotient_value[$q_index] = (int) (
- ($x_window[0] * MATH_BIGINTEGER_BASE_FULL + $x_window[1])
- /
- $y_window[0]
- );
- }
-
- $temp_value = array($y_window[1], $y_window[0]);
-
- $lhs->value = array($quotient_value[$q_index]);
- $lhs = $lhs->multiply($temp);
-
- $rhs_value = array($x_window[2], $x_window[1], $x_window[0]);
-
- while ( $lhs->compare($rhs) > 0 ) {
- --$quotient_value[$q_index];
-
- $lhs->value = array($quotient_value[$q_index]);
- $lhs = $lhs->multiply($temp);
- }
-
- $adjust = $this->_array_repeat(0, $q_index);
- $temp_value = array($quotient_value[$q_index]);
- $temp = $temp->multiply($y);
- $temp_value = &$temp->value;
- $temp_value = array_merge($adjust, $temp_value);
-
- $x = $x->subtract($temp);
-
- if ($x->compare($zero) < 0) {
- $temp_value = array_merge($adjust, $y_value);
- $x = $x->add($temp);
-
- --$quotient_value[$q_index];
- }
-
- $x_max = count($x_value) - 1;
- }
-
- // unnormalize the remainder
- $x->_rshift($shift);
-
- $quotient->is_negative = $x_sign != $y_sign;
-
- // calculate the "common residue", if appropriate
- if ( $x_sign ) {
- $y->_rshift($shift);
- $x = $y->subtract($x);
- }
-
- return array($this->_normalize($quotient), $this->_normalize($x));
- }
-
- /**
- * Divides a BigInteger by a regular integer
- *
- * abc / x = a00 / x + b0 / x + c / x
- *
- * @param Array $dividend
- * @param Array $divisor
- * @return Array
- * @access private
- */
- function _divide_digit($dividend, $divisor)
- {
- $carry = 0;
- $result = array();
-
- for ($i = count($dividend) - 1; $i >= 0; --$i) {
- $temp = MATH_BIGINTEGER_BASE_FULL * $carry + $dividend[$i];
- $result[$i] = (int) ($temp / $divisor);
- $carry = (int) ($temp - $divisor * $result[$i]);
- }
-
- return array($result, $carry);
- }
-
- /**
- * Performs modular exponentiation.
- *
- * Here's an example:
- *
- * modPow($b, $c);
- *
- * echo $c->toString(); // outputs 10
- * ?>
- *
- *
- * @param Math_BigInteger $e
- * @param Math_BigInteger $n
- * @return Math_BigInteger
- * @access public
- * @internal The most naive approach to modular exponentiation has very unreasonable requirements, and
- * and although the approach involving repeated squaring does vastly better, it, too, is impractical
- * for our purposes. The reason being that division - by far the most complicated and time-consuming
- * of the basic operations (eg. +,-,*,/) - occurs multiple times within it.
- *
- * Modular reductions resolve this issue. Although an individual modular reduction takes more time
- * then an individual division, when performed in succession (with the same modulo), they're a lot faster.
- *
- * The two most commonly used modular reductions are Barrett and Montgomery reduction. Montgomery reduction,
- * although faster, only works when the gcd of the modulo and of the base being used is 1. In RSA, when the
- * base is a power of two, the modulo - a product of two primes - is always going to have a gcd of 1 (because
- * the product of two odd numbers is odd), but what about when RSA isn't used?
- *
- * In contrast, Barrett reduction has no such constraint. As such, some bigint implementations perform a
- * Barrett reduction after every operation in the modpow function. Others perform Barrett reductions when the
- * modulo is even and Montgomery reductions when the modulo is odd. BigInteger.java's modPow method, however,
- * uses a trick involving the Chinese Remainder Theorem to factor the even modulo into two numbers - one odd and
- * the other, a power of two - and recombine them, later. This is the method that this modPow function uses.
- * {@link http://islab.oregonstate.edu/papers/j34monex.pdf Montgomery Reduction with Even Modulus} elaborates.
- */
- function modPow($e, $n)
- {
- $n = $this->bitmask !== false && $this->bitmask->compare($n) < 0 ? $this->bitmask : $n->abs();
-
- if ($e->compare(new Math_BigInteger()) < 0) {
- $e = $e->abs();
-
- $temp = $this->modInverse($n);
- if ($temp === false) {
- return false;
- }
-
- return $this->_normalize($temp->modPow($e, $n));
- }
-
- if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_GMP ) {
- $temp = new Math_BigInteger();
- $temp->value = gmp_powm($this->value, $e->value, $n->value);
-
- return $this->_normalize($temp);
- }
-
- if ($this->compare(new Math_BigInteger()) < 0 || $this->compare($n) > 0) {
- list(, $temp) = $this->divide($n);
- return $temp->modPow($e, $n);
- }
-
- if (defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) {
- $components = array(
- 'modulus' => $n->toBytes(true),
- 'publicExponent' => $e->toBytes(true)
- );
-
- $components = array(
- 'modulus' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['modulus'])), $components['modulus']),
- 'publicExponent' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['publicExponent'])), $components['publicExponent'])
- );
-
- $RSAPublicKey = pack('Ca*a*a*',
- 48, $this->_encodeASN1Length(strlen($components['modulus']) + strlen($components['publicExponent'])),
- $components['modulus'], $components['publicExponent']
- );
-
- $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA
- $RSAPublicKey = chr(0) . $RSAPublicKey;
- $RSAPublicKey = chr(3) . $this->_encodeASN1Length(strlen($RSAPublicKey)) . $RSAPublicKey;
-
- $encapsulated = pack('Ca*a*',
- 48, $this->_encodeASN1Length(strlen($rsaOID . $RSAPublicKey)), $rsaOID . $RSAPublicKey
- );
-
- $RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" .
- chunk_split(base64_encode($encapsulated)) .
- '-----END PUBLIC KEY-----';
-
- $plaintext = str_pad($this->toBytes(), strlen($n->toBytes(true)) - 1, "\0", STR_PAD_LEFT);
-
- if (openssl_public_encrypt($plaintext, $result, $RSAPublicKey, OPENSSL_NO_PADDING)) {
- return new Math_BigInteger($result, 256);
- }
- }
-
- if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH ) {
- $temp = new Math_BigInteger();
- $temp->value = bcpowmod($this->value, $e->value, $n->value, 0);
-
- return $this->_normalize($temp);
- }
-
- if ( empty($e->value) ) {
- $temp = new Math_BigInteger();
- $temp->value = array(1);
- return $this->_normalize($temp);
- }
-
- if ( $e->value == array(1) ) {
- list(, $temp) = $this->divide($n);
- return $this->_normalize($temp);
- }
-
- if ( $e->value == array(2) ) {
- $temp = new Math_BigInteger();
- $temp->value = $this->_square($this->value);
- list(, $temp) = $temp->divide($n);
- return $this->_normalize($temp);
- }
-
- return $this->_normalize($this->_slidingWindow($e, $n, MATH_BIGINTEGER_BARRETT));
-
- // is the modulo odd?
- if ( $n->value[0] & 1 ) {
- return $this->_normalize($this->_slidingWindow($e, $n, MATH_BIGINTEGER_MONTGOMERY));
- }
- // if it's not, it's even
-
- // find the lowest set bit (eg. the max pow of 2 that divides $n)
- for ($i = 0; $i < count($n->value); ++$i) {
- if ( $n->value[$i] ) {
- $temp = decbin($n->value[$i]);
- $j = strlen($temp) - strrpos($temp, '1') - 1;
- $j+= 26 * $i;
- break;
- }
- }
- // at this point, 2^$j * $n/(2^$j) == $n
-
- $mod1 = $n->copy();
- $mod1->_rshift($j);
- $mod2 = new Math_BigInteger();
- $mod2->value = array(1);
- $mod2->_lshift($j);
-
- $part1 = ( $mod1->value != array(1) ) ? $this->_slidingWindow($e, $mod1, MATH_BIGINTEGER_MONTGOMERY) : new Math_BigInteger();
- $part2 = $this->_slidingWindow($e, $mod2, MATH_BIGINTEGER_POWEROF2);
-
- $y1 = $mod2->modInverse($mod1);
- $y2 = $mod1->modInverse($mod2);
-
- $result = $part1->multiply($mod2);
- $result = $result->multiply($y1);
-
- $temp = $part2->multiply($mod1);
- $temp = $temp->multiply($y2);
-
- $result = $result->add($temp);
- list(, $result) = $result->divide($n);
-
- return $this->_normalize($result);
- }
-
- /**
- * Performs modular exponentiation.
- *
- * Alias for Math_BigInteger::modPow()
- *
- * @param Math_BigInteger $e
- * @param Math_BigInteger $n
- * @return Math_BigInteger
- * @access public
- */
- function powMod($e, $n)
- {
- return $this->modPow($e, $n);
- }
-
- /**
- * Sliding Window k-ary Modular Exponentiation
- *
- * Based on {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=27 HAC 14.85} /
- * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=210 MPM 7.7}. In a departure from those algorithims,
- * however, this function performs a modular reduction after every multiplication and squaring operation.
- * As such, this function has the same preconditions that the reductions being used do.
- *
- * @param Math_BigInteger $e
- * @param Math_BigInteger $n
- * @param Integer $mode
- * @return Math_BigInteger
- * @access private
- */
- function _slidingWindow($e, $n, $mode)
- {
- static $window_ranges = array(7, 25, 81, 241, 673, 1793); // from BigInteger.java's oddModPow function
- //static $window_ranges = array(0, 7, 36, 140, 450, 1303, 3529); // from MPM 7.3.1
-
- $e_value = $e->value;
- $e_length = count($e_value) - 1;
- $e_bits = decbin($e_value[$e_length]);
- for ($i = $e_length - 1; $i >= 0; --$i) {
- $e_bits.= str_pad(decbin($e_value[$i]), MATH_BIGINTEGER_BASE, '0', STR_PAD_LEFT);
- }
-
- $e_length = strlen($e_bits);
-
- // calculate the appropriate window size.
- // $window_size == 3 if $window_ranges is between 25 and 81, for example.
- for ($i = 0, $window_size = 1; $e_length > $window_ranges[$i] && $i < count($window_ranges); ++$window_size, ++$i);
-
- $n_value = $n->value;
-
- // precompute $this^0 through $this^$window_size
- $powers = array();
- $powers[1] = $this->_prepareReduce($this->value, $n_value, $mode);
- $powers[2] = $this->_squareReduce($powers[1], $n_value, $mode);
-
- // we do every other number since substr($e_bits, $i, $j+1) (see below) is supposed to end
- // in a 1. ie. it's supposed to be odd.
- $temp = 1 << ($window_size - 1);
- for ($i = 1; $i < $temp; ++$i) {
- $i2 = $i << 1;
- $powers[$i2 + 1] = $this->_multiplyReduce($powers[$i2 - 1], $powers[2], $n_value, $mode);
- }
-
- $result = array(1);
- $result = $this->_prepareReduce($result, $n_value, $mode);
-
- for ($i = 0; $i < $e_length; ) {
- if ( !$e_bits[$i] ) {
- $result = $this->_squareReduce($result, $n_value, $mode);
- ++$i;
- } else {
- for ($j = $window_size - 1; $j > 0; --$j) {
- if ( !empty($e_bits[$i + $j]) ) {
- break;
- }
- }
-
- for ($k = 0; $k <= $j; ++$k) {// eg. the length of substr($e_bits, $i, $j+1)
- $result = $this->_squareReduce($result, $n_value, $mode);
- }
-
- $result = $this->_multiplyReduce($result, $powers[bindec(substr($e_bits, $i, $j + 1))], $n_value, $mode);
-
- $i+=$j + 1;
- }
- }
-
- $temp = new Math_BigInteger();
- $temp->value = $this->_reduce($result, $n_value, $mode);
-
- return $temp;
- }
-
- /**
- * Modular reduction
- *
- * For most $modes this will return the remainder.
- *
- * @see _slidingWindow()
- * @access private
- * @param Array $x
- * @param Array $n
- * @param Integer $mode
- * @return Array
- */
- function _reduce($x, $n, $mode)
- {
- switch ($mode) {
- case MATH_BIGINTEGER_MONTGOMERY:
- return $this->_montgomery($x, $n);
- case MATH_BIGINTEGER_BARRETT:
- return $this->_barrett($x, $n);
- case MATH_BIGINTEGER_POWEROF2:
- $lhs = new Math_BigInteger();
- $lhs->value = $x;
- $rhs = new Math_BigInteger();
- $rhs->value = $n;
- return $x->_mod2($n);
- case MATH_BIGINTEGER_CLASSIC:
- $lhs = new Math_BigInteger();
- $lhs->value = $x;
- $rhs = new Math_BigInteger();
- $rhs->value = $n;
- list(, $temp) = $lhs->divide($rhs);
- return $temp->value;
- case MATH_BIGINTEGER_NONE:
- return $x;
- default:
- // an invalid $mode was provided
- }
- }
-
- /**
- * Modular reduction preperation
- *
- * @see _slidingWindow()
- * @access private
- * @param Array $x
- * @param Array $n
- * @param Integer $mode
- * @return Array
- */
- function _prepareReduce($x, $n, $mode)
- {
- if ($mode == MATH_BIGINTEGER_MONTGOMERY) {
- return $this->_prepMontgomery($x, $n);
- }
- return $this->_reduce($x, $n, $mode);
- }
-
- /**
- * Modular multiply
- *
- * @see _slidingWindow()
- * @access private
- * @param Array $x
- * @param Array $y
- * @param Array $n
- * @param Integer $mode
- * @return Array
- */
- function _multiplyReduce($x, $y, $n, $mode)
- {
- if ($mode == MATH_BIGINTEGER_MONTGOMERY) {
- return $this->_montgomeryMultiply($x, $y, $n);
- }
- $temp = $this->_multiply($x, false, $y, false);
- return $this->_reduce($temp[MATH_BIGINTEGER_VALUE], $n, $mode);
- }
-
- /**
- * Modular square
- *
- * @see _slidingWindow()
- * @access private
- * @param Array $x
- * @param Array $n
- * @param Integer $mode
- * @return Array
- */
- function _squareReduce($x, $n, $mode)
- {
- if ($mode == MATH_BIGINTEGER_MONTGOMERY) {
- return $this->_montgomeryMultiply($x, $x, $n);
- }
- return $this->_reduce($this->_square($x), $n, $mode);
- }
-
- /**
- * Modulos for Powers of Two
- *
- * Calculates $x%$n, where $n = 2**$e, for some $e. Since this is basically the same as doing $x & ($n-1),
- * we'll just use this function as a wrapper for doing that.
- *
- * @see _slidingWindow()
- * @access private
- * @param Math_BigInteger
- * @return Math_BigInteger
- */
- function _mod2($n)
- {
- $temp = new Math_BigInteger();
- $temp->value = array(1);
- return $this->bitwise_and($n->subtract($temp));
- }
-
- /**
- * Barrett Modular Reduction
- *
- * See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=14 HAC 14.3.3} /
- * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=165 MPM 6.2.5} for more information. Modified slightly,
- * so as not to require negative numbers (initially, this script didn't support negative numbers).
- *
- * Employs "folding", as described at
- * {@link http://www.cosic.esat.kuleuven.be/publications/thesis-149.pdf#page=66 thesis-149.pdf#page=66}. To quote from
- * it, "the idea [behind folding] is to find a value x' such that x (mod m) = x' (mod m), with x' being smaller than x."
- *
- * Unfortunately, the "Barrett Reduction with Folding" algorithm described in thesis-149.pdf is not, as written, all that
- * usable on account of (1) its not using reasonable radix points as discussed in
- * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=162 MPM 6.2.2} and (2) the fact that, even with reasonable
- * radix points, it only works when there are an even number of digits in the denominator. The reason for (2) is that
- * (x >> 1) + (x >> 1) != x / 2 + x / 2. If x is even, they're the same, but if x is odd, they're not. See the in-line
- * comments for details.
- *
- * @see _slidingWindow()
- * @access private
- * @param Array $n
- * @param Array $m
- * @return Array
- */
- function _barrett($n, $m)
- {
- static $cache = array(
- MATH_BIGINTEGER_VARIABLE => array(),
- MATH_BIGINTEGER_DATA => array()
- );
-
- $m_length = count($m);
-
- // if ($this->_compare($n, $this->_square($m)) >= 0) {
- if (count($n) > 2 * $m_length) {
- $lhs = new Math_BigInteger();
- $rhs = new Math_BigInteger();
- $lhs->value = $n;
- $rhs->value = $m;
- list(, $temp) = $lhs->divide($rhs);
- return $temp->value;
- }
-
- // if (m.length >> 1) + 2 <= m.length then m is too small and n can't be reduced
- if ($m_length < 5) {
- return $this->_regularBarrett($n, $m);
- }
-
- // n = 2 * m.length
-
- if ( ($key = array_search($m, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) {
- $key = count($cache[MATH_BIGINTEGER_VARIABLE]);
- $cache[MATH_BIGINTEGER_VARIABLE][] = $m;
-
- $lhs = new Math_BigInteger();
- $lhs_value = &$lhs->value;
- $lhs_value = $this->_array_repeat(0, $m_length + ($m_length >> 1));
- $lhs_value[] = 1;
- $rhs = new Math_BigInteger();
- $rhs->value = $m;
-
- list($u, $m1) = $lhs->divide($rhs);
- $u = $u->value;
- $m1 = $m1->value;
-
- $cache[MATH_BIGINTEGER_DATA][] = array(
- 'u' => $u, // m.length >> 1 (technically (m.length >> 1) + 1)
- 'm1'=> $m1 // m.length
- );
- } else {
- extract($cache[MATH_BIGINTEGER_DATA][$key]);
- }
-
- $cutoff = $m_length + ($m_length >> 1);
- $lsd = array_slice($n, 0, $cutoff); // m.length + (m.length >> 1)
- $msd = array_slice($n, $cutoff); // m.length >> 1
- $lsd = $this->_trim($lsd);
- $temp = $this->_multiply($msd, false, $m1, false);
- $n = $this->_add($lsd, false, $temp[MATH_BIGINTEGER_VALUE], false); // m.length + (m.length >> 1) + 1
-
- if ($m_length & 1) {
- return $this->_regularBarrett($n[MATH_BIGINTEGER_VALUE], $m);
- }
-
- // (m.length + (m.length >> 1) + 1) - (m.length - 1) == (m.length >> 1) + 2
- $temp = array_slice($n[MATH_BIGINTEGER_VALUE], $m_length - 1);
- // if even: ((m.length >> 1) + 2) + (m.length >> 1) == m.length + 2
- // if odd: ((m.length >> 1) + 2) + (m.length >> 1) == (m.length - 1) + 2 == m.length + 1
- $temp = $this->_multiply($temp, false, $u, false);
- // if even: (m.length + 2) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + 1
- // if odd: (m.length + 1) - ((m.length >> 1) + 1) = m.length - (m.length >> 1)
- $temp = array_slice($temp[MATH_BIGINTEGER_VALUE], ($m_length >> 1) + 1);
- // if even: (m.length - (m.length >> 1) + 1) + m.length = 2 * m.length - (m.length >> 1) + 1
- // if odd: (m.length - (m.length >> 1)) + m.length = 2 * m.length - (m.length >> 1)
- $temp = $this->_multiply($temp, false, $m, false);
-
- // at this point, if m had an odd number of digits, we'd be subtracting a 2 * m.length - (m.length >> 1) digit
- // number from a m.length + (m.length >> 1) + 1 digit number. ie. there'd be an extra digit and the while loop
- // following this comment would loop a lot (hence our calling _regularBarrett() in that situation).
-
- $result = $this->_subtract($n[MATH_BIGINTEGER_VALUE], false, $temp[MATH_BIGINTEGER_VALUE], false);
-
- while ($this->_compare($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $m, false) >= 0) {
- $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $m, false);
- }
-
- return $result[MATH_BIGINTEGER_VALUE];
- }
-
- /**
- * (Regular) Barrett Modular Reduction
- *
- * For numbers with more than four digits Math_BigInteger::_barrett() is faster. The difference between that and this
- * is that this function does not fold the denominator into a smaller form.
- *
- * @see _slidingWindow()
- * @access private
- * @param Array $x
- * @param Array $n
- * @return Array
- */
- function _regularBarrett($x, $n)
- {
- static $cache = array(
- MATH_BIGINTEGER_VARIABLE => array(),
- MATH_BIGINTEGER_DATA => array()
- );
-
- $n_length = count($n);
-
- if (count($x) > 2 * $n_length) {
- $lhs = new Math_BigInteger();
- $rhs = new Math_BigInteger();
- $lhs->value = $x;
- $rhs->value = $n;
- list(, $temp) = $lhs->divide($rhs);
- return $temp->value;
- }
-
- if ( ($key = array_search($n, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) {
- $key = count($cache[MATH_BIGINTEGER_VARIABLE]);
- $cache[MATH_BIGINTEGER_VARIABLE][] = $n;
- $lhs = new Math_BigInteger();
- $lhs_value = &$lhs->value;
- $lhs_value = $this->_array_repeat(0, 2 * $n_length);
- $lhs_value[] = 1;
- $rhs = new Math_BigInteger();
- $rhs->value = $n;
- list($temp, ) = $lhs->divide($rhs); // m.length
- $cache[MATH_BIGINTEGER_DATA][] = $temp->value;
- }
-
- // 2 * m.length - (m.length - 1) = m.length + 1
- $temp = array_slice($x, $n_length - 1);
- // (m.length + 1) + m.length = 2 * m.length + 1
- $temp = $this->_multiply($temp, false, $cache[MATH_BIGINTEGER_DATA][$key], false);
- // (2 * m.length + 1) - (m.length - 1) = m.length + 2
- $temp = array_slice($temp[MATH_BIGINTEGER_VALUE], $n_length + 1);
-
- // m.length + 1
- $result = array_slice($x, 0, $n_length + 1);
- // m.length + 1
- $temp = $this->_multiplyLower($temp, false, $n, false, $n_length + 1);
- // $temp == array_slice($temp->_multiply($temp, false, $n, false)->value, 0, $n_length + 1)
-
- if ($this->_compare($result, false, $temp[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_SIGN]) < 0) {
- $corrector_value = $this->_array_repeat(0, $n_length + 1);
- $corrector_value[] = 1;
- $result = $this->_add($result, false, $corrector_value, false);
- $result = $result[MATH_BIGINTEGER_VALUE];
- }
-
- // at this point, we're subtracting a number with m.length + 1 digits from another number with m.length + 1 digits
- $result = $this->_subtract($result, false, $temp[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_SIGN]);
- while ($this->_compare($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $n, false) > 0) {
- $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $n, false);
- }
-
- return $result[MATH_BIGINTEGER_VALUE];
- }
-
- /**
- * Performs long multiplication up to $stop digits
- *
- * If you're going to be doing array_slice($product->value, 0, $stop), some cycles can be saved.
- *
- * @see _regularBarrett()
- * @param Array $x_value
- * @param Boolean $x_negative
- * @param Array $y_value
- * @param Boolean $y_negative
- * @param Integer $stop
- * @return Array
- * @access private
- */
- function _multiplyLower($x_value, $x_negative, $y_value, $y_negative, $stop)
- {
- $x_length = count($x_value);
- $y_length = count($y_value);
-
- if ( !$x_length || !$y_length ) { // a 0 is being multiplied
- return array(
- MATH_BIGINTEGER_VALUE => array(),
- MATH_BIGINTEGER_SIGN => false
- );
- }
-
- if ( $x_length < $y_length ) {
- $temp = $x_value;
- $x_value = $y_value;
- $y_value = $temp;
-
- $x_length = count($x_value);
- $y_length = count($y_value);
- }
-
- $product_value = $this->_array_repeat(0, $x_length + $y_length);
-
- // the following for loop could be removed if the for loop following it
- // (the one with nested for loops) initially set $i to 0, but
- // doing so would also make the result in one set of unnecessary adds,
- // since on the outermost loops first pass, $product->value[$k] is going
- // to always be 0
-
- $carry = 0;
-
- for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0, $k = $i
- $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0
- $carry = (int) ($temp / MATH_BIGINTEGER_BASE_FULL);
- $product_value[$j] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
- }
-
- if ($j < $stop) {
- $product_value[$j] = $carry;
- }
-
- // the above for loop is what the previous comment was talking about. the
- // following for loop is the "one with nested for loops"
-
- for ($i = 1; $i < $y_length; ++$i) {
- $carry = 0;
-
- for ($j = 0, $k = $i; $j < $x_length && $k < $stop; ++$j, ++$k) {
- $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry;
- $carry = (int) ($temp / MATH_BIGINTEGER_BASE_FULL);
- $product_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
- }
-
- if ($k < $stop) {
- $product_value[$k] = $carry;
- }
- }
-
- return array(
- MATH_BIGINTEGER_VALUE => $this->_trim($product_value),
- MATH_BIGINTEGER_SIGN => $x_negative != $y_negative
- );
- }
-
- /**
- * Montgomery Modular Reduction
- *
- * ($x->_prepMontgomery($n))->_montgomery($n) yields $x % $n.
- * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=170 MPM 6.3} provides insights on how this can be
- * improved upon (basically, by using the comba method). gcd($n, 2) must be equal to one for this function
- * to work correctly.
- *
- * @see _prepMontgomery()
- * @see _slidingWindow()
- * @access private
- * @param Array $x
- * @param Array $n
- * @return Array
- */
- function _montgomery($x, $n)
- {
- static $cache = array(
- MATH_BIGINTEGER_VARIABLE => array(),
- MATH_BIGINTEGER_DATA => array()
- );
-
- if ( ($key = array_search($n, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) {
- $key = count($cache[MATH_BIGINTEGER_VARIABLE]);
- $cache[MATH_BIGINTEGER_VARIABLE][] = $x;
- $cache[MATH_BIGINTEGER_DATA][] = $this->_modInverse67108864($n);
- }
-
- $k = count($n);
-
- $result = array(MATH_BIGINTEGER_VALUE => $x);
-
- for ($i = 0; $i < $k; ++$i) {
- $temp = $result[MATH_BIGINTEGER_VALUE][$i] * $cache[MATH_BIGINTEGER_DATA][$key];
- $temp = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * ((int) ($temp / MATH_BIGINTEGER_BASE_FULL)));
- $temp = $this->_regularMultiply(array($temp), $n);
- $temp = array_merge($this->_array_repeat(0, $i), $temp);
- $result = $this->_add($result[MATH_BIGINTEGER_VALUE], false, $temp, false);
- }
-
- $result[MATH_BIGINTEGER_VALUE] = array_slice($result[MATH_BIGINTEGER_VALUE], $k);
-
- if ($this->_compare($result, false, $n, false) >= 0) {
- $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], false, $n, false);
- }
-
- return $result[MATH_BIGINTEGER_VALUE];
- }
-
- /**
- * Montgomery Multiply
- *
- * Interleaves the montgomery reduction and long multiplication algorithms together as described in
- * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=13 HAC 14.36}
- *
- * @see _prepMontgomery()
- * @see _montgomery()
- * @access private
- * @param Array $x
- * @param Array $y
- * @param Array $m
- * @return Array
- */
- function _montgomeryMultiply($x, $y, $m)
- {
- $temp = $this->_multiply($x, false, $y, false);
- return $this->_montgomery($temp[MATH_BIGINTEGER_VALUE], $m);
-
- static $cache = array(
- MATH_BIGINTEGER_VARIABLE => array(),
- MATH_BIGINTEGER_DATA => array()
- );
-
- if ( ($key = array_search($m, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) {
- $key = count($cache[MATH_BIGINTEGER_VARIABLE]);
- $cache[MATH_BIGINTEGER_VARIABLE][] = $m;
- $cache[MATH_BIGINTEGER_DATA][] = $this->_modInverse67108864($m);
- }
-
- $n = max(count($x), count($y), count($m));
- $x = array_pad($x, $n, 0);
- $y = array_pad($y, $n, 0);
- $m = array_pad($m, $n, 0);
- $a = array(MATH_BIGINTEGER_VALUE => $this->_array_repeat(0, $n + 1));
- for ($i = 0; $i < $n; ++$i) {
- $temp = $a[MATH_BIGINTEGER_VALUE][0] + $x[$i] * $y[0];
- $temp = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * ((int) ($temp / MATH_BIGINTEGER_BASE_FULL)));
- $temp = $temp * $cache[MATH_BIGINTEGER_DATA][$key];
- $temp = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * ((int) ($temp / MATH_BIGINTEGER_BASE_FULL)));
- $temp = $this->_add($this->_regularMultiply(array($x[$i]), $y), false, $this->_regularMultiply(array($temp), $m), false);
- $a = $this->_add($a[MATH_BIGINTEGER_VALUE], false, $temp[MATH_BIGINTEGER_VALUE], false);
- $a[MATH_BIGINTEGER_VALUE] = array_slice($a[MATH_BIGINTEGER_VALUE], 1);
- }
- if ($this->_compare($a[MATH_BIGINTEGER_VALUE], false, $m, false) >= 0) {
- $a = $this->_subtract($a[MATH_BIGINTEGER_VALUE], false, $m, false);
- }
- return $a[MATH_BIGINTEGER_VALUE];
- }
-
- /**
- * Prepare a number for use in Montgomery Modular Reductions
- *
- * @see _montgomery()
- * @see _slidingWindow()
- * @access private
- * @param Array $x
- * @param Array $n
- * @return Array
- */
- function _prepMontgomery($x, $n)
- {
- $lhs = new Math_BigInteger();
- $lhs->value = array_merge($this->_array_repeat(0, count($n)), $x);
- $rhs = new Math_BigInteger();
- $rhs->value = $n;
-
- list(, $temp) = $lhs->divide($rhs);
- return $temp->value;
- }
-
- /**
- * Modular Inverse of a number mod 2**26 (eg. 67108864)
- *
- * Based off of the bnpInvDigit function implemented and justified in the following URL:
- *
- * {@link http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js}
- *
- * The following URL provides more info:
- *
- * {@link http://groups.google.com/group/sci.crypt/msg/7a137205c1be7d85}
- *
- * As for why we do all the bitmasking... strange things can happen when converting from floats to ints. For
- * instance, on some computers, var_dump((int) -4294967297) yields int(-1) and on others, it yields
- * int(-2147483648). To avoid problems stemming from this, we use bitmasks to guarantee that ints aren't
- * auto-converted to floats. The outermost bitmask is present because without it, there's no guarantee that
- * the "residue" returned would be the so-called "common residue". We use fmod, in the last step, because the
- * maximum possible $x is 26 bits and the maximum $result is 16 bits. Thus, we have to be able to handle up to
- * 40 bits, which only 64-bit floating points will support.
- *
- * Thanks to Pedro Gimeno Fortea for input!
- *
- * @see _montgomery()
- * @access private
- * @param Array $x
- * @return Integer
- */
- function _modInverse67108864($x) // 2**26 == 67,108,864
- {
- $x = -$x[0];
- $result = $x & 0x3; // x**-1 mod 2**2
- $result = ($result * (2 - $x * $result)) & 0xF; // x**-1 mod 2**4
- $result = ($result * (2 - ($x & 0xFF) * $result)) & 0xFF; // x**-1 mod 2**8
- $result = ($result * ((2 - ($x & 0xFFFF) * $result) & 0xFFFF)) & 0xFFFF; // x**-1 mod 2**16
- $result = fmod($result * (2 - fmod($x * $result, MATH_BIGINTEGER_BASE_FULL)), MATH_BIGINTEGER_BASE_FULL); // x**-1 mod 2**26
- return $result & MATH_BIGINTEGER_MAX_DIGIT;
- }
-
- /**
- * Calculates modular inverses.
- *
- * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses.
- *
- * Here's an example:
- *
- * modInverse($b);
- * echo $c->toString(); // outputs 4
- *
- * echo "\r\n";
- *
- * $d = $a->multiply($c);
- * list(, $d) = $d->divide($b);
- * echo $d; // outputs 1 (as per the definition of modular inverse)
- * ?>
- *
- *
- * @param Math_BigInteger $n
- * @return mixed false, if no modular inverse exists, Math_BigInteger, otherwise.
- * @access public
- * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=21 HAC 14.64} for more information.
- */
- function modInverse($n)
- {
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- $temp = new Math_BigInteger();
- $temp->value = gmp_invert($this->value, $n->value);
-
- return ( $temp->value === false ) ? false : $this->_normalize($temp);
- }
-
- static $zero, $one;
- if (!isset($zero)) {
- $zero = new Math_BigInteger();
- $one = new Math_BigInteger(1);
- }
-
- // $x mod -$n == $x mod $n.
- $n = $n->abs();
-
- if ($this->compare($zero) < 0) {
- $temp = $this->abs();
- $temp = $temp->modInverse($n);
- return $this->_normalize($n->subtract($temp));
- }
-
- extract($this->extendedGCD($n));
-
- if (!$gcd->equals($one)) {
- return false;
- }
-
- $x = $x->compare($zero) < 0 ? $x->add($n) : $x;
-
- return $this->compare($zero) < 0 ? $this->_normalize($n->subtract($x)) : $this->_normalize($x);
- }
-
- /**
- * Calculates the greatest common divisor and Bezout's identity.
- *
- * Say you have 693 and 609. The GCD is 21. Bezout's identity states that there exist integers x and y such that
- * 693*x + 609*y == 21. In point of fact, there are actually an infinite number of x and y combinations and which
- * combination is returned is dependant upon which mode is in use. See
- * {@link http://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity Bezout's identity - Wikipedia} for more information.
- *
- * Here's an example:
- *
- * extendedGCD($b));
- *
- * echo $gcd->toString() . "\r\n"; // outputs 21
- * echo $a->toString() * $x->toString() + $b->toString() * $y->toString(); // outputs 21
- * ?>
- *
- *
- * @param Math_BigInteger $n
- * @return Math_BigInteger
- * @access public
- * @internal Calculates the GCD using the binary xGCD algorithim described in
- * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=19 HAC 14.61}. As the text above 14.61 notes,
- * the more traditional algorithim requires "relatively costly multiple-precision divisions".
- */
- function extendedGCD($n)
- {
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- extract(gmp_gcdext($this->value, $n->value));
-
- return array(
- 'gcd' => $this->_normalize(new Math_BigInteger($g)),
- 'x' => $this->_normalize(new Math_BigInteger($s)),
- 'y' => $this->_normalize(new Math_BigInteger($t))
- );
- case MATH_BIGINTEGER_MODE_BCMATH:
- // it might be faster to use the binary xGCD algorithim here, as well, but (1) that algorithim works
- // best when the base is a power of 2 and (2) i don't think it'd make much difference, anyway. as is,
- // the basic extended euclidean algorithim is what we're using.
-
- $u = $this->value;
- $v = $n->value;
-
- $a = '1';
- $b = '0';
- $c = '0';
- $d = '1';
-
- while (bccomp($v, '0', 0) != 0) {
- $q = bcdiv($u, $v, 0);
-
- $temp = $u;
- $u = $v;
- $v = bcsub($temp, bcmul($v, $q, 0), 0);
-
- $temp = $a;
- $a = $c;
- $c = bcsub($temp, bcmul($a, $q, 0), 0);
-
- $temp = $b;
- $b = $d;
- $d = bcsub($temp, bcmul($b, $q, 0), 0);
- }
-
- return array(
- 'gcd' => $this->_normalize(new Math_BigInteger($u)),
- 'x' => $this->_normalize(new Math_BigInteger($a)),
- 'y' => $this->_normalize(new Math_BigInteger($b))
- );
- }
-
- $y = $n->copy();
- $x = $this->copy();
- $g = new Math_BigInteger();
- $g->value = array(1);
-
- while ( !(($x->value[0] & 1)|| ($y->value[0] & 1)) ) {
- $x->_rshift(1);
- $y->_rshift(1);
- $g->_lshift(1);
- }
-
- $u = $x->copy();
- $v = $y->copy();
-
- $a = new Math_BigInteger();
- $b = new Math_BigInteger();
- $c = new Math_BigInteger();
- $d = new Math_BigInteger();
-
- $a->value = $d->value = $g->value = array(1);
- $b->value = $c->value = array();
-
- while ( !empty($u->value) ) {
- while ( !($u->value[0] & 1) ) {
- $u->_rshift(1);
- if ( (!empty($a->value) && ($a->value[0] & 1)) || (!empty($b->value) && ($b->value[0] & 1)) ) {
- $a = $a->add($y);
- $b = $b->subtract($x);
- }
- $a->_rshift(1);
- $b->_rshift(1);
- }
-
- while ( !($v->value[0] & 1) ) {
- $v->_rshift(1);
- if ( (!empty($d->value) && ($d->value[0] & 1)) || (!empty($c->value) && ($c->value[0] & 1)) ) {
- $c = $c->add($y);
- $d = $d->subtract($x);
- }
- $c->_rshift(1);
- $d->_rshift(1);
- }
-
- if ($u->compare($v) >= 0) {
- $u = $u->subtract($v);
- $a = $a->subtract($c);
- $b = $b->subtract($d);
- } else {
- $v = $v->subtract($u);
- $c = $c->subtract($a);
- $d = $d->subtract($b);
- }
- }
-
- return array(
- 'gcd' => $this->_normalize($g->multiply($v)),
- 'x' => $this->_normalize($c),
- 'y' => $this->_normalize($d)
- );
- }
-
- /**
- * Calculates the greatest common divisor
- *
- * Say you have 693 and 609. The GCD is 21.
- *
- * Here's an example:
- *
- * extendedGCD($b);
- *
- * echo $gcd->toString() . "\r\n"; // outputs 21
- * ?>
- *
- *
- * @param Math_BigInteger $n
- * @return Math_BigInteger
- * @access public
- */
- function gcd($n)
- {
- extract($this->extendedGCD($n));
- return $gcd;
- }
-
- /**
- * Absolute value.
- *
- * @return Math_BigInteger
- * @access public
- */
- function abs()
- {
- $temp = new Math_BigInteger();
-
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- $temp->value = gmp_abs($this->value);
- break;
- case MATH_BIGINTEGER_MODE_BCMATH:
- $temp->value = (bccomp($this->value, '0', 0) < 0) ? substr($this->value, 1) : $this->value;
- break;
- default:
- $temp->value = $this->value;
- }
-
- return $temp;
- }
-
- /**
- * Compares two numbers.
- *
- * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this is
- * demonstrated thusly:
- *
- * $x > $y: $x->compare($y) > 0
- * $x < $y: $x->compare($y) < 0
- * $x == $y: $x->compare($y) == 0
- *
- * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y).
- *
- * @param Math_BigInteger $y
- * @return Integer < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal.
- * @access public
- * @see equals()
- * @internal Could return $this->subtract($x), but that's not as fast as what we do do.
- */
- function compare($y)
- {
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- return gmp_cmp($this->value, $y->value);
- case MATH_BIGINTEGER_MODE_BCMATH:
- return bccomp($this->value, $y->value, 0);
- }
-
- return $this->_compare($this->value, $this->is_negative, $y->value, $y->is_negative);
- }
-
- /**
- * Compares two numbers.
- *
- * @param Array $x_value
- * @param Boolean $x_negative
- * @param Array $y_value
- * @param Boolean $y_negative
- * @return Integer
- * @see compare()
- * @access private
- */
- function _compare($x_value, $x_negative, $y_value, $y_negative)
- {
- if ( $x_negative != $y_negative ) {
- return ( !$x_negative && $y_negative ) ? 1 : -1;
- }
-
- $result = $x_negative ? -1 : 1;
-
- if ( count($x_value) != count($y_value) ) {
- return ( count($x_value) > count($y_value) ) ? $result : -$result;
- }
- $size = max(count($x_value), count($y_value));
-
- $x_value = array_pad($x_value, $size, 0);
- $y_value = array_pad($y_value, $size, 0);
-
- for ($i = count($x_value) - 1; $i >= 0; --$i) {
- if ($x_value[$i] != $y_value[$i]) {
- return ( $x_value[$i] > $y_value[$i] ) ? $result : -$result;
- }
- }
-
- return 0;
- }
-
- /**
- * Tests the equality of two numbers.
- *
- * If you need to see if one number is greater than or less than another number, use Math_BigInteger::compare()
- *
- * @param Math_BigInteger $x
- * @return Boolean
- * @access public
- * @see compare()
- */
- function equals($x)
- {
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- return gmp_cmp($this->value, $x->value) == 0;
- default:
- return $this->value === $x->value && $this->is_negative == $x->is_negative;
- }
- }
-
- /**
- * Set Precision
- *
- * Some bitwise operations give different results depending on the precision being used. Examples include left
- * shift, not, and rotates.
- *
- * @param Integer $bits
- * @access public
- */
- function setPrecision($bits)
- {
- $this->precision = $bits;
- if ( MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_BCMATH ) {
- $this->bitmask = new Math_BigInteger(chr((1 << ($bits & 0x7)) - 1) . str_repeat(chr(0xFF), $bits >> 3), 256);
- } else {
- $this->bitmask = new Math_BigInteger(bcpow('2', $bits, 0));
- }
-
- $temp = $this->_normalize($this);
- $this->value = $temp->value;
- }
-
- /**
- * Logical And
- *
- * @param Math_BigInteger $x
- * @access public
- * @internal Implemented per a request by Lluis Pamies i Juarez
- * @return Math_BigInteger
- */
- function bitwise_and($x)
- {
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- $temp = new Math_BigInteger();
- $temp->value = gmp_and($this->value, $x->value);
-
- return $this->_normalize($temp);
- case MATH_BIGINTEGER_MODE_BCMATH:
- $left = $this->toBytes();
- $right = $x->toBytes();
-
- $length = max(strlen($left), strlen($right));
-
- $left = str_pad($left, $length, chr(0), STR_PAD_LEFT);
- $right = str_pad($right, $length, chr(0), STR_PAD_LEFT);
-
- return $this->_normalize(new Math_BigInteger($left & $right, 256));
- }
-
- $result = $this->copy();
-
- $length = min(count($x->value), count($this->value));
-
- $result->value = array_slice($result->value, 0, $length);
-
- for ($i = 0; $i < $length; ++$i) {
- $result->value[$i]&= $x->value[$i];
- }
-
- return $this->_normalize($result);
- }
-
- /**
- * Logical Or
- *
- * @param Math_BigInteger $x
- * @access public
- * @internal Implemented per a request by Lluis Pamies i Juarez
- * @return Math_BigInteger
- */
- function bitwise_or($x)
- {
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- $temp = new Math_BigInteger();
- $temp->value = gmp_or($this->value, $x->value);
-
- return $this->_normalize($temp);
- case MATH_BIGINTEGER_MODE_BCMATH:
- $left = $this->toBytes();
- $right = $x->toBytes();
-
- $length = max(strlen($left), strlen($right));
-
- $left = str_pad($left, $length, chr(0), STR_PAD_LEFT);
- $right = str_pad($right, $length, chr(0), STR_PAD_LEFT);
-
- return $this->_normalize(new Math_BigInteger($left | $right, 256));
- }
-
- $length = max(count($this->value), count($x->value));
- $result = $this->copy();
- $result->value = array_pad($result->value, $length, 0);
- $x->value = array_pad($x->value, $length, 0);
-
- for ($i = 0; $i < $length; ++$i) {
- $result->value[$i]|= $x->value[$i];
- }
-
- return $this->_normalize($result);
- }
-
- /**
- * Logical Exclusive-Or
- *
- * @param Math_BigInteger $x
- * @access public
- * @internal Implemented per a request by Lluis Pamies i Juarez
- * @return Math_BigInteger
- */
- function bitwise_xor($x)
- {
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- $temp = new Math_BigInteger();
- $temp->value = gmp_xor($this->value, $x->value);
-
- return $this->_normalize($temp);
- case MATH_BIGINTEGER_MODE_BCMATH:
- $left = $this->toBytes();
- $right = $x->toBytes();
-
- $length = max(strlen($left), strlen($right));
-
- $left = str_pad($left, $length, chr(0), STR_PAD_LEFT);
- $right = str_pad($right, $length, chr(0), STR_PAD_LEFT);
-
- return $this->_normalize(new Math_BigInteger($left ^ $right, 256));
- }
-
- $length = max(count($this->value), count($x->value));
- $result = $this->copy();
- $result->value = array_pad($result->value, $length, 0);
- $x->value = array_pad($x->value, $length, 0);
-
- for ($i = 0; $i < $length; ++$i) {
- $result->value[$i]^= $x->value[$i];
- }
-
- return $this->_normalize($result);
- }
-
- /**
- * Logical Not
- *
- * @access public
- * @internal Implemented per a request by Lluis Pamies i Juarez
- * @return Math_BigInteger
- */
- function bitwise_not()
- {
- // calculuate "not" without regard to $this->precision
- // (will always result in a smaller number. ie. ~1 isn't 1111 1110 - it's 0)
- $temp = $this->toBytes();
- $pre_msb = decbin(ord($temp[0]));
- $temp = ~$temp;
- $msb = decbin(ord($temp[0]));
- if (strlen($msb) == 8) {
- $msb = substr($msb, strpos($msb, '0'));
- }
- $temp[0] = chr(bindec($msb));
-
- // see if we need to add extra leading 1's
- $current_bits = strlen($pre_msb) + 8 * strlen($temp) - 8;
- $new_bits = $this->precision - $current_bits;
- if ($new_bits <= 0) {
- return $this->_normalize(new Math_BigInteger($temp, 256));
- }
-
- // generate as many leading 1's as we need to.
- $leading_ones = chr((1 << ($new_bits & 0x7)) - 1) . str_repeat(chr(0xFF), $new_bits >> 3);
- $this->_base256_lshift($leading_ones, $current_bits);
-
- $temp = str_pad($temp, ceil($this->bits / 8), chr(0), STR_PAD_LEFT);
-
- return $this->_normalize(new Math_BigInteger($leading_ones | $temp, 256));
- }
-
- /**
- * Logical Right Shift
- *
- * Shifts BigInteger's by $shift bits, effectively dividing by 2**$shift.
- *
- * @param Integer $shift
- * @return Math_BigInteger
- * @access public
- * @internal The only version that yields any speed increases is the internal version.
- */
- function bitwise_rightShift($shift)
- {
- $temp = new Math_BigInteger();
-
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- static $two;
-
- if (!isset($two)) {
- $two = gmp_init('2');
- }
-
- $temp->value = gmp_div_q($this->value, gmp_pow($two, $shift));
-
- break;
- case MATH_BIGINTEGER_MODE_BCMATH:
- $temp->value = bcdiv($this->value, bcpow('2', $shift, 0), 0);
-
- break;
- default: // could just replace _lshift with this, but then all _lshift() calls would need to be rewritten
- // and I don't want to do that...
- $temp->value = $this->value;
- $temp->_rshift($shift);
- }
-
- return $this->_normalize($temp);
- }
-
- /**
- * Logical Left Shift
- *
- * Shifts BigInteger's by $shift bits, effectively multiplying by 2**$shift.
- *
- * @param Integer $shift
- * @return Math_BigInteger
- * @access public
- * @internal The only version that yields any speed increases is the internal version.
- */
- function bitwise_leftShift($shift)
- {
- $temp = new Math_BigInteger();
-
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- static $two;
-
- if (!isset($two)) {
- $two = gmp_init('2');
- }
-
- $temp->value = gmp_mul($this->value, gmp_pow($two, $shift));
-
- break;
- case MATH_BIGINTEGER_MODE_BCMATH:
- $temp->value = bcmul($this->value, bcpow('2', $shift, 0), 0);
-
- break;
- default: // could just replace _rshift with this, but then all _lshift() calls would need to be rewritten
- // and I don't want to do that...
- $temp->value = $this->value;
- $temp->_lshift($shift);
- }
-
- return $this->_normalize($temp);
- }
-
- /**
- * Logical Left Rotate
- *
- * Instead of the top x bits being dropped they're appended to the shifted bit string.
- *
- * @param Integer $shift
- * @return Math_BigInteger
- * @access public
- */
- function bitwise_leftRotate($shift)
- {
- $bits = $this->toBytes();
-
- if ($this->precision > 0) {
- $precision = $this->precision;
- if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH ) {
- $mask = $this->bitmask->subtract(new Math_BigInteger(1));
- $mask = $mask->toBytes();
- } else {
- $mask = $this->bitmask->toBytes();
- }
- } else {
- $temp = ord($bits[0]);
- for ($i = 0; $temp >> $i; ++$i);
- $precision = 8 * strlen($bits) - 8 + $i;
- $mask = chr((1 << ($precision & 0x7)) - 1) . str_repeat(chr(0xFF), $precision >> 3);
- }
-
- if ($shift < 0) {
- $shift+= $precision;
- }
- $shift%= $precision;
-
- if (!$shift) {
- return $this->copy();
- }
-
- $left = $this->bitwise_leftShift($shift);
- $left = $left->bitwise_and(new Math_BigInteger($mask, 256));
- $right = $this->bitwise_rightShift($precision - $shift);
- $result = MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_BCMATH ? $left->bitwise_or($right) : $left->add($right);
- return $this->_normalize($result);
- }
-
- /**
- * Logical Right Rotate
- *
- * Instead of the bottom x bits being dropped they're prepended to the shifted bit string.
- *
- * @param Integer $shift
- * @return Math_BigInteger
- * @access public
- */
- function bitwise_rightRotate($shift)
- {
- return $this->bitwise_leftRotate(-$shift);
- }
-
- /**
- * Set random number generator function
- *
- * This function is deprecated.
- *
- * @param String $generator
- * @access public
- */
- function setRandomGenerator($generator)
- {
- }
-
- /**
- * Generates a random BigInteger
- *
- * Byte length is equal to $length. Uses crypt_random if it's loaded and mt_rand if it's not.
- *
- * @param Integer $length
- * @return Math_BigInteger
- * @access private
- */
- function _random_number_helper($size)
- {
- $crypt_random = function_exists('crypt_random_string') || (!class_exists('Crypt_Random') && function_exists('crypt_random_string'));
- if ($crypt_random) {
- $random = crypt_random_string($size);
- } else {
- $random = '';
-
- if ($size & 1) {
- $random.= chr(mt_rand(0, 255));
- }
-
- $blocks = $size >> 1;
- for ($i = 0; $i < $blocks; ++$i) {
- // mt_rand(-2147483648, 0x7FFFFFFF) always produces -2147483648 on some systems
- $random.= pack('n', mt_rand(0, 0xFFFF));
- }
- }
-
- return new Math_BigInteger($random, 256);
- }
-
- /**
- * Generate a random number
- *
- * @param optional Integer $min
- * @param optional Integer $max
- * @return Math_BigInteger
- * @access public
- */
- function random($min = false, $max = false)
- {
- if ($min === false) {
- $min = new Math_BigInteger(0);
- }
-
- if ($max === false) {
- $max = new Math_BigInteger(0x7FFFFFFF);
- }
-
- $compare = $max->compare($min);
-
- if (!$compare) {
- return $this->_normalize($min);
- } else if ($compare < 0) {
- // if $min is bigger then $max, swap $min and $max
- $temp = $max;
- $max = $min;
- $min = $temp;
- }
-
- static $one;
- if (!isset($one)) {
- $one = new Math_BigInteger(1);
- }
-
- $max = $max->subtract($min->subtract($one));
- $size = strlen(ltrim($max->toBytes(), chr(0)));
-
- /*
- doing $random % $max doesn't work because some numbers will be more likely to occur than others.
- eg. if $max is 140 and $random's max is 255 then that'd mean both $random = 5 and $random = 145
- would produce 5 whereas the only value of random that could produce 139 would be 139. ie.
- not all numbers would be equally likely. some would be more likely than others.
-
- creating a whole new random number until you find one that is within the range doesn't work
- because, for sufficiently small ranges, the likelihood that you'd get a number within that range
- would be pretty small. eg. with $random's max being 255 and if your $max being 1 the probability
- would be pretty high that $random would be greater than $max.
-
- phpseclib works around this using the technique described here:
-
- http://crypto.stackexchange.com/questions/5708/creating-a-small-number-from-a-cryptographically-secure-random-string
- */
- $random_max = new Math_BigInteger(chr(1) . str_repeat("\0", $size), 256);
- $random = $this->_random_number_helper($size);
-
- list($max_multiple) = $random_max->divide($max);
- $max_multiple = $max_multiple->multiply($max);
-
- while ($random->compare($max_multiple) >= 0) {
- $random = $random->subtract($max_multiple);
- $random_max = $random_max->subtract($max_multiple);
- $random = $random->bitwise_leftShift(8);
- $random = $random->add($this->_random_number_helper(1));
- $random_max = $random_max->bitwise_leftShift(8);
- list($max_multiple) = $random_max->divide($max);
- $max_multiple = $max_multiple->multiply($max);
- }
- list(, $random) = $random->divide($max);
-
- return $this->_normalize($random->add($min));
- }
-
- /**
- * Generate a random prime number.
- *
- * If there's not a prime within the given range, false will be returned. If more than $timeout seconds have elapsed,
- * give up and return false.
- *
- * @param optional Integer $min
- * @param optional Integer $max
- * @param optional Integer $timeout
- * @return Math_BigInteger
- * @access public
- * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=15 HAC 4.44}.
- */
- function randomPrime($min = false, $max = false, $timeout = false)
- {
- if ($min === false) {
- $min = new Math_BigInteger(0);
- }
-
- if ($max === false) {
- $max = new Math_BigInteger(0x7FFFFFFF);
- }
-
- $compare = $max->compare($min);
-
- if (!$compare) {
- return $min->isPrime() ? $min : false;
- } else if ($compare < 0) {
- // if $min is bigger then $max, swap $min and $max
- $temp = $max;
- $max = $min;
- $min = $temp;
- }
-
- static $one, $two;
- if (!isset($one)) {
- $one = new Math_BigInteger(1);
- $two = new Math_BigInteger(2);
- }
-
- $start = time();
-
- $x = $this->random($min, $max);
-
- // gmp_nextprime() requires PHP 5 >= 5.2.0 per .
- if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_GMP && function_exists('gmp_nextprime') ) {
- $p = new Math_BigInteger();
- $p->value = gmp_nextprime($x->value);
-
- if ($p->compare($max) <= 0) {
- return $p;
- }
-
- if (!$min->equals($x)) {
- $x = $x->subtract($one);
- }
-
- return $x->randomPrime($min, $x);
- }
-
- if ($x->equals($two)) {
- return $x;
- }
-
- $x->_make_odd();
- if ($x->compare($max) > 0) {
- // if $x > $max then $max is even and if $min == $max then no prime number exists between the specified range
- if ($min->equals($max)) {
- return false;
- }
- $x = $min->copy();
- $x->_make_odd();
- }
-
- $initial_x = $x->copy();
-
- while (true) {
- if ($timeout !== false && time() - $start > $timeout) {
- return false;
- }
-
- if ($x->isPrime()) {
- return $x;
- }
-
- $x = $x->add($two);
-
- if ($x->compare($max) > 0) {
- $x = $min->copy();
- if ($x->equals($two)) {
- return $x;
- }
- $x->_make_odd();
- }
-
- if ($x->equals($initial_x)) {
- return false;
- }
- }
- }
-
- /**
- * Make the current number odd
- *
- * If the current number is odd it'll be unchanged. If it's even, one will be added to it.
- *
- * @see randomPrime()
- * @access private
- */
- function _make_odd()
- {
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- gmp_setbit($this->value, 0);
- break;
- case MATH_BIGINTEGER_MODE_BCMATH:
- if ($this->value[strlen($this->value) - 1] % 2 == 0) {
- $this->value = bcadd($this->value, '1');
- }
- break;
- default:
- $this->value[0] |= 1;
- }
- }
-
- /**
- * Checks a numer to see if it's prime
- *
- * Assuming the $t parameter is not set, this function has an error rate of 2**-80. The main motivation for the
- * $t parameter is distributability. Math_BigInteger::randomPrime() can be distributed accross multiple pageloads
- * on a website instead of just one.
- *
- * @param optional Integer $t
- * @return Boolean
- * @access public
- * @internal Uses the
- * {@link http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test Miller-Rabin primality test}. See
- * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=8 HAC 4.24}.
- */
- function isPrime($t = false)
- {
- $length = strlen($this->toBytes());
-
- if (!$t) {
- // see HAC 4.49 "Note (controlling the error probability)"
- // @codingStandardsIgnoreStart
- if ($length >= 163) { $t = 2; } // floor(1300 / 8)
- else if ($length >= 106) { $t = 3; } // floor( 850 / 8)
- else if ($length >= 81 ) { $t = 4; } // floor( 650 / 8)
- else if ($length >= 68 ) { $t = 5; } // floor( 550 / 8)
- else if ($length >= 56 ) { $t = 6; } // floor( 450 / 8)
- else if ($length >= 50 ) { $t = 7; } // floor( 400 / 8)
- else if ($length >= 43 ) { $t = 8; } // floor( 350 / 8)
- else if ($length >= 37 ) { $t = 9; } // floor( 300 / 8)
- else if ($length >= 31 ) { $t = 12; } // floor( 250 / 8)
- else if ($length >= 25 ) { $t = 15; } // floor( 200 / 8)
- else if ($length >= 18 ) { $t = 18; } // floor( 150 / 8)
- else { $t = 27; }
- // @codingStandardsIgnoreEnd
- }
-
- // ie. gmp_testbit($this, 0)
- // ie. isEven() or !isOdd()
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- return gmp_prob_prime($this->value, $t) != 0;
- case MATH_BIGINTEGER_MODE_BCMATH:
- if ($this->value === '2') {
- return true;
- }
- if ($this->value[strlen($this->value) - 1] % 2 == 0) {
- return false;
- }
- break;
- default:
- if ($this->value == array(2)) {
- return true;
- }
- if (~$this->value[0] & 1) {
- return false;
- }
- }
-
- static $primes, $zero, $one, $two;
-
- if (!isset($primes)) {
- $primes = array(
- 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
- 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137,
- 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227,
- 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313,
- 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419,
- 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509,
- 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617,
- 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727,
- 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829,
- 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947,
- 953, 967, 971, 977, 983, 991, 997
- );
-
- if ( MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL ) {
- for ($i = 0; $i < count($primes); ++$i) {
- $primes[$i] = new Math_BigInteger($primes[$i]);
- }
- }
-
- $zero = new Math_BigInteger();
- $one = new Math_BigInteger(1);
- $two = new Math_BigInteger(2);
- }
-
- if ($this->equals($one)) {
- return false;
- }
-
- // see HAC 4.4.1 "Random search for probable primes"
- if ( MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL ) {
- foreach ($primes as $prime) {
- list(, $r) = $this->divide($prime);
- if ($r->equals($zero)) {
- return $this->equals($prime);
- }
- }
- } else {
- $value = $this->value;
- foreach ($primes as $prime) {
- list(, $r) = $this->_divide_digit($value, $prime);
- if (!$r) {
- return count($value) == 1 && $value[0] == $prime;
- }
- }
- }
-
- $n = $this->copy();
- $n_1 = $n->subtract($one);
- $n_2 = $n->subtract($two);
-
- $r = $n_1->copy();
- $r_value = $r->value;
- // ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s));
- if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH ) {
- $s = 0;
- // if $n was 1, $r would be 0 and this would be an infinite loop, hence our $this->equals($one) check earlier
- while ($r->value[strlen($r->value) - 1] % 2 == 0) {
- $r->value = bcdiv($r->value, '2', 0);
- ++$s;
- }
- } else {
- for ($i = 0, $r_length = count($r_value); $i < $r_length; ++$i) {
- $temp = ~$r_value[$i] & 0xFFFFFF;
- for ($j = 1; ($temp >> $j) & 1; ++$j);
- if ($j != 25) {
- break;
- }
- }
- $s = 26 * $i + $j - 1;
- $r->_rshift($s);
- }
-
- for ($i = 0; $i < $t; ++$i) {
- $a = $this->random($two, $n_2);
- $y = $a->modPow($r, $n);
-
- if (!$y->equals($one) && !$y->equals($n_1)) {
- for ($j = 1; $j < $s && !$y->equals($n_1); ++$j) {
- $y = $y->modPow($two, $n);
- if ($y->equals($one)) {
- return false;
- }
- }
-
- if (!$y->equals($n_1)) {
- return false;
- }
- }
- }
- return true;
- }
-
- /**
- * Logical Left Shift
- *
- * Shifts BigInteger's by $shift bits.
- *
- * @param Integer $shift
- * @access private
- */
- function _lshift($shift)
- {
- if ( $shift == 0 ) {
- return;
- }
-
- $num_digits = (int) ($shift / MATH_BIGINTEGER_BASE);
- $shift %= MATH_BIGINTEGER_BASE;
- $shift = 1 << $shift;
-
- $carry = 0;
-
- for ($i = 0; $i < count($this->value); ++$i) {
- $temp = $this->value[$i] * $shift + $carry;
- $carry = (int) ($temp / MATH_BIGINTEGER_BASE_FULL);
- $this->value[$i] = (int) ($temp - $carry * MATH_BIGINTEGER_BASE_FULL);
- }
-
- if ( $carry ) {
- $this->value[] = $carry;
- }
-
- while ($num_digits--) {
- array_unshift($this->value, 0);
- }
- }
-
- /**
- * Logical Right Shift
- *
- * Shifts BigInteger's by $shift bits.
- *
- * @param Integer $shift
- * @access private
- */
- function _rshift($shift)
- {
- if ($shift == 0) {
- return;
- }
-
- $num_digits = (int) ($shift / MATH_BIGINTEGER_BASE);
- $shift %= MATH_BIGINTEGER_BASE;
- $carry_shift = MATH_BIGINTEGER_BASE - $shift;
- $carry_mask = (1 << $shift) - 1;
-
- if ( $num_digits ) {
- $this->value = array_slice($this->value, $num_digits);
- }
-
- $carry = 0;
-
- for ($i = count($this->value) - 1; $i >= 0; --$i) {
- $temp = $this->value[$i] >> $shift | $carry;
- $carry = ($this->value[$i] & $carry_mask) << $carry_shift;
- $this->value[$i] = $temp;
- }
-
- $this->value = $this->_trim($this->value);
- }
-
- /**
- * Normalize
- *
- * Removes leading zeros and truncates (if necessary) to maintain the appropriate precision
- *
- * @param Math_BigInteger
- * @return Math_BigInteger
- * @see _trim()
- * @access private
- */
- function _normalize($result)
- {
- $result->precision = $this->precision;
- $result->bitmask = $this->bitmask;
-
- switch ( MATH_BIGINTEGER_MODE ) {
- case MATH_BIGINTEGER_MODE_GMP:
- if (!empty($result->bitmask->value)) {
- $result->value = gmp_and($result->value, $result->bitmask->value);
- }
-
- return $result;
- case MATH_BIGINTEGER_MODE_BCMATH:
- if (!empty($result->bitmask->value)) {
- $result->value = bcmod($result->value, $result->bitmask->value);
- }
-
- return $result;
- }
-
- $value = &$result->value;
-
- if ( !count($value) ) {
- return $result;
- }
-
- $value = $this->_trim($value);
-
- if (!empty($result->bitmask->value)) {
- $length = min(count($value), count($this->bitmask->value));
- $value = array_slice($value, 0, $length);
-
- for ($i = 0; $i < $length; ++$i) {
- $value[$i] = $value[$i] & $this->bitmask->value[$i];
- }
- }
-
- return $result;
- }
-
- /**
- * Trim
- *
- * Removes leading zeros
- *
- * @param Array $value
- * @return Math_BigInteger
- * @access private
- */
- function _trim($value)
- {
- for ($i = count($value) - 1; $i >= 0; --$i) {
- if ( $value[$i] ) {
- break;
- }
- unset($value[$i]);
- }
-
- return $value;
- }
-
- /**
- * Array Repeat
- *
- * @param $input Array
- * @param $multiplier mixed
- * @return Array
- * @access private
- */
- function _array_repeat($input, $multiplier)
- {
- return ($multiplier) ? array_fill(0, $multiplier, $input) : array();
- }
-
- /**
- * Logical Left Shift
- *
- * Shifts binary strings $shift bits, essentially multiplying by 2**$shift.
- *
- * @param $x String
- * @param $shift Integer
- * @return String
- * @access private
- */
- function _base256_lshift(&$x, $shift)
- {
- if ($shift == 0) {
- return;
- }
-
- $num_bytes = $shift >> 3; // eg. floor($shift/8)
- $shift &= 7; // eg. $shift % 8
-
- $carry = 0;
- for ($i = strlen($x) - 1; $i >= 0; --$i) {
- $temp = ord($x[$i]) << $shift | $carry;
- $x[$i] = chr($temp);
- $carry = $temp >> 8;
- }
- $carry = ($carry != 0) ? chr($carry) : '';
- $x = $carry . $x . str_repeat(chr(0), $num_bytes);
- }
-
- /**
- * Logical Right Shift
- *
- * Shifts binary strings $shift bits, essentially dividing by 2**$shift and returning the remainder.
- *
- * @param $x String
- * @param $shift Integer
- * @return String
- * @access private
- */
- function _base256_rshift(&$x, $shift)
- {
- if ($shift == 0) {
- $x = ltrim($x, chr(0));
- return '';
- }
-
- $num_bytes = $shift >> 3; // eg. floor($shift/8)
- $shift &= 7; // eg. $shift % 8
-
- $remainder = '';
- if ($num_bytes) {
- $start = $num_bytes > strlen($x) ? -strlen($x) : -$num_bytes;
- $remainder = substr($x, $start);
- $x = substr($x, 0, -$num_bytes);
- }
-
- $carry = 0;
- $carry_shift = 8 - $shift;
- for ($i = 0; $i < strlen($x); ++$i) {
- $temp = (ord($x[$i]) >> $shift) | $carry;
- $carry = (ord($x[$i]) << $carry_shift) & 0xFF;
- $x[$i] = chr($temp);
- }
- $x = ltrim($x, chr(0));
-
- $remainder = chr($carry >> $carry_shift) . $remainder;
-
- return ltrim($remainder, chr(0));
- }
-
- // one quirk about how the following functions are implemented is that PHP defines N to be an unsigned long
- // at 32-bits, while java's longs are 64-bits.
-
- /**
- * Converts 32-bit integers to bytes.
- *
- * @param Integer $x
- * @return String
- * @access private
- */
- function _int2bytes($x)
- {
- return ltrim(pack('N', $x), chr(0));
- }
-
- /**
- * Converts bytes to 32-bit integers
- *
- * @param String $x
- * @return Integer
- * @access private
- */
- function _bytes2int($x)
- {
- $temp = unpack('Nint', str_pad($x, 4, chr(0), STR_PAD_LEFT));
- return $temp['int'];
- }
-
- /**
- * DER-encode an integer
- *
- * The ability to DER-encode integers is needed to create RSA public keys for use with OpenSSL
- *
- * @see modPow()
- * @access private
- * @param Integer $length
- * @return String
- */
- function _encodeASN1Length($length)
- {
- if ($length <= 0x7F) {
- return chr($length);
- }
-
- $temp = ltrim(pack('N', $length), chr(0));
- return pack('Ca*', 0x80 | strlen($temp), $temp);
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Net/SCP.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Net/SCP.php
deleted file mode 100644
index 4cfa357009f50972f1a027592f9702173fd63dc0..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Net/SCP.php
+++ /dev/null
@@ -1,362 +0,0 @@
-
- * login('username', 'password')) {
- * exit('bad login');
- * }
-
- * $scp = new Net_SCP($ssh);
- * $scp->put('abcd', str_repeat('x', 1024*1024));
- * ?>
- *
- *
- * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @category Net
- * @package Net_SCP
- * @author Jim Wigginton
- * @copyright MMX Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- */
-
-/**#@+
- * @access public
- * @see Net_SCP::put()
- */
-/**
- * Reads data from a local file.
- */
-define('NET_SCP_LOCAL_FILE', 1);
-/**
- * Reads data from a string.
- */
-define('NET_SCP_STRING', 2);
-/**#@-*/
-
-/**#@+
- * @access private
- * @see Net_SCP::_send()
- * @see Net_SCP::_receive()
- */
-/**
- * SSH1 is being used.
- */
-define('NET_SCP_SSH1', 1);
-/**
- * SSH2 is being used.
- */
-define('NET_SCP_SSH2', 2);
-/**#@-*/
-
-/**
- * Pure-PHP implementations of SCP.
- *
- * @package Net_SCP
- * @author Jim Wigginton
- * @version 0.1.0
- * @access public
- */
-class Net_SCP
-{
- /**
- * SSH Object
- *
- * @var Object
- * @access private
- */
- var $ssh;
-
- /**
- * Packet Size
- *
- * @var Integer
- * @access private
- */
- var $packet_size;
-
- /**
- * Mode
- *
- * @var Integer
- * @access private
- */
- var $mode;
-
- /**
- * Default Constructor.
- *
- * Connects to an SSH server
- *
- * @param String $host
- * @param optional Integer $port
- * @param optional Integer $timeout
- * @return Net_SCP
- * @access public
- */
- function Net_SCP($ssh)
- {
- if (!is_object($ssh)) {
- return;
- }
-
- switch (strtolower(get_class($ssh))) {
- case'net_ssh2':
- $this->mode = NET_SCP_SSH2;
- break;
- case 'net_ssh1':
- $this->packet_size = 50000;
- $this->mode = NET_SCP_SSH1;
- break;
- default:
- return;
- }
-
- $this->ssh = $ssh;
- }
-
- /**
- * Uploads a file to the SCP server.
- *
- * By default, Net_SCP::put() does not read from the local filesystem. $data is dumped directly into $remote_file.
- * So, for example, if you set $data to 'filename.ext' and then do Net_SCP::get(), you will get a file, twelve bytes
- * long, containing 'filename.ext' as its contents.
- *
- * Setting $mode to NET_SCP_LOCAL_FILE will change the above behavior. With NET_SCP_LOCAL_FILE, $remote_file will
- * contain as many bytes as filename.ext does on your local filesystem. If your filename.ext is 1MB then that is how
- * large $remote_file will be, as well.
- *
- * Currently, only binary mode is supported. As such, if the line endings need to be adjusted, you will need to take
- * care of that, yourself.
- *
- * @param String $remote_file
- * @param String $data
- * @param optional Integer $mode
- * @param optional Callable $callback
- * @return Boolean
- * @access public
- */
- function put($remote_file, $data, $mode = NET_SCP_STRING, $callback = null)
- {
- if (!isset($this->ssh)) {
- return false;
- }
-
- if (!$this->ssh->exec('scp -t ' . $remote_file, false)) { // -t = to
- return false;
- }
-
- $temp = $this->_receive();
- if ($temp !== chr(0)) {
- return false;
- }
-
- if ($this->mode == NET_SCP_SSH2) {
- $this->packet_size = $this->ssh->packet_size_client_to_server[NET_SSH2_CHANNEL_EXEC] - 4;
- }
-
- $remote_file = basename($remote_file);
-
- if ($mode == NET_SCP_STRING) {
- $size = strlen($data);
- } else {
- if (!is_file($data)) {
- user_error("$data is not a valid file", E_USER_NOTICE);
- return false;
- }
-
- $fp = @fopen($data, 'rb');
- if (!$fp) {
- fclose($fp);
- return false;
- }
- $size = filesize($data);
- }
-
- $this->_send('C0644 ' . $size . ' ' . $remote_file . "\n");
-
- $temp = $this->_receive();
- if ($temp !== chr(0)) {
- return false;
- }
-
- $sent = 0;
- while ($sent < $size) {
- $temp = $mode & NET_SCP_STRING ? substr($data, $sent, $this->packet_size) : fread($fp, $this->packet_size);
- $this->_send($temp);
- $sent+= strlen($temp);
-
- if (is_callable($callback)) {
- $callback($sent);
- }
- }
- $this->_close();
-
- if ($mode != NET_SCP_STRING) {
- fclose($fp);
- }
-
- return true;
- }
-
- /**
- * Downloads a file from the SCP server.
- *
- * Returns a string containing the contents of $remote_file if $local_file is left undefined or a boolean false if
- * the operation was unsuccessful. If $local_file is defined, returns true or false depending on the success of the
- * operation
- *
- * @param String $remote_file
- * @param optional String $local_file
- * @return Mixed
- * @access public
- */
- function get($remote_file, $local_file = false)
- {
- if (!isset($this->ssh)) {
- return false;
- }
-
- if (!$this->ssh->exec('scp -f ' . $remote_file, false)) { // -f = from
- return false;
- }
-
- $this->_send("\0");
-
- if (!preg_match('#(?[^ ]+) (?\d+) (?.+)#', rtrim($this->_receive()), $info)) {
- return false;
- }
-
- $this->_send("\0");
-
- $size = 0;
-
- if ($local_file !== false) {
- $fp = @fopen($local_file, 'wb');
- if (!$fp) {
- return false;
- }
- }
-
- $content = '';
- while ($size < $info['size']) {
- $data = $this->_receive();
- // SCP usually seems to split stuff out into 16k chunks
- $size+= strlen($data);
-
- if ($local_file === false) {
- $content.= $data;
- } else {
- fputs($fp, $data);
- }
- }
-
- $this->_close();
-
- if ($local_file !== false) {
- fclose($fp);
- return true;
- }
-
- return $content;
- }
-
- /**
- * Sends a packet to an SSH server
- *
- * @param String $data
- * @access private
- */
- function _send($data)
- {
- switch ($this->mode) {
- case NET_SCP_SSH2:
- $this->ssh->_send_channel_packet(NET_SSH2_CHANNEL_EXEC, $data);
- break;
- case NET_SCP_SSH1:
- $data = pack('CNa*', NET_SSH1_CMSG_STDIN_DATA, strlen($data), $data);
- $this->ssh->_send_binary_packet($data);
- }
- }
-
- /**
- * Receives a packet from an SSH server
- *
- * @return String
- * @access private
- */
- function _receive()
- {
- switch ($this->mode) {
- case NET_SCP_SSH2:
- return $this->ssh->_get_channel_packet(NET_SSH2_CHANNEL_EXEC, true);
- case NET_SCP_SSH1:
- if (!$this->ssh->bitmap) {
- return false;
- }
- while (true) {
- $response = $this->ssh->_get_binary_packet();
- switch ($response[NET_SSH1_RESPONSE_TYPE]) {
- case NET_SSH1_SMSG_STDOUT_DATA:
- extract(unpack('Nlength', $response[NET_SSH1_RESPONSE_DATA]));
- return $this->ssh->_string_shift($response[NET_SSH1_RESPONSE_DATA], $length);
- case NET_SSH1_SMSG_STDERR_DATA:
- break;
- case NET_SSH1_SMSG_EXITSTATUS:
- $this->ssh->_send_binary_packet(chr(NET_SSH1_CMSG_EXIT_CONFIRMATION));
- fclose($this->ssh->fsock);
- $this->ssh->bitmap = 0;
- return false;
- default:
- user_error('Unknown packet received', E_USER_NOTICE);
- return false;
- }
- }
- }
- }
-
- /**
- * Closes the connection to an SSH server
- *
- * @access private
- */
- function _close()
- {
- switch ($this->mode) {
- case NET_SCP_SSH2:
- $this->ssh->_close_channel(NET_SSH2_CHANNEL_EXEC, true);
- break;
- case NET_SCP_SSH1:
- $this->ssh->disconnect();
- }
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Net/SFTP.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Net/SFTP.php
deleted file mode 100644
index 68d944f9f3f5ad91a51008cf4e5eeee7adab83c3..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Net/SFTP.php
+++ /dev/null
@@ -1,2226 +0,0 @@
-
- * login('username', 'password')) {
- * exit('Login Failed');
- * }
- *
- * echo $sftp->pwd() . "\r\n";
- * $sftp->put('filename.ext', 'hello, world!');
- * print_r($sftp->nlist());
- * ?>
- *
- *
- * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @category Net
- * @package Net_SFTP
- * @author Jim Wigginton
- * @copyright MMIX Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- */
-
-/**
- * Include Net_SSH2
- */
-if (!class_exists('Net_SSH2')) {
- include_once 'SSH2.php';
-}
-
-/**#@+
- * @access public
- * @see Net_SFTP::getLog()
- */
-/**
- * Returns the message numbers
- */
-define('NET_SFTP_LOG_SIMPLE', NET_SSH2_LOG_SIMPLE);
-/**
- * Returns the message content
- */
-define('NET_SFTP_LOG_COMPLEX', NET_SSH2_LOG_COMPLEX);
-/**
- * Outputs the message content in real-time.
- */
-define('NET_SFTP_LOG_REALTIME', 3);
-/**#@-*/
-
-/**
- * SFTP channel constant
- *
- * Net_SSH2::exec() uses 0 and Net_SSH2::read() / Net_SSH2::write() use 1.
- *
- * @see Net_SSH2::_send_channel_packet()
- * @see Net_SSH2::_get_channel_packet()
- * @access private
- */
-define('NET_SFTP_CHANNEL', 0x100);
-
-/**#@+
- * @access public
- * @see Net_SFTP::put()
- */
-/**
- * Reads data from a local file.
- */
-define('NET_SFTP_LOCAL_FILE', 1);
-/**
- * Reads data from a string.
- */
-// this value isn't really used anymore but i'm keeping it reserved for historical reasons
-define('NET_SFTP_STRING', 2);
-/**
- * Resumes an upload
- */
-define('NET_SFTP_RESUME', 4);
-/**
- * Append a local file to an already existing remote file
- */
-define('NET_SFTP_RESUME_START', 8);
-/**#@-*/
-
-/**
- * Pure-PHP implementations of SFTP.
- *
- * @package Net_SFTP
- * @author Jim Wigginton
- * @version 0.1.0
- * @access public
- */
-class Net_SFTP extends Net_SSH2
-{
- /**
- * Packet Types
- *
- * @see Net_SFTP::Net_SFTP()
- * @var Array
- * @access private
- */
- var $packet_types = array();
-
- /**
- * Status Codes
- *
- * @see Net_SFTP::Net_SFTP()
- * @var Array
- * @access private
- */
- var $status_codes = array();
-
- /**
- * The Request ID
- *
- * The request ID exists in the off chance that a packet is sent out-of-order. Of course, this library doesn't support
- * concurrent actions, so it's somewhat academic, here.
- *
- * @var Integer
- * @see Net_SFTP::_send_sftp_packet()
- * @access private
- */
- var $request_id = false;
-
- /**
- * The Packet Type
- *
- * The request ID exists in the off chance that a packet is sent out-of-order. Of course, this library doesn't support
- * concurrent actions, so it's somewhat academic, here.
- *
- * @var Integer
- * @see Net_SFTP::_get_sftp_packet()
- * @access private
- */
- var $packet_type = -1;
-
- /**
- * Packet Buffer
- *
- * @var String
- * @see Net_SFTP::_get_sftp_packet()
- * @access private
- */
- var $packet_buffer = '';
-
- /**
- * Extensions supported by the server
- *
- * @var Array
- * @see Net_SFTP::_initChannel()
- * @access private
- */
- var $extensions = array();
-
- /**
- * Server SFTP version
- *
- * @var Integer
- * @see Net_SFTP::_initChannel()
- * @access private
- */
- var $version;
-
- /**
- * Current working directory
- *
- * @var String
- * @see Net_SFTP::_realpath()
- * @see Net_SFTP::chdir()
- * @access private
- */
- var $pwd = false;
-
- /**
- * Packet Type Log
- *
- * @see Net_SFTP::getLog()
- * @var Array
- * @access private
- */
- var $packet_type_log = array();
-
- /**
- * Packet Log
- *
- * @see Net_SFTP::getLog()
- * @var Array
- * @access private
- */
- var $packet_log = array();
-
- /**
- * Error information
- *
- * @see Net_SFTP::getSFTPErrors()
- * @see Net_SFTP::getLastSFTPError()
- * @var String
- * @access private
- */
- var $sftp_errors = array();
-
- /**
- * Directory Cache
- *
- * Rather than always having to open a directory and close it immediately there after to see if a file is a directory or
- * rather than always
- *
- * @see Net_SFTP::_save_dir()
- * @see Net_SFTP::_remove_dir()
- * @see Net_SFTP::_is_dir()
- * @var Array
- * @access private
- */
- var $dirs = array();
-
- /**
- * Max SFTP Packet Size
- *
- * @see Net_SFTP::Net_SFTP()
- * @see Net_SFTP::get()
- * @var Array
- * @access private
- */
- var $max_sftp_packet;
-
- /**
- * Default Constructor.
- *
- * Connects to an SFTP server
- *
- * @param String $host
- * @param optional Integer $port
- * @param optional Integer $timeout
- * @return Net_SFTP
- * @access public
- */
- function Net_SFTP($host, $port = 22, $timeout = 10)
- {
- parent::Net_SSH2($host, $port, $timeout);
-
- $this->max_sftp_packet = 1 << 15;
-
- $this->packet_types = array(
- 1 => 'NET_SFTP_INIT',
- 2 => 'NET_SFTP_VERSION',
- /* the format of SSH_FXP_OPEN changed between SFTPv4 and SFTPv5+:
- SFTPv5+: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.1
- pre-SFTPv5 : http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.3 */
- 3 => 'NET_SFTP_OPEN',
- 4 => 'NET_SFTP_CLOSE',
- 5 => 'NET_SFTP_READ',
- 6 => 'NET_SFTP_WRITE',
- 7 => 'NET_SFTP_LSTAT',
- 9 => 'NET_SFTP_SETSTAT',
- 11 => 'NET_SFTP_OPENDIR',
- 12 => 'NET_SFTP_READDIR',
- 13 => 'NET_SFTP_REMOVE',
- 14 => 'NET_SFTP_MKDIR',
- 15 => 'NET_SFTP_RMDIR',
- 16 => 'NET_SFTP_REALPATH',
- 17 => 'NET_SFTP_STAT',
- /* the format of SSH_FXP_RENAME changed between SFTPv4 and SFTPv5+:
- SFTPv5+: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3
- pre-SFTPv5 : http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.5 */
- 18 => 'NET_SFTP_RENAME',
-
- 101=> 'NET_SFTP_STATUS',
- 102=> 'NET_SFTP_HANDLE',
- /* the format of SSH_FXP_NAME changed between SFTPv3 and SFTPv4+:
- SFTPv4+: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.4
- pre-SFTPv4 : http://tools.ietf.org/html/draft-ietf-secsh-filexfer-02#section-7 */
- 103=> 'NET_SFTP_DATA',
- 104=> 'NET_SFTP_NAME',
- 105=> 'NET_SFTP_ATTRS',
-
- 200=> 'NET_SFTP_EXTENDED'
- );
- $this->status_codes = array(
- 0 => 'NET_SFTP_STATUS_OK',
- 1 => 'NET_SFTP_STATUS_EOF',
- 2 => 'NET_SFTP_STATUS_NO_SUCH_FILE',
- 3 => 'NET_SFTP_STATUS_PERMISSION_DENIED',
- 4 => 'NET_SFTP_STATUS_FAILURE',
- 5 => 'NET_SFTP_STATUS_BAD_MESSAGE',
- 6 => 'NET_SFTP_STATUS_NO_CONNECTION',
- 7 => 'NET_SFTP_STATUS_CONNECTION_LOST',
- 8 => 'NET_SFTP_STATUS_OP_UNSUPPORTED',
- 9 => 'NET_SFTP_STATUS_INVALID_HANDLE',
- 10 => 'NET_SFTP_STATUS_NO_SUCH_PATH',
- 11 => 'NET_SFTP_STATUS_FILE_ALREADY_EXISTS',
- 12 => 'NET_SFTP_STATUS_WRITE_PROTECT',
- 13 => 'NET_SFTP_STATUS_NO_MEDIA',
- 14 => 'NET_SFTP_STATUS_NO_SPACE_ON_FILESYSTEM',
- 15 => 'NET_SFTP_STATUS_QUOTA_EXCEEDED',
- 16 => 'NET_SFTP_STATUS_UNKNOWN_PRINCIPAL',
- 17 => 'NET_SFTP_STATUS_LOCK_CONFLICT',
- 18 => 'NET_SFTP_STATUS_DIR_NOT_EMPTY',
- 19 => 'NET_SFTP_STATUS_NOT_A_DIRECTORY',
- 20 => 'NET_SFTP_STATUS_INVALID_FILENAME',
- 21 => 'NET_SFTP_STATUS_LINK_LOOP',
- 22 => 'NET_SFTP_STATUS_CANNOT_DELETE',
- 23 => 'NET_SFTP_STATUS_INVALID_PARAMETER',
- 24 => 'NET_SFTP_STATUS_FILE_IS_A_DIRECTORY',
- 25 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_CONFLICT',
- 26 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_REFUSED',
- 27 => 'NET_SFTP_STATUS_DELETE_PENDING',
- 28 => 'NET_SFTP_STATUS_FILE_CORRUPT',
- 29 => 'NET_SFTP_STATUS_OWNER_INVALID',
- 30 => 'NET_SFTP_STATUS_GROUP_INVALID',
- 31 => 'NET_SFTP_STATUS_NO_MATCHING_BYTE_RANGE_LOCK'
- );
- // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-7.1
- // the order, in this case, matters quite a lot - see Net_SFTP::_parseAttributes() to understand why
- $this->attributes = array(
- 0x00000001 => 'NET_SFTP_ATTR_SIZE',
- 0x00000002 => 'NET_SFTP_ATTR_UIDGID', // defined in SFTPv3, removed in SFTPv4+
- 0x00000004 => 'NET_SFTP_ATTR_PERMISSIONS',
- 0x00000008 => 'NET_SFTP_ATTR_ACCESSTIME',
- // 0x80000000 will yield a floating point on 32-bit systems and converting floating points to integers
- // yields inconsistent behavior depending on how php is compiled. so we left shift -1 (which, in
- // two's compliment, consists of all 1 bits) by 31. on 64-bit systems this'll yield 0xFFFFFFFF80000000.
- // that's not a problem, however, and 'anded' and a 32-bit number, as all the leading 1 bits are ignored.
- -1 << 31 => 'NET_SFTP_ATTR_EXTENDED'
- );
- // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.3
- // the flag definitions change somewhat in SFTPv5+. if SFTPv5+ support is added to this library, maybe name
- // the array for that $this->open5_flags and similarily alter the constant names.
- $this->open_flags = array(
- 0x00000001 => 'NET_SFTP_OPEN_READ',
- 0x00000002 => 'NET_SFTP_OPEN_WRITE',
- 0x00000004 => 'NET_SFTP_OPEN_APPEND',
- 0x00000008 => 'NET_SFTP_OPEN_CREATE',
- 0x00000010 => 'NET_SFTP_OPEN_TRUNCATE',
- 0x00000020 => 'NET_SFTP_OPEN_EXCL'
- );
- // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-5.2
- // see Net_SFTP::_parseLongname() for an explanation
- $this->file_types = array(
- 1 => 'NET_SFTP_TYPE_REGULAR',
- 2 => 'NET_SFTP_TYPE_DIRECTORY',
- 3 => 'NET_SFTP_TYPE_SYMLINK',
- 4 => 'NET_SFTP_TYPE_SPECIAL',
- 5 => 'NET_SFTP_TYPE_UNKNOWN',
- // the followin types were first defined for use in SFTPv5+
- // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-05#section-5.2
- 6 => 'NET_SFTP_TYPE_SOCKET',
- 7 => 'NET_SFTP_TYPE_CHAR_DEVICE',
- 8 => 'NET_SFTP_TYPE_BLOCK_DEVICE',
- 9 => 'NET_SFTP_TYPE_FIFO'
- );
- $this->_define_array(
- $this->packet_types,
- $this->status_codes,
- $this->attributes,
- $this->open_flags,
- $this->file_types
- );
-
- if (!defined('NET_SFTP_QUEUE_SIZE')) {
- define('NET_SFTP_QUEUE_SIZE', 50);
- }
- }
-
- /**
- * Login
- *
- * @param String $username
- * @param optional String $password
- * @return Boolean
- * @access public
- */
- function login($username)
- {
- $args = func_get_args();
- if (!call_user_func_array(array(&$this, '_login'), $args)) {
- return false;
- }
-
- $this->window_size_server_to_client[NET_SFTP_CHANNEL] = $this->window_size;
-
- $packet = pack('CNa*N3',
- NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', NET_SFTP_CHANNEL, $this->window_size, 0x4000);
-
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
-
- $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_OPEN;
-
- $response = $this->_get_channel_packet(NET_SFTP_CHANNEL);
- if ($response === false) {
- return false;
- }
-
- $packet = pack('CNNa*CNa*',
- NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SFTP_CHANNEL], strlen('subsystem'), 'subsystem', 1, strlen('sftp'), 'sftp');
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
-
- $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_REQUEST;
-
- $response = $this->_get_channel_packet(NET_SFTP_CHANNEL);
- if ($response === false) {
- // from PuTTY's psftp.exe
- $command = "test -x /usr/lib/sftp-server && exec /usr/lib/sftp-server\n" .
- "test -x /usr/local/lib/sftp-server && exec /usr/local/lib/sftp-server\n" .
- "exec sftp-server";
- // we don't do $this->exec($command, false) because exec() operates on a different channel and plus the SSH_MSG_CHANNEL_OPEN that exec() does
- // is redundant
- $packet = pack('CNNa*CNa*',
- NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SFTP_CHANNEL], strlen('exec'), 'exec', 1, strlen($command), $command);
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
-
- $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_REQUEST;
-
- $response = $this->_get_channel_packet(NET_SFTP_CHANNEL);
- if ($response === false) {
- return false;
- }
- }
-
- $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_DATA;
-
- if (!$this->_send_sftp_packet(NET_SFTP_INIT, "\0\0\0\3")) {
- return false;
- }
-
- $response = $this->_get_sftp_packet();
- if ($this->packet_type != NET_SFTP_VERSION) {
- user_error('Expected SSH_FXP_VERSION');
- return false;
- }
-
- extract(unpack('Nversion', $this->_string_shift($response, 4)));
- $this->version = $version;
- while (!empty($response)) {
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- $key = $this->_string_shift($response, $length);
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- $value = $this->_string_shift($response, $length);
- $this->extensions[$key] = $value;
- }
-
- /*
- SFTPv4+ defines a 'newline' extension. SFTPv3 seems to have unofficial support for it via 'newline@vandyke.com',
- however, I'm not sure what 'newline@vandyke.com' is supposed to do (the fact that it's unofficial means that it's
- not in the official SFTPv3 specs) and 'newline@vandyke.com' / 'newline' are likely not drop-in substitutes for
- one another due to the fact that 'newline' comes with a SSH_FXF_TEXT bitmask whereas it seems unlikely that
- 'newline@vandyke.com' would.
- */
- /*
- if (isset($this->extensions['newline@vandyke.com'])) {
- $this->extensions['newline'] = $this->extensions['newline@vandyke.com'];
- unset($this->extensions['newline@vandyke.com']);
- }
- */
-
- $this->request_id = 1;
-
- /*
- A Note on SFTPv4/5/6 support:
- states the following:
-
- "If the client wishes to interoperate with servers that support noncontiguous version
- numbers it SHOULD send '3'"
-
- Given that the server only sends its version number after the client has already done so, the above
- seems to be suggesting that v3 should be the default version. This makes sense given that v3 is the
- most popular.
-
- states the following;
-
- "If the server did not send the "versions" extension, or the version-from-list was not included, the
- server MAY send a status response describing the failure, but MUST then close the channel without
- processing any further requests."
-
- So what do you do if you have a client whose initial SSH_FXP_INIT packet says it implements v3 and
- a server whose initial SSH_FXP_VERSION reply says it implements v4 and only v4? If it only implements
- v4, the "versions" extension is likely not going to have been sent so version re-negotiation as discussed
- in draft-ietf-secsh-filexfer-13 would be quite impossible. As such, what Net_SFTP would do is close the
- channel and reopen it with a new and updated SSH_FXP_INIT packet.
- */
- switch ($this->version) {
- case 2:
- case 3:
- break;
- default:
- return false;
- }
-
- $this->pwd = $this->_realpath('.');
-
- $this->_save_dir($this->pwd);
-
- return true;
- }
-
- /**
- * Returns the current directory name
- *
- * @return Mixed
- * @access public
- */
- function pwd()
- {
- return $this->pwd;
- }
-
- /**
- * Logs errors
- *
- * @param String $response
- * @param optional Integer $status
- * @access public
- */
- function _logError($response, $status = -1)
- {
- if ($status == -1) {
- extract(unpack('Nstatus', $this->_string_shift($response, 4)));
- }
-
- $error = $this->status_codes[$status];
-
- if ($this->version > 2) {
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- $this->sftp_errors[] = $error . ': ' . $this->_string_shift($response, $length);
- } else {
- $this->sftp_errors[] = $error;
- }
- }
-
- /**
- * Canonicalize the Server-Side Path Name
- *
- * SFTP doesn't provide a mechanism by which the current working directory can be changed, so we'll emulate it. Returns
- * the absolute (canonicalized) path.
- *
- * @see Net_SFTP::chdir()
- * @param String $path
- * @return Mixed
- * @access private
- */
- function _realpath($path)
- {
- if ($this->pwd === false) {
- // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.9
- if (!$this->_send_sftp_packet(NET_SFTP_REALPATH, pack('Na*', strlen($path), $path))) {
- return false;
- }
-
- $response = $this->_get_sftp_packet();
- switch ($this->packet_type) {
- case NET_SFTP_NAME:
- // although SSH_FXP_NAME is implemented differently in SFTPv3 than it is in SFTPv4+, the following
- // should work on all SFTP versions since the only part of the SSH_FXP_NAME packet the following looks
- // at is the first part and that part is defined the same in SFTP versions 3 through 6.
- $this->_string_shift($response, 4); // skip over the count - it should be 1, anyway
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- return $this->_string_shift($response, $length);
- case NET_SFTP_STATUS:
- $this->_logError($response);
- return false;
- default:
- user_error('Expected SSH_FXP_NAME or SSH_FXP_STATUS');
- return false;
- }
- }
-
- if ($path[0] != '/') {
- $path = $this->pwd . '/' . $path;
- }
-
- $path = explode('/', $path);
- $new = array();
- foreach ($path as $dir) {
- if (!strlen($dir)) {
- continue;
- }
- switch ($dir) {
- case '..':
- array_pop($new);
- case '.':
- break;
- default:
- $new[] = $dir;
- }
- }
-
- return '/' . implode('/', $new);
- }
-
- /**
- * Changes the current directory
- *
- * @param String $dir
- * @return Boolean
- * @access public
- */
- function chdir($dir)
- {
- if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
- return false;
- }
-
- // assume current dir if $dir is empty
- if ($dir === '') {
- $dir = './';
- // suffix a slash if needed
- } elseif ($dir[strlen($dir) - 1] != '/') {
- $dir.= '/';
- }
-
- $dir = $this->_realpath($dir);
-
- // confirm that $dir is, in fact, a valid directory
- if ($this->_is_dir($dir)) {
- $this->pwd = $dir;
- return true;
- }
-
- // we could do a stat on the alleged $dir to see if it's a directory but that doesn't tell us
- // the currently logged in user has the appropriate permissions or not. maybe you could see if
- // the file's uid / gid match the currently logged in user's uid / gid but how there's no easy
- // way to get those with SFTP
-
- if (!$this->_send_sftp_packet(NET_SFTP_OPENDIR, pack('Na*', strlen($dir), $dir))) {
- return false;
- }
-
- // see Net_SFTP::nlist() for a more thorough explanation of the following
- $response = $this->_get_sftp_packet();
- switch ($this->packet_type) {
- case NET_SFTP_HANDLE:
- $handle = substr($response, 4);
- break;
- case NET_SFTP_STATUS:
- $this->_logError($response);
- return false;
- default:
- user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS');
- return false;
- }
-
- if (!$this->_close_handle($handle)) {
- return false;
- }
-
- $this->_save_dir($dir);
-
- $this->pwd = $dir;
- return true;
- }
-
- /**
- * Returns a list of files in the given directory
- *
- * @param optional String $dir
- * @return Mixed
- * @access public
- */
- function nlist($dir = '.')
- {
- return $this->_list($dir, false);
- }
-
- /**
- * Returns a detailed list of files in the given directory
- *
- * @param optional String $dir
- * @return Mixed
- * @access public
- */
- function rawlist($dir = '.')
- {
- return $this->_list($dir, true);
- }
-
- /**
- * Reads a list, be it detailed or not, of files in the given directory
- *
- * $realpath exists because, in the case of the recursive deletes and recursive chmod's $realpath has already
- * been calculated.
- *
- * @param String $dir
- * @param optional Boolean $raw
- * @param optional Boolean $realpath
- * @return Mixed
- * @access private
- */
- function _list($dir, $raw = true, $realpath = true)
- {
- if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
- return false;
- }
-
- $dir = $this->_realpath($dir . '/');
- if ($dir === false) {
- return false;
- }
-
- // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.2
- if (!$this->_send_sftp_packet(NET_SFTP_OPENDIR, pack('Na*', strlen($dir), $dir))) {
- return false;
- }
-
- $response = $this->_get_sftp_packet();
- switch ($this->packet_type) {
- case NET_SFTP_HANDLE:
- // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.2
- // since 'handle' is the last field in the SSH_FXP_HANDLE packet, we'll just remove the first four bytes that
- // represent the length of the string and leave it at that
- $handle = substr($response, 4);
- break;
- case NET_SFTP_STATUS:
- // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED
- $this->_logError($response);
- return false;
- default:
- user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS');
- return false;
- }
-
- $this->_save_dir($dir);
-
- $contents = array();
- while (true) {
- // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.2.2
- // why multiple SSH_FXP_READDIR packets would be sent when the response to a single one can span arbitrarily many
- // SSH_MSG_CHANNEL_DATA messages is not known to me.
- if (!$this->_send_sftp_packet(NET_SFTP_READDIR, pack('Na*', strlen($handle), $handle))) {
- return false;
- }
-
- $response = $this->_get_sftp_packet();
- switch ($this->packet_type) {
- case NET_SFTP_NAME:
- extract(unpack('Ncount', $this->_string_shift($response, 4)));
- for ($i = 0; $i < $count; $i++) {
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- $shortname = $this->_string_shift($response, $length);
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- $longname = $this->_string_shift($response, $length);
- $attributes = $this->_parseAttributes($response);
- if (!isset($attributes['type'])) {
- $fileType = $this->_parseLongname($longname);
- if ($fileType) {
- $attributes['type'] = $fileType;
- }
- }
- if (!$raw) {
- $contents[] = $shortname;
- } else {
- $contents[$shortname] = $attributes;
- }
-
- if (isset($attributes['type']) && $attributes['type'] == NET_SFTP_TYPE_DIRECTORY && ($shortname != '.' && $shortname != '..')) {
- $this->_save_dir($dir . '/' . $shortname);
- }
- // SFTPv6 has an optional boolean end-of-list field, but we'll ignore that, since the
- // final SSH_FXP_STATUS packet should tell us that, already.
- }
- break;
- case NET_SFTP_STATUS:
- extract(unpack('Nstatus', $this->_string_shift($response, 4)));
- if ($status != NET_SFTP_STATUS_EOF) {
- $this->_logError($response, $status);
- return false;
- }
- break 2;
- default:
- user_error('Expected SSH_FXP_NAME or SSH_FXP_STATUS');
- return false;
- }
- }
-
- if (!$this->_close_handle($handle)) {
- return false;
- }
-
- return $contents;
- }
-
- /**
- * Returns the file size, in bytes, or false, on failure
- *
- * Files larger than 4GB will show up as being exactly 4GB.
- *
- * @param String $filename
- * @return Mixed
- * @access public
- */
- function size($filename)
- {
- if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
- return false;
- }
-
- $filename = $this->_realpath($filename);
- if ($filename === false) {
- return false;
- }
-
- return $this->_size($filename);
- }
-
- /**
- * Save directories to cache
- *
- * @param String $dir
- * @access private
- */
- function _save_dir($dir)
- {
- // preg_replace('#^/|/(?=/)|/$#', '', $dir) == str_replace('//', '/', trim($dir, '/'))
- $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $dir));
-
- $temp = &$this->dirs;
- foreach ($dirs as $dir) {
- if (!isset($temp[$dir])) {
- $temp[$dir] = array();
- }
- $temp = &$temp[$dir];
- }
- }
-
- /**
- * Remove directories from cache
- *
- * @param String $dir
- * @access private
- */
- function _remove_dir($dir)
- {
- $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $dir));
-
- $temp = &$this->dirs;
- foreach ($dirs as $dir) {
- if ($dir == end($dirs)) {
- unset($temp[$dir]);
- return true;
- }
- if (!isset($temp[$dir])) {
- return false;
- }
- $temp = &$temp[$dir];
- }
- }
-
- /**
- * Checks cache for directory
- *
- * Mainly used by chdir, which is, in turn, also used for determining whether or not an individual
- * file is a directory or not by stat() and lstat()
- *
- * @param String $dir
- * @access private
- */
- function _is_dir($dir)
- {
- $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $dir));
-
- $temp = &$this->dirs;
- foreach ($dirs as $dir) {
- if (!isset($temp[$dir])) {
- return false;
- }
- $temp = &$temp[$dir];
- }
- return true;
- }
-
- /**
- * Returns general information about a file.
- *
- * Returns an array on success and false otherwise.
- *
- * @param String $filename
- * @return Mixed
- * @access public
- */
- function stat($filename)
- {
- if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
- return false;
- }
-
- $filename = $this->_realpath($filename);
- if ($filename === false) {
- return false;
- }
-
- $stat = $this->_stat($filename, NET_SFTP_STAT);
- if ($stat === false) {
- return false;
- }
- if (isset($stat['type'])) {
- return $stat;
- }
-
- $pwd = $this->pwd;
- $stat['type'] = $this->chdir($filename) ?
- NET_SFTP_TYPE_DIRECTORY :
- NET_SFTP_TYPE_REGULAR;
- $this->pwd = $pwd;
-
- return $stat;
- }
-
- /**
- * Returns general information about a file or symbolic link.
- *
- * Returns an array on success and false otherwise.
- *
- * @param String $filename
- * @return Mixed
- * @access public
- */
- function lstat($filename)
- {
- if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
- return false;
- }
-
- $filename = $this->_realpath($filename);
- if ($filename === false) {
- return false;
- }
-
- $lstat = $this->_stat($filename, NET_SFTP_LSTAT);
- if ($lstat === false) {
- return false;
- }
- if (isset($lstat['type'])) {
- return $lstat;
- }
-
- $stat = $this->_stat($filename, NET_SFTP_STAT);
-
- if ($lstat != $stat) {
- return array_merge($lstat, array('type' => NET_SFTP_TYPE_SYMLINK));
- }
-
- $pwd = $this->pwd;
- $lstat['type'] = $this->chdir($filename) ?
- NET_SFTP_TYPE_DIRECTORY :
- NET_SFTP_TYPE_REGULAR;
- $this->pwd = $pwd;
-
- return $lstat;
- }
-
- /**
- * Returns general information about a file or symbolic link
- *
- * Determines information without calling Net_SFTP::_realpath().
- * The second parameter can be either NET_SFTP_STAT or NET_SFTP_LSTAT.
- *
- * @param String $filename
- * @param Integer $type
- * @return Mixed
- * @access private
- */
- function _stat($filename, $type)
- {
- // SFTPv4+ adds an additional 32-bit integer field - flags - to the following:
- $packet = pack('Na*', strlen($filename), $filename);
- if (!$this->_send_sftp_packet($type, $packet)) {
- return false;
- }
-
- $response = $this->_get_sftp_packet();
- switch ($this->packet_type) {
- case NET_SFTP_ATTRS:
- return $this->_parseAttributes($response);
- case NET_SFTP_STATUS:
- $this->_logError($response);
- return false;
- }
-
- user_error('Expected SSH_FXP_ATTRS or SSH_FXP_STATUS');
- return false;
- }
-
- /**
- * Returns the file size, in bytes, or false, on failure
- *
- * Determines the size without calling Net_SFTP::_realpath()
- *
- * @param String $filename
- * @return Mixed
- * @access private
- */
- function _size($filename)
- {
- $result = $this->_stat($filename, NET_SFTP_STAT);
- if ($result === false) {
- return false;
- }
- return isset($result['size']) ? $result['size'] : -1;
- }
-
- /**
- * Truncates a file to a given length
- *
- * @param String $filename
- * @param Integer $new_size
- * @return Boolean
- * @access public
- */
- function truncate($filename, $new_size)
- {
- $attr = pack('N3', NET_SFTP_ATTR_SIZE, $new_size / 4294967296, $new_size); // 4294967296 == 0x100000000 == 1<<32
-
- return $this->_setstat($filename, $attr, false);
- }
-
- /**
- * Sets access and modification time of file.
- *
- * If the file does not exist, it will be created.
- *
- * @param String $filename
- * @param optional Integer $time
- * @param optional Integer $atime
- * @return Boolean
- * @access public
- */
- function touch($filename, $time = null, $atime = null)
- {
- if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
- return false;
- }
-
- $filename = $this->_realpath($filename);
- if ($filename === false) {
- return false;
- }
-
- if (!isset($time)) {
- $time = time();
- }
- if (!isset($atime)) {
- $atime = $time;
- }
-
- $flags = NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE | NET_SFTP_OPEN_EXCL;
- $attr = pack('N3', NET_SFTP_ATTR_ACCESSTIME, $time, $atime);
- $packet = pack('Na*Na*', strlen($filename), $filename, $flags, $attr);
- if (!$this->_send_sftp_packet(NET_SFTP_OPEN, $packet)) {
- return false;
- }
-
- $response = $this->_get_sftp_packet();
- switch ($this->packet_type) {
- case NET_SFTP_HANDLE:
- return $this->_close_handle(substr($response, 4));
- case NET_SFTP_STATUS:
- $this->_logError($response);
- break;
- default:
- user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS');
- return false;
- }
-
- return $this->_setstat($filename, $attr, false);
- }
-
- /**
- * Changes file or directory owner
- *
- * Returns true on success or false on error.
- *
- * @param String $filename
- * @param Integer $uid
- * @param optional Boolean $recursive
- * @return Boolean
- * @access public
- */
- function chown($filename, $uid, $recursive = false)
- {
- // quoting from ,
- // "if the owner or group is specified as -1, then that ID is not changed"
- $attr = pack('N3', NET_SFTP_ATTR_UIDGID, $uid, -1);
-
- return $this->_setstat($filename, $attr, $recursive);
- }
-
- /**
- * Changes file or directory group
- *
- * Returns true on success or false on error.
- *
- * @param String $filename
- * @param Integer $gid
- * @param optional Boolean $recursive
- * @return Boolean
- * @access public
- */
- function chgrp($filename, $gid, $recursive = false)
- {
- $attr = pack('N3', NET_SFTP_ATTR_UIDGID, -1, $gid);
-
- return $this->_setstat($filename, $attr, $recursive);
- }
-
- /**
- * Set permissions on a file.
- *
- * Returns the new file permissions on success or false on error.
- * If $recursive is true than this just returns true or false.
- *
- * @param Integer $mode
- * @param String $filename
- * @param optional Boolean $recursive
- * @return Mixed
- * @access public
- */
- function chmod($mode, $filename, $recursive = false)
- {
- if (is_string($mode) && is_int($filename)) {
- $temp = $mode;
- $mode = $filename;
- $filename = $temp;
- }
-
- $attr = pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777);
- if (!$this->_setstat($filename, $attr, $recursive)) {
- return false;
- }
- if ($recursive) {
- return true;
- }
-
- // rather than return what the permissions *should* be, we'll return what they actually are. this will also
- // tell us if the file actually exists.
- // incidentally, SFTPv4+ adds an additional 32-bit integer field - flags - to the following:
- $packet = pack('Na*', strlen($filename), $filename);
- if (!$this->_send_sftp_packet(NET_SFTP_STAT, $packet)) {
- return false;
- }
-
- $response = $this->_get_sftp_packet();
- switch ($this->packet_type) {
- case NET_SFTP_ATTRS:
- $attrs = $this->_parseAttributes($response);
- return $attrs['permissions'];
- case NET_SFTP_STATUS:
- $this->_logError($response);
- return false;
- }
-
- user_error('Expected SSH_FXP_ATTRS or SSH_FXP_STATUS');
- return false;
- }
-
- /**
- * Sets information about a file
- *
- * @param String $filename
- * @param String $attr
- * @param Boolean $recursive
- * @return Boolean
- * @access private
- */
- function _setstat($filename, $attr, $recursive)
- {
- if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
- return false;
- }
-
- $filename = $this->_realpath($filename);
- if ($filename === false) {
- return false;
- }
-
- if ($recursive) {
- $i = 0;
- $result = $this->_setstat_recursive($filename, $attr, $i);
- $this->_read_put_responses($i);
- return $result;
- }
-
- // SFTPv4+ has an additional byte field - type - that would need to be sent, as well. setting it to
- // SSH_FILEXFER_TYPE_UNKNOWN might work. if not, we'd have to do an SSH_FXP_STAT before doing an SSH_FXP_SETSTAT.
- if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($filename), $filename, $attr))) {
- return false;
- }
-
- /*
- "Because some systems must use separate system calls to set various attributes, it is possible that a failure
- response will be returned, but yet some of the attributes may be have been successfully modified. If possible,
- servers SHOULD avoid this situation; however, clients MUST be aware that this is possible."
-
- -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.6
- */
- $response = $this->_get_sftp_packet();
- if ($this->packet_type != NET_SFTP_STATUS) {
- user_error('Expected SSH_FXP_STATUS');
- return false;
- }
-
- extract(unpack('Nstatus', $this->_string_shift($response, 4)));
- if ($status != NET_SFTP_STATUS_OK) {
- $this->_logError($response, $status);
- return false;
- }
-
- return true;
- }
-
- /**
- * Recursively sets information on directories on the SFTP server
- *
- * Minimizes directory lookups and SSH_FXP_STATUS requests for speed.
- *
- * @param String $path
- * @param String $attr
- * @param Integer $i
- * @return Boolean
- * @access private
- */
- function _setstat_recursive($path, $attr, &$i)
- {
- if (!$this->_read_put_responses($i)) {
- return false;
- }
- $i = 0;
- $entries = $this->_list($path, true, false);
-
- if ($entries === false) {
- return $this->_setstat($path, $attr, false);
- }
-
- // normally $entries would have at least . and .. but it might not if the directories
- // permissions didn't allow reading
- if (empty($entries)) {
- return false;
- }
-
- foreach ($entries as $filename=>$props) {
- if ($filename == '.' || $filename == '..') {
- continue;
- }
-
- if (!isset($props['type'])) {
- return false;
- }
-
- $temp = $path . '/' . $filename;
- if ($props['type'] == NET_SFTP_TYPE_DIRECTORY) {
- if (!$this->_setstat_recursive($temp, $attr, $i)) {
- return false;
- }
- } else {
- if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($temp), $temp, $attr))) {
- return false;
- }
-
- $i++;
-
- if ($i >= NET_SFTP_QUEUE_SIZE) {
- if (!$this->_read_put_responses($i)) {
- return false;
- }
- $i = 0;
- }
- }
- }
-
- if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($path), $path, $attr))) {
- return false;
- }
-
- $i++;
-
- if ($i >= NET_SFTP_QUEUE_SIZE) {
- if (!$this->_read_put_responses($i)) {
- return false;
- }
- $i = 0;
- }
-
- return true;
- }
-
- /**
- * Creates a directory.
- *
- * @param String $dir
- * @return Boolean
- * @access public
- */
- function mkdir($dir, $mode = -1, $recursive = false)
- {
- if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
- return false;
- }
-
- $dir = $this->_realpath($dir);
- // by not providing any permissions, hopefully the server will use the logged in users umask - their
- // default permissions.
- $attr = $mode == -1 ? "\0\0\0\0" : pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777);
-
- if ($recursive) {
- $dirs = explode('/', preg_replace('#/(?=/)|/$#', '', $dir));
- if (empty($dirs[0])) {
- array_shift($dirs);
- $dirs[0] = '/' . $dirs[0];
- }
- for ($i = 0; $i < count($dirs); $i++) {
- $temp = array_slice($dirs, 0, $i + 1);
- $temp = implode('/', $temp);
- $result = $this->_mkdir_helper($temp, $attr);
- }
- return $result;
- }
-
- return $this->_mkdir_helper($dir, $attr);
- }
-
- /**
- * Helper function for directory creation
- *
- * @param String $dir
- * @return Boolean
- * @access private
- */
- function _mkdir_helper($dir, $attr)
- {
- if (!$this->_send_sftp_packet(NET_SFTP_MKDIR, pack('Na*a*', strlen($dir), $dir, $attr))) {
- return false;
- }
-
- $response = $this->_get_sftp_packet();
- if ($this->packet_type != NET_SFTP_STATUS) {
- user_error('Expected SSH_FXP_STATUS');
- return false;
- }
-
- extract(unpack('Nstatus', $this->_string_shift($response, 4)));
- if ($status != NET_SFTP_STATUS_OK) {
- $this->_logError($response, $status);
- return false;
- }
-
- $this->_save_dir($dir);
-
- return true;
- }
-
- /**
- * Removes a directory.
- *
- * @param String $dir
- * @return Boolean
- * @access public
- */
- function rmdir($dir)
- {
- if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
- return false;
- }
-
- $dir = $this->_realpath($dir);
- if ($dir === false) {
- return false;
- }
-
- if (!$this->_send_sftp_packet(NET_SFTP_RMDIR, pack('Na*', strlen($dir), $dir))) {
- return false;
- }
-
- $response = $this->_get_sftp_packet();
- if ($this->packet_type != NET_SFTP_STATUS) {
- user_error('Expected SSH_FXP_STATUS');
- return false;
- }
-
- extract(unpack('Nstatus', $this->_string_shift($response, 4)));
- if ($status != NET_SFTP_STATUS_OK) {
- // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED?
- $this->_logError($response, $status);
- return false;
- }
-
- $this->_remove_dir($dir);
-
- return true;
- }
-
- /**
- * Uploads a file to the SFTP server.
- *
- * By default, Net_SFTP::put() does not read from the local filesystem. $data is dumped directly into $remote_file.
- * So, for example, if you set $data to 'filename.ext' and then do Net_SFTP::get(), you will get a file, twelve bytes
- * long, containing 'filename.ext' as its contents.
- *
- * Setting $mode to NET_SFTP_LOCAL_FILE will change the above behavior. With NET_SFTP_LOCAL_FILE, $remote_file will
- * contain as many bytes as filename.ext does on your local filesystem. If your filename.ext is 1MB then that is how
- * large $remote_file will be, as well.
- *
- * Currently, only binary mode is supported. As such, if the line endings need to be adjusted, you will need to take
- * care of that, yourself.
- *
- * $mode can take an additional two parameters - NET_SFTP_RESUME and NET_SFTP_RESUME_START. These are bitwise AND'd with
- * $mode. So if you want to resume upload of a 300mb file on the local file system you'd set $mode to the following:
- *
- * NET_SFTP_LOCAL_FILE | NET_SFTP_RESUME
- *
- * If you wanted to simply append the full contents of a local file to the full contents of a remote file you'd replace
- * NET_SFTP_RESUME with NET_SFTP_RESUME_START.
- *
- * If $mode & (NET_SFTP_RESUME | NET_SFTP_RESUME_START) then NET_SFTP_RESUME_START will be assumed.
- *
- * $start and $local_start give you more fine grained control over this process and take precident over NET_SFTP_RESUME
- * when they're non-negative. ie. $start could let you write at the end of a file (like NET_SFTP_RESUME) or in the middle
- * of one. $local_start could let you start your reading from the end of a file (like NET_SFTP_RESUME_START) or in the
- * middle of one.
- *
- * Setting $local_start to > 0 or $mode | NET_SFTP_RESUME_START doesn't do anything unless $mode | NET_SFTP_LOCAL_FILE.
- *
- * @param String $remote_file
- * @param String $data
- * @param optional Integer $mode
- * @param optional Integer $start
- * @param optional Integer $local_start
- * @return Boolean
- * @access public
- * @internal ASCII mode for SFTPv4/5/6 can be supported by adding a new function - Net_SFTP::setMode().
- */
- function put($remote_file, $data, $mode = NET_SFTP_STRING, $start = -1, $local_start = -1)
- {
- if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
- return false;
- }
-
- $remote_file = $this->_realpath($remote_file);
- if ($remote_file === false) {
- return false;
- }
-
- $flags = NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE;
- // according to the SFTP specs, NET_SFTP_OPEN_APPEND should "force all writes to append data at the end of the file."
- // in practice, it doesn't seem to do that.
- //$flags|= ($mode & NET_SFTP_RESUME) ? NET_SFTP_OPEN_APPEND : NET_SFTP_OPEN_TRUNCATE;
-
- if ($start >= 0) {
- $offset = $start;
- } elseif ($mode & NET_SFTP_RESUME) {
- // if NET_SFTP_OPEN_APPEND worked as it should _size() wouldn't need to be called
- $size = $this->_size($remote_file);
- $offset = $size !== false ? $size : 0;
- } else {
- $offset = 0;
- $flags|= NET_SFTP_OPEN_TRUNCATE;
- }
-
- $packet = pack('Na*N2', strlen($remote_file), $remote_file, $flags, 0);
- if (!$this->_send_sftp_packet(NET_SFTP_OPEN, $packet)) {
- return false;
- }
-
- $response = $this->_get_sftp_packet();
- switch ($this->packet_type) {
- case NET_SFTP_HANDLE:
- $handle = substr($response, 4);
- break;
- case NET_SFTP_STATUS:
- $this->_logError($response);
- return false;
- default:
- user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS');
- return false;
- }
-
- // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.2.3
- if ($mode & NET_SFTP_LOCAL_FILE) {
- if (!is_file($data)) {
- user_error("$data is not a valid file");
- return false;
- }
- $fp = @fopen($data, 'rb');
- if (!$fp) {
- return false;
- }
- $size = filesize($data);
-
- if ($local_start >= 0) {
- fseek($fp, $local_start);
- } elseif ($mode & NET_SFTP_RESUME_START) {
- // do nothing
- } else {
- fseek($fp, $offset);
- }
- } else {
- $size = strlen($data);
- }
-
- $sent = 0;
- $size = $size < 0 ? ($size & 0x7FFFFFFF) + 0x80000000 : $size;
-
- $sftp_packet_size = 4096; // PuTTY uses 4096
- // make the SFTP packet be exactly 4096 bytes by including the bytes in the NET_SFTP_WRITE packets "header"
- $sftp_packet_size-= strlen($handle) + 25;
- $i = 0;
- while ($sent < $size) {
- $temp = $mode & NET_SFTP_LOCAL_FILE ? fread($fp, $sftp_packet_size) : substr($data, $sent, $sftp_packet_size);
- $subtemp = $offset + $sent;
- $packet = pack('Na*N3a*', strlen($handle), $handle, $subtemp / 4294967296, $subtemp, strlen($temp), $temp);
- if (!$this->_send_sftp_packet(NET_SFTP_WRITE, $packet)) {
- fclose($fp);
- return false;
- }
- $sent+= strlen($temp);
-
- $i++;
-
- if ($i == NET_SFTP_QUEUE_SIZE) {
- if (!$this->_read_put_responses($i)) {
- $i = 0;
- break;
- }
- $i = 0;
- }
- }
-
- if (!$this->_read_put_responses($i)) {
- if ($mode & NET_SFTP_LOCAL_FILE) {
- fclose($fp);
- }
- $this->_close_handle($handle);
- return false;
- }
-
- if ($mode & NET_SFTP_LOCAL_FILE) {
- fclose($fp);
- }
-
- return $this->_close_handle($handle);
- }
-
- /**
- * Reads multiple successive SSH_FXP_WRITE responses
- *
- * Sending an SSH_FXP_WRITE packet and immediately reading its response isn't as efficient as blindly sending out $i
- * SSH_FXP_WRITEs, in succession, and then reading $i responses.
- *
- * @param Integer $i
- * @return Boolean
- * @access private
- */
- function _read_put_responses($i)
- {
- while ($i--) {
- $response = $this->_get_sftp_packet();
- if ($this->packet_type != NET_SFTP_STATUS) {
- user_error('Expected SSH_FXP_STATUS');
- return false;
- }
-
- extract(unpack('Nstatus', $this->_string_shift($response, 4)));
- if ($status != NET_SFTP_STATUS_OK) {
- $this->_logError($response, $status);
- break;
- }
- }
-
- return $i < 0;
- }
-
- /**
- * Close handle
- *
- * @param String $handle
- * @return Boolean
- * @access private
- */
- function _close_handle($handle)
- {
- if (!$this->_send_sftp_packet(NET_SFTP_CLOSE, pack('Na*', strlen($handle), $handle))) {
- return false;
- }
-
- // "The client MUST release all resources associated with the handle regardless of the status."
- // -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.3
- $response = $this->_get_sftp_packet();
- if ($this->packet_type != NET_SFTP_STATUS) {
- user_error('Expected SSH_FXP_STATUS');
- return false;
- }
-
- extract(unpack('Nstatus', $this->_string_shift($response, 4)));
- if ($status != NET_SFTP_STATUS_OK) {
- $this->_logError($response, $status);
- return false;
- }
-
- return true;
- }
-
- /**
- * Downloads a file from the SFTP server.
- *
- * Returns a string containing the contents of $remote_file if $local_file is left undefined or a boolean false if
- * the operation was unsuccessful. If $local_file is defined, returns true or false depending on the success of the
- * operation.
- *
- * $offset and $length can be used to download files in chunks.
- *
- * @param String $remote_file
- * @param optional String $local_file
- * @param optional Integer $offset
- * @param optional Integer $length
- * @return Mixed
- * @access public
- */
- function get($remote_file, $local_file = false, $offset = 0, $length = -1)
- {
- if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
- return false;
- }
-
- $remote_file = $this->_realpath($remote_file);
- if ($remote_file === false) {
- return false;
- }
-
- $packet = pack('Na*N2', strlen($remote_file), $remote_file, NET_SFTP_OPEN_READ, 0);
- if (!$this->_send_sftp_packet(NET_SFTP_OPEN, $packet)) {
- return false;
- }
-
- $response = $this->_get_sftp_packet();
- switch ($this->packet_type) {
- case NET_SFTP_HANDLE:
- $handle = substr($response, 4);
- break;
- case NET_SFTP_STATUS: // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED
- $this->_logError($response);
- return false;
- default:
- user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS');
- return false;
- }
-
- if ($local_file !== false) {
- $fp = fopen($local_file, 'wb');
- if (!$fp) {
- return false;
- }
- } else {
- $content = '';
- }
-
- $start = $offset;
- $size = $this->max_sftp_packet < $length || $length < 0 ? $this->max_sftp_packet : $length;
- while (true) {
- $packet = pack('Na*N3', strlen($handle), $handle, $offset / 4294967296, $offset, $size);
- if (!$this->_send_sftp_packet(NET_SFTP_READ, $packet)) {
- if ($local_file !== false) {
- fclose($fp);
- }
- return false;
- }
-
- $response = $this->_get_sftp_packet();
- switch ($this->packet_type) {
- case NET_SFTP_DATA:
- $temp = substr($response, 4);
- $offset+= strlen($temp);
- if ($local_file === false) {
- $content.= $temp;
- } else {
- fputs($fp, $temp);
- }
- break;
- case NET_SFTP_STATUS:
- // could, in theory, return false if !strlen($content) but we'll hold off for the time being
- $this->_logError($response);
- break 2;
- default:
- user_error('Expected SSH_FXP_DATA or SSH_FXP_STATUS');
- if ($local_file !== false) {
- fclose($fp);
- }
- return false;
- }
-
- if ($length > 0 && $length <= $offset - $start) {
- break;
- }
- }
-
- if ($length > 0 && $length <= $offset - $start) {
- if ($local_file === false) {
- $content = substr($content, 0, $length);
- } else {
- ftruncate($fp, $length);
- }
- }
-
- if ($local_file !== false) {
- fclose($fp);
- }
-
- if (!$this->_close_handle($handle)) {
- return false;
- }
-
- // if $content isn't set that means a file was written to
- return isset($content) ? $content : true;
- }
-
- /**
- * Deletes a file on the SFTP server.
- *
- * @param String $path
- * @param Boolean $recursive
- * @return Boolean
- * @access public
- */
- function delete($path, $recursive = true)
- {
- if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
- return false;
- }
-
- $path = $this->_realpath($path);
- if ($path === false) {
- return false;
- }
-
- // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3
- if (!$this->_send_sftp_packet(NET_SFTP_REMOVE, pack('Na*', strlen($path), $path))) {
- return false;
- }
-
- $response = $this->_get_sftp_packet();
- if ($this->packet_type != NET_SFTP_STATUS) {
- user_error('Expected SSH_FXP_STATUS');
- return false;
- }
-
- // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED
- extract(unpack('Nstatus', $this->_string_shift($response, 4)));
- if ($status != NET_SFTP_STATUS_OK) {
- $this->_logError($response, $status);
- if (!$recursive) {
- return false;
- }
- $i = 0;
- $result = $this->_delete_recursive($path, $i);
- $this->_read_put_responses($i);
- return $result;
- }
-
- return true;
- }
-
- /**
- * Recursively deletes directories on the SFTP server
- *
- * Minimizes directory lookups and SSH_FXP_STATUS requests for speed.
- *
- * @param String $path
- * @param Integer $i
- * @return Boolean
- * @access private
- */
- function _delete_recursive($path, &$i)
- {
- if (!$this->_read_put_responses($i)) {
- return false;
- }
- $i = 0;
- $entries = $this->_list($path, true, false);
-
- // normally $entries would have at least . and .. but it might not if the directories
- // permissions didn't allow reading
- if (empty($entries)) {
- return false;
- }
-
- foreach ($entries as $filename=>$props) {
- if ($filename == '.' || $filename == '..') {
- continue;
- }
-
- if (!isset($props['type'])) {
- return false;
- }
-
- $temp = $path . '/' . $filename;
- if ($props['type'] == NET_SFTP_TYPE_DIRECTORY) {
- if (!$this->_delete_recursive($temp, $i)) {
- return false;
- }
- } else {
- if (!$this->_send_sftp_packet(NET_SFTP_REMOVE, pack('Na*', strlen($temp), $temp))) {
- return false;
- }
-
- $i++;
-
- if ($i >= NET_SFTP_QUEUE_SIZE) {
- if (!$this->_read_put_responses($i)) {
- return false;
- }
- $i = 0;
- }
- }
- }
-
- if (!$this->_send_sftp_packet(NET_SFTP_RMDIR, pack('Na*', strlen($path), $path))) {
- return false;
- }
- $this->_remove_dir($path);
-
- $i++;
-
- if ($i >= NET_SFTP_QUEUE_SIZE) {
- if (!$this->_read_put_responses($i)) {
- return false;
- }
- $i = 0;
- }
-
- return true;
- }
-
- /**
- * Renames a file or a directory on the SFTP server
- *
- * @param String $oldname
- * @param String $newname
- * @return Boolean
- * @access public
- */
- function rename($oldname, $newname)
- {
- if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
- return false;
- }
-
- $oldname = $this->_realpath($oldname);
- $newname = $this->_realpath($newname);
- if ($oldname === false || $newname === false) {
- return false;
- }
-
- // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3
- $packet = pack('Na*Na*', strlen($oldname), $oldname, strlen($newname), $newname);
- if (!$this->_send_sftp_packet(NET_SFTP_RENAME, $packet)) {
- return false;
- }
-
- $response = $this->_get_sftp_packet();
- if ($this->packet_type != NET_SFTP_STATUS) {
- user_error('Expected SSH_FXP_STATUS');
- return false;
- }
-
- // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED
- extract(unpack('Nstatus', $this->_string_shift($response, 4)));
- if ($status != NET_SFTP_STATUS_OK) {
- $this->_logError($response, $status);
- return false;
- }
-
- return true;
- }
-
- /**
- * Parse Attributes
- *
- * See '7. File Attributes' of draft-ietf-secsh-filexfer-13 for more info.
- *
- * @param String $response
- * @return Array
- * @access private
- */
- function _parseAttributes(&$response)
- {
- $attr = array();
- extract(unpack('Nflags', $this->_string_shift($response, 4)));
- // SFTPv4+ have a type field (a byte) that follows the above flag field
- foreach ($this->attributes as $key => $value) {
- switch ($flags & $key) {
- case NET_SFTP_ATTR_SIZE: // 0x00000001
- // size is represented by a 64-bit integer, so we perhaps ought to be doing the following:
- // $attr['size'] = new Math_BigInteger($this->_string_shift($response, 8), 256);
- // of course, you shouldn't be using Net_SFTP to transfer files that are in excess of 4GB
- // (0xFFFFFFFF bytes), anyway. as such, we'll just represent all file sizes that are bigger than
- // 4GB as being 4GB.
- extract(unpack('Nupper/Nsize', $this->_string_shift($response, 8)));
- $attr['size'] = $upper ? 4294967296 * $upper : 0;
- $attr['size']+= $size < 0 ? ($size & 0x7FFFFFFF) + 0x80000000 : $size;
- break;
- case NET_SFTP_ATTR_UIDGID: // 0x00000002 (SFTPv3 only)
- $attr+= unpack('Nuid/Ngid', $this->_string_shift($response, 8));
- break;
- case NET_SFTP_ATTR_PERMISSIONS: // 0x00000004
- $attr+= unpack('Npermissions', $this->_string_shift($response, 4));
- // mode == permissions; permissions was the original array key and is retained for bc purposes.
- // mode was added because that's the more industry standard terminology
- $attr+= array('mode' => $attr['permissions']);
- $fileType = $this->_parseMode($attr['permissions']);
- if ($fileType !== false) {
- $attr+= array('type' => $fileType);
- }
- break;
- case NET_SFTP_ATTR_ACCESSTIME: // 0x00000008
- $attr+= unpack('Natime/Nmtime', $this->_string_shift($response, 8));
- break;
- case NET_SFTP_ATTR_EXTENDED: // 0x80000000
- extract(unpack('Ncount', $this->_string_shift($response, 4)));
- for ($i = 0; $i < $count; $i++) {
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- $key = $this->_string_shift($response, $length);
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- $attr[$key] = $this->_string_shift($response, $length);
- }
- }
- }
- return $attr;
- }
-
- /**
- * Attempt to identify the file type
- *
- * Quoting the SFTP RFC, "Implementations MUST NOT send bits that are not defined" but they seem to anyway
- *
- * @param Integer $mode
- * @return Integer
- * @access private
- */
- function _parseMode($mode)
- {
- // values come from http://lxr.free-electrons.com/source/include/uapi/linux/stat.h#L12
- // see, also, http://linux.die.net/man/2/stat
- switch ($mode & 0170000) {// ie. 1111 0000 0000 0000
- case 0000000: // no file type specified - figure out the file type using alternative means
- return false;
- case 0040000:
- return NET_SFTP_TYPE_DIRECTORY;
- case 0100000:
- return NET_SFTP_TYPE_REGULAR;
- case 0120000:
- return NET_SFTP_TYPE_SYMLINK;
- // new types introduced in SFTPv5+
- // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-05#section-5.2
- case 0010000: // named pipe (fifo)
- return NET_SFTP_TYPE_FIFO;
- case 0020000: // character special
- return NET_SFTP_TYPE_CHAR_DEVICE;
- case 0060000: // block special
- return NET_SFTP_BLOCK_DEVICE;
- case 0140000: // socket
- return NET_SFTP_TYPE_SOCKET;
- case 0160000: // whiteout
- // "SPECIAL should be used for files that are of
- // a known type which cannot be expressed in the protocol"
- return NET_SFTP_TYPE_SPECIAL;
- default:
- return NET_SFTP_TYPE_UNKNOWN;
- }
- }
-
- /**
- * Parse Longname
- *
- * SFTPv3 doesn't provide any easy way of identifying a file type. You could try to open
- * a file as a directory and see if an error is returned or you could try to parse the
- * SFTPv3-specific longname field of the SSH_FXP_NAME packet. That's what this function does.
- * The result is returned using the
- * {@link http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-5.2 SFTPv4 type constants}.
- *
- * If the longname is in an unrecognized format bool(false) is returned.
- *
- * @param String $longname
- * @return Mixed
- * @access private
- */
- function _parseLongname($longname)
- {
- // http://en.wikipedia.org/wiki/Unix_file_types
- // http://en.wikipedia.org/wiki/Filesystem_permissions#Notation_of_traditional_Unix_permissions
- if (preg_match('#^[^/]([r-][w-][xstST-]){3}#', $longname)) {
- switch ($longname[0]) {
- case '-':
- return NET_SFTP_TYPE_REGULAR;
- case 'd':
- return NET_SFTP_TYPE_DIRECTORY;
- case 'l':
- return NET_SFTP_TYPE_SYMLINK;
- default:
- return NET_SFTP_TYPE_SPECIAL;
- }
- }
-
- return false;
- }
-
- /**
- * Sends SFTP Packets
- *
- * See '6. General Packet Format' of draft-ietf-secsh-filexfer-13 for more info.
- *
- * @param Integer $type
- * @param String $data
- * @see Net_SFTP::_get_sftp_packet()
- * @see Net_SSH2::_send_channel_packet()
- * @return Boolean
- * @access private
- */
- function _send_sftp_packet($type, $data)
- {
- $packet = $this->request_id !== false ?
- pack('NCNa*', strlen($data) + 5, $type, $this->request_id, $data) :
- pack('NCa*', strlen($data) + 1, $type, $data);
-
- $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838
- $result = $this->_send_channel_packet(NET_SFTP_CHANNEL, $packet);
- $stop = strtok(microtime(), ' ') + strtok('');
-
- if (defined('NET_SFTP_LOGGING')) {
- $packet_type = '-> ' . $this->packet_types[$type] .
- ' (' . round($stop - $start, 4) . 's)';
- if (NET_SFTP_LOGGING == NET_SFTP_LOG_REALTIME) {
- echo "\r\n" . $this->_format_log(array($data), array($packet_type)) . "\r\n \r\n";
- flush();
- ob_flush();
- } else {
- $this->packet_type_log[] = $packet_type;
- if (NET_SFTP_LOGGING == NET_SFTP_LOG_COMPLEX) {
- $this->packet_log[] = $data;
- }
- }
- }
-
- return $result;
- }
-
- /**
- * Receives SFTP Packets
- *
- * See '6. General Packet Format' of draft-ietf-secsh-filexfer-13 for more info.
- *
- * Incidentally, the number of SSH_MSG_CHANNEL_DATA messages has no bearing on the number of SFTP packets present.
- * There can be one SSH_MSG_CHANNEL_DATA messages containing two SFTP packets or there can be two SSH_MSG_CHANNEL_DATA
- * messages containing one SFTP packet.
- *
- * @see Net_SFTP::_send_sftp_packet()
- * @return String
- * @access private
- */
- function _get_sftp_packet()
- {
- $this->curTimeout = false;
-
- $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838
-
- // SFTP packet length
- while (strlen($this->packet_buffer) < 4) {
- $temp = $this->_get_channel_packet(NET_SFTP_CHANNEL);
- if (is_bool($temp)) {
- $this->packet_type = false;
- $this->packet_buffer = '';
- return false;
- }
- $this->packet_buffer.= $temp;
- }
- extract(unpack('Nlength', $this->_string_shift($this->packet_buffer, 4)));
- $tempLength = $length;
- $tempLength-= strlen($this->packet_buffer);
-
- // SFTP packet type and data payload
- while ($tempLength > 0) {
- $temp = $this->_get_channel_packet(NET_SFTP_CHANNEL);
- if (is_bool($temp)) {
- $this->packet_type = false;
- $this->packet_buffer = '';
- return false;
- }
- $this->packet_buffer.= $temp;
- $tempLength-= strlen($temp);
- }
-
- $stop = strtok(microtime(), ' ') + strtok('');
-
- $this->packet_type = ord($this->_string_shift($this->packet_buffer));
-
- if ($this->request_id !== false) {
- $this->_string_shift($this->packet_buffer, 4); // remove the request id
- $length-= 5; // account for the request id and the packet type
- } else {
- $length-= 1; // account for the packet type
- }
-
- $packet = $this->_string_shift($this->packet_buffer, $length);
-
- if (defined('NET_SFTP_LOGGING')) {
- $packet_type = '<- ' . $this->packet_types[$this->packet_type] .
- ' (' . round($stop - $start, 4) . 's)';
- if (NET_SFTP_LOGGING == NET_SFTP_LOG_REALTIME) {
- echo "\r\n" . $this->_format_log(array($packet), array($packet_type)) . "\r\n \r\n";
- flush();
- ob_flush();
- } else {
- $this->packet_type_log[] = $packet_type;
- if (NET_SFTP_LOGGING == NET_SFTP_LOG_COMPLEX) {
- $this->packet_log[] = $packet;
- }
- }
- }
-
- return $packet;
- }
-
- /**
- * Returns a log of the packets that have been sent and received.
- *
- * Returns a string if NET_SFTP_LOGGING == NET_SFTP_LOG_COMPLEX, an array if NET_SFTP_LOGGING == NET_SFTP_LOG_SIMPLE and false if !defined('NET_SFTP_LOGGING')
- *
- * @access public
- * @return String or Array
- */
- function getSFTPLog()
- {
- if (!defined('NET_SFTP_LOGGING')) {
- return false;
- }
-
- switch (NET_SFTP_LOGGING) {
- case NET_SFTP_LOG_COMPLEX:
- return $this->_format_log($this->packet_log, $this->packet_type_log);
- break;
- //case NET_SFTP_LOG_SIMPLE:
- default:
- return $this->packet_type_log;
- }
- }
-
- /**
- * Returns all errors
- *
- * @return String
- * @access public
- */
- function getSFTPErrors()
- {
- return $this->sftp_errors;
- }
-
- /**
- * Returns the last error
- *
- * @return String
- * @access public
- */
- function getLastSFTPError()
- {
- return count($this->sftp_errors) ? $this->sftp_errors[count($this->sftp_errors) - 1] : '';
- }
-
- /**
- * Get supported SFTP versions
- *
- * @return Array
- * @access public
- */
- function getSupportedVersions()
- {
- $temp = array('version' => $this->version);
- if (isset($this->extensions['versions'])) {
- $temp['extensions'] = $this->extensions['versions'];
- }
- return $temp;
- }
-
- /**
- * Disconnect
- *
- * @param Integer $reason
- * @return Boolean
- * @access private
- */
- function _disconnect($reason)
- {
- $this->pwd = false;
- parent::_disconnect($reason);
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Net/SFTP/Stream.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Net/SFTP/Stream.php
deleted file mode 100644
index 48b79b3ef7f55eb1d4b37d0ff3dd00ce5bbc4145..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Net/SFTP/Stream.php
+++ /dev/null
@@ -1,775 +0,0 @@
-
- * @copyright MMXIII Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- */
-
-/**
- * SFTP Stream Wrapper
- *
- * @package Net_SFTP_Stream
- * @author Jim Wigginton
- * @version 0.3.2
- * @access public
- */
-class Net_SFTP_Stream
-{
- /**
- * SFTP instances
- *
- * Rather than re-create the connection we re-use instances if possible
- *
- * @var Array
- * @access static
- */
- static $instances;
-
- /**
- * SFTP instance
- *
- * @var Object
- * @access private
- */
- var $sftp;
-
- /**
- * Path
- *
- * @var String
- * @access private
- */
- var $path;
-
- /**
- * Mode
- *
- * @var String
- * @access private
- */
- var $mode;
-
- /**
- * Position
- *
- * @var Integer
- * @access private
- */
- var $pos;
-
- /**
- * Size
- *
- * @var Integer
- * @access private
- */
- var $size;
-
- /**
- * Directory entries
- *
- * @var Array
- * @access private
- */
- var $entries;
-
- /**
- * EOF flag
- *
- * @var Boolean
- * @access private
- */
- var $eof;
-
- /**
- * Context resource
- *
- * Technically this needs to be publically accessible so PHP can set it directly
- *
- * @var Resource
- * @access public
- */
- var $context;
-
- /**
- * Notification callback function
- *
- * @var Callable
- * @access public
- */
- var $notification;
-
- /**
- * The Constructor
- *
- * @access public
- */
- function Net_SFTP_Stream()
- {
- if (defined('NET_SFTP_STREAM_LOGGING')) {
- echo "__construct()\r\n";
- }
-
- if (!class_exists('Net_SFTP')) {
- include_once 'Net/SFTP.php';
- }
- }
-
- /**
- * Path Parser
- *
- * Extract a path from a URI and actually connect to an SSH server if appropriate
- *
- * If "notification" is set as a context parameter the message code for successful login is
- * NET_SSH2_MSG_USERAUTH_SUCCESS. For a failed login it's NET_SSH2_MSG_USERAUTH_FAILURE.
- *
- * @param String $path
- * @return String
- * @access private
- */
- function _parse_path($path)
- {
- extract(parse_url($path) + array('port' => 22));
-
- if (!isset($host)) {
- return false;
- }
-
- if (isset($this->context)) {
- $context = stream_context_get_params($this->context);
- if (isset($context['notification'])) {
- $this->notification = $context['notification'];
- }
- }
-
- if ($host[0] == '$') {
- $host = substr($host, 1);
- global $$host;
- if (!is_object($$host) || get_class($$host) != 'Net_SFTP') {
- return false;
- }
- $this->sftp = $$host;
- } else {
- if (isset($this->context)) {
- $context = stream_context_get_options($this->context);
- }
- if (isset($context['sftp']['session'])) {
- $sftp = $context['sftp']['session'];
- }
- if (isset($context['sftp']['sftp'])) {
- $sftp = $context['sftp']['sftp'];
- }
- if (isset($sftp) && is_object($sftp) && get_class($sftp) == 'Net_SFTP') {
- $this->sftp = $sftp;
- return $path;
- }
- if (isset($context['sftp']['username'])) {
- $user = $context['sftp']['username'];
- }
- if (isset($context['sftp']['password'])) {
- $pass = $context['sftp']['password'];
- }
- if (isset($context['sftp']['privkey']) && is_object($context['sftp']['privkey']) && get_Class($context['sftp']['privkey']) == 'Crypt_RSA') {
- $pass = $context['sftp']['privkey'];
- }
-
- if (!isset($user) || !isset($pass)) {
- return false;
- }
-
- // casting $pass to a string is necessary in the event that it's a Crypt_RSA object
- if (isset(self::$instances[$host][$port][$user][(string) $pass])) {
- $this->sftp = self::$instances[$host][$port][$user][(string) $pass];
- } else {
- $this->sftp = new Net_SFTP($host, $port);
- if (isset($this->notification) && is_callable($this->notification)) {
- /* if !is_callable($this->notification) we could do this:
-
- user_error('fopen(): failed to call user notifier', E_USER_WARNING);
-
- the ftp wrapper gives errors like that when the notifier isn't callable.
- i've opted not to do that, however, since the ftp wrapper gives the line
- on which the fopen occurred as the line number - not the line that the
- user_error is on.
- */
- call_user_func($this->notification, STREAM_NOTIFY_CONNECT, STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0);
- call_user_func($this->notification, STREAM_NOTIFY_AUTH_REQUIRED, STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0);
- if (!$this->sftp->login($user, $pass)) {
- call_user_func($this->notification, STREAM_NOTIFY_AUTH_RESULT, STREAM_NOTIFY_SEVERITY_ERR, 'Login Failure', NET_SSH2_MSG_USERAUTH_FAILURE, 0, 0);
- return false;
- }
- call_user_func($this->notification, STREAM_NOTIFY_AUTH_RESULT, STREAM_NOTIFY_SEVERITY_INFO, 'Login Success', NET_SSH2_MSG_USERAUTH_SUCCESS, 0, 0);
- } else {
- if (!$this->sftp->login($user, $pass)) {
- return false;
- }
- }
- self::$instances[$host][$port][$user][(string) $pass] = $this->sftp;
- }
- }
-
- return $path;
- }
-
- /**
- * Opens file or URL
- *
- * @param String $path
- * @param String $mode
- * @param Integer $options
- * @param String $opened_path
- * @return Boolean
- * @access public
- */
- function _stream_open($path, $mode, $options, &$opened_path)
- {
- $path = $this->_parse_path($path);
-
- if ($path === false) {
- return false;
- }
- $this->path = $path;
-
- $this->size = $this->sftp->size($path);
- $this->mode = preg_replace('#[bt]$#', '', $mode);
- $this->eof = false;
-
- if ($this->size === false) {
- if ($this->mode[0] == 'r') {
- return false;
- }
- } else {
- switch ($this->mode[0]) {
- case 'x':
- return false;
- case 'w':
- case 'c':
- $this->sftp->truncate($path, 0);
- }
- }
-
- $this->pos = $this->mode[0] != 'a' ? 0 : $this->size;
-
- return true;
- }
-
- /**
- * Read from stream
- *
- * @param Integer $count
- * @return Mixed
- * @access public
- */
- function _stream_read($count)
- {
- switch ($this->mode) {
- case 'w':
- case 'a':
- case 'x':
- case 'c':
- return false;
- }
-
- // commented out because some files - eg. /dev/urandom - will say their size is 0 when in fact it's kinda infinite
- //if ($this->pos >= $this->size) {
- // $this->eof = true;
- // return false;
- //}
-
- $result = $this->sftp->get($this->path, false, $this->pos, $count);
- if (isset($this->notification) && is_callable($this->notification)) {
- if ($result === false) {
- call_user_func($this->notification, STREAM_NOTIFY_FAILURE, STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0);
- return 0;
- }
- // seems that PHP calls stream_read in 8k chunks
- call_user_func($this->notification, STREAM_NOTIFY_PROGRESS, STREAM_NOTIFY_SEVERITY_INFO, '', 0, strlen($result), $this->size);
- }
-
- if (empty($result)) { // ie. false or empty string
- $this->eof = true;
- return false;
- }
- $this->pos+= strlen($result);
-
- return $result;
- }
-
- /**
- * Write to stream
- *
- * @param String $data
- * @return Mixed
- * @access public
- */
- function _stream_write($data)
- {
- switch ($this->mode) {
- case 'r':
- return false;
- }
-
- $result = $this->sftp->put($this->path, $data, NET_SFTP_STRING, $this->pos);
- if (isset($this->notification) && is_callable($this->notification)) {
- if (!$result) {
- call_user_func($this->notification, STREAM_NOTIFY_FAILURE, STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0);
- return 0;
- }
- // seems that PHP splits up strings into 8k blocks before calling stream_write
- call_user_func($this->notification, STREAM_NOTIFY_PROGRESS, STREAM_NOTIFY_SEVERITY_INFO, '', 0, strlen($data), strlen($data));
- }
-
- if ($result === false) {
- return false;
- }
- $this->pos+= strlen($data);
- if ($this->pos > $this->size) {
- $this->size = $this->pos;
- }
- $this->eof = false;
- return strlen($data);
- }
-
- /**
- * Retrieve the current position of a stream
- *
- * @return Integer
- * @access public
- */
- function _stream_tell()
- {
- return $this->pos;
- }
-
- /**
- * Tests for end-of-file on a file pointer
- *
- * In my testing there are four classes functions that normally effect the pointer:
- * fseek, fputs / fwrite, fgets / fread and ftruncate.
- *
- * Only fgets / fread, however, results in feof() returning true. do fputs($fp, 'aaa') on a blank file and feof()
- * will return false. do fread($fp, 1) and feof() will then return true. do fseek($fp, 10) on ablank file and feof()
- * will return false. do fread($fp, 1) and feof() will then return true.
- *
- * @return Boolean
- * @access public
- */
- function _stream_eof()
- {
- return $this->eof;
- }
-
- /**
- * Seeks to specific location in a stream
- *
- * @param Integer $offset
- * @param Integer $whence
- * @return Boolean
- * @access public
- */
- function _stream_seek($offset, $whence)
- {
- switch ($whence) {
- case SEEK_SET:
- if ($offset >= $this->size || $offset < 0) {
- return false;
- }
- break;
- case SEEK_CUR:
- $offset+= $this->pos;
- break;
- case SEEK_END:
- $offset+= $this->size;
- }
-
- $this->pos = $offset;
- $this->eof = false;
- return true;
- }
-
- /**
- * Change stream options
- *
- * @param String $path
- * @param Integer $option
- * @param Mixed $var
- * @return Boolean
- * @access public
- */
- function _stream_metadata($path, $option, $var)
- {
- $path = $this->_parse_path($path);
- if ($path === false) {
- return false;
- }
-
- // stream_metadata was introduced in PHP 5.4.0 but as of 5.4.11 the constants haven't been defined
- // see http://www.php.net/streamwrapper.stream-metadata and https://bugs.php.net/64246
- // and https://github.com/php/php-src/blob/master/main/php_streams.h#L592
- switch ($option) {
- case 1: // PHP_STREAM_META_TOUCH
- return $this->sftp->touch($path, $var[0], $var[1]);
- case 2: // PHP_STREAM_OWNER_NAME
- case 3: // PHP_STREAM_GROUP_NAME
- return false;
- case 4: // PHP_STREAM_META_OWNER
- return $this->sftp->chown($path, $var);
- case 5: // PHP_STREAM_META_GROUP
- return $this->sftp->chgrp($path, $var);
- case 6: // PHP_STREAM_META_ACCESS
- return $this->sftp->chmod($path, $var) !== false;
- }
- }
-
- /**
- * Retrieve the underlaying resource
- *
- * @param Integer $cast_as
- * @return Resource
- * @access public
- */
- function _stream_cast($cast_as)
- {
- return $this->sftp->fsock;
- }
-
- /**
- * Advisory file locking
- *
- * @param Integer $operation
- * @return Boolean
- * @access public
- */
- function _stream_lock($operation)
- {
- return false;
- }
-
- /**
- * Renames a file or directory
- *
- * Attempts to rename oldname to newname, moving it between directories if necessary.
- * If newname exists, it will be overwritten. This is a departure from what Net_SFTP
- * does.
- *
- * @param String $path_from
- * @param String $path_to
- * @return Boolean
- * @access public
- */
- function _rename($path_from, $path_to)
- {
- $path1 = parse_url($path_from);
- $path2 = parse_url($path_to);
- unset($path1['path'], $path2['path']);
- if ($path1 != $path2) {
- return false;
- }
-
- $path_from = $this->_parse_path($path_from);
- $path_to = parse_url($path_to);
- if ($path_from == false) {
- return false;
- }
-
- $path_to = $path_to['path']; // the $component part of parse_url() was added in PHP 5.1.2
- // "It is an error if there already exists a file with the name specified by newpath."
- // -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-02#section-6.5
- if (!$this->sftp->rename($path_from, $path_to)) {
- if ($this->sftp->stat($path_to)) {
- return $this->sftp->delete($path_to, true) && $this->sftp->rename($path_from, $path_to);
- }
- return false;
- }
-
- return true;
- }
-
- /**
- * Open directory handle
- *
- * The only $options is "whether or not to enforce safe_mode (0x04)". Since safe mode was deprecated in 5.3 and
- * removed in 5.4 I'm just going to ignore it
- *
- * @param String $path
- * @param Integer $options
- * @return Boolean
- * @access public
- */
- function _dir_opendir($path, $options)
- {
- $path = $this->_parse_path($path);
- if ($path === false) {
- return false;
- }
- $this->pos = 0;
- $this->entries = $this->sftp->nlist($path);
- return $this->entries !== false;
- }
-
- /**
- * Read entry from directory handle
- *
- * @return Mixed
- * @access public
- */
- function _dir_readdir()
- {
- if (isset($this->entries[$this->pos])) {
- return $this->entries[$this->pos++];
- }
- return false;
- }
-
- /**
- * Rewind directory handle
- *
- * @return Boolean
- * @access public
- */
- function _dir_rewinddir()
- {
- $this->pos = 0;
- return true;
- }
-
- /**
- * Close directory handle
- *
- * @return Boolean
- * @access public
- */
- function _dir_closedir()
- {
- return true;
- }
-
- /**
- * Create a directory
- *
- * Only valid $options is STREAM_MKDIR_RECURSIVE
- *
- * @param String $path
- * @param Integer $mode
- * @param Integer $options
- * @return Boolean
- * @access public
- */
- function _mkdir($path, $mode, $options)
- {
- $path = $this->_parse_path($path);
- if ($path === false) {
- return false;
- }
-
- return $this->sftp->mkdir($path, $mode, $options & STREAM_MKDIR_RECURSIVE);
- }
-
- /**
- * Removes a directory
- *
- * Only valid $options is STREAM_MKDIR_RECURSIVE per , however,
- * does not have a $recursive parameter as mkdir() does so I don't know how
- * STREAM_MKDIR_RECURSIVE is supposed to be set. Also, when I try it out with rmdir() I get 8 as
- * $options. What does 8 correspond to?
- *
- * @param String $path
- * @param Integer $mode
- * @param Integer $options
- * @return Boolean
- * @access public
- */
- function _rmdir($path, $options)
- {
- $path = $this->_parse_path($path);
- if ($path === false) {
- return false;
- }
-
- return $this->sftp->rmdir($path);
- }
-
- /**
- * Flushes the output
- *
- * See . Always returns true because Net_SFTP doesn't cache stuff before writing
- *
- * @return Boolean
- * @access public
- */
- function _stream_flush()
- {
- return true;
- }
-
- /**
- * Retrieve information about a file resource
- *
- * @return Mixed
- * @access public
- */
- function _stream_stat()
- {
- $results = $this->sftp->stat($this->path);
- if ($results === false) {
- return false;
- }
- return $results;
- }
-
- /**
- * Delete a file
- *
- * @param String $path
- * @return Boolean
- * @access public
- */
- function _unlink($path)
- {
- $path = $this->_parse_path($path);
- if ($path === false) {
- return false;
- }
-
- return $this->sftp->delete($path, false);
- }
-
- /**
- * Retrieve information about a file
- *
- * Ignores the STREAM_URL_STAT_QUIET flag because the entirety of Net_SFTP_Stream is quiet by default
- * might be worthwhile to reconstruct bits 12-16 (ie. the file type) if mode doesn't have them but we'll
- * cross that bridge when and if it's reached
- *
- * @param String $path
- * @param Integer $flags
- * @return Mixed
- * @access public
- */
- function _url_stat($path, $flags)
- {
- $path = $this->_parse_path($path);
- if ($path === false) {
- return false;
- }
-
- $results = $flags & STREAM_URL_STAT_LINK ? $this->sftp->lstat($path) : $this->sftp->stat($path);
- if ($results === false) {
- return false;
- }
-
- return $results;
- }
-
- /**
- * Truncate stream
- *
- * @param Integer $new_size
- * @return Boolean
- * @access public
- */
- function _stream_truncate($new_size)
- {
- if (!$this->sftp->truncate($this->path, $new_size)) {
- return false;
- }
-
- $this->eof = false;
- $this->size = $new_size;
-
- return true;
- }
-
- /**
- * Change stream options
- *
- * STREAM_OPTION_WRITE_BUFFER isn't supported for the same reason stream_flush isn't.
- * The other two aren't supported because of limitations in Net_SFTP.
- *
- * @param Integer $option
- * @param Integer $arg1
- * @param Integer $arg2
- * @return Boolean
- * @access public
- */
- function _stream_set_option($option, $arg1, $arg2)
- {
- return false;
- }
-
- /**
- * Close an resource
- *
- * @access public
- */
- function _stream_close()
- {
- }
-
- /**
- * __call Magic Method
- *
- * When you're utilizing an SFTP stream you're not calling the methods in this class directly - PHP is calling them for you.
- * Which kinda begs the question... what methods is PHP calling and what parameters is it passing to them? This function
- * lets you figure that out.
- *
- * If NET_SFTP_STREAM_LOGGING is defined all calls will be output on the screen and then (regardless of whether or not
- * NET_SFTP_STREAM_LOGGING is enabled) the parameters will be passed through to the appropriate method.
- *
- * @param String
- * @param Array
- * @return Mixed
- * @access public
- */
- function __call($name, $arguments)
- {
- if (defined('NET_SFTP_STREAM_LOGGING')) {
- echo $name . '(';
- $last = count($arguments) - 1;
- foreach ($arguments as $i => $argument) {
- var_export($argument);
- if ($i != $last) {
- echo ',';
- }
- }
- echo ")\r\n";
- }
- $name = '_' . $name;
- if (!method_exists($this, $name)) {
- return false;
- }
- return call_user_func_array(array($this, $name), $arguments);
- }
-}
-
-if (function_exists('stream_wrapper_register')) {
- stream_wrapper_register('sftp', 'Net_SFTP_Stream');
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Net/SSH1.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Net/SSH1.php
deleted file mode 100644
index 0a6aa90828958f462f6349c588172497e9532bf0..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Net/SSH1.php
+++ /dev/null
@@ -1,1582 +0,0 @@
-
- * login('username', 'password')) {
- * exit('Login Failed');
- * }
- *
- * echo $ssh->exec('ls -la');
- * ?>
- *
- *
- * Here's another short example:
- *
- * login('username', 'password')) {
- * exit('Login Failed');
- * }
- *
- * echo $ssh->read('username@username:~$');
- * $ssh->write("ls -la\n");
- * echo $ssh->read('username@username:~$');
- * ?>
- *
- *
- * More information on the SSHv1 specification can be found by reading
- * {@link http://www.snailbook.com/docs/protocol-1.5.txt protocol-1.5.txt}.
- *
- * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @category Net
- * @package Net_SSH1
- * @author Jim Wigginton
- * @copyright MMVII Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- */
-
-/**#@+
- * Encryption Methods
- *
- * @see Net_SSH1::getSupportedCiphers()
- * @access public
- */
-/**
- * No encryption
- *
- * Not supported.
- */
-define('NET_SSH1_CIPHER_NONE', 0);
-/**
- * IDEA in CFB mode
- *
- * Not supported.
- */
-define('NET_SSH1_CIPHER_IDEA', 1);
-/**
- * DES in CBC mode
- */
-define('NET_SSH1_CIPHER_DES', 2);
-/**
- * Triple-DES in CBC mode
- *
- * All implementations are required to support this
- */
-define('NET_SSH1_CIPHER_3DES', 3);
-/**
- * TRI's Simple Stream encryption CBC
- *
- * Not supported nor is it defined in the official SSH1 specs. OpenSSH, however, does define it (see cipher.h),
- * although it doesn't use it (see cipher.c)
- */
-define('NET_SSH1_CIPHER_BROKEN_TSS', 4);
-/**
- * RC4
- *
- * Not supported.
- *
- * @internal According to the SSH1 specs:
- *
- * "The first 16 bytes of the session key are used as the key for
- * the server to client direction. The remaining 16 bytes are used
- * as the key for the client to server direction. This gives
- * independent 128-bit keys for each direction."
- *
- * This library currently only supports encryption when the same key is being used for both directions. This is
- * because there's only one $crypto object. Two could be added ($encrypt and $decrypt, perhaps).
- */
-define('NET_SSH1_CIPHER_RC4', 5);
-/**
- * Blowfish
- *
- * Not supported nor is it defined in the official SSH1 specs. OpenSSH, however, defines it (see cipher.h) and
- * uses it (see cipher.c)
- */
-define('NET_SSH1_CIPHER_BLOWFISH', 6);
-/**#@-*/
-
-/**#@+
- * Authentication Methods
- *
- * @see Net_SSH1::getSupportedAuthentications()
- * @access public
- */
-/**
- * .rhosts or /etc/hosts.equiv
- */
-define('NET_SSH1_AUTH_RHOSTS', 1);
-/**
- * pure RSA authentication
- */
-define('NET_SSH1_AUTH_RSA', 2);
-/**
- * password authentication
- *
- * This is the only method that is supported by this library.
- */
-define('NET_SSH1_AUTH_PASSWORD', 3);
-/**
- * .rhosts with RSA host authentication
- */
-define('NET_SSH1_AUTH_RHOSTS_RSA', 4);
-/**#@-*/
-
-/**#@+
- * Terminal Modes
- *
- * @link http://3sp.com/content/developer/maverick-net/docs/Maverick.SSH.PseudoTerminalModesMembers.html
- * @access private
- */
-define('NET_SSH1_TTY_OP_END', 0);
-/**#@-*/
-
-/**
- * The Response Type
- *
- * @see Net_SSH1::_get_binary_packet()
- * @access private
- */
-define('NET_SSH1_RESPONSE_TYPE', 1);
-
-/**
- * The Response Data
- *
- * @see Net_SSH1::_get_binary_packet()
- * @access private
- */
-define('NET_SSH1_RESPONSE_DATA', 2);
-
-/**#@+
- * Execution Bitmap Masks
- *
- * @see Net_SSH1::bitmap
- * @access private
- */
-define('NET_SSH1_MASK_CONSTRUCTOR', 0x00000001);
-define('NET_SSH1_MASK_LOGIN', 0x00000002);
-define('NET_SSH1_MASK_SHELL', 0x00000004);
-/**#@-*/
-
-/**#@+
- * @access public
- * @see Net_SSH1::getLog()
- */
-/**
- * Returns the message numbers
- */
-define('NET_SSH1_LOG_SIMPLE', 1);
-/**
- * Returns the message content
- */
-define('NET_SSH1_LOG_COMPLEX', 2);
-/**
- * Outputs the content real-time
- */
-define('NET_SSH1_LOG_REALTIME', 3);
-/**
- * Dumps the content real-time to a file
- */
-define('NET_SSH1_LOG_REALTIME_FILE', 4);
-/**#@-*/
-
-/**#@+
- * @access public
- * @see Net_SSH1::read()
- */
-/**
- * Returns when a string matching $expect exactly is found
- */
-define('NET_SSH1_READ_SIMPLE', 1);
-/**
- * Returns when a string matching the regular expression $expect is found
- */
-define('NET_SSH1_READ_REGEX', 2);
-/**#@-*/
-
-/**
- * Pure-PHP implementation of SSHv1.
- *
- * @package Net_SSH1
- * @author Jim Wigginton
- * @version 0.1.0
- * @access public
- */
-class Net_SSH1
-{
- /**
- * The SSH identifier
- *
- * @var String
- * @access private
- */
- var $identifier = 'SSH-1.5-phpseclib';
-
- /**
- * The Socket Object
- *
- * @var Object
- * @access private
- */
- var $fsock;
-
- /**
- * The cryptography object
- *
- * @var Object
- * @access private
- */
- var $crypto = false;
-
- /**
- * Execution Bitmap
- *
- * The bits that are set represent functions that have been called already. This is used to determine
- * if a requisite function has been successfully executed. If not, an error should be thrown.
- *
- * @var Integer
- * @access private
- */
- var $bitmap = 0;
-
- /**
- * The Server Key Public Exponent
- *
- * Logged for debug purposes
- *
- * @see Net_SSH1::getServerKeyPublicExponent()
- * @var String
- * @access private
- */
- var $server_key_public_exponent;
-
- /**
- * The Server Key Public Modulus
- *
- * Logged for debug purposes
- *
- * @see Net_SSH1::getServerKeyPublicModulus()
- * @var String
- * @access private
- */
- var $server_key_public_modulus;
-
- /**
- * The Host Key Public Exponent
- *
- * Logged for debug purposes
- *
- * @see Net_SSH1::getHostKeyPublicExponent()
- * @var String
- * @access private
- */
- var $host_key_public_exponent;
-
- /**
- * The Host Key Public Modulus
- *
- * Logged for debug purposes
- *
- * @see Net_SSH1::getHostKeyPublicModulus()
- * @var String
- * @access private
- */
- var $host_key_public_modulus;
-
- /**
- * Supported Ciphers
- *
- * Logged for debug purposes
- *
- * @see Net_SSH1::getSupportedCiphers()
- * @var Array
- * @access private
- */
- var $supported_ciphers = array(
- NET_SSH1_CIPHER_NONE => 'No encryption',
- NET_SSH1_CIPHER_IDEA => 'IDEA in CFB mode',
- NET_SSH1_CIPHER_DES => 'DES in CBC mode',
- NET_SSH1_CIPHER_3DES => 'Triple-DES in CBC mode',
- NET_SSH1_CIPHER_BROKEN_TSS => 'TRI\'s Simple Stream encryption CBC',
- NET_SSH1_CIPHER_RC4 => 'RC4',
- NET_SSH1_CIPHER_BLOWFISH => 'Blowfish'
- );
-
- /**
- * Supported Authentications
- *
- * Logged for debug purposes
- *
- * @see Net_SSH1::getSupportedAuthentications()
- * @var Array
- * @access private
- */
- var $supported_authentications = array(
- NET_SSH1_AUTH_RHOSTS => '.rhosts or /etc/hosts.equiv',
- NET_SSH1_AUTH_RSA => 'pure RSA authentication',
- NET_SSH1_AUTH_PASSWORD => 'password authentication',
- NET_SSH1_AUTH_RHOSTS_RSA => '.rhosts with RSA host authentication'
- );
-
- /**
- * Server Identification
- *
- * @see Net_SSH1::getServerIdentification()
- * @var String
- * @access private
- */
- var $server_identification = '';
-
- /**
- * Protocol Flags
- *
- * @see Net_SSH1::Net_SSH1()
- * @var Array
- * @access private
- */
- var $protocol_flags = array();
-
- /**
- * Protocol Flag Log
- *
- * @see Net_SSH1::getLog()
- * @var Array
- * @access private
- */
- var $protocol_flag_log = array();
-
- /**
- * Message Log
- *
- * @see Net_SSH1::getLog()
- * @var Array
- * @access private
- */
- var $message_log = array();
-
- /**
- * Real-time log file pointer
- *
- * @see Net_SSH1::_append_log()
- * @var Resource
- * @access private
- */
- var $realtime_log_file;
-
- /**
- * Real-time log file size
- *
- * @see Net_SSH1::_append_log()
- * @var Integer
- * @access private
- */
- var $realtime_log_size;
-
- /**
- * Real-time log file wrap boolean
- *
- * @see Net_SSH1::_append_log()
- * @var Boolean
- * @access private
- */
- var $realtime_log_wrap;
-
- /**
- * Interactive Buffer
- *
- * @see Net_SSH1::read()
- * @var Array
- * @access private
- */
- var $interactiveBuffer = '';
-
- /**
- * Timeout
- *
- * @see Net_SSH1::setTimeout()
- * @access private
- */
- var $timeout;
-
- /**
- * Current Timeout
- *
- * @see Net_SSH1::_get_channel_packet()
- * @access private
- */
- var $curTimeout;
-
- /**
- * Log Boundary
- *
- * @see Net_SSH1::_format_log
- * @access private
- */
- var $log_boundary = ':';
-
- /**
- * Log Long Width
- *
- * @see Net_SSH1::_format_log
- * @access private
- */
- var $log_long_width = 65;
-
- /**
- * Log Short Width
- *
- * @see Net_SSH1::_format_log
- * @access private
- */
- var $log_short_width = 16;
-
- /**
- * Default Constructor.
- *
- * Connects to an SSHv1 server
- *
- * @param String $host
- * @param optional Integer $port
- * @param optional Integer $timeout
- * @param optional Integer $cipher
- * @return Net_SSH1
- * @access public
- */
- function Net_SSH1($host, $port = 22, $timeout = 10, $cipher = NET_SSH1_CIPHER_3DES)
- {
- if (!class_exists('Math_BigInteger')) {
- include_once 'Math/BigInteger.php';
- }
-
- // Include Crypt_Random
- // the class_exists() will only be called if the crypt_random_string function hasn't been defined and
- // will trigger a call to __autoload() if you're wanting to auto-load classes
- // call function_exists() a second time to stop the include_once from being called outside
- // of the auto loader
- if (!function_exists('crypt_random_string') && !class_exists('Crypt_Random') && !function_exists('crypt_random_string')) {
- include_once 'Crypt/Random.php';
- }
-
- $this->protocol_flags = array(
- 1 => 'NET_SSH1_MSG_DISCONNECT',
- 2 => 'NET_SSH1_SMSG_PUBLIC_KEY',
- 3 => 'NET_SSH1_CMSG_SESSION_KEY',
- 4 => 'NET_SSH1_CMSG_USER',
- 9 => 'NET_SSH1_CMSG_AUTH_PASSWORD',
- 10 => 'NET_SSH1_CMSG_REQUEST_PTY',
- 12 => 'NET_SSH1_CMSG_EXEC_SHELL',
- 13 => 'NET_SSH1_CMSG_EXEC_CMD',
- 14 => 'NET_SSH1_SMSG_SUCCESS',
- 15 => 'NET_SSH1_SMSG_FAILURE',
- 16 => 'NET_SSH1_CMSG_STDIN_DATA',
- 17 => 'NET_SSH1_SMSG_STDOUT_DATA',
- 18 => 'NET_SSH1_SMSG_STDERR_DATA',
- 19 => 'NET_SSH1_CMSG_EOF',
- 20 => 'NET_SSH1_SMSG_EXITSTATUS',
- 33 => 'NET_SSH1_CMSG_EXIT_CONFIRMATION'
- );
-
- $this->_define_array($this->protocol_flags);
-
- $this->fsock = @fsockopen($host, $port, $errno, $errstr, $timeout);
- if (!$this->fsock) {
- user_error(rtrim("Cannot connect to $host. Error $errno. $errstr"));
- return;
- }
-
- $this->server_identification = $init_line = fgets($this->fsock, 255);
-
- if (defined('NET_SSH1_LOGGING')) {
- $this->_append_log('<-', $this->server_identification);
- $this->_append_log('->', $this->identifier . "\r\n");
- }
-
- if (!preg_match('#SSH-([0-9\.]+)-(.+)#', $init_line, $parts)) {
- user_error('Can only connect to SSH servers');
- return;
- }
- if ($parts[1][0] != 1) {
- user_error("Cannot connect to SSH $parts[1] servers");
- return;
- }
-
- fputs($this->fsock, $this->identifier."\r\n");
-
- $response = $this->_get_binary_packet();
- if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_PUBLIC_KEY) {
- user_error('Expected SSH_SMSG_PUBLIC_KEY');
- return;
- }
-
- $anti_spoofing_cookie = $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 8);
-
- $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4);
-
- $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2));
- $server_key_public_exponent = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256);
- $this->server_key_public_exponent = $server_key_public_exponent;
-
- $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2));
- $server_key_public_modulus = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256);
- $this->server_key_public_modulus = $server_key_public_modulus;
-
- $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4);
-
- $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2));
- $host_key_public_exponent = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256);
- $this->host_key_public_exponent = $host_key_public_exponent;
-
- $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2));
- $host_key_public_modulus = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256);
- $this->host_key_public_modulus = $host_key_public_modulus;
-
- $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4);
-
- // get a list of the supported ciphers
- extract(unpack('Nsupported_ciphers_mask', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4)));
- foreach ($this->supported_ciphers as $mask=>$name) {
- if (($supported_ciphers_mask & (1 << $mask)) == 0) {
- unset($this->supported_ciphers[$mask]);
- }
- }
-
- // get a list of the supported authentications
- extract(unpack('Nsupported_authentications_mask', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4)));
- foreach ($this->supported_authentications as $mask=>$name) {
- if (($supported_authentications_mask & (1 << $mask)) == 0) {
- unset($this->supported_authentications[$mask]);
- }
- }
-
- $session_id = pack('H*', md5($host_key_public_modulus->toBytes() . $server_key_public_modulus->toBytes() . $anti_spoofing_cookie));
-
- $session_key = crypt_random_string(32);
- $double_encrypted_session_key = $session_key ^ str_pad($session_id, 32, chr(0));
-
- if ($server_key_public_modulus->compare($host_key_public_modulus) < 0) {
- $double_encrypted_session_key = $this->_rsa_crypt(
- $double_encrypted_session_key,
- array(
- $server_key_public_exponent,
- $server_key_public_modulus
- )
- );
- $double_encrypted_session_key = $this->_rsa_crypt(
- $double_encrypted_session_key,
- array(
- $host_key_public_exponent,
- $host_key_public_modulus
- )
- );
- } else {
- $double_encrypted_session_key = $this->_rsa_crypt(
- $double_encrypted_session_key,
- array(
- $host_key_public_exponent,
- $host_key_public_modulus
- )
- );
- $double_encrypted_session_key = $this->_rsa_crypt(
- $double_encrypted_session_key,
- array(
- $server_key_public_exponent,
- $server_key_public_modulus
- )
- );
- }
-
- $cipher = isset($this->supported_ciphers[$cipher]) ? $cipher : NET_SSH1_CIPHER_3DES;
- $data = pack('C2a*na*N', NET_SSH1_CMSG_SESSION_KEY, $cipher, $anti_spoofing_cookie, 8 * strlen($double_encrypted_session_key), $double_encrypted_session_key, 0);
-
- if (!$this->_send_binary_packet($data)) {
- user_error('Error sending SSH_CMSG_SESSION_KEY');
- return;
- }
-
- switch ($cipher) {
- //case NET_SSH1_CIPHER_NONE:
- // $this->crypto = new Crypt_Null();
- // break;
- case NET_SSH1_CIPHER_DES:
- if (!class_exists('Crypt_DES')) {
- include_once 'Crypt/DES.php';
- }
- $this->crypto = new Crypt_DES();
- $this->crypto->disablePadding();
- $this->crypto->enableContinuousBuffer();
- $this->crypto->setKey(substr($session_key, 0, 8));
- break;
- case NET_SSH1_CIPHER_3DES:
- if (!class_exists('Crypt_TripleDES')) {
- include_once 'Crypt/TripleDES.php';
- }
- $this->crypto = new Crypt_TripleDES(CRYPT_DES_MODE_3CBC);
- $this->crypto->disablePadding();
- $this->crypto->enableContinuousBuffer();
- $this->crypto->setKey(substr($session_key, 0, 24));
- break;
- //case NET_SSH1_CIPHER_RC4:
- // if (!class_exists('Crypt_RC4')) {
- // include_once('Crypt/RC4.php');
- // }
- // $this->crypto = new Crypt_RC4();
- // $this->crypto->enableContinuousBuffer();
- // $this->crypto->setKey(substr($session_key, 0, 16));
- // break;
- }
-
- $response = $this->_get_binary_packet();
-
- if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_SUCCESS) {
- user_error('Expected SSH_SMSG_SUCCESS');
- return;
- }
-
- $this->bitmap = NET_SSH1_MASK_CONSTRUCTOR;
- }
-
- /**
- * Login
- *
- * @param String $username
- * @param optional String $password
- * @return Boolean
- * @access public
- */
- function login($username, $password = '')
- {
- if (!($this->bitmap & NET_SSH1_MASK_CONSTRUCTOR)) {
- return false;
- }
-
- $data = pack('CNa*', NET_SSH1_CMSG_USER, strlen($username), $username);
-
- if (!$this->_send_binary_packet($data)) {
- user_error('Error sending SSH_CMSG_USER');
- return false;
- }
-
- $response = $this->_get_binary_packet();
-
- if ($response === true) {
- return false;
- }
- if ($response[NET_SSH1_RESPONSE_TYPE] == NET_SSH1_SMSG_SUCCESS) {
- $this->bitmap |= NET_SSH1_MASK_LOGIN;
- return true;
- } else if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_FAILURE) {
- user_error('Expected SSH_SMSG_SUCCESS or SSH_SMSG_FAILURE');
- return false;
- }
-
- $data = pack('CNa*', NET_SSH1_CMSG_AUTH_PASSWORD, strlen($password), $password);
-
- if (!$this->_send_binary_packet($data)) {
- user_error('Error sending SSH_CMSG_AUTH_PASSWORD');
- return false;
- }
-
- // remove the username and password from the last logged packet
- if (defined('NET_SSH1_LOGGING') && NET_SSH1_LOGGING == NET_SSH1_LOG_COMPLEX) {
- $data = pack('CNa*', NET_SSH1_CMSG_AUTH_PASSWORD, strlen('password'), 'password');
- $this->message_log[count($this->message_log) - 1] = $data;
- }
-
- $response = $this->_get_binary_packet();
-
- if ($response === true) {
- return false;
- }
- if ($response[NET_SSH1_RESPONSE_TYPE] == NET_SSH1_SMSG_SUCCESS) {
- $this->bitmap |= NET_SSH1_MASK_LOGIN;
- return true;
- } else if ($response[NET_SSH1_RESPONSE_TYPE] == NET_SSH1_SMSG_FAILURE) {
- return false;
- } else {
- user_error('Expected SSH_SMSG_SUCCESS or SSH_SMSG_FAILURE');
- return false;
- }
- }
-
- /**
- * Set Timeout
- *
- * $ssh->exec('ping 127.0.0.1'); on a Linux host will never return and will run indefinitely. setTimeout() makes it so it'll timeout.
- * Setting $timeout to false or 0 will mean there is no timeout.
- *
- * @param Mixed $timeout
- */
- function setTimeout($timeout)
- {
- $this->timeout = $this->curTimeout = $timeout;
- }
-
- /**
- * Executes a command on a non-interactive shell, returns the output, and quits.
- *
- * An SSH1 server will close the connection after a command has been executed on a non-interactive shell. SSH2
- * servers don't, however, this isn't an SSH2 client. The way this works, on the server, is by initiating a
- * shell with the -s option, as discussed in the following links:
- *
- * {@link http://www.faqs.org/docs/bashman/bashref_65.html http://www.faqs.org/docs/bashman/bashref_65.html}
- * {@link http://www.faqs.org/docs/bashman/bashref_62.html http://www.faqs.org/docs/bashman/bashref_62.html}
- *
- * To execute further commands, a new Net_SSH1 object will need to be created.
- *
- * Returns false on failure and the output, otherwise.
- *
- * @see Net_SSH1::interactiveRead()
- * @see Net_SSH1::interactiveWrite()
- * @param String $cmd
- * @return mixed
- * @access public
- */
- function exec($cmd, $block = true)
- {
- if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) {
- user_error('Operation disallowed prior to login()');
- return false;
- }
-
- $data = pack('CNa*', NET_SSH1_CMSG_EXEC_CMD, strlen($cmd), $cmd);
-
- if (!$this->_send_binary_packet($data)) {
- user_error('Error sending SSH_CMSG_EXEC_CMD');
- return false;
- }
-
- if (!$block) {
- return true;
- }
-
- $output = '';
- $response = $this->_get_binary_packet();
-
- if ($response !== false) {
- do {
- $output.= substr($response[NET_SSH1_RESPONSE_DATA], 4);
- $response = $this->_get_binary_packet();
- } while (is_array($response) && $response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_EXITSTATUS);
- }
-
- $data = pack('C', NET_SSH1_CMSG_EXIT_CONFIRMATION);
-
- // i don't think it's really all that important if this packet gets sent or not.
- $this->_send_binary_packet($data);
-
- fclose($this->fsock);
-
- // reset the execution bitmap - a new Net_SSH1 object needs to be created.
- $this->bitmap = 0;
-
- return $output;
- }
-
- /**
- * Creates an interactive shell
- *
- * @see Net_SSH1::interactiveRead()
- * @see Net_SSH1::interactiveWrite()
- * @return Boolean
- * @access private
- */
- function _initShell()
- {
- // connect using the sample parameters in protocol-1.5.txt.
- // according to wikipedia.org's entry on text terminals, "the fundamental type of application running on a text
- // terminal is a command line interpreter or shell". thus, opening a terminal session to run the shell.
- $data = pack('CNa*N4C', NET_SSH1_CMSG_REQUEST_PTY, strlen('vt100'), 'vt100', 24, 80, 0, 0, NET_SSH1_TTY_OP_END);
-
- if (!$this->_send_binary_packet($data)) {
- user_error('Error sending SSH_CMSG_REQUEST_PTY');
- return false;
- }
-
- $response = $this->_get_binary_packet();
-
- if ($response === true) {
- return false;
- }
- if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_SUCCESS) {
- user_error('Expected SSH_SMSG_SUCCESS');
- return false;
- }
-
- $data = pack('C', NET_SSH1_CMSG_EXEC_SHELL);
-
- if (!$this->_send_binary_packet($data)) {
- user_error('Error sending SSH_CMSG_EXEC_SHELL');
- return false;
- }
-
- $this->bitmap |= NET_SSH1_MASK_SHELL;
-
- //stream_set_blocking($this->fsock, 0);
-
- return true;
- }
-
- /**
- * Inputs a command into an interactive shell.
- *
- * @see Net_SSH1::interactiveWrite()
- * @param String $cmd
- * @return Boolean
- * @access public
- */
- function write($cmd)
- {
- return $this->interactiveWrite($cmd);
- }
-
- /**
- * Returns the output of an interactive shell when there's a match for $expect
- *
- * $expect can take the form of a string literal or, if $mode == NET_SSH1_READ_REGEX,
- * a regular expression.
- *
- * @see Net_SSH1::write()
- * @param String $expect
- * @param Integer $mode
- * @return Boolean
- * @access public
- */
- function read($expect, $mode = NET_SSH1_READ_SIMPLE)
- {
- if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) {
- user_error('Operation disallowed prior to login()');
- return false;
- }
-
- if (!($this->bitmap & NET_SSH1_MASK_SHELL) && !$this->_initShell()) {
- user_error('Unable to initiate an interactive shell session');
- return false;
- }
-
- $match = $expect;
- while (true) {
- if ($mode == NET_SSH1_READ_REGEX) {
- preg_match($expect, $this->interactiveBuffer, $matches);
- $match = isset($matches[0]) ? $matches[0] : '';
- }
- $pos = strlen($match) ? strpos($this->interactiveBuffer, $match) : false;
- if ($pos !== false) {
- return $this->_string_shift($this->interactiveBuffer, $pos + strlen($match));
- }
- $response = $this->_get_binary_packet();
-
- if ($response === true) {
- return $this->_string_shift($this->interactiveBuffer, strlen($this->interactiveBuffer));
- }
- $this->interactiveBuffer.= substr($response[NET_SSH1_RESPONSE_DATA], 4);
- }
- }
-
- /**
- * Inputs a command into an interactive shell.
- *
- * @see Net_SSH1::interactiveRead()
- * @param String $cmd
- * @return Boolean
- * @access public
- */
- function interactiveWrite($cmd)
- {
- if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) {
- user_error('Operation disallowed prior to login()');
- return false;
- }
-
- if (!($this->bitmap & NET_SSH1_MASK_SHELL) && !$this->_initShell()) {
- user_error('Unable to initiate an interactive shell session');
- return false;
- }
-
- $data = pack('CNa*', NET_SSH1_CMSG_STDIN_DATA, strlen($cmd), $cmd);
-
- if (!$this->_send_binary_packet($data)) {
- user_error('Error sending SSH_CMSG_STDIN');
- return false;
- }
-
- return true;
- }
-
- /**
- * Returns the output of an interactive shell when no more output is available.
- *
- * Requires PHP 4.3.0 or later due to the use of the stream_select() function. If you see stuff like
- * "^[[00m", you're seeing ANSI escape codes. According to
- * {@link http://support.microsoft.com/kb/101875 How to Enable ANSI.SYS in a Command Window}, "Windows NT
- * does not support ANSI escape sequences in Win32 Console applications", so if you're a Windows user,
- * there's not going to be much recourse.
- *
- * @see Net_SSH1::interactiveRead()
- * @return String
- * @access public
- */
- function interactiveRead()
- {
- if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) {
- user_error('Operation disallowed prior to login()');
- return false;
- }
-
- if (!($this->bitmap & NET_SSH1_MASK_SHELL) && !$this->_initShell()) {
- user_error('Unable to initiate an interactive shell session');
- return false;
- }
-
- $read = array($this->fsock);
- $write = $except = null;
- if (stream_select($read, $write, $except, 0)) {
- $response = $this->_get_binary_packet();
- return substr($response[NET_SSH1_RESPONSE_DATA], 4);
- } else {
- return '';
- }
- }
-
- /**
- * Disconnect
- *
- * @access public
- */
- function disconnect()
- {
- $this->_disconnect();
- }
-
- /**
- * Destructor.
- *
- * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call
- * disconnect().
- *
- * @access public
- */
- function __destruct()
- {
- $this->_disconnect();
- }
-
- /**
- * Disconnect
- *
- * @param String $msg
- * @access private
- */
- function _disconnect($msg = 'Client Quit')
- {
- if ($this->bitmap) {
- $data = pack('C', NET_SSH1_CMSG_EOF);
- $this->_send_binary_packet($data);
- /*
- $response = $this->_get_binary_packet();
- if ($response === true) {
- $response = array(NET_SSH1_RESPONSE_TYPE => -1);
- }
- switch ($response[NET_SSH1_RESPONSE_TYPE]) {
- case NET_SSH1_SMSG_EXITSTATUS:
- $data = pack('C', NET_SSH1_CMSG_EXIT_CONFIRMATION);
- break;
- default:
- $data = pack('CNa*', NET_SSH1_MSG_DISCONNECT, strlen($msg), $msg);
- }
- */
- $data = pack('CNa*', NET_SSH1_MSG_DISCONNECT, strlen($msg), $msg);
-
- $this->_send_binary_packet($data);
- fclose($this->fsock);
- $this->bitmap = 0;
- }
- }
-
- /**
- * Gets Binary Packets
- *
- * See 'The Binary Packet Protocol' of protocol-1.5.txt for more info.
- *
- * Also, this function could be improved upon by adding detection for the following exploit:
- * http://www.securiteam.com/securitynews/5LP042K3FY.html
- *
- * @see Net_SSH1::_send_binary_packet()
- * @return Array
- * @access private
- */
- function _get_binary_packet()
- {
- if (feof($this->fsock)) {
- //user_error('connection closed prematurely');
- return false;
- }
-
- if ($this->curTimeout) {
- $read = array($this->fsock);
- $write = $except = null;
-
- $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838
- $sec = floor($this->curTimeout);
- $usec = 1000000 * ($this->curTimeout - $sec);
- // on windows this returns a "Warning: Invalid CRT parameters detected" error
- if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) {
- //$this->_disconnect('Timeout');
- return true;
- }
- $elapsed = strtok(microtime(), ' ') + strtok('') - $start;
- $this->curTimeout-= $elapsed;
- }
-
- $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838
- $temp = unpack('Nlength', fread($this->fsock, 4));
-
- $padding_length = 8 - ($temp['length'] & 7);
- $length = $temp['length'] + $padding_length;
-
- while ($length > 0) {
- $temp = fread($this->fsock, $length);
- $raw.= $temp;
- $length-= strlen($temp);
- }
- $stop = strtok(microtime(), ' ') + strtok('');
-
- if (strlen($raw) && $this->crypto !== false) {
- $raw = $this->crypto->decrypt($raw);
- }
-
- $padding = substr($raw, 0, $padding_length);
- $type = $raw[$padding_length];
- $data = substr($raw, $padding_length + 1, -4);
-
- $temp = unpack('Ncrc', substr($raw, -4));
-
- //if ( $temp['crc'] != $this->_crc($padding . $type . $data) ) {
- // user_error('Bad CRC in packet from server');
- // return false;
- //}
-
- $type = ord($type);
-
- if (defined('NET_SSH1_LOGGING')) {
- $temp = isset($this->protocol_flags[$type]) ? $this->protocol_flags[$type] : 'UNKNOWN';
- $temp = '<- ' . $temp .
- ' (' . round($stop - $start, 4) . 's)';
- $this->_append_log($temp, $data);
- }
-
- return array(
- NET_SSH1_RESPONSE_TYPE => $type,
- NET_SSH1_RESPONSE_DATA => $data
- );
- }
-
- /**
- * Sends Binary Packets
- *
- * Returns true on success, false on failure.
- *
- * @see Net_SSH1::_get_binary_packet()
- * @param String $data
- * @return Boolean
- * @access private
- */
- function _send_binary_packet($data)
- {
- if (feof($this->fsock)) {
- //user_error('connection closed prematurely');
- return false;
- }
-
- $length = strlen($data) + 4;
-
- $padding = crypt_random_string(8 - ($length & 7));
-
- $orig = $data;
- $data = $padding . $data;
- $data.= pack('N', $this->_crc($data));
-
- if ($this->crypto !== false) {
- $data = $this->crypto->encrypt($data);
- }
-
- $packet = pack('Na*', $length, $data);
-
- $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838
- $result = strlen($packet) == fputs($this->fsock, $packet);
- $stop = strtok(microtime(), ' ') + strtok('');
-
- if (defined('NET_SSH1_LOGGING')) {
- $temp = isset($this->protocol_flags[ord($orig[0])]) ? $this->protocol_flags[ord($orig[0])] : 'UNKNOWN';
- $temp = '-> ' . $temp .
- ' (' . round($stop - $start, 4) . 's)';
- $this->_append_log($temp, $orig);
- }
-
- return $result;
- }
-
- /**
- * Cyclic Redundancy Check (CRC)
- *
- * PHP's crc32 function is implemented slightly differently than the one that SSH v1 uses, so
- * we've reimplemented it. A more detailed discussion of the differences can be found after
- * $crc_lookup_table's initialization.
- *
- * @see Net_SSH1::_get_binary_packet()
- * @see Net_SSH1::_send_binary_packet()
- * @param String $data
- * @return Integer
- * @access private
- */
- function _crc($data)
- {
- static $crc_lookup_table = array(
- 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
- 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
- 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
- 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
- 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
- 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
- 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
- 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
- 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
- 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
- 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
- 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
- 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
- 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
- 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
- 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
- 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
- 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
- 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
- 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
- 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
- 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
- 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
- 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
- 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
- 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
- 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
- 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
- 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
- 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
- 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
- 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
- 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
- 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
- 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
- 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
- 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
- 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
- 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
- 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
- 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
- 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
- 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
- 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
- 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
- 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
- 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
- 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
- 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
- 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
- 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
- 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
- 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
- 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
- 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
- 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
- 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
- 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
- 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
- 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
- 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
- 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
- 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
- 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
- );
-
- // For this function to yield the same output as PHP's crc32 function, $crc would have to be
- // set to 0xFFFFFFFF, initially - not 0x00000000 as it currently is.
- $crc = 0x00000000;
- $length = strlen($data);
-
- for ($i=0;$i<$length;$i++) {
- // We AND $crc >> 8 with 0x00FFFFFF because we want the eight newly added bits to all
- // be zero. PHP, unfortunately, doesn't always do this. 0x80000000 >> 8, as an example,
- // yields 0xFF800000 - not 0x00800000. The following link elaborates:
- // http://www.php.net/manual/en/language.operators.bitwise.php#57281
- $crc = (($crc >> 8) & 0x00FFFFFF) ^ $crc_lookup_table[($crc & 0xFF) ^ ord($data[$i])];
- }
-
- // In addition to having to set $crc to 0xFFFFFFFF, initially, the return value must be XOR'd with
- // 0xFFFFFFFF for this function to return the same thing that PHP's crc32 function would.
- return $crc;
- }
-
- /**
- * String Shift
- *
- * Inspired by array_shift
- *
- * @param String $string
- * @param optional Integer $index
- * @return String
- * @access private
- */
- function _string_shift(&$string, $index = 1)
- {
- $substr = substr($string, 0, $index);
- $string = substr($string, $index);
- return $substr;
- }
-
- /**
- * RSA Encrypt
- *
- * Returns mod(pow($m, $e), $n), where $n should be the product of two (large) primes $p and $q and where $e
- * should be a number with the property that gcd($e, ($p - 1) * ($q - 1)) == 1. Could just make anything that
- * calls this call modexp, instead, but I think this makes things clearer, maybe...
- *
- * @see Net_SSH1::Net_SSH1()
- * @param Math_BigInteger $m
- * @param Array $key
- * @return Math_BigInteger
- * @access private
- */
- function _rsa_crypt($m, $key)
- {
- /*
- if (!class_exists('Crypt_RSA')) {
- include_once 'Crypt/RSA.php';
- }
-
- $rsa = new Crypt_RSA();
- $rsa->loadKey($key, CRYPT_RSA_PUBLIC_FORMAT_RAW);
- $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
- return $rsa->encrypt($m);
- */
-
- // To quote from protocol-1.5.txt:
- // The most significant byte (which is only partial as the value must be
- // less than the public modulus, which is never a power of two) is zero.
- //
- // The next byte contains the value 2 (which stands for public-key
- // encrypted data in the PKCS standard [PKCS#1]). Then, there are non-
- // zero random bytes to fill any unused space, a zero byte, and the data
- // to be encrypted in the least significant bytes, the last byte of the
- // data in the least significant byte.
-
- // Presumably the part of PKCS#1 they're refering to is "Section 7.2.1 Encryption Operation",
- // under "7.2 RSAES-PKCS1-v1.5" and "7 Encryption schemes" of the following URL:
- // ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1.pdf
- $modulus = $key[1]->toBytes();
- $length = strlen($modulus) - strlen($m) - 3;
- $random = '';
- while (strlen($random) != $length) {
- $block = crypt_random_string($length - strlen($random));
- $block = str_replace("\x00", '', $block);
- $random.= $block;
- }
- $temp = chr(0) . chr(2) . $random . chr(0) . $m;
-
- $m = new Math_BigInteger($temp, 256);
- $m = $m->modPow($key[0], $key[1]);
-
- return $m->toBytes();
- }
-
- /**
- * Define Array
- *
- * Takes any number of arrays whose indices are integers and whose values are strings and defines a bunch of
- * named constants from it, using the value as the name of the constant and the index as the value of the constant.
- * If any of the constants that would be defined already exists, none of the constants will be defined.
- *
- * @param Array $array
- * @access private
- */
- function _define_array()
- {
- $args = func_get_args();
- foreach ($args as $arg) {
- foreach ($arg as $key=>$value) {
- if (!defined($value)) {
- define($value, $key);
- } else {
- break 2;
- }
- }
- }
- }
-
- /**
- * Returns a log of the packets that have been sent and received.
- *
- * Returns a string if NET_SSH1_LOGGING == NET_SSH1_LOG_COMPLEX, an array if NET_SSH1_LOGGING == NET_SSH1_LOG_SIMPLE and false if !defined('NET_SSH1_LOGGING')
- *
- * @access public
- * @return String or Array
- */
- function getLog()
- {
- if (!defined('NET_SSH1_LOGGING')) {
- return false;
- }
-
- switch (NET_SSH1_LOGGING) {
- case NET_SSH1_LOG_SIMPLE:
- return $this->message_number_log;
- break;
- case NET_SSH1_LOG_COMPLEX:
- return $this->_format_log($this->message_log, $this->protocol_flags_log);
- break;
- default:
- return false;
- }
- }
-
- /**
- * Formats a log for printing
- *
- * @param Array $message_log
- * @param Array $message_number_log
- * @access private
- * @return String
- */
- function _format_log($message_log, $message_number_log)
- {
- $output = '';
- for ($i = 0; $i < count($message_log); $i++) {
- $output.= $message_number_log[$i] . "\r\n";
- $current_log = $message_log[$i];
- $j = 0;
- do {
- if (strlen($current_log)) {
- $output.= str_pad(dechex($j), 7, '0', STR_PAD_LEFT) . '0 ';
- }
- $fragment = $this->_string_shift($current_log, $this->log_short_width);
- $hex = substr(preg_replace_callback('#.#s', array($this, '_format_log_helper'), $fragment), strlen($this->log_boundary));
- // replace non ASCII printable characters with dots
- // http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters
- // also replace < with a . since < messes up the output on web browsers
- $raw = preg_replace('#[^\x20-\x7E]|<#', '.', $fragment);
- $output.= str_pad($hex, $this->log_long_width - $this->log_short_width, ' ') . $raw . "\r\n";
- $j++;
- } while (strlen($current_log));
- $output.= "\r\n";
- }
-
- return $output;
- }
-
- /**
- * Helper function for _format_log
- *
- * For use with preg_replace_callback()
- *
- * @param Array $matches
- * @access private
- * @return String
- */
- function _format_log_helper($matches)
- {
- return $this->log_boundary . str_pad(dechex(ord($matches[0])), 2, '0', STR_PAD_LEFT);
- }
-
- /**
- * Return the server key public exponent
- *
- * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead,
- * the raw bytes. This behavior is similar to PHP's md5() function.
- *
- * @param optional Boolean $raw_output
- * @return String
- * @access public
- */
- function getServerKeyPublicExponent($raw_output = false)
- {
- return $raw_output ? $this->server_key_public_exponent->toBytes() : $this->server_key_public_exponent->toString();
- }
-
- /**
- * Return the server key public modulus
- *
- * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead,
- * the raw bytes. This behavior is similar to PHP's md5() function.
- *
- * @param optional Boolean $raw_output
- * @return String
- * @access public
- */
- function getServerKeyPublicModulus($raw_output = false)
- {
- return $raw_output ? $this->server_key_public_modulus->toBytes() : $this->server_key_public_modulus->toString();
- }
-
- /**
- * Return the host key public exponent
- *
- * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead,
- * the raw bytes. This behavior is similar to PHP's md5() function.
- *
- * @param optional Boolean $raw_output
- * @return String
- * @access public
- */
- function getHostKeyPublicExponent($raw_output = false)
- {
- return $raw_output ? $this->host_key_public_exponent->toBytes() : $this->host_key_public_exponent->toString();
- }
-
- /**
- * Return the host key public modulus
- *
- * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead,
- * the raw bytes. This behavior is similar to PHP's md5() function.
- *
- * @param optional Boolean $raw_output
- * @return String
- * @access public
- */
- function getHostKeyPublicModulus($raw_output = false)
- {
- return $raw_output ? $this->host_key_public_modulus->toBytes() : $this->host_key_public_modulus->toString();
- }
-
- /**
- * Return a list of ciphers supported by SSH1 server.
- *
- * Just because a cipher is supported by an SSH1 server doesn't mean it's supported by this library. If $raw_output
- * is set to true, returns, instead, an array of constants. ie. instead of array('Triple-DES in CBC mode'), you'll
- * get array(NET_SSH1_CIPHER_3DES).
- *
- * @param optional Boolean $raw_output
- * @return Array
- * @access public
- */
- function getSupportedCiphers($raw_output = false)
- {
- return $raw_output ? array_keys($this->supported_ciphers) : array_values($this->supported_ciphers);
- }
-
- /**
- * Return a list of authentications supported by SSH1 server.
- *
- * Just because a cipher is supported by an SSH1 server doesn't mean it's supported by this library. If $raw_output
- * is set to true, returns, instead, an array of constants. ie. instead of array('password authentication'), you'll
- * get array(NET_SSH1_AUTH_PASSWORD).
- *
- * @param optional Boolean $raw_output
- * @return Array
- * @access public
- */
- function getSupportedAuthentications($raw_output = false)
- {
- return $raw_output ? array_keys($this->supported_authentications) : array_values($this->supported_authentications);
- }
-
- /**
- * Return the server identification.
- *
- * @return String
- * @access public
- */
- function getServerIdentification()
- {
- return rtrim($this->server_identification);
- }
-
- /**
- * Logs data packets
- *
- * Makes sure that only the last 1MB worth of packets will be logged
- *
- * @param String $data
- * @access private
- */
- function _append_log($protocol_flags, $message)
- {
- switch (NET_SSH1_LOGGING) {
- // useful for benchmarks
- case NET_SSH1_LOG_SIMPLE:
- $this->protocol_flags_log[] = $protocol_flags;
- break;
- // the most useful log for SSH1
- case NET_SSH1_LOG_COMPLEX:
- $this->protocol_flags_log[] = $protocol_flags;
- $this->_string_shift($message);
- $this->log_size+= strlen($message);
- $this->message_log[] = $message;
- while ($this->log_size > NET_SSH1_LOG_MAX_SIZE) {
- $this->log_size-= strlen(array_shift($this->message_log));
- array_shift($this->protocol_flags_log);
- }
- break;
- // dump the output out realtime; packets may be interspersed with non packets,
- // passwords won't be filtered out and select other packets may not be correctly
- // identified
- case NET_SSH1_LOG_REALTIME:
- echo "\r\n" . $this->_format_log(array($message), array($protocol_flags)) . "\r\n \r\n";
- @flush();
- @ob_flush();
- break;
- // basically the same thing as NET_SSH1_LOG_REALTIME with the caveat that NET_SSH1_LOG_REALTIME_FILE
- // needs to be defined and that the resultant log file will be capped out at NET_SSH1_LOG_MAX_SIZE.
- // the earliest part of the log file is denoted by the first <<< START >>> and is not going to necessarily
- // at the beginning of the file
- case NET_SSH1_LOG_REALTIME_FILE:
- if (!isset($this->realtime_log_file)) {
- // PHP doesn't seem to like using constants in fopen()
- $filename = NET_SSH1_LOG_REALTIME_FILE;
- $fp = fopen($filename, 'w');
- $this->realtime_log_file = $fp;
- }
- if (!is_resource($this->realtime_log_file)) {
- break;
- }
- $entry = $this->_format_log(array($message), array($protocol_flags));
- if ($this->realtime_log_wrap) {
- $temp = "<<< START >>>\r\n";
- $entry.= $temp;
- fseek($this->realtime_log_file, ftell($this->realtime_log_file) - strlen($temp));
- }
- $this->realtime_log_size+= strlen($entry);
- if ($this->realtime_log_size > NET_SSH1_LOG_MAX_SIZE) {
- fseek($this->realtime_log_file, 0);
- $this->realtime_log_size = strlen($entry);
- $this->realtime_log_wrap = true;
- }
- fputs($this->realtime_log_file, $entry);
- }
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/Net/SSH2.php b/apps/files_external/3rdparty/phpseclib/phpseclib/Net/SSH2.php
deleted file mode 100644
index 2fddb68a9b2fd9cfde0f12208badabe35fa76592..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/Net/SSH2.php
+++ /dev/null
@@ -1,3686 +0,0 @@
-
- * login('username', 'password')) {
- * exit('Login Failed');
- * }
- *
- * echo $ssh->exec('pwd');
- * echo $ssh->exec('ls -la');
- * ?>
- *
- *
- *
- * setPassword('whatever');
- * $key->loadKey(file_get_contents('privatekey'));
- *
- * $ssh = new Net_SSH2('www.domain.tld');
- * if (!$ssh->login('username', $key)) {
- * exit('Login Failed');
- * }
- *
- * echo $ssh->read('username@username:~$');
- * $ssh->write("ls -la\n");
- * echo $ssh->read('username@username:~$');
- * ?>
- *
- *
- * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @category Net
- * @package Net_SSH2
- * @author Jim Wigginton
- * @copyright MMVII Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- */
-
-/**#@+
- * Execution Bitmap Masks
- *
- * @see Net_SSH2::bitmap
- * @access private
- */
-define('NET_SSH2_MASK_CONSTRUCTOR', 0x00000001);
-define('NET_SSH2_MASK_LOGIN_REQ', 0x00000002);
-define('NET_SSH2_MASK_LOGIN', 0x00000004);
-define('NET_SSH2_MASK_SHELL', 0x00000008);
-define('NET_SSH2_MASK_WINDOW_ADJUST', 0X00000010);
-/**#@-*/
-
-/**#@+
- * Channel constants
- *
- * RFC4254 refers not to client and server channels but rather to sender and recipient channels. we don't refer
- * to them in that way because RFC4254 toggles the meaning. the client sends a SSH_MSG_CHANNEL_OPEN message with
- * a sender channel and the server sends a SSH_MSG_CHANNEL_OPEN_CONFIRMATION in response, with a sender and a
- * recepient channel. at first glance, you might conclude that SSH_MSG_CHANNEL_OPEN_CONFIRMATION's sender channel
- * would be the same thing as SSH_MSG_CHANNEL_OPEN's sender channel, but it's not, per this snipet:
- * The 'recipient channel' is the channel number given in the original
- * open request, and 'sender channel' is the channel number allocated by
- * the other side.
- *
- * @see Net_SSH2::_send_channel_packet()
- * @see Net_SSH2::_get_channel_packet()
- * @access private
- */
-define('NET_SSH2_CHANNEL_EXEC', 0); // PuTTy uses 0x100
-define('NET_SSH2_CHANNEL_SHELL', 1);
-define('NET_SSH2_CHANNEL_SUBSYSTEM', 2);
-/**#@-*/
-
-/**#@+
- * @access public
- * @see Net_SSH2::getLog()
- */
-/**
- * Returns the message numbers
- */
-define('NET_SSH2_LOG_SIMPLE', 1);
-/**
- * Returns the message content
- */
-define('NET_SSH2_LOG_COMPLEX', 2);
-/**
- * Outputs the content real-time
- */
-define('NET_SSH2_LOG_REALTIME', 3);
-/**
- * Dumps the content real-time to a file
- */
-define('NET_SSH2_LOG_REALTIME_FILE', 4);
-/**#@-*/
-
-/**#@+
- * @access public
- * @see Net_SSH2::read()
- */
-/**
- * Returns when a string matching $expect exactly is found
- */
-define('NET_SSH2_READ_SIMPLE', 1);
-/**
- * Returns when a string matching the regular expression $expect is found
- */
-define('NET_SSH2_READ_REGEX', 2);
-/**
- * Make sure that the log never gets larger than this
- */
-define('NET_SSH2_LOG_MAX_SIZE', 1024 * 1024);
-/**#@-*/
-
-/**
- * Pure-PHP implementation of SSHv2.
- *
- * @package Net_SSH2
- * @author Jim Wigginton
- * @version 0.1.0
- * @access public
- */
-class Net_SSH2
-{
- /**
- * The SSH identifier
- *
- * @var String
- * @access private
- */
- var $identifier;
-
- /**
- * The Socket Object
- *
- * @var Object
- * @access private
- */
- var $fsock;
-
- /**
- * Execution Bitmap
- *
- * The bits that are set represent functions that have been called already. This is used to determine
- * if a requisite function has been successfully executed. If not, an error should be thrown.
- *
- * @var Integer
- * @access private
- */
- var $bitmap = 0;
-
- /**
- * Error information
- *
- * @see Net_SSH2::getErrors()
- * @see Net_SSH2::getLastError()
- * @var String
- * @access private
- */
- var $errors = array();
-
- /**
- * Server Identifier
- *
- * @see Net_SSH2::getServerIdentification()
- * @var String
- * @access private
- */
- var $server_identifier = '';
-
- /**
- * Key Exchange Algorithms
- *
- * @see Net_SSH2::getKexAlgorithims()
- * @var Array
- * @access private
- */
- var $kex_algorithms;
-
- /**
- * Server Host Key Algorithms
- *
- * @see Net_SSH2::getServerHostKeyAlgorithms()
- * @var Array
- * @access private
- */
- var $server_host_key_algorithms;
-
- /**
- * Encryption Algorithms: Client to Server
- *
- * @see Net_SSH2::getEncryptionAlgorithmsClient2Server()
- * @var Array
- * @access private
- */
- var $encryption_algorithms_client_to_server;
-
- /**
- * Encryption Algorithms: Server to Client
- *
- * @see Net_SSH2::getEncryptionAlgorithmsServer2Client()
- * @var Array
- * @access private
- */
- var $encryption_algorithms_server_to_client;
-
- /**
- * MAC Algorithms: Client to Server
- *
- * @see Net_SSH2::getMACAlgorithmsClient2Server()
- * @var Array
- * @access private
- */
- var $mac_algorithms_client_to_server;
-
- /**
- * MAC Algorithms: Server to Client
- *
- * @see Net_SSH2::getMACAlgorithmsServer2Client()
- * @var Array
- * @access private
- */
- var $mac_algorithms_server_to_client;
-
- /**
- * Compression Algorithms: Client to Server
- *
- * @see Net_SSH2::getCompressionAlgorithmsClient2Server()
- * @var Array
- * @access private
- */
- var $compression_algorithms_client_to_server;
-
- /**
- * Compression Algorithms: Server to Client
- *
- * @see Net_SSH2::getCompressionAlgorithmsServer2Client()
- * @var Array
- * @access private
- */
- var $compression_algorithms_server_to_client;
-
- /**
- * Languages: Server to Client
- *
- * @see Net_SSH2::getLanguagesServer2Client()
- * @var Array
- * @access private
- */
- var $languages_server_to_client;
-
- /**
- * Languages: Client to Server
- *
- * @see Net_SSH2::getLanguagesClient2Server()
- * @var Array
- * @access private
- */
- var $languages_client_to_server;
-
- /**
- * Block Size for Server to Client Encryption
- *
- * "Note that the length of the concatenation of 'packet_length',
- * 'padding_length', 'payload', and 'random padding' MUST be a multiple
- * of the cipher block size or 8, whichever is larger. This constraint
- * MUST be enforced, even when using stream ciphers."
- *
- * -- http://tools.ietf.org/html/rfc4253#section-6
- *
- * @see Net_SSH2::Net_SSH2()
- * @see Net_SSH2::_send_binary_packet()
- * @var Integer
- * @access private
- */
- var $encrypt_block_size = 8;
-
- /**
- * Block Size for Client to Server Encryption
- *
- * @see Net_SSH2::Net_SSH2()
- * @see Net_SSH2::_get_binary_packet()
- * @var Integer
- * @access private
- */
- var $decrypt_block_size = 8;
-
- /**
- * Server to Client Encryption Object
- *
- * @see Net_SSH2::_get_binary_packet()
- * @var Object
- * @access private
- */
- var $decrypt = false;
-
- /**
- * Client to Server Encryption Object
- *
- * @see Net_SSH2::_send_binary_packet()
- * @var Object
- * @access private
- */
- var $encrypt = false;
-
- /**
- * Client to Server HMAC Object
- *
- * @see Net_SSH2::_send_binary_packet()
- * @var Object
- * @access private
- */
- var $hmac_create = false;
-
- /**
- * Server to Client HMAC Object
- *
- * @see Net_SSH2::_get_binary_packet()
- * @var Object
- * @access private
- */
- var $hmac_check = false;
-
- /**
- * Size of server to client HMAC
- *
- * We need to know how big the HMAC will be for the server to client direction so that we know how many bytes to read.
- * For the client to server side, the HMAC object will make the HMAC as long as it needs to be. All we need to do is
- * append it.
- *
- * @see Net_SSH2::_get_binary_packet()
- * @var Integer
- * @access private
- */
- var $hmac_size = false;
-
- /**
- * Server Public Host Key
- *
- * @see Net_SSH2::getServerPublicHostKey()
- * @var String
- * @access private
- */
- var $server_public_host_key;
-
- /**
- * Session identifer
- *
- * "The exchange hash H from the first key exchange is additionally
- * used as the session identifier, which is a unique identifier for
- * this connection."
- *
- * -- http://tools.ietf.org/html/rfc4253#section-7.2
- *
- * @see Net_SSH2::_key_exchange()
- * @var String
- * @access private
- */
- var $session_id = false;
-
- /**
- * Exchange hash
- *
- * The current exchange hash
- *
- * @see Net_SSH2::_key_exchange()
- * @var String
- * @access private
- */
- var $exchange_hash = false;
-
- /**
- * Message Numbers
- *
- * @see Net_SSH2::Net_SSH2()
- * @var Array
- * @access private
- */
- var $message_numbers = array();
-
- /**
- * Disconnection Message 'reason codes' defined in RFC4253
- *
- * @see Net_SSH2::Net_SSH2()
- * @var Array
- * @access private
- */
- var $disconnect_reasons = array();
-
- /**
- * SSH_MSG_CHANNEL_OPEN_FAILURE 'reason codes', defined in RFC4254
- *
- * @see Net_SSH2::Net_SSH2()
- * @var Array
- * @access private
- */
- var $channel_open_failure_reasons = array();
-
- /**
- * Terminal Modes
- *
- * @link http://tools.ietf.org/html/rfc4254#section-8
- * @see Net_SSH2::Net_SSH2()
- * @var Array
- * @access private
- */
- var $terminal_modes = array();
-
- /**
- * SSH_MSG_CHANNEL_EXTENDED_DATA's data_type_codes
- *
- * @link http://tools.ietf.org/html/rfc4254#section-5.2
- * @see Net_SSH2::Net_SSH2()
- * @var Array
- * @access private
- */
- var $channel_extended_data_type_codes = array();
-
- /**
- * Send Sequence Number
- *
- * See 'Section 6.4. Data Integrity' of rfc4253 for more info.
- *
- * @see Net_SSH2::_send_binary_packet()
- * @var Integer
- * @access private
- */
- var $send_seq_no = 0;
-
- /**
- * Get Sequence Number
- *
- * See 'Section 6.4. Data Integrity' of rfc4253 for more info.
- *
- * @see Net_SSH2::_get_binary_packet()
- * @var Integer
- * @access private
- */
- var $get_seq_no = 0;
-
- /**
- * Server Channels
- *
- * Maps client channels to server channels
- *
- * @see Net_SSH2::_get_channel_packet()
- * @see Net_SSH2::exec()
- * @var Array
- * @access private
- */
- var $server_channels = array();
-
- /**
- * Channel Buffers
- *
- * If a client requests a packet from one channel but receives two packets from another those packets should
- * be placed in a buffer
- *
- * @see Net_SSH2::_get_channel_packet()
- * @see Net_SSH2::exec()
- * @var Array
- * @access private
- */
- var $channel_buffers = array();
-
- /**
- * Channel Status
- *
- * Contains the type of the last sent message
- *
- * @see Net_SSH2::_get_channel_packet()
- * @var Array
- * @access private
- */
- var $channel_status = array();
-
- /**
- * Packet Size
- *
- * Maximum packet size indexed by channel
- *
- * @see Net_SSH2::_send_channel_packet()
- * @var Array
- * @access private
- */
- var $packet_size_client_to_server = array();
-
- /**
- * Message Number Log
- *
- * @see Net_SSH2::getLog()
- * @var Array
- * @access private
- */
- var $message_number_log = array();
-
- /**
- * Message Log
- *
- * @see Net_SSH2::getLog()
- * @var Array
- * @access private
- */
- var $message_log = array();
-
- /**
- * The Window Size
- *
- * Bytes the other party can send before it must wait for the window to be adjusted (0x7FFFFFFF = 2GB)
- *
- * @var Integer
- * @see Net_SSH2::_send_channel_packet()
- * @see Net_SSH2::exec()
- * @access private
- */
- var $window_size = 0x7FFFFFFF;
-
- /**
- * Window size, server to client
- *
- * Window size indexed by channel
- *
- * @see Net_SSH2::_send_channel_packet()
- * @var Array
- * @access private
- */
- var $window_size_server_to_client = array();
-
- /**
- * Window size, client to server
- *
- * Window size indexed by channel
- *
- * @see Net_SSH2::_get_channel_packet()
- * @var Array
- * @access private
- */
- var $window_size_client_to_server = array();
-
- /**
- * Server signature
- *
- * Verified against $this->session_id
- *
- * @see Net_SSH2::getServerPublicHostKey()
- * @var String
- * @access private
- */
- var $signature = '';
-
- /**
- * Server signature format
- *
- * ssh-rsa or ssh-dss.
- *
- * @see Net_SSH2::getServerPublicHostKey()
- * @var String
- * @access private
- */
- var $signature_format = '';
-
- /**
- * Interactive Buffer
- *
- * @see Net_SSH2::read()
- * @var Array
- * @access private
- */
- var $interactiveBuffer = '';
-
- /**
- * Current log size
- *
- * Should never exceed NET_SSH2_LOG_MAX_SIZE
- *
- * @see Net_SSH2::_send_binary_packet()
- * @see Net_SSH2::_get_binary_packet()
- * @var Integer
- * @access private
- */
- var $log_size;
-
- /**
- * Timeout
- *
- * @see Net_SSH2::setTimeout()
- * @access private
- */
- var $timeout;
-
- /**
- * Current Timeout
- *
- * @see Net_SSH2::_get_channel_packet()
- * @access private
- */
- var $curTimeout;
-
- /**
- * Real-time log file pointer
- *
- * @see Net_SSH2::_append_log()
- * @var Resource
- * @access private
- */
- var $realtime_log_file;
-
- /**
- * Real-time log file size
- *
- * @see Net_SSH2::_append_log()
- * @var Integer
- * @access private
- */
- var $realtime_log_size;
-
- /**
- * Has the signature been validated?
- *
- * @see Net_SSH2::getServerPublicHostKey()
- * @var Boolean
- * @access private
- */
- var $signature_validated = false;
-
- /**
- * Real-time log file wrap boolean
- *
- * @see Net_SSH2::_append_log()
- * @access private
- */
- var $realtime_log_wrap;
-
- /**
- * Flag to suppress stderr from output
- *
- * @see Net_SSH2::enableQuietMode()
- * @access private
- */
- var $quiet_mode = false;
-
- /**
- * Time of first network activity
- *
- * @access private
- */
- var $last_packet;
-
- /**
- * Exit status returned from ssh if any
- *
- * @var Integer
- * @access private
- */
- var $exit_status;
-
- /**
- * Flag to request a PTY when using exec()
- *
- * @see Net_SSH2::enablePTY()
- * @access private
- */
- var $request_pty = false;
-
- /**
- * Flag set while exec() is running when using enablePTY()
- *
- * @access private
- */
- var $in_request_pty_exec = false;
-
- /**
- * Flag set after startSubsystem() is called
- *
- * @access private
- */
- var $in_subsystem;
-
- /**
- * Contents of stdError
- *
- * @access private
- */
- var $stdErrorLog;
-
- /**
- * The Last Interactive Response
- *
- * @see Net_SSH2::_keyboard_interactive_process()
- * @access private
- */
- var $last_interactive_response = '';
-
- /**
- * Keyboard Interactive Request / Responses
- *
- * @see Net_SSH2::_keyboard_interactive_process()
- * @access private
- */
- var $keyboard_requests_responses = array();
-
- /**
- * Banner Message
- *
- * Quoting from the RFC, "in some jurisdictions, sending a warning message before
- * authentication may be relevant for getting legal protection."
- *
- * @see Net_SSH2::_filter()
- * @see Net_SSH2::getBannerMessage()
- * @access private
- */
- var $banner_message = '';
-
- /**
- * Did read() timeout or return normally?
- *
- * @see Net_SSH2::isTimeout
- * @access private
- */
- var $is_timeout = false;
-
- /**
- * Log Boundary
- *
- * @see Net_SSH2::_format_log
- * @access private
- */
- var $log_boundary = ':';
-
- /**
- * Log Long Width
- *
- * @see Net_SSH2::_format_log
- * @access private
- */
- var $log_long_width = 65;
-
- /**
- * Log Short Width
- *
- * @see Net_SSH2::_format_log
- * @access private
- */
- var $log_short_width = 16;
-
- /**
- * Default Constructor.
- *
- * Connects to an SSHv2 server
- *
- * @param String $host
- * @param optional Integer $port
- * @param optional Integer $timeout
- * @return Net_SSH2
- * @access public
- */
- function Net_SSH2($host, $port = 22, $timeout = 10)
- {
- // Include Math_BigInteger
- // Used to do Diffie-Hellman key exchange and DSA/RSA signature verification.
- if (!class_exists('Math_BigInteger')) {
- include_once 'Math/BigInteger.php';
- }
-
- if (!function_exists('crypt_random_string')) {
- include_once 'Crypt/Random.php';
- }
-
- if (!class_exists('Crypt_Hash')) {
- include_once 'Crypt/Hash.php';
- }
-
- $this->last_packet = strtok(microtime(), ' ') + strtok(''); // == microtime(true) in PHP5
- $this->message_numbers = array(
- 1 => 'NET_SSH2_MSG_DISCONNECT',
- 2 => 'NET_SSH2_MSG_IGNORE',
- 3 => 'NET_SSH2_MSG_UNIMPLEMENTED',
- 4 => 'NET_SSH2_MSG_DEBUG',
- 5 => 'NET_SSH2_MSG_SERVICE_REQUEST',
- 6 => 'NET_SSH2_MSG_SERVICE_ACCEPT',
- 20 => 'NET_SSH2_MSG_KEXINIT',
- 21 => 'NET_SSH2_MSG_NEWKEYS',
- 30 => 'NET_SSH2_MSG_KEXDH_INIT',
- 31 => 'NET_SSH2_MSG_KEXDH_REPLY',
- 50 => 'NET_SSH2_MSG_USERAUTH_REQUEST',
- 51 => 'NET_SSH2_MSG_USERAUTH_FAILURE',
- 52 => 'NET_SSH2_MSG_USERAUTH_SUCCESS',
- 53 => 'NET_SSH2_MSG_USERAUTH_BANNER',
-
- 80 => 'NET_SSH2_MSG_GLOBAL_REQUEST',
- 81 => 'NET_SSH2_MSG_REQUEST_SUCCESS',
- 82 => 'NET_SSH2_MSG_REQUEST_FAILURE',
- 90 => 'NET_SSH2_MSG_CHANNEL_OPEN',
- 91 => 'NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION',
- 92 => 'NET_SSH2_MSG_CHANNEL_OPEN_FAILURE',
- 93 => 'NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST',
- 94 => 'NET_SSH2_MSG_CHANNEL_DATA',
- 95 => 'NET_SSH2_MSG_CHANNEL_EXTENDED_DATA',
- 96 => 'NET_SSH2_MSG_CHANNEL_EOF',
- 97 => 'NET_SSH2_MSG_CHANNEL_CLOSE',
- 98 => 'NET_SSH2_MSG_CHANNEL_REQUEST',
- 99 => 'NET_SSH2_MSG_CHANNEL_SUCCESS',
- 100 => 'NET_SSH2_MSG_CHANNEL_FAILURE'
- );
- $this->disconnect_reasons = array(
- 1 => 'NET_SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT',
- 2 => 'NET_SSH2_DISCONNECT_PROTOCOL_ERROR',
- 3 => 'NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED',
- 4 => 'NET_SSH2_DISCONNECT_RESERVED',
- 5 => 'NET_SSH2_DISCONNECT_MAC_ERROR',
- 6 => 'NET_SSH2_DISCONNECT_COMPRESSION_ERROR',
- 7 => 'NET_SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE',
- 8 => 'NET_SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED',
- 9 => 'NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE',
- 10 => 'NET_SSH2_DISCONNECT_CONNECTION_LOST',
- 11 => 'NET_SSH2_DISCONNECT_BY_APPLICATION',
- 12 => 'NET_SSH2_DISCONNECT_TOO_MANY_CONNECTIONS',
- 13 => 'NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER',
- 14 => 'NET_SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE',
- 15 => 'NET_SSH2_DISCONNECT_ILLEGAL_USER_NAME'
- );
- $this->channel_open_failure_reasons = array(
- 1 => 'NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED'
- );
- $this->terminal_modes = array(
- 0 => 'NET_SSH2_TTY_OP_END'
- );
- $this->channel_extended_data_type_codes = array(
- 1 => 'NET_SSH2_EXTENDED_DATA_STDERR'
- );
-
- $this->_define_array(
- $this->message_numbers,
- $this->disconnect_reasons,
- $this->channel_open_failure_reasons,
- $this->terminal_modes,
- $this->channel_extended_data_type_codes,
- array(60 => 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ'),
- array(60 => 'NET_SSH2_MSG_USERAUTH_PK_OK'),
- array(60 => 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST',
- 61 => 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE')
- );
-
- $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838
- $this->fsock = @fsockopen($host, $port, $errno, $errstr, $timeout);
- if (!$this->fsock) {
- user_error(rtrim("Cannot connect to $host. Error $errno. $errstr"));
- return;
- }
- $elapsed = strtok(microtime(), ' ') + strtok('') - $start;
-
- $timeout-= $elapsed;
-
- if ($timeout <= 0) {
- user_error(rtrim("Cannot connect to $host. Timeout error"));
- return;
- }
-
- $read = array($this->fsock);
- $write = $except = null;
-
- $sec = floor($timeout);
- $usec = 1000000 * ($timeout - $sec);
-
- // on windows this returns a "Warning: Invalid CRT parameters detected" error
- // the !count() is done as a workaround for
- if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) {
- user_error(rtrim("Cannot connect to $host. Banner timeout"));
- return;
- }
-
- /* According to the SSH2 specs,
-
- "The server MAY send other lines of data before sending the version
- string. Each line SHOULD be terminated by a Carriage Return and Line
- Feed. Such lines MUST NOT begin with "SSH-", and SHOULD be encoded
- in ISO-10646 UTF-8 [RFC3629] (language is not specified). Clients
- MUST be able to process such lines." */
- $temp = '';
- $extra = '';
- while (!feof($this->fsock) && !preg_match('#^SSH-(\d\.\d+)#', $temp, $matches)) {
- if (substr($temp, -2) == "\r\n") {
- $extra.= $temp;
- $temp = '';
- }
- $temp.= fgets($this->fsock, 255);
- }
-
- if (feof($this->fsock)) {
- user_error('Connection closed by server');
- return false;
- }
-
- $this->identifier = $this->_generate_identifier();
-
- if (defined('NET_SSH2_LOGGING')) {
- $this->_append_log('<-', $extra . $temp);
- $this->_append_log('->', $this->identifier . "\r\n");
- }
-
- $this->server_identifier = trim($temp, "\r\n");
- if (strlen($extra)) {
- $this->errors[] = utf8_decode($extra);
- }
-
- if ($matches[1] != '1.99' && $matches[1] != '2.0') {
- user_error("Cannot connect to SSH $matches[1] servers");
- return;
- }
-
- fputs($this->fsock, $this->identifier . "\r\n");
-
- $response = $this->_get_binary_packet();
- if ($response === false) {
- user_error('Connection closed by server');
- return;
- }
-
- if (ord($response[0]) != NET_SSH2_MSG_KEXINIT) {
- user_error('Expected SSH_MSG_KEXINIT');
- return;
- }
-
- if (!$this->_key_exchange($response)) {
- return;
- }
-
- $this->bitmap = NET_SSH2_MASK_CONSTRUCTOR;
- }
-
- /**
- * Generates the SSH identifier
- *
- * You should overwrite this method in your own class if you want to use another identifier
- *
- * @access protected
- * @return String
- */
- function _generate_identifier()
- {
- $identifier = 'SSH-2.0-phpseclib_0.3';
-
- $ext = array();
- if (extension_loaded('mcrypt')) {
- $ext[] = 'mcrypt';
- }
-
- if (extension_loaded('gmp')) {
- $ext[] = 'gmp';
- } elseif (extension_loaded('bcmath')) {
- $ext[] = 'bcmath';
- }
-
- if (!empty($ext)) {
- $identifier .= ' (' . implode(', ', $ext) . ')';
- }
-
- return $identifier;
- }
-
- /**
- * Key Exchange
- *
- * @param String $kexinit_payload_server
- * @access private
- */
- function _key_exchange($kexinit_payload_server)
- {
- static $kex_algorithms = array(
- 'diffie-hellman-group1-sha1', // REQUIRED
- 'diffie-hellman-group14-sha1' // REQUIRED
- );
-
- static $server_host_key_algorithms = array(
- 'ssh-rsa', // RECOMMENDED sign Raw RSA Key
- 'ssh-dss' // REQUIRED sign Raw DSS Key
- );
-
- static $encryption_algorithms = false;
- if ($encryption_algorithms === false) {
- $encryption_algorithms = array(
- // from :
- 'arcfour256',
- 'arcfour128',
-
- 'arcfour', // OPTIONAL the ARCFOUR stream cipher with a 128-bit key
-
- // CTR modes from :
- 'aes128-ctr', // RECOMMENDED AES (Rijndael) in SDCTR mode, with 128-bit key
- 'aes192-ctr', // RECOMMENDED AES with 192-bit key
- 'aes256-ctr', // RECOMMENDED AES with 256-bit key
-
- 'twofish128-ctr', // OPTIONAL Twofish in SDCTR mode, with 128-bit key
- 'twofish192-ctr', // OPTIONAL Twofish with 192-bit key
- 'twofish256-ctr', // OPTIONAL Twofish with 256-bit key
-
- 'aes128-cbc', // RECOMMENDED AES with a 128-bit key
- 'aes192-cbc', // OPTIONAL AES with a 192-bit key
- 'aes256-cbc', // OPTIONAL AES in CBC mode, with a 256-bit key
-
- 'twofish128-cbc', // OPTIONAL Twofish with a 128-bit key
- 'twofish192-cbc', // OPTIONAL Twofish with a 192-bit key
- 'twofish256-cbc',
- 'twofish-cbc', // OPTIONAL alias for "twofish256-cbc"
- // (this is being retained for historical reasons)
-
- 'blowfish-ctr', // OPTIONAL Blowfish in SDCTR mode
-
- 'blowfish-cbc', // OPTIONAL Blowfish in CBC mode
-
- '3des-ctr', // RECOMMENDED Three-key 3DES in SDCTR mode
-
- '3des-cbc', // REQUIRED three-key 3DES in CBC mode
- 'none' // OPTIONAL no encryption; NOT RECOMMENDED
- );
-
- if (!$this->_is_includable('Crypt/RC4.php')) {
- $encryption_algorithms = array_diff(
- $encryption_algorithms,
- array('arcfour256', 'arcfour128', 'arcfour')
- );
- }
- if (!$this->_is_includable('Crypt/Rijndael.php')) {
- $encryption_algorithms = array_diff(
- $encryption_algorithms,
- array('aes128-ctr', 'aes192-ctr', 'aes256-ctr', 'aes128-cbc', 'aes192-cbc', 'aes256-cbc')
- );
- }
- if (!$this->_is_includable('Crypt/Twofish.php')) {
- $encryption_algorithms = array_diff(
- $encryption_algorithms,
- array('twofish128-ctr', 'twofish192-ctr', 'twofish256-ctr', 'twofish128-cbc', 'twofish192-cbc', 'twofish256-cbc', 'twofish-cbc')
- );
- }
- if (!$this->_is_includable('Crypt/Blowfish.php')) {
- $encryption_algorithms = array_diff(
- $encryption_algorithms,
- array('blowfish-ctr', 'blowfish-cbc')
- );
- }
- if (!$this->_is_includable('Crypt/TripleDES.php')) {
- $encryption_algorithms = array_diff(
- $encryption_algorithms,
- array('3des-ctr', '3des-cbc')
- );
- }
- $encryption_algorithms = array_values($encryption_algorithms);
- }
-
- static $mac_algorithms = array(
- 'hmac-sha1-96', // RECOMMENDED first 96 bits of HMAC-SHA1 (digest length = 12, key length = 20)
- 'hmac-sha1', // REQUIRED HMAC-SHA1 (digest length = key length = 20)
- 'hmac-md5-96', // OPTIONAL first 96 bits of HMAC-MD5 (digest length = 12, key length = 16)
- 'hmac-md5', // OPTIONAL HMAC-MD5 (digest length = key length = 16)
- 'none' // OPTIONAL no MAC; NOT RECOMMENDED
- );
-
- static $compression_algorithms = array(
- 'none' // REQUIRED no compression
- //'zlib' // OPTIONAL ZLIB (LZ77) compression
- );
-
- // some SSH servers have buggy implementations of some of the above algorithms
- switch ($this->server_identifier) {
- case 'SSH-2.0-SSHD':
- $mac_algorithms = array_values(array_diff(
- $mac_algorithms,
- array('hmac-sha1-96', 'hmac-md5-96')
- ));
- }
-
- static $str_kex_algorithms, $str_server_host_key_algorithms,
- $encryption_algorithms_server_to_client, $mac_algorithms_server_to_client, $compression_algorithms_server_to_client,
- $encryption_algorithms_client_to_server, $mac_algorithms_client_to_server, $compression_algorithms_client_to_server;
-
- if (empty($str_kex_algorithms)) {
- $str_kex_algorithms = implode(',', $kex_algorithms);
- $str_server_host_key_algorithms = implode(',', $server_host_key_algorithms);
- $encryption_algorithms_server_to_client = $encryption_algorithms_client_to_server = implode(',', $encryption_algorithms);
- $mac_algorithms_server_to_client = $mac_algorithms_client_to_server = implode(',', $mac_algorithms);
- $compression_algorithms_server_to_client = $compression_algorithms_client_to_server = implode(',', $compression_algorithms);
- }
-
- $client_cookie = crypt_random_string(16);
-
- $response = $kexinit_payload_server;
- $this->_string_shift($response, 1); // skip past the message number (it should be SSH_MSG_KEXINIT)
- $server_cookie = $this->_string_shift($response, 16);
-
- $temp = unpack('Nlength', $this->_string_shift($response, 4));
- $this->kex_algorithms = explode(',', $this->_string_shift($response, $temp['length']));
-
- $temp = unpack('Nlength', $this->_string_shift($response, 4));
- $this->server_host_key_algorithms = explode(',', $this->_string_shift($response, $temp['length']));
-
- $temp = unpack('Nlength', $this->_string_shift($response, 4));
- $this->encryption_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length']));
-
- $temp = unpack('Nlength', $this->_string_shift($response, 4));
- $this->encryption_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length']));
-
- $temp = unpack('Nlength', $this->_string_shift($response, 4));
- $this->mac_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length']));
-
- $temp = unpack('Nlength', $this->_string_shift($response, 4));
- $this->mac_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length']));
-
- $temp = unpack('Nlength', $this->_string_shift($response, 4));
- $this->compression_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length']));
-
- $temp = unpack('Nlength', $this->_string_shift($response, 4));
- $this->compression_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length']));
-
- $temp = unpack('Nlength', $this->_string_shift($response, 4));
- $this->languages_client_to_server = explode(',', $this->_string_shift($response, $temp['length']));
-
- $temp = unpack('Nlength', $this->_string_shift($response, 4));
- $this->languages_server_to_client = explode(',', $this->_string_shift($response, $temp['length']));
-
- extract(unpack('Cfirst_kex_packet_follows', $this->_string_shift($response, 1)));
- $first_kex_packet_follows = $first_kex_packet_follows != 0;
-
- // the sending of SSH2_MSG_KEXINIT could go in one of two places. this is the second place.
- $kexinit_payload_client = pack('Ca*Na*Na*Na*Na*Na*Na*Na*Na*Na*Na*CN',
- NET_SSH2_MSG_KEXINIT, $client_cookie, strlen($str_kex_algorithms), $str_kex_algorithms,
- strlen($str_server_host_key_algorithms), $str_server_host_key_algorithms, strlen($encryption_algorithms_client_to_server),
- $encryption_algorithms_client_to_server, strlen($encryption_algorithms_server_to_client), $encryption_algorithms_server_to_client,
- strlen($mac_algorithms_client_to_server), $mac_algorithms_client_to_server, strlen($mac_algorithms_server_to_client),
- $mac_algorithms_server_to_client, strlen($compression_algorithms_client_to_server), $compression_algorithms_client_to_server,
- strlen($compression_algorithms_server_to_client), $compression_algorithms_server_to_client, 0, '', 0, '',
- 0, 0
- );
-
- if (!$this->_send_binary_packet($kexinit_payload_client)) {
- return false;
- }
- // here ends the second place.
-
- // we need to decide upon the symmetric encryption algorithms before we do the diffie-hellman key exchange
- for ($i = 0; $i < count($encryption_algorithms) && !in_array($encryption_algorithms[$i], $this->encryption_algorithms_server_to_client); $i++);
- if ($i == count($encryption_algorithms)) {
- user_error('No compatible server to client encryption algorithms found');
- return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
- }
-
- // we don't initialize any crypto-objects, yet - we do that, later. for now, we need the lengths to make the
- // diffie-hellman key exchange as fast as possible
- $decrypt = $encryption_algorithms[$i];
- switch ($decrypt) {
- case '3des-cbc':
- case '3des-ctr':
- $decryptKeyLength = 24; // eg. 192 / 8
- break;
- case 'aes256-cbc':
- case 'aes256-ctr':
- case 'twofish-cbc':
- case 'twofish256-cbc':
- case 'twofish256-ctr':
- $decryptKeyLength = 32; // eg. 256 / 8
- break;
- case 'aes192-cbc':
- case 'aes192-ctr':
- case 'twofish192-cbc':
- case 'twofish192-ctr':
- $decryptKeyLength = 24; // eg. 192 / 8
- break;
- case 'aes128-cbc':
- case 'aes128-ctr':
- case 'twofish128-cbc':
- case 'twofish128-ctr':
- case 'blowfish-cbc':
- case 'blowfish-ctr':
- $decryptKeyLength = 16; // eg. 128 / 8
- break;
- case 'arcfour':
- case 'arcfour128':
- $decryptKeyLength = 16; // eg. 128 / 8
- break;
- case 'arcfour256':
- $decryptKeyLength = 32; // eg. 128 / 8
- break;
- case 'none';
- $decryptKeyLength = 0;
- }
-
- for ($i = 0; $i < count($encryption_algorithms) && !in_array($encryption_algorithms[$i], $this->encryption_algorithms_client_to_server); $i++);
- if ($i == count($encryption_algorithms)) {
- user_error('No compatible client to server encryption algorithms found');
- return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
- }
-
- $encrypt = $encryption_algorithms[$i];
- switch ($encrypt) {
- case '3des-cbc':
- case '3des-ctr':
- $encryptKeyLength = 24;
- break;
- case 'aes256-cbc':
- case 'aes256-ctr':
- case 'twofish-cbc':
- case 'twofish256-cbc':
- case 'twofish256-ctr':
- $encryptKeyLength = 32;
- break;
- case 'aes192-cbc':
- case 'aes192-ctr':
- case 'twofish192-cbc':
- case 'twofish192-ctr':
- $encryptKeyLength = 24;
- break;
- case 'aes128-cbc':
- case 'aes128-ctr':
- case 'twofish128-cbc':
- case 'twofish128-ctr':
- case 'blowfish-cbc':
- case 'blowfish-ctr':
- $encryptKeyLength = 16;
- break;
- case 'arcfour':
- case 'arcfour128':
- $encryptKeyLength = 16;
- break;
- case 'arcfour256':
- $encryptKeyLength = 32;
- break;
- case 'none';
- $encryptKeyLength = 0;
- }
-
- $keyLength = $decryptKeyLength > $encryptKeyLength ? $decryptKeyLength : $encryptKeyLength;
-
- // through diffie-hellman key exchange a symmetric key is obtained
- for ($i = 0; $i < count($kex_algorithms) && !in_array($kex_algorithms[$i], $this->kex_algorithms); $i++);
- if ($i == count($kex_algorithms)) {
- user_error('No compatible key exchange algorithms found');
- return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
- }
-
- switch ($kex_algorithms[$i]) {
- // see http://tools.ietf.org/html/rfc2409#section-6.2 and
- // http://tools.ietf.org/html/rfc2412, appendex E
- case 'diffie-hellman-group1-sha1':
- $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' .
- '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' .
- '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' .
- 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF';
- break;
- // see http://tools.ietf.org/html/rfc3526#section-3
- case 'diffie-hellman-group14-sha1':
- $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' .
- '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' .
- '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' .
- 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' .
- '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' .
- '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' .
- 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' .
- '3995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF';
- break;
- }
-
- // For both diffie-hellman-group1-sha1 and diffie-hellman-group14-sha1
- // the generator field element is 2 (decimal) and the hash function is sha1.
- $g = new Math_BigInteger(2);
- $prime = new Math_BigInteger($prime, 16);
- $kexHash = new Crypt_Hash('sha1');
- //$q = $p->bitwise_rightShift(1);
-
- /* To increase the speed of the key exchange, both client and server may
- reduce the size of their private exponents. It should be at least
- twice as long as the key material that is generated from the shared
- secret. For more details, see the paper by van Oorschot and Wiener
- [VAN-OORSCHOT].
-
- -- http://tools.ietf.org/html/rfc4419#section-6.2 */
- $one = new Math_BigInteger(1);
- $keyLength = min($keyLength, $kexHash->getLength());
- $max = $one->bitwise_leftShift(16 * $keyLength); // 2 * 8 * $keyLength
- $max = $max->subtract($one);
-
- $x = $one->random($one, $max);
- $e = $g->modPow($x, $prime);
-
- $eBytes = $e->toBytes(true);
- $data = pack('CNa*', NET_SSH2_MSG_KEXDH_INIT, strlen($eBytes), $eBytes);
-
- if (!$this->_send_binary_packet($data)) {
- user_error('Connection closed by server');
- return false;
- }
-
- $response = $this->_get_binary_packet();
- if ($response === false) {
- user_error('Connection closed by server');
- return false;
- }
- extract(unpack('Ctype', $this->_string_shift($response, 1)));
-
- if ($type != NET_SSH2_MSG_KEXDH_REPLY) {
- user_error('Expected SSH_MSG_KEXDH_REPLY');
- return false;
- }
-
- $temp = unpack('Nlength', $this->_string_shift($response, 4));
- $this->server_public_host_key = $server_public_host_key = $this->_string_shift($response, $temp['length']);
-
- $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4));
- $public_key_format = $this->_string_shift($server_public_host_key, $temp['length']);
-
- $temp = unpack('Nlength', $this->_string_shift($response, 4));
- $fBytes = $this->_string_shift($response, $temp['length']);
- $f = new Math_BigInteger($fBytes, -256);
-
- $temp = unpack('Nlength', $this->_string_shift($response, 4));
- $this->signature = $this->_string_shift($response, $temp['length']);
-
- $temp = unpack('Nlength', $this->_string_shift($this->signature, 4));
- $this->signature_format = $this->_string_shift($this->signature, $temp['length']);
-
- $key = $f->modPow($x, $prime);
- $keyBytes = $key->toBytes(true);
-
- $this->exchange_hash = pack('Na*Na*Na*Na*Na*Na*Na*Na*',
- strlen($this->identifier), $this->identifier, strlen($this->server_identifier), $this->server_identifier,
- strlen($kexinit_payload_client), $kexinit_payload_client, strlen($kexinit_payload_server),
- $kexinit_payload_server, strlen($this->server_public_host_key), $this->server_public_host_key, strlen($eBytes),
- $eBytes, strlen($fBytes), $fBytes, strlen($keyBytes), $keyBytes
- );
-
- $this->exchange_hash = $kexHash->hash($this->exchange_hash);
-
- if ($this->session_id === false) {
- $this->session_id = $this->exchange_hash;
- }
-
- for ($i = 0; $i < count($server_host_key_algorithms) && !in_array($server_host_key_algorithms[$i], $this->server_host_key_algorithms); $i++);
- if ($i == count($server_host_key_algorithms)) {
- user_error('No compatible server host key algorithms found');
- return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
- }
-
- if ($public_key_format != $server_host_key_algorithms[$i] || $this->signature_format != $server_host_key_algorithms[$i]) {
- user_error('Server Host Key Algorithm Mismatch');
- return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
- }
-
- $packet = pack('C',
- NET_SSH2_MSG_NEWKEYS
- );
-
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
-
- $response = $this->_get_binary_packet();
-
- if ($response === false) {
- user_error('Connection closed by server');
- return false;
- }
-
- extract(unpack('Ctype', $this->_string_shift($response, 1)));
-
- if ($type != NET_SSH2_MSG_NEWKEYS) {
- user_error('Expected SSH_MSG_NEWKEYS');
- return false;
- }
-
- switch ($encrypt) {
- case '3des-cbc':
- if (!class_exists('Crypt_TripleDES')) {
- include_once 'Crypt/TripleDES.php';
- }
- $this->encrypt = new Crypt_TripleDES();
- // $this->encrypt_block_size = 64 / 8 == the default
- break;
- case '3des-ctr':
- if (!class_exists('Crypt_TripleDES')) {
- include_once 'Crypt/TripleDES.php';
- }
- $this->encrypt = new Crypt_TripleDES(CRYPT_DES_MODE_CTR);
- // $this->encrypt_block_size = 64 / 8 == the default
- break;
- case 'aes256-cbc':
- case 'aes192-cbc':
- case 'aes128-cbc':
- if (!class_exists('Crypt_Rijndael')) {
- include_once 'Crypt/Rijndael.php';
- }
- $this->encrypt = new Crypt_Rijndael();
- $this->encrypt_block_size = 16; // eg. 128 / 8
- break;
- case 'aes256-ctr':
- case 'aes192-ctr':
- case 'aes128-ctr':
- if (!class_exists('Crypt_Rijndael')) {
- include_once 'Crypt/Rijndael.php';
- }
- $this->encrypt = new Crypt_Rijndael(CRYPT_RIJNDAEL_MODE_CTR);
- $this->encrypt_block_size = 16; // eg. 128 / 8
- break;
- case 'blowfish-cbc':
- if (!class_exists('Crypt_Blowfish')) {
- include_once 'Crypt/Blowfish.php';
- }
- $this->encrypt = new Crypt_Blowfish();
- $this->encrypt_block_size = 8;
- break;
- case 'blowfish-ctr':
- if (!class_exists('Crypt_Blowfish')) {
- include_once 'Crypt/Blowfish.php';
- }
- $this->encrypt = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR);
- $this->encrypt_block_size = 8;
- break;
- case 'twofish128-cbc':
- case 'twofish192-cbc':
- case 'twofish256-cbc':
- case 'twofish-cbc':
- if (!class_exists('Crypt_Twofish')) {
- include_once 'Crypt/Twofish.php';
- }
- $this->encrypt = new Crypt_Twofish();
- $this->encrypt_block_size = 16;
- break;
- case 'twofish128-ctr':
- case 'twofish192-ctr':
- case 'twofish256-ctr':
- if (!class_exists('Crypt_Twofish')) {
- include_once 'Crypt/Twofish.php';
- }
- $this->encrypt = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR);
- $this->encrypt_block_size = 16;
- break;
- case 'arcfour':
- case 'arcfour128':
- case 'arcfour256':
- if (!class_exists('Crypt_RC4')) {
- include_once 'Crypt/RC4.php';
- }
- $this->encrypt = new Crypt_RC4();
- break;
- case 'none';
- //$this->encrypt = new Crypt_Null();
- }
-
- switch ($decrypt) {
- case '3des-cbc':
- if (!class_exists('Crypt_TripleDES')) {
- include_once 'Crypt/TripleDES.php';
- }
- $this->decrypt = new Crypt_TripleDES();
- break;
- case '3des-ctr':
- if (!class_exists('Crypt_TripleDES')) {
- include_once 'Crypt/TripleDES.php';
- }
- $this->decrypt = new Crypt_TripleDES(CRYPT_DES_MODE_CTR);
- break;
- case 'aes256-cbc':
- case 'aes192-cbc':
- case 'aes128-cbc':
- if (!class_exists('Crypt_Rijndael')) {
- include_once 'Crypt/Rijndael.php';
- }
- $this->decrypt = new Crypt_Rijndael();
- $this->decrypt_block_size = 16;
- break;
- case 'aes256-ctr':
- case 'aes192-ctr':
- case 'aes128-ctr':
- if (!class_exists('Crypt_Rijndael')) {
- include_once 'Crypt/Rijndael.php';
- }
- $this->decrypt = new Crypt_Rijndael(CRYPT_RIJNDAEL_MODE_CTR);
- $this->decrypt_block_size = 16;
- break;
- case 'blowfish-cbc':
- if (!class_exists('Crypt_Blowfish')) {
- include_once 'Crypt/Blowfish.php';
- }
- $this->decrypt = new Crypt_Blowfish();
- $this->decrypt_block_size = 8;
- break;
- case 'blowfish-ctr':
- if (!class_exists('Crypt_Blowfish')) {
- include_once 'Crypt/Blowfish.php';
- }
- $this->decrypt = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR);
- $this->decrypt_block_size = 8;
- break;
- case 'twofish128-cbc':
- case 'twofish192-cbc':
- case 'twofish256-cbc':
- case 'twofish-cbc':
- if (!class_exists('Crypt_Twofish')) {
- include_once 'Crypt/Twofish.php';
- }
- $this->decrypt = new Crypt_Twofish();
- $this->decrypt_block_size = 16;
- break;
- case 'twofish128-ctr':
- case 'twofish192-ctr':
- case 'twofish256-ctr':
- if (!class_exists('Crypt_Twofish')) {
- include_once 'Crypt/Twofish.php';
- }
- $this->decrypt = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR);
- $this->decrypt_block_size = 16;
- break;
- case 'arcfour':
- case 'arcfour128':
- case 'arcfour256':
- if (!class_exists('Crypt_RC4')) {
- include_once 'Crypt/RC4.php';
- }
- $this->decrypt = new Crypt_RC4();
- break;
- case 'none';
- //$this->decrypt = new Crypt_Null();
- }
-
- $keyBytes = pack('Na*', strlen($keyBytes), $keyBytes);
-
- if ($this->encrypt) {
- $this->encrypt->enableContinuousBuffer();
- $this->encrypt->disablePadding();
-
- $iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'A' . $this->session_id);
- while ($this->encrypt_block_size > strlen($iv)) {
- $iv.= $kexHash->hash($keyBytes . $this->exchange_hash . $iv);
- }
- $this->encrypt->setIV(substr($iv, 0, $this->encrypt_block_size));
-
- $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'C' . $this->session_id);
- while ($encryptKeyLength > strlen($key)) {
- $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key);
- }
- $this->encrypt->setKey(substr($key, 0, $encryptKeyLength));
- }
-
- if ($this->decrypt) {
- $this->decrypt->enableContinuousBuffer();
- $this->decrypt->disablePadding();
-
- $iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'B' . $this->session_id);
- while ($this->decrypt_block_size > strlen($iv)) {
- $iv.= $kexHash->hash($keyBytes . $this->exchange_hash . $iv);
- }
- $this->decrypt->setIV(substr($iv, 0, $this->decrypt_block_size));
-
- $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'D' . $this->session_id);
- while ($decryptKeyLength > strlen($key)) {
- $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key);
- }
- $this->decrypt->setKey(substr($key, 0, $decryptKeyLength));
- }
-
- /* The "arcfour128" algorithm is the RC4 cipher, as described in
- [SCHNEIER], using a 128-bit key. The first 1536 bytes of keystream
- generated by the cipher MUST be discarded, and the first byte of the
- first encrypted packet MUST be encrypted using the 1537th byte of
- keystream.
-
- -- http://tools.ietf.org/html/rfc4345#section-4 */
- if ($encrypt == 'arcfour128' || $encrypt == 'arcfour256') {
- $this->encrypt->encrypt(str_repeat("\0", 1536));
- }
- if ($decrypt == 'arcfour128' || $decrypt == 'arcfour256') {
- $this->decrypt->decrypt(str_repeat("\0", 1536));
- }
-
- for ($i = 0; $i < count($mac_algorithms) && !in_array($mac_algorithms[$i], $this->mac_algorithms_client_to_server); $i++);
- if ($i == count($mac_algorithms)) {
- user_error('No compatible client to server message authentication algorithms found');
- return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
- }
-
- $createKeyLength = 0; // ie. $mac_algorithms[$i] == 'none'
- switch ($mac_algorithms[$i]) {
- case 'hmac-sha1':
- $this->hmac_create = new Crypt_Hash('sha1');
- $createKeyLength = 20;
- break;
- case 'hmac-sha1-96':
- $this->hmac_create = new Crypt_Hash('sha1-96');
- $createKeyLength = 20;
- break;
- case 'hmac-md5':
- $this->hmac_create = new Crypt_Hash('md5');
- $createKeyLength = 16;
- break;
- case 'hmac-md5-96':
- $this->hmac_create = new Crypt_Hash('md5-96');
- $createKeyLength = 16;
- }
-
- for ($i = 0; $i < count($mac_algorithms) && !in_array($mac_algorithms[$i], $this->mac_algorithms_server_to_client); $i++);
- if ($i == count($mac_algorithms)) {
- user_error('No compatible server to client message authentication algorithms found');
- return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
- }
-
- $checkKeyLength = 0;
- $this->hmac_size = 0;
- switch ($mac_algorithms[$i]) {
- case 'hmac-sha1':
- $this->hmac_check = new Crypt_Hash('sha1');
- $checkKeyLength = 20;
- $this->hmac_size = 20;
- break;
- case 'hmac-sha1-96':
- $this->hmac_check = new Crypt_Hash('sha1-96');
- $checkKeyLength = 20;
- $this->hmac_size = 12;
- break;
- case 'hmac-md5':
- $this->hmac_check = new Crypt_Hash('md5');
- $checkKeyLength = 16;
- $this->hmac_size = 16;
- break;
- case 'hmac-md5-96':
- $this->hmac_check = new Crypt_Hash('md5-96');
- $checkKeyLength = 16;
- $this->hmac_size = 12;
- }
-
- $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'E' . $this->session_id);
- while ($createKeyLength > strlen($key)) {
- $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key);
- }
- $this->hmac_create->setKey(substr($key, 0, $createKeyLength));
-
- $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'F' . $this->session_id);
- while ($checkKeyLength > strlen($key)) {
- $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key);
- }
- $this->hmac_check->setKey(substr($key, 0, $checkKeyLength));
-
- for ($i = 0; $i < count($compression_algorithms) && !in_array($compression_algorithms[$i], $this->compression_algorithms_server_to_client); $i++);
- if ($i == count($compression_algorithms)) {
- user_error('No compatible server to client compression algorithms found');
- return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
- }
- $this->decompress = $compression_algorithms[$i] == 'zlib';
-
- for ($i = 0; $i < count($compression_algorithms) && !in_array($compression_algorithms[$i], $this->compression_algorithms_client_to_server); $i++);
- if ($i == count($compression_algorithms)) {
- user_error('No compatible client to server compression algorithms found');
- return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
- }
- $this->compress = $compression_algorithms[$i] == 'zlib';
-
- return true;
- }
-
- /**
- * Login
- *
- * The $password parameter can be a plaintext password, a Crypt_RSA object or an array
- *
- * @param String $username
- * @param Mixed $password
- * @param Mixed $...
- * @return Boolean
- * @see _login
- * @access public
- */
- function login($username)
- {
- $args = func_get_args();
- return call_user_func_array(array(&$this, '_login'), $args);
- }
-
- /**
- * Login Helper
- *
- * @param String $username
- * @param Mixed $password
- * @param Mixed $...
- * @return Boolean
- * @see _login_helper
- * @access private
- */
- function _login($username)
- {
- $args = array_slice(func_get_args(), 1);
- if (empty($args)) {
- return $this->_login_helper($username);
- }
-
- foreach ($args as $arg) {
- if ($this->_login_helper($username, $arg)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Login Helper
- *
- * @param String $username
- * @param optional String $password
- * @return Boolean
- * @access private
- * @internal It might be worthwhile, at some point, to protect against {@link http://tools.ietf.org/html/rfc4251#section-9.3.9 traffic analysis}
- * by sending dummy SSH_MSG_IGNORE messages.
- */
- function _login_helper($username, $password = null)
- {
- if (!($this->bitmap & NET_SSH2_MASK_CONSTRUCTOR)) {
- return false;
- }
-
- if (!($this->bitmap & NET_SSH2_MASK_LOGIN_REQ)) {
- $packet = pack('CNa*',
- NET_SSH2_MSG_SERVICE_REQUEST, strlen('ssh-userauth'), 'ssh-userauth'
- );
-
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
-
- $response = $this->_get_binary_packet();
- if ($response === false) {
- user_error('Connection closed by server');
- return false;
- }
-
- extract(unpack('Ctype', $this->_string_shift($response, 1)));
-
- if ($type != NET_SSH2_MSG_SERVICE_ACCEPT) {
- user_error('Expected SSH_MSG_SERVICE_ACCEPT');
- return false;
- }
- $this->bitmap |= NET_SSH2_MASK_LOGIN_REQ;
- }
-
- if (strlen($this->last_interactive_response)) {
- return !is_string($password) && !is_array($password) ? false : $this->_keyboard_interactive_process($password);
- }
-
- // although PHP5's get_class() preserves the case, PHP4's does not
- if (is_object($password)) {
- switch (strtolower(get_class($password))) {
- case 'crypt_rsa':
- return $this->_privatekey_login($username, $password);
- case 'system_ssh_agent':
- return $this->_ssh_agent_login($username, $password);
- }
- }
-
- if (is_array($password)) {
- if ($this->_keyboard_interactive_login($username, $password)) {
- $this->bitmap |= NET_SSH2_MASK_LOGIN;
- return true;
- }
- return false;
- }
-
- if (!isset($password)) {
- $packet = pack('CNa*Na*Na*',
- NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection',
- strlen('none'), 'none'
- );
-
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
-
- $response = $this->_get_binary_packet();
- if ($response === false) {
- user_error('Connection closed by server');
- return false;
- }
-
- extract(unpack('Ctype', $this->_string_shift($response, 1)));
-
- switch ($type) {
- case NET_SSH2_MSG_USERAUTH_SUCCESS:
- $this->bitmap |= NET_SSH2_MASK_LOGIN;
- return true;
- //case NET_SSH2_MSG_USERAUTH_FAILURE:
- default:
- return false;
- }
- }
-
- $packet = pack('CNa*Na*Na*CNa*',
- NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection',
- strlen('password'), 'password', 0, strlen($password), $password
- );
-
- // remove the username and password from the logged packet
- if (!defined('NET_SSH2_LOGGING')) {
- $logged = null;
- } else {
- $logged = pack('CNa*Na*Na*CNa*',
- NET_SSH2_MSG_USERAUTH_REQUEST, strlen('username'), 'username', strlen('ssh-connection'), 'ssh-connection',
- strlen('password'), 'password', 0, strlen('password'), 'password'
- );
- }
-
- if (!$this->_send_binary_packet($packet, $logged)) {
- return false;
- }
-
- $response = $this->_get_binary_packet();
- if ($response === false) {
- user_error('Connection closed by server');
- return false;
- }
-
- extract(unpack('Ctype', $this->_string_shift($response, 1)));
-
- switch ($type) {
- case NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ: // in theory, the password can be changed
- if (defined('NET_SSH2_LOGGING')) {
- $this->message_number_log[count($this->message_number_log) - 1] = 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ';
- }
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- $this->errors[] = 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: ' . utf8_decode($this->_string_shift($response, $length));
- return $this->_disconnect(NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER);
- case NET_SSH2_MSG_USERAUTH_FAILURE:
- // can we use keyboard-interactive authentication? if not then either the login is bad or the server employees
- // multi-factor authentication
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- $auth_methods = explode(',', $this->_string_shift($response, $length));
- extract(unpack('Cpartial_success', $this->_string_shift($response, 1)));
- $partial_success = $partial_success != 0;
-
- if (!$partial_success && in_array('keyboard-interactive', $auth_methods)) {
- if ($this->_keyboard_interactive_login($username, $password)) {
- $this->bitmap |= NET_SSH2_MASK_LOGIN;
- return true;
- }
- return false;
- }
- return false;
- case NET_SSH2_MSG_USERAUTH_SUCCESS:
- $this->bitmap |= NET_SSH2_MASK_LOGIN;
- return true;
- }
-
- return false;
- }
-
- /**
- * Login via keyboard-interactive authentication
- *
- * See {@link http://tools.ietf.org/html/rfc4256 RFC4256} for details. This is not a full-featured keyboard-interactive authenticator.
- *
- * @param String $username
- * @param String $password
- * @return Boolean
- * @access private
- */
- function _keyboard_interactive_login($username, $password)
- {
- $packet = pack('CNa*Na*Na*Na*Na*',
- NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection',
- strlen('keyboard-interactive'), 'keyboard-interactive', 0, '', 0, ''
- );
-
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
-
- return $this->_keyboard_interactive_process($password);
- }
-
- /**
- * Handle the keyboard-interactive requests / responses.
- *
- * @param String $responses...
- * @return Boolean
- * @access private
- */
- function _keyboard_interactive_process()
- {
- $responses = func_get_args();
-
- if (strlen($this->last_interactive_response)) {
- $response = $this->last_interactive_response;
- } else {
- $orig = $response = $this->_get_binary_packet();
- if ($response === false) {
- user_error('Connection closed by server');
- return false;
- }
- }
-
- extract(unpack('Ctype', $this->_string_shift($response, 1)));
-
- switch ($type) {
- case NET_SSH2_MSG_USERAUTH_INFO_REQUEST:
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- $this->_string_shift($response, $length); // name; may be empty
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- $this->_string_shift($response, $length); // instruction; may be empty
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- $this->_string_shift($response, $length); // language tag; may be empty
- extract(unpack('Nnum_prompts', $this->_string_shift($response, 4)));
-
- for ($i = 0; $i < count($responses); $i++) {
- if (is_array($responses[$i])) {
- foreach ($responses[$i] as $key => $value) {
- $this->keyboard_requests_responses[$key] = $value;
- }
- unset($responses[$i]);
- }
- }
- $responses = array_values($responses);
-
- if (isset($this->keyboard_requests_responses)) {
- for ($i = 0; $i < $num_prompts; $i++) {
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- // prompt - ie. "Password: "; must not be empty
- $prompt = $this->_string_shift($response, $length);
- //$echo = $this->_string_shift($response) != chr(0);
- foreach ($this->keyboard_requests_responses as $key => $value) {
- if (substr($prompt, 0, strlen($key)) == $key) {
- $responses[] = $value;
- break;
- }
- }
- }
- }
-
- // see http://tools.ietf.org/html/rfc4256#section-3.2
- if (strlen($this->last_interactive_response)) {
- $this->last_interactive_response = '';
- } else if (defined('NET_SSH2_LOGGING')) {
- $this->message_number_log[count($this->message_number_log) - 1] = str_replace(
- 'UNKNOWN',
- 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST',
- $this->message_number_log[count($this->message_number_log) - 1]
- );
- }
-
- if (!count($responses) && $num_prompts) {
- $this->last_interactive_response = $orig;
- $this->bitmap |= NET_SSH_MASK_LOGIN_INTERACTIVE;
- return false;
- }
-
- /*
- After obtaining the requested information from the user, the client
- MUST respond with an SSH_MSG_USERAUTH_INFO_RESPONSE message.
- */
- // see http://tools.ietf.org/html/rfc4256#section-3.4
- $packet = $logged = pack('CN', NET_SSH2_MSG_USERAUTH_INFO_RESPONSE, count($responses));
- for ($i = 0; $i < count($responses); $i++) {
- $packet.= pack('Na*', strlen($responses[$i]), $responses[$i]);
- $logged.= pack('Na*', strlen('dummy-answer'), 'dummy-answer');
- }
-
- if (!$this->_send_binary_packet($packet, $logged)) {
- return false;
- }
-
- if (defined('NET_SSH2_LOGGING') && NET_SSH2_LOGGING == NET_SSH2_LOG_COMPLEX) {
- $this->message_number_log[count($this->message_number_log) - 1] = str_replace(
- 'UNKNOWN',
- 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE',
- $this->message_number_log[count($this->message_number_log) - 1]
- );
- }
-
- /*
- After receiving the response, the server MUST send either an
- SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE, or another
- SSH_MSG_USERAUTH_INFO_REQUEST message.
- */
- // maybe phpseclib should force close the connection after x request / responses? unless something like that is done
- // there could be an infinite loop of request / responses.
- return $this->_keyboard_interactive_process();
- case NET_SSH2_MSG_USERAUTH_SUCCESS:
- return true;
- case NET_SSH2_MSG_USERAUTH_FAILURE:
- return false;
- }
-
- return false;
- }
-
- /**
- * Login with an ssh-agent provided key
- *
- * @param String $username
- * @param System_SSH_Agent $agent
- * @return Boolean
- * @access private
- */
- function _ssh_agent_login($username, $agent)
- {
- $keys = $agent->requestIdentities();
- foreach ($keys as $key) {
- if ($this->_privatekey_login($username, $key)) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Login with an RSA private key
- *
- * @param String $username
- * @param Crypt_RSA $password
- * @return Boolean
- * @access private
- * @internal It might be worthwhile, at some point, to protect against {@link http://tools.ietf.org/html/rfc4251#section-9.3.9 traffic analysis}
- * by sending dummy SSH_MSG_IGNORE messages.
- */
- function _privatekey_login($username, $privatekey)
- {
- // see http://tools.ietf.org/html/rfc4253#page-15
- $publickey = $privatekey->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_RAW);
- if ($publickey === false) {
- return false;
- }
-
- $publickey = array(
- 'e' => $publickey['e']->toBytes(true),
- 'n' => $publickey['n']->toBytes(true)
- );
- $publickey = pack('Na*Na*Na*',
- strlen('ssh-rsa'), 'ssh-rsa', strlen($publickey['e']), $publickey['e'], strlen($publickey['n']), $publickey['n']
- );
-
- $part1 = pack('CNa*Na*Na*',
- NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection',
- strlen('publickey'), 'publickey'
- );
- $part2 = pack('Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publickey), $publickey);
-
- $packet = $part1 . chr(0) . $part2;
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
-
- $response = $this->_get_binary_packet();
- if ($response === false) {
- user_error('Connection closed by server');
- return false;
- }
-
- extract(unpack('Ctype', $this->_string_shift($response, 1)));
-
- switch ($type) {
- case NET_SSH2_MSG_USERAUTH_FAILURE:
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- $this->errors[] = 'SSH_MSG_USERAUTH_FAILURE: ' . $this->_string_shift($response, $length);
- return false;
- case NET_SSH2_MSG_USERAUTH_PK_OK:
- // we'll just take it on faith that the public key blob and the public key algorithm name are as
- // they should be
- if (defined('NET_SSH2_LOGGING') && NET_SSH2_LOGGING == NET_SSH2_LOG_COMPLEX) {
- $this->message_number_log[count($this->message_number_log) - 1] = str_replace(
- 'UNKNOWN',
- 'NET_SSH2_MSG_USERAUTH_PK_OK',
- $this->message_number_log[count($this->message_number_log) - 1]
- );
- }
- }
-
- $packet = $part1 . chr(1) . $part2;
- $privatekey->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
- $signature = $privatekey->sign(pack('Na*a*', strlen($this->session_id), $this->session_id, $packet));
- $signature = pack('Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($signature), $signature);
- $packet.= pack('Na*', strlen($signature), $signature);
-
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
-
- $response = $this->_get_binary_packet();
- if ($response === false) {
- user_error('Connection closed by server');
- return false;
- }
-
- extract(unpack('Ctype', $this->_string_shift($response, 1)));
-
- switch ($type) {
- case NET_SSH2_MSG_USERAUTH_FAILURE:
- // either the login is bad or the server employs multi-factor authentication
- return false;
- case NET_SSH2_MSG_USERAUTH_SUCCESS:
- $this->bitmap |= NET_SSH2_MASK_LOGIN;
- return true;
- }
-
- return false;
- }
-
- /**
- * Set Timeout
- *
- * $ssh->exec('ping 127.0.0.1'); on a Linux host will never return and will run indefinitely. setTimeout() makes it so it'll timeout.
- * Setting $timeout to false or 0 will mean there is no timeout.
- *
- * @param Mixed $timeout
- * @access public
- */
- function setTimeout($timeout)
- {
- $this->timeout = $this->curTimeout = $timeout;
- }
-
- /**
- * Get the output from stdError
- *
- * @access public
- */
- function getStdError()
- {
- return $this->stdErrorLog;
- }
-
- /**
- * Execute Command
- *
- * If $block is set to false then Net_SSH2::_get_channel_packet(NET_SSH2_CHANNEL_EXEC) will need to be called manually.
- * In all likelihood, this is not a feature you want to be taking advantage of.
- *
- * @param String $command
- * @param optional Boolean $block
- * @return String
- * @access public
- */
- function exec($command, $callback = null)
- {
- $this->curTimeout = $this->timeout;
- $this->is_timeout = false;
- $this->stdErrorLog = '';
-
- if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
- return false;
- }
-
- // RFC4254 defines the (client) window size as "bytes the other party can send before it must wait for the window to
- // be adjusted". 0x7FFFFFFF is, at 2GB, the max size. technically, it should probably be decremented, but,
- // honestly, if you're transfering more than 2GB, you probably shouldn't be using phpseclib, anyway.
- // see http://tools.ietf.org/html/rfc4254#section-5.2 for more info
- $this->window_size_server_to_client[NET_SSH2_CHANNEL_EXEC] = 0x7FFFFFFF;
- // 0x8000 is the maximum max packet size, per http://tools.ietf.org/html/rfc4253#section-6.1, although since PuTTy
- // uses 0x4000, that's what will be used here, as well.
- $packet_size = 0x4000;
-
- $packet = pack('CNa*N3',
- NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', NET_SSH2_CHANNEL_EXEC, $this->window_size_server_to_client[NET_SSH2_CHANNEL_EXEC], $packet_size);
-
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
-
- $this->channel_status[NET_SSH2_CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_OPEN;
-
- $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_EXEC);
- if ($response === false) {
- return false;
- }
-
- if ($this->request_pty === true) {
- $terminal_modes = pack('C', NET_SSH2_TTY_OP_END);
- $packet = pack('CNNa*CNa*N5a*',
- NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_EXEC], strlen('pty-req'), 'pty-req', 1, strlen('vt100'), 'vt100',
- 80, 24, 0, 0, strlen($terminal_modes), $terminal_modes);
-
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
- $response = $this->_get_binary_packet();
- if ($response === false) {
- user_error('Connection closed by server');
- return false;
- }
-
- list(, $type) = unpack('C', $this->_string_shift($response, 1));
-
- switch ($type) {
- case NET_SSH2_MSG_CHANNEL_SUCCESS:
- break;
- case NET_SSH2_MSG_CHANNEL_FAILURE:
- default:
- user_error('Unable to request pseudo-terminal');
- return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION);
- }
- $this->in_request_pty_exec = true;
- }
-
- // sending a pty-req SSH_MSG_CHANNEL_REQUEST message is unnecessary and, in fact, in most cases, slows things
- // down. the one place where it might be desirable is if you're doing something like Net_SSH2::exec('ping localhost &').
- // with a pty-req SSH_MSG_CHANNEL_REQUEST, exec() will return immediately and the ping process will then
- // then immediately terminate. without such a request exec() will loop indefinitely. the ping process won't end but
- // neither will your script.
-
- // although, in theory, the size of SSH_MSG_CHANNEL_REQUEST could exceed the maximum packet size established by
- // SSH_MSG_CHANNEL_OPEN_CONFIRMATION, RFC4254#section-5.1 states that the "maximum packet size" refers to the
- // "maximum size of an individual data packet". ie. SSH_MSG_CHANNEL_DATA. RFC4254#section-5.2 corroborates.
- $packet = pack('CNNa*CNa*',
- NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_EXEC], strlen('exec'), 'exec', 1, strlen($command), $command);
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
-
- $this->channel_status[NET_SSH2_CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_REQUEST;
-
- $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_EXEC);
- if ($response === false) {
- return false;
- }
-
- $this->channel_status[NET_SSH2_CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_DATA;
-
- if ($callback === false || $this->in_request_pty_exec) {
- return true;
- }
-
- $output = '';
- while (true) {
- $temp = $this->_get_channel_packet(NET_SSH2_CHANNEL_EXEC);
- switch (true) {
- case $temp === true:
- return is_callable($callback) ? true : $output;
- case $temp === false:
- return false;
- default:
- if (is_callable($callback)) {
- $callback($temp);
- } else {
- $output.= $temp;
- }
- }
- }
- }
-
- /**
- * Creates an interactive shell
- *
- * @see Net_SSH2::read()
- * @see Net_SSH2::write()
- * @return Boolean
- * @access private
- */
- function _initShell()
- {
- if ($this->in_request_pty_exec === true) {
- return true;
- }
-
- $this->window_size_server_to_client[NET_SSH2_CHANNEL_SHELL] = 0x7FFFFFFF;
- $packet_size = 0x4000;
-
- $packet = pack('CNa*N3',
- NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', NET_SSH2_CHANNEL_SHELL, $this->window_size_server_to_client[NET_SSH2_CHANNEL_SHELL], $packet_size);
-
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
-
- $this->channel_status[NET_SSH2_CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_OPEN;
-
- $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SHELL);
- if ($response === false) {
- return false;
- }
-
- $terminal_modes = pack('C', NET_SSH2_TTY_OP_END);
- $packet = pack('CNNa*CNa*N5a*',
- NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_SHELL], strlen('pty-req'), 'pty-req', 1, strlen('vt100'), 'vt100',
- 80, 24, 0, 0, strlen($terminal_modes), $terminal_modes);
-
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
-
- $response = $this->_get_binary_packet();
- if ($response === false) {
- user_error('Connection closed by server');
- return false;
- }
-
- list(, $type) = unpack('C', $this->_string_shift($response, 1));
-
- switch ($type) {
- case NET_SSH2_MSG_CHANNEL_SUCCESS:
- // if a pty can't be opened maybe commands can still be executed
- case NET_SSH2_MSG_CHANNEL_FAILURE:
- break;
- default:
- user_error('Unable to request pseudo-terminal');
- return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION);
- }
-
- $packet = pack('CNNa*C',
- NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_SHELL], strlen('shell'), 'shell', 1);
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
-
- $this->channel_status[NET_SSH2_CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_REQUEST;
-
- $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SHELL);
- if ($response === false) {
- return false;
- }
-
- $this->channel_status[NET_SSH2_CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_DATA;
-
- $this->bitmap |= NET_SSH2_MASK_SHELL;
-
- return true;
- }
-
- /**
- * Return the channel to be used with read() / write()
- *
- * @see Net_SSH2::read()
- * @see Net_SSH2::write()
- * @return Integer
- * @access public
- */
- function _get_interactive_channel()
- {
- switch (true) {
- case $this->in_subsystem:
- return NET_SSH2_CHANNEL_SUBSYSTEM;
- case $this->in_request_pty_exec:
- return NET_SSH2_CHANNEL_EXEC;
- default:
- return NET_SSH2_CHANNEL_SHELL;
- }
- }
-
- /**
- * Returns the output of an interactive shell
- *
- * Returns when there's a match for $expect, which can take the form of a string literal or,
- * if $mode == NET_SSH2_READ_REGEX, a regular expression.
- *
- * @see Net_SSH2::write()
- * @param String $expect
- * @param Integer $mode
- * @return String
- * @access public
- */
- function read($expect = '', $mode = NET_SSH2_READ_SIMPLE)
- {
- $this->curTimeout = $this->timeout;
- $this->is_timeout = false;
-
- if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
- user_error('Operation disallowed prior to login()');
- return false;
- }
-
- if (!($this->bitmap & NET_SSH2_MASK_SHELL) && !$this->_initShell()) {
- user_error('Unable to initiate an interactive shell session');
- return false;
- }
-
- $channel = $this->_get_interactive_channel();
-
- $match = $expect;
- while (true) {
- if ($mode == NET_SSH2_READ_REGEX) {
- preg_match($expect, $this->interactiveBuffer, $matches);
- $match = isset($matches[0]) ? $matches[0] : '';
- }
- $pos = strlen($match) ? strpos($this->interactiveBuffer, $match) : false;
- if ($pos !== false) {
- return $this->_string_shift($this->interactiveBuffer, $pos + strlen($match));
- }
- $response = $this->_get_channel_packet($channel);
- if (is_bool($response)) {
- $this->in_request_pty_exec = false;
- return $response ? $this->_string_shift($this->interactiveBuffer, strlen($this->interactiveBuffer)) : false;
- }
-
- $this->interactiveBuffer.= $response;
- }
- }
-
- /**
- * Inputs a command into an interactive shell.
- *
- * @see Net_SSH2::read()
- * @param String $cmd
- * @return Boolean
- * @access public
- */
- function write($cmd)
- {
- if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) {
- user_error('Operation disallowed prior to login()');
- return false;
- }
-
- if (!($this->bitmap & NET_SSH2_MASK_SHELL) && !$this->_initShell()) {
- user_error('Unable to initiate an interactive shell session');
- return false;
- }
-
- return $this->_send_channel_packet($this->_get_interactive_channel(), $cmd);
- }
-
- /**
- * Start a subsystem.
- *
- * Right now only one subsystem at a time is supported. To support multiple subsystem's stopSubsystem() could accept
- * a string that contained the name of the subsystem, but at that point, only one subsystem of each type could be opened.
- * To support multiple subsystem's of the same name maybe it'd be best if startSubsystem() generated a new channel id and
- * returns that and then that that was passed into stopSubsystem() but that'll be saved for a future date and implemented
- * if there's sufficient demand for such a feature.
- *
- * @see Net_SSH2::stopSubsystem()
- * @param String $subsystem
- * @return Boolean
- * @access public
- */
- function startSubsystem($subsystem)
- {
- $this->window_size_server_to_client[NET_SSH2_CHANNEL_SUBSYSTEM] = $this->window_size;
-
- $packet = pack('CNa*N3',
- NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', NET_SSH2_CHANNEL_SUBSYSTEM, $this->window_size, 0x4000);
-
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
-
- $this->channel_status[NET_SSH2_CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_OPEN;
-
- $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SUBSYSTEM);
- if ($response === false) {
- return false;
- }
-
- $packet = pack('CNNa*CNa*',
- NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_SUBSYSTEM], strlen('subsystem'), 'subsystem', 1, strlen($subsystem), $subsystem);
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
-
- $this->channel_status[NET_SSH2_CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_REQUEST;
-
- $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SUBSYSTEM);
-
- if ($response === false) {
- return false;
- }
-
- $this->channel_status[NET_SSH2_CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_DATA;
-
- $this->bitmap |= NET_SSH2_MASK_SHELL;
- $this->in_subsystem = true;
-
- return true;
- }
-
- /**
- * Stops a subsystem.
- *
- * @see Net_SSH2::startSubsystem()
- * @return Boolean
- * @access public
- */
- function stopSubsystem()
- {
- $this->in_subsystem = false;
- $this->_close_channel(NET_SSH2_CHANNEL_SUBSYSTEM);
- return true;
- }
-
- /**
- * Closes a channel
- *
- * If read() timed out you might want to just close the channel and have it auto-restart on the next read() call
- *
- * @access public
- */
- function reset()
- {
- $this->_close_channel($this->_get_interactive_channel());
- }
-
- /**
- * Is timeout?
- *
- * Did exec() or read() return because they timed out or because they encountered the end?
- *
- * @access public
- */
- function isTimeout()
- {
- return $this->is_timeout;
- }
-
- /**
- * Disconnect
- *
- * @access public
- */
- function disconnect()
- {
- $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION);
- if (isset($this->realtime_log_file) && is_resource($this->realtime_log_file)) {
- fclose($this->realtime_log_file);
- }
- }
-
- /**
- * Destructor.
- *
- * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call
- * disconnect().
- *
- * @access public
- */
- function __destruct()
- {
- $this->disconnect();
- }
-
- /**
- * Is the connection still active?
- *
- * @access public
- */
- function isConnected()
- {
- return $this->bitmap & NET_SSH2_MASK_LOGIN;
- }
-
- /**
- * Gets Binary Packets
- *
- * See '6. Binary Packet Protocol' of rfc4253 for more info.
- *
- * @see Net_SSH2::_send_binary_packet()
- * @return String
- * @access private
- */
- function _get_binary_packet()
- {
- if (!is_resource($this->fsock) || feof($this->fsock)) {
- user_error('Connection closed prematurely');
- $this->bitmap = 0;
- return false;
- }
-
- $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838
- $raw = fread($this->fsock, $this->decrypt_block_size);
-
- if (!strlen($raw)) {
- return '';
- }
-
- if ($this->decrypt !== false) {
- $raw = $this->decrypt->decrypt($raw);
- }
- if ($raw === false) {
- user_error('Unable to decrypt content');
- return false;
- }
-
- extract(unpack('Npacket_length/Cpadding_length', $this->_string_shift($raw, 5)));
-
- $remaining_length = $packet_length + 4 - $this->decrypt_block_size;
-
- // quoting ,
- // "implementations SHOULD check that the packet length is reasonable"
- // PuTTY uses 0x9000 as the actual max packet size and so to shall we
- if ($remaining_length < -$this->decrypt_block_size || $remaining_length > 0x9000 || $remaining_length % $this->decrypt_block_size != 0) {
- user_error('Invalid size');
- return false;
- }
-
- $buffer = '';
- while ($remaining_length > 0) {
- $temp = fread($this->fsock, $remaining_length);
- $buffer.= $temp;
- $remaining_length-= strlen($temp);
- }
- $stop = strtok(microtime(), ' ') + strtok('');
- if (strlen($buffer)) {
- $raw.= $this->decrypt !== false ? $this->decrypt->decrypt($buffer) : $buffer;
- }
-
- $payload = $this->_string_shift($raw, $packet_length - $padding_length - 1);
- $padding = $this->_string_shift($raw, $padding_length); // should leave $raw empty
-
- if ($this->hmac_check !== false) {
- $hmac = fread($this->fsock, $this->hmac_size);
- if ($hmac != $this->hmac_check->hash(pack('NNCa*', $this->get_seq_no, $packet_length, $padding_length, $payload . $padding))) {
- user_error('Invalid HMAC');
- return false;
- }
- }
-
- //if ($this->decompress) {
- // $payload = gzinflate(substr($payload, 2));
- //}
-
- $this->get_seq_no++;
-
- if (defined('NET_SSH2_LOGGING')) {
- $current = strtok(microtime(), ' ') + strtok('');
- $message_number = isset($this->message_numbers[ord($payload[0])]) ? $this->message_numbers[ord($payload[0])] : 'UNKNOWN (' . ord($payload[0]) . ')';
- $message_number = '<- ' . $message_number .
- ' (since last: ' . round($current - $this->last_packet, 4) . ', network: ' . round($stop - $start, 4) . 's)';
- $this->_append_log($message_number, $payload);
- $this->last_packet = $current;
- }
-
- return $this->_filter($payload);
- }
-
- /**
- * Filter Binary Packets
- *
- * Because some binary packets need to be ignored...
- *
- * @see Net_SSH2::_get_binary_packet()
- * @return String
- * @access private
- */
- function _filter($payload)
- {
- switch (ord($payload[0])) {
- case NET_SSH2_MSG_DISCONNECT:
- $this->_string_shift($payload, 1);
- extract(unpack('Nreason_code/Nlength', $this->_string_shift($payload, 8)));
- $this->errors[] = 'SSH_MSG_DISCONNECT: ' . $this->disconnect_reasons[$reason_code] . "\r\n" . utf8_decode($this->_string_shift($payload, $length));
- $this->bitmap = 0;
- return false;
- case NET_SSH2_MSG_IGNORE:
- $payload = $this->_get_binary_packet();
- break;
- case NET_SSH2_MSG_DEBUG:
- $this->_string_shift($payload, 2);
- extract(unpack('Nlength', $this->_string_shift($payload, 4)));
- $this->errors[] = 'SSH_MSG_DEBUG: ' . utf8_decode($this->_string_shift($payload, $length));
- $payload = $this->_get_binary_packet();
- break;
- case NET_SSH2_MSG_UNIMPLEMENTED:
- return false;
- case NET_SSH2_MSG_KEXINIT:
- if ($this->session_id !== false) {
- if (!$this->_key_exchange($payload)) {
- $this->bitmap = 0;
- return false;
- }
- $payload = $this->_get_binary_packet();
- }
- }
-
- // see http://tools.ietf.org/html/rfc4252#section-5.4; only called when the encryption has been activated and when we haven't already logged in
- if (($this->bitmap & NET_SSH2_MASK_CONSTRUCTOR) && !($this->bitmap & NET_SSH2_MASK_LOGIN) && ord($payload[0]) == NET_SSH2_MSG_USERAUTH_BANNER) {
- $this->_string_shift($payload, 1);
- extract(unpack('Nlength', $this->_string_shift($payload, 4)));
- $this->banner_message = utf8_decode($this->_string_shift($payload, $length));
- $payload = $this->_get_binary_packet();
- }
-
- // only called when we've already logged in
- if (($this->bitmap & NET_SSH2_MASK_CONSTRUCTOR) && ($this->bitmap & NET_SSH2_MASK_LOGIN)) {
- switch (ord($payload[0])) {
- case NET_SSH2_MSG_GLOBAL_REQUEST: // see http://tools.ietf.org/html/rfc4254#section-4
- $this->_string_shift($payload, 1);
- extract(unpack('Nlength', $this->_string_shift($payload)));
- $this->errors[] = 'SSH_MSG_GLOBAL_REQUEST: ' . utf8_decode($this->_string_shift($payload, $length));
-
- if (!$this->_send_binary_packet(pack('C', NET_SSH2_MSG_REQUEST_FAILURE))) {
- return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION);
- }
-
- $payload = $this->_get_binary_packet();
- break;
- case NET_SSH2_MSG_CHANNEL_OPEN: // see http://tools.ietf.org/html/rfc4254#section-5.1
- $this->_string_shift($payload, 1);
- extract(unpack('Nlength', $this->_string_shift($payload, 4)));
- $this->errors[] = 'SSH_MSG_CHANNEL_OPEN: ' . utf8_decode($this->_string_shift($payload, $length));
-
- $this->_string_shift($payload, 4); // skip over client channel
- extract(unpack('Nserver_channel', $this->_string_shift($payload, 4)));
-
- $packet = pack('CN3a*Na*',
- NET_SSH2_MSG_REQUEST_FAILURE, $server_channel, NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED, 0, '', 0, '');
-
- if (!$this->_send_binary_packet($packet)) {
- return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION);
- }
-
- $payload = $this->_get_binary_packet();
- break;
- case NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST:
- $this->_string_shift($payload, 1);
- extract(unpack('Nchannel', $this->_string_shift($payload, 4)));
- extract(unpack('Nwindow_size', $this->_string_shift($payload, 4)));
- $this->window_size_client_to_server[$channel]+= $window_size;
-
- $payload = ($this->bitmap & NET_SSH2_MASK_WINDOW_ADJUST) ? true : $this->_get_binary_packet();
- }
- }
-
- return $payload;
- }
-
- /**
- * Enable Quiet Mode
- *
- * Suppress stderr from output
- *
- * @access public
- */
- function enableQuietMode()
- {
- $this->quiet_mode = true;
- }
-
- /**
- * Disable Quiet Mode
- *
- * Show stderr in output
- *
- * @access public
- */
- function disableQuietMode()
- {
- $this->quiet_mode = false;
- }
-
- /**
- * Enable request-pty when using exec()
- *
- * @access public
- */
- function enablePTY()
- {
- $this->request_pty = true;
- }
-
- /**
- * Disable request-pty when using exec()
- *
- * @access public
- */
- function disablePTY()
- {
- $this->request_pty = false;
- }
-
- /**
- * Gets channel data
- *
- * Returns the data as a string if it's available and false if not.
- *
- * @param $client_channel
- * @return Mixed
- * @access private
- */
- function _get_channel_packet($client_channel, $skip_extended = false)
- {
- if (!empty($this->channel_buffers[$client_channel])) {
- return array_shift($this->channel_buffers[$client_channel]);
- }
-
- while (true) {
- if ($this->curTimeout) {
- if ($this->curTimeout < 0) {
- $this->is_timeout = true;
- return true;
- }
-
- $read = array($this->fsock);
- $write = $except = null;
-
- $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838
- $sec = floor($this->curTimeout);
- $usec = 1000000 * ($this->curTimeout - $sec);
- // on windows this returns a "Warning: Invalid CRT parameters detected" error
- if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) {
- $this->is_timeout = true;
- return true;
- }
- $elapsed = strtok(microtime(), ' ') + strtok('') - $start;
- $this->curTimeout-= $elapsed;
- }
-
- $response = $this->_get_binary_packet();
- if ($response === false) {
- user_error('Connection closed by server');
- return false;
- }
- if ($client_channel == -1 && $response === true) {
- return true;
- }
- if (!strlen($response)) {
- return '';
- }
-
- extract(unpack('Ctype/Nchannel', $this->_string_shift($response, 5)));
-
- $this->window_size_server_to_client[$channel]-= strlen($response) + 4;
-
- // resize the window, if appropriate
- if ($this->window_size_server_to_client[$channel] < 0) {
- $packet = pack('CNN', NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST, $this->server_channels[$channel], $this->window_size);
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
- $this->window_size_server_to_client[$channel]+= $this->window_size;
- }
-
- switch ($this->channel_status[$channel]) {
- case NET_SSH2_MSG_CHANNEL_OPEN:
- switch ($type) {
- case NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION:
- extract(unpack('Nserver_channel', $this->_string_shift($response, 4)));
- $this->server_channels[$channel] = $server_channel;
- extract(unpack('Nwindow_size', $this->_string_shift($response, 4)));
- $this->window_size_client_to_server[$channel] = $window_size;
- $temp = unpack('Npacket_size_client_to_server', $this->_string_shift($response, 4));
- $this->packet_size_client_to_server[$channel] = $temp['packet_size_client_to_server'];
- return $client_channel == $channel ? true : $this->_get_channel_packet($client_channel, $skip_extended);
- //case NET_SSH2_MSG_CHANNEL_OPEN_FAILURE:
- default:
- user_error('Unable to open channel');
- return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION);
- }
- break;
- case NET_SSH2_MSG_CHANNEL_REQUEST:
- switch ($type) {
- case NET_SSH2_MSG_CHANNEL_SUCCESS:
- return true;
- case NET_SSH2_MSG_CHANNEL_FAILURE:
- return false;
- default:
- user_error('Unable to fulfill channel request');
- return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION);
- }
- case NET_SSH2_MSG_CHANNEL_CLOSE:
- return $type == NET_SSH2_MSG_CHANNEL_CLOSE ? true : $this->_get_channel_packet($client_channel, $skip_extended);
- }
-
- // ie. $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_DATA
-
- switch ($type) {
- case NET_SSH2_MSG_CHANNEL_DATA:
- /*
- if ($channel == NET_SSH2_CHANNEL_EXEC) {
- // SCP requires null packets, such as this, be sent. further, in the case of the ssh.com SSH server
- // this actually seems to make things twice as fast. more to the point, the message right after
- // SSH_MSG_CHANNEL_DATA (usually SSH_MSG_IGNORE) won't block for as long as it would have otherwise.
- // in OpenSSH it slows things down but only by a couple thousandths of a second.
- $this->_send_channel_packet($channel, chr(0));
- }
- */
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- $data = $this->_string_shift($response, $length);
- if ($client_channel == $channel) {
- return $data;
- }
- if (!isset($this->channel_buffers[$channel])) {
- $this->channel_buffers[$channel] = array();
- }
- $this->channel_buffers[$channel][] = $data;
- break;
- case NET_SSH2_MSG_CHANNEL_EXTENDED_DATA:
- /*
- if ($client_channel == NET_SSH2_CHANNEL_EXEC) {
- $this->_send_channel_packet($client_channel, chr(0));
- }
- */
- // currently, there's only one possible value for $data_type_code: NET_SSH2_EXTENDED_DATA_STDERR
- extract(unpack('Ndata_type_code/Nlength', $this->_string_shift($response, 8)));
- $data = $this->_string_shift($response, $length);
- $this->stdErrorLog .= $data;
- if ($skip_extended || $this->quiet_mode) {
- break;
- }
- if ($client_channel == $channel) {
- return $data;
- }
- if (!isset($this->channel_buffers[$channel])) {
- $this->channel_buffers[$channel] = array();
- }
- $this->channel_buffers[$channel][] = $data;
- break;
- case NET_SSH2_MSG_CHANNEL_REQUEST:
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- $value = $this->_string_shift($response, $length);
- switch ($value) {
- case 'exit-signal':
- $this->_string_shift($response, 1);
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- $this->errors[] = 'SSH_MSG_CHANNEL_REQUEST (exit-signal): ' . $this->_string_shift($response, $length);
- $this->_string_shift($response, 1);
- extract(unpack('Nlength', $this->_string_shift($response, 4)));
- if ($length) {
- $this->errors[count($this->errors)].= "\r\n" . $this->_string_shift($response, $length);
- }
-
- $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$client_channel]));
- $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel]));
-
- $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_EOF;
-
- break;
- case 'exit-status':
- extract(unpack('Cfalse/Nexit_status', $this->_string_shift($response, 5)));
- $this->exit_status = $exit_status;
-
- // "The client MAY ignore these messages."
- // -- http://tools.ietf.org/html/rfc4254#section-6.10
-
- break;
- default:
- // "Some systems may not implement signals, in which case they SHOULD ignore this message."
- // -- http://tools.ietf.org/html/rfc4254#section-6.9
- break;
- }
- break;
- case NET_SSH2_MSG_CHANNEL_CLOSE:
- $this->curTimeout = 0;
-
- if ($this->bitmap & NET_SSH2_MASK_SHELL) {
- $this->bitmap&= ~NET_SSH2_MASK_SHELL;
- }
- if ($this->channel_status[$channel] != NET_SSH2_MSG_CHANNEL_EOF) {
- $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel]));
- }
-
- $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_CLOSE;
- return true;
- case NET_SSH2_MSG_CHANNEL_EOF:
- break;
- default:
- user_error('Error reading channel data');
- return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION);
- }
- }
- }
-
- /**
- * Sends Binary Packets
- *
- * See '6. Binary Packet Protocol' of rfc4253 for more info.
- *
- * @param String $data
- * @param optional String $logged
- * @see Net_SSH2::_get_binary_packet()
- * @return Boolean
- * @access private
- */
- function _send_binary_packet($data, $logged = null)
- {
- if (!is_resource($this->fsock) || feof($this->fsock)) {
- user_error('Connection closed prematurely');
- $this->bitmap = 0;
- return false;
- }
-
- //if ($this->compress) {
- // // the -4 removes the checksum:
- // // http://php.net/function.gzcompress#57710
- // $data = substr(gzcompress($data), 0, -4);
- //}
-
- // 4 (packet length) + 1 (padding length) + 4 (minimal padding amount) == 9
- $packet_length = strlen($data) + 9;
- // round up to the nearest $this->encrypt_block_size
- $packet_length+= (($this->encrypt_block_size - 1) * $packet_length) % $this->encrypt_block_size;
- // subtracting strlen($data) is obvious - subtracting 5 is necessary because of packet_length and padding_length
- $padding_length = $packet_length - strlen($data) - 5;
- $padding = crypt_random_string($padding_length);
-
- // we subtract 4 from packet_length because the packet_length field isn't supposed to include itself
- $packet = pack('NCa*', $packet_length - 4, $padding_length, $data . $padding);
-
- $hmac = $this->hmac_create !== false ? $this->hmac_create->hash(pack('Na*', $this->send_seq_no, $packet)) : '';
- $this->send_seq_no++;
-
- if ($this->encrypt !== false) {
- $packet = $this->encrypt->encrypt($packet);
- }
-
- $packet.= $hmac;
-
- $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838
- $result = strlen($packet) == fputs($this->fsock, $packet);
- $stop = strtok(microtime(), ' ') + strtok('');
-
- if (defined('NET_SSH2_LOGGING')) {
- $current = strtok(microtime(), ' ') + strtok('');
- $message_number = isset($this->message_numbers[ord($data[0])]) ? $this->message_numbers[ord($data[0])] : 'UNKNOWN (' . ord($data[0]) . ')';
- $message_number = '-> ' . $message_number .
- ' (since last: ' . round($current - $this->last_packet, 4) . ', network: ' . round($stop - $start, 4) . 's)';
- $this->_append_log($message_number, isset($logged) ? $logged : $data);
- $this->last_packet = $current;
- }
-
- return $result;
- }
-
- /**
- * Logs data packets
- *
- * Makes sure that only the last 1MB worth of packets will be logged
- *
- * @param String $data
- * @access private
- */
- function _append_log($message_number, $message)
- {
- // remove the byte identifying the message type from all but the first two messages (ie. the identification strings)
- if (strlen($message_number) > 2) {
- $this->_string_shift($message);
- }
-
- switch (NET_SSH2_LOGGING) {
- // useful for benchmarks
- case NET_SSH2_LOG_SIMPLE:
- $this->message_number_log[] = $message_number;
- break;
- // the most useful log for SSH2
- case NET_SSH2_LOG_COMPLEX:
- $this->message_number_log[] = $message_number;
- $this->log_size+= strlen($message);
- $this->message_log[] = $message;
- while ($this->log_size > NET_SSH2_LOG_MAX_SIZE) {
- $this->log_size-= strlen(array_shift($this->message_log));
- array_shift($this->message_number_log);
- }
- break;
- // dump the output out realtime; packets may be interspersed with non packets,
- // passwords won't be filtered out and select other packets may not be correctly
- // identified
- case NET_SSH2_LOG_REALTIME:
- switch (PHP_SAPI) {
- case 'cli':
- $start = $stop = "\r\n";
- break;
- default:
- $start = '';
- $stop = ' ';
- }
- echo $start . $this->_format_log(array($message), array($message_number)) . $stop;
- @flush();
- @ob_flush();
- break;
- // basically the same thing as NET_SSH2_LOG_REALTIME with the caveat that NET_SSH2_LOG_REALTIME_FILE
- // needs to be defined and that the resultant log file will be capped out at NET_SSH2_LOG_MAX_SIZE.
- // the earliest part of the log file is denoted by the first <<< START >>> and is not going to necessarily
- // at the beginning of the file
- case NET_SSH2_LOG_REALTIME_FILE:
- if (!isset($this->realtime_log_file)) {
- // PHP doesn't seem to like using constants in fopen()
- $filename = NET_SSH2_LOG_REALTIME_FILENAME;
- $fp = fopen($filename, 'w');
- $this->realtime_log_file = $fp;
- }
- if (!is_resource($this->realtime_log_file)) {
- break;
- }
- $entry = $this->_format_log(array($message), array($message_number));
- if ($this->realtime_log_wrap) {
- $temp = "<<< START >>>\r\n";
- $entry.= $temp;
- fseek($this->realtime_log_file, ftell($this->realtime_log_file) - strlen($temp));
- }
- $this->realtime_log_size+= strlen($entry);
- if ($this->realtime_log_size > NET_SSH2_LOG_MAX_SIZE) {
- fseek($this->realtime_log_file, 0);
- $this->realtime_log_size = strlen($entry);
- $this->realtime_log_wrap = true;
- }
- fputs($this->realtime_log_file, $entry);
- }
- }
-
- /**
- * Sends channel data
- *
- * Spans multiple SSH_MSG_CHANNEL_DATAs if appropriate
- *
- * @param Integer $client_channel
- * @param String $data
- * @return Boolean
- * @access private
- */
- function _send_channel_packet($client_channel, $data)
- {
- /* The maximum amount of data allowed is determined by the maximum
- packet size for the channel, and the current window size, whichever
- is smaller.
-
- -- http://tools.ietf.org/html/rfc4254#section-5.2 */
- $max_size = min(
- $this->packet_size_client_to_server[$client_channel],
- $this->window_size_client_to_server[$client_channel]
- ) - 4;
- while (strlen($data) > $max_size) {
- if (!$this->window_size_client_to_server[$client_channel]) {
- $this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST;
- // using an invalid channel will let the buffers be built up for the valid channels
- $output = $this->_get_channel_packet(-1);
- $this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST;
- $max_size = min(
- $this->packet_size_client_to_server[$client_channel],
- $this->window_size_client_to_server[$client_channel]
- ) - 4;
- }
-
- $packet = pack('CN2a*',
- NET_SSH2_MSG_CHANNEL_DATA,
- $this->server_channels[$client_channel],
- $max_size,
- $this->_string_shift($data, $max_size)
- );
-
- $this->window_size_client_to_server[$client_channel]-= $max_size + 4;
-
- if (!$this->_send_binary_packet($packet)) {
- return false;
- }
- }
-
- if (strlen($data) >= $this->window_size_client_to_server[$client_channel] - 4) {
- $this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST;
- $this->_get_channel_packet(-1);
- $this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST;
- }
-
- $this->window_size_client_to_server[$client_channel]-= strlen($data) + 4;
-
- return $this->_send_binary_packet(pack('CN2a*',
- NET_SSH2_MSG_CHANNEL_DATA,
- $this->server_channels[$client_channel],
- strlen($data),
- $data));
- }
-
- /**
- * Closes and flushes a channel
- *
- * Net_SSH2 doesn't properly close most channels. For exec() channels are normally closed by the server
- * and for SFTP channels are presumably closed when the client disconnects. This functions is intended
- * for SCP more than anything.
- *
- * @param Integer $client_channel
- * @param Boolean $want_reply
- * @return Boolean
- * @access private
- */
- function _close_channel($client_channel, $want_reply = false)
- {
- // see http://tools.ietf.org/html/rfc4254#section-5.3
-
- $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$client_channel]));
-
- if (!$want_reply) {
- $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$client_channel]));
- }
-
- $this->channel_status[$client_channel] = NET_SSH2_MSG_CHANNEL_CLOSE;
-
- $this->curTimeout = 0;
-
- while (!is_bool($this->_get_channel_packet($client_channel)));
-
- if ($want_reply) {
- $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$client_channel]));
- }
-
- if ($this->bitmap & NET_SSH2_MASK_SHELL) {
- $this->bitmap&= ~NET_SSH2_MASK_SHELL;
- }
- }
-
- /**
- * Disconnect
- *
- * @param Integer $reason
- * @return Boolean
- * @access private
- */
- function _disconnect($reason)
- {
- if ($this->bitmap) {
- $data = pack('CNNa*Na*', NET_SSH2_MSG_DISCONNECT, $reason, 0, '', 0, '');
- $this->_send_binary_packet($data);
- $this->bitmap = 0;
- fclose($this->fsock);
- return false;
- }
- }
-
- /**
- * String Shift
- *
- * Inspired by array_shift
- *
- * @param String $string
- * @param optional Integer $index
- * @return String
- * @access private
- */
- function _string_shift(&$string, $index = 1)
- {
- $substr = substr($string, 0, $index);
- $string = substr($string, $index);
- return $substr;
- }
-
- /**
- * Define Array
- *
- * Takes any number of arrays whose indices are integers and whose values are strings and defines a bunch of
- * named constants from it, using the value as the name of the constant and the index as the value of the constant.
- * If any of the constants that would be defined already exists, none of the constants will be defined.
- *
- * @param Array $array
- * @access private
- */
- function _define_array()
- {
- $args = func_get_args();
- foreach ($args as $arg) {
- foreach ($arg as $key=>$value) {
- if (!defined($value)) {
- define($value, $key);
- } else {
- break 2;
- }
- }
- }
- }
-
- /**
- * Returns a log of the packets that have been sent and received.
- *
- * Returns a string if NET_SSH2_LOGGING == NET_SSH2_LOG_COMPLEX, an array if NET_SSH2_LOGGING == NET_SSH2_LOG_SIMPLE and false if !defined('NET_SSH2_LOGGING')
- *
- * @access public
- * @return String or Array
- */
- function getLog()
- {
- if (!defined('NET_SSH2_LOGGING')) {
- return false;
- }
-
- switch (NET_SSH2_LOGGING) {
- case NET_SSH2_LOG_SIMPLE:
- return $this->message_number_log;
- break;
- case NET_SSH2_LOG_COMPLEX:
- return $this->_format_log($this->message_log, $this->message_number_log);
- break;
- default:
- return false;
- }
- }
-
- /**
- * Formats a log for printing
- *
- * @param Array $message_log
- * @param Array $message_number_log
- * @access private
- * @return String
- */
- function _format_log($message_log, $message_number_log)
- {
- $output = '';
- for ($i = 0; $i < count($message_log); $i++) {
- $output.= $message_number_log[$i] . "\r\n";
- $current_log = $message_log[$i];
- $j = 0;
- do {
- if (strlen($current_log)) {
- $output.= str_pad(dechex($j), 7, '0', STR_PAD_LEFT) . '0 ';
- }
- $fragment = $this->_string_shift($current_log, $this->log_short_width);
- $hex = substr(preg_replace_callback('#.#s', array($this, '_format_log_helper'), $fragment), strlen($this->log_boundary));
- // replace non ASCII printable characters with dots
- // http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters
- // also replace < with a . since < messes up the output on web browsers
- $raw = preg_replace('#[^\x20-\x7E]|<#', '.', $fragment);
- $output.= str_pad($hex, $this->log_long_width - $this->log_short_width, ' ') . $raw . "\r\n";
- $j++;
- } while (strlen($current_log));
- $output.= "\r\n";
- }
-
- return $output;
- }
-
- /**
- * Helper function for _format_log
- *
- * For use with preg_replace_callback()
- *
- * @param Array $matches
- * @access private
- * @return String
- */
- function _format_log_helper($matches)
- {
- return $this->log_boundary . str_pad(dechex(ord($matches[0])), 2, '0', STR_PAD_LEFT);
- }
-
- /**
- * Returns all errors
- *
- * @return String
- * @access public
- */
- function getErrors()
- {
- return $this->errors;
- }
-
- /**
- * Returns the last error
- *
- * @return String
- * @access public
- */
- function getLastError()
- {
- return $this->errors[count($this->errors) - 1];
- }
-
- /**
- * Return the server identification.
- *
- * @return String
- * @access public
- */
- function getServerIdentification()
- {
- return $this->server_identifier;
- }
-
- /**
- * Return a list of the key exchange algorithms the server supports.
- *
- * @return Array
- * @access public
- */
- function getKexAlgorithms()
- {
- return $this->kex_algorithms;
- }
-
- /**
- * Return a list of the host key (public key) algorithms the server supports.
- *
- * @return Array
- * @access public
- */
- function getServerHostKeyAlgorithms()
- {
- return $this->server_host_key_algorithms;
- }
-
- /**
- * Return a list of the (symmetric key) encryption algorithms the server supports, when receiving stuff from the client.
- *
- * @return Array
- * @access public
- */
- function getEncryptionAlgorithmsClient2Server()
- {
- return $this->encryption_algorithms_client_to_server;
- }
-
- /**
- * Return a list of the (symmetric key) encryption algorithms the server supports, when sending stuff to the client.
- *
- * @return Array
- * @access public
- */
- function getEncryptionAlgorithmsServer2Client()
- {
- return $this->encryption_algorithms_server_to_client;
- }
-
- /**
- * Return a list of the MAC algorithms the server supports, when receiving stuff from the client.
- *
- * @return Array
- * @access public
- */
- function getMACAlgorithmsClient2Server()
- {
- return $this->mac_algorithms_client_to_server;
- }
-
- /**
- * Return a list of the MAC algorithms the server supports, when sending stuff to the client.
- *
- * @return Array
- * @access public
- */
- function getMACAlgorithmsServer2Client()
- {
- return $this->mac_algorithms_server_to_client;
- }
-
- /**
- * Return a list of the compression algorithms the server supports, when receiving stuff from the client.
- *
- * @return Array
- * @access public
- */
- function getCompressionAlgorithmsClient2Server()
- {
- return $this->compression_algorithms_client_to_server;
- }
-
- /**
- * Return a list of the compression algorithms the server supports, when sending stuff to the client.
- *
- * @return Array
- * @access public
- */
- function getCompressionAlgorithmsServer2Client()
- {
- return $this->compression_algorithms_server_to_client;
- }
-
- /**
- * Return a list of the languages the server supports, when sending stuff to the client.
- *
- * @return Array
- * @access public
- */
- function getLanguagesServer2Client()
- {
- return $this->languages_server_to_client;
- }
-
- /**
- * Return a list of the languages the server supports, when receiving stuff from the client.
- *
- * @return Array
- * @access public
- */
- function getLanguagesClient2Server()
- {
- return $this->languages_client_to_server;
- }
-
- /**
- * Returns the banner message.
- *
- * Quoting from the RFC, "in some jurisdictions, sending a warning message before
- * authentication may be relevant for getting legal protection."
- *
- * @return String
- * @access public
- */
- function getBannerMessage()
- {
- return $this->banner_message;
- }
-
- /**
- * Returns the server public host key.
- *
- * Caching this the first time you connect to a server and checking the result on subsequent connections
- * is recommended. Returns false if the server signature is not signed correctly with the public host key.
- *
- * @return Mixed
- * @access public
- */
- function getServerPublicHostKey()
- {
- $signature = $this->signature;
- $server_public_host_key = $this->server_public_host_key;
-
- extract(unpack('Nlength', $this->_string_shift($server_public_host_key, 4)));
- $this->_string_shift($server_public_host_key, $length);
-
- if ($this->signature_validated) {
- return $this->bitmap ?
- $this->signature_format . ' ' . base64_encode($this->server_public_host_key) :
- false;
- }
-
- $this->signature_validated = true;
-
- switch ($this->signature_format) {
- case 'ssh-dss':
- $zero = new Math_BigInteger();
-
- $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4));
- $p = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256);
-
- $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4));
- $q = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256);
-
- $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4));
- $g = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256);
-
- $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4));
- $y = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256);
-
- /* The value for 'dss_signature_blob' is encoded as a string containing
- r, followed by s (which are 160-bit integers, without lengths or
- padding, unsigned, and in network byte order). */
- $temp = unpack('Nlength', $this->_string_shift($signature, 4));
- if ($temp['length'] != 40) {
- user_error('Invalid signature');
- return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
- }
-
- $r = new Math_BigInteger($this->_string_shift($signature, 20), 256);
- $s = new Math_BigInteger($this->_string_shift($signature, 20), 256);
-
- switch (true) {
- case $r->equals($zero):
- case $r->compare($q) >= 0:
- case $s->equals($zero):
- case $s->compare($q) >= 0:
- user_error('Invalid signature');
- return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
- }
-
- $w = $s->modInverse($q);
-
- $u1 = $w->multiply(new Math_BigInteger(sha1($this->exchange_hash), 16));
- list(, $u1) = $u1->divide($q);
-
- $u2 = $w->multiply($r);
- list(, $u2) = $u2->divide($q);
-
- $g = $g->modPow($u1, $p);
- $y = $y->modPow($u2, $p);
-
- $v = $g->multiply($y);
- list(, $v) = $v->divide($p);
- list(, $v) = $v->divide($q);
-
- if (!$v->equals($r)) {
- user_error('Bad server signature');
- return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE);
- }
-
- break;
- case 'ssh-rsa':
- $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4));
- $e = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256);
-
- $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4));
- $n = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256);
- $nLength = $temp['length'];
-
- /*
- $temp = unpack('Nlength', $this->_string_shift($signature, 4));
- $signature = $this->_string_shift($signature, $temp['length']);
-
- if (!class_exists('Crypt_RSA')) {
- include_once 'Crypt/RSA.php';
- }
-
- $rsa = new Crypt_RSA();
- $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
- $rsa->loadKey(array('e' => $e, 'n' => $n), CRYPT_RSA_PUBLIC_FORMAT_RAW);
- if (!$rsa->verify($this->exchange_hash, $signature)) {
- user_error('Bad server signature');
- return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE);
- }
- */
-
- $temp = unpack('Nlength', $this->_string_shift($signature, 4));
- $s = new Math_BigInteger($this->_string_shift($signature, $temp['length']), 256);
-
- // validate an RSA signature per "8.2 RSASSA-PKCS1-v1_5", "5.2.2 RSAVP1", and "9.1 EMSA-PSS" in the
- // following URL:
- // ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1.pdf
-
- // also, see SSHRSA.c (rsa2_verifysig) in PuTTy's source.
-
- if ($s->compare(new Math_BigInteger()) < 0 || $s->compare($n->subtract(new Math_BigInteger(1))) > 0) {
- user_error('Invalid signature');
- return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
- }
-
- $s = $s->modPow($e, $n);
- $s = $s->toBytes();
-
- $h = pack('N4H*', 0x00302130, 0x0906052B, 0x0E03021A, 0x05000414, sha1($this->exchange_hash));
- $h = chr(0x01) . str_repeat(chr(0xFF), $nLength - 3 - strlen($h)) . $h;
-
- if ($s != $h) {
- user_error('Bad server signature');
- return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE);
- }
- break;
- default:
- user_error('Unsupported signature format');
- return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE);
- }
-
- return $this->signature_format . ' ' . base64_encode($this->server_public_host_key);
- }
-
- /**
- * Returns the exit status of an SSH command or false.
- *
- * @return Integer or false
- * @access public
- */
- function getExitStatus()
- {
- if (is_null($this->exit_status)) {
- return false;
- }
- return $this->exit_status;
- }
-
- /**
- * Is a path includable?
- *
- * @return Boolean
- * @access private
- */
- function _is_includable($suffix)
- {
- // stream_resolve_include_path was introduced in PHP 5.3.2
- if (function_exists('stream_resolve_include_path')) {
- return stream_resolve_include_path($suffix) !== false;
- }
-
- $paths = PATH_SEPARATOR == ':' ?
- preg_split('#(?
- * login('username', $agent)) {
- * exit('Login Failed');
- * }
- *
- * echo $ssh->exec('pwd');
- * echo $ssh->exec('ls -la');
- * ?>
- *
- *
- * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @category System
- * @package System_SSH_Agent
- * @author Jim Wigginton
- * @copyright MMXIV Jim Wigginton
- * @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://phpseclib.sourceforge.net
- * @internal See http://api.libssh.org/rfc/PROTOCOL.agent
- */
-
-/**#@+
- * Message numbers
- *
- * @access private
- */
-// to request SSH1 keys you have to use SSH_AGENTC_REQUEST_RSA_IDENTITIES (1)
-define('SYSTEM_SSH_AGENTC_REQUEST_IDENTITIES', 11);
-// this is the SSH2 response; the SSH1 response is SSH_AGENT_RSA_IDENTITIES_ANSWER (2).
-define('SYSTEM_SSH_AGENT_IDENTITIES_ANSWER', 12);
-define('SYSTEM_SSH_AGENT_FAILURE', 5);
-// the SSH1 request is SSH_AGENTC_RSA_CHALLENGE (3)
-define('SYSTEM_SSH_AGENTC_SIGN_REQUEST', 13);
-// the SSH1 response is SSH_AGENT_RSA_RESPONSE (4)
-define('SYSTEM_SSH_AGENT_SIGN_RESPONSE', 14);
-/**#@-*/
-
-/**
- * Pure-PHP ssh-agent client identity object
- *
- * Instantiation should only be performed by System_SSH_Agent class.
- * This could be thought of as implementing an interface that Crypt_RSA
- * implements. ie. maybe a Net_SSH_Auth_PublicKey interface or something.
- * The methods in this interface would be getPublicKey, setSignatureMode
- * and sign since those are the methods phpseclib looks for to perform
- * public key authentication.
- *
- * @package System_SSH_Agent
- * @author Jim Wigginton
- * @version 0.1.0
- * @access internal
- */
-class System_SSH_Agent_Identity
-{
- /**
- * Key Object
- *
- * @var Crypt_RSA
- * @access private
- * @see System_SSH_Agent_Identity::getPublicKey()
- */
- var $key;
-
- /**
- * Key Blob
- *
- * @var String
- * @access private
- * @see System_SSH_Agent_Identity::sign()
- */
- var $key_blob;
-
- /**
- * Socket Resource
- *
- * @var Resource
- * @access private
- * @see System_SSH_Agent_Identity::sign()
- */
- var $fsock;
-
- /**
- * Default Constructor.
- *
- * @param Resource $fsock
- * @return System_SSH_Agent_Identity
- * @access private
- */
- function System_SSH_Agent_Identity($fsock)
- {
- $this->fsock = $fsock;
- }
-
- /**
- * Set Public Key
- *
- * Called by System_SSH_Agent::requestIdentities()
- *
- * @param Crypt_RSA $key
- * @access private
- */
- function setPublicKey($key)
- {
- $this->key = $key;
- $this->key->setPublicKey();
- }
-
- /**
- * Set Public Key
- *
- * Called by System_SSH_Agent::requestIdentities(). The key blob could be extracted from $this->key
- * but this saves a small amount of computation.
- *
- * @param String $key_blob
- * @access private
- */
- function setPublicKeyBlob($key_blob)
- {
- $this->key_blob = $key_blob;
- }
-
- /**
- * Get Public Key
- *
- * Wrapper for $this->key->getPublicKey()
- *
- * @param Integer $format optional
- * @return Mixed
- * @access public
- */
- function getPublicKey($format = null)
- {
- return !isset($format) ? $this->key->getPublicKey() : $this->key->getPublicKey($format);
- }
-
- /**
- * Set Signature Mode
- *
- * Doesn't do anything as ssh-agent doesn't let you pick and choose the signature mode. ie.
- * ssh-agent's only supported mode is CRYPT_RSA_SIGNATURE_PKCS1
- *
- * @param Integer $mode
- * @access public
- */
- function setSignatureMode($mode)
- {
- }
-
- /**
- * Create a signature
- *
- * See "2.6.2 Protocol 2 private key signature request"
- *
- * @param String $message
- * @return String
- * @access public
- */
- function sign($message)
- {
- // the last parameter (currently 0) is for flags and ssh-agent only defines one flag (for ssh-dss): SSH_AGENT_OLD_SIGNATURE
- $packet = pack('CNa*Na*N', SYSTEM_SSH_AGENTC_SIGN_REQUEST, strlen($this->key_blob), $this->key_blob, strlen($message), $message, 0);
- $packet = pack('Na*', strlen($packet), $packet);
- if (strlen($packet) != fputs($this->fsock, $packet)) {
- user_error('Connection closed during signing');
- }
-
- $length = current(unpack('N', fread($this->fsock, 4)));
- $type = ord(fread($this->fsock, 1));
- if ($type != SYSTEM_SSH_AGENT_SIGN_RESPONSE) {
- user_error('Unable to retreive signature');
- }
-
- $signature_blob = fread($this->fsock, $length - 1);
- // the only other signature format defined - ssh-dss - is the same length as ssh-rsa
- // the + 12 is for the other various SSH added length fields
- return substr($signature_blob, strlen('ssh-rsa') + 12);
- }
-}
-
-/**
- * Pure-PHP ssh-agent client identity factory
- *
- * requestIdentities() method pumps out System_SSH_Agent_Identity objects
- *
- * @package System_SSH_Agent
- * @author Jim Wigginton
- * @version 0.1.0
- * @access internal
- */
-class System_SSH_Agent
-{
- /**
- * Socket Resource
- *
- * @var Resource
- * @access private
- */
- var $fsock;
-
- /**
- * Default Constructor
- *
- * @return System_SSH_Agent
- * @access public
- */
- function System_SSH_Agent()
- {
- switch (true) {
- case isset($_SERVER['SSH_AUTH_SOCK']):
- $address = $_SERVER['SSH_AUTH_SOCK'];
- break;
- case isset($_ENV['SSH_AUTH_SOCK']):
- $address = $_ENV['SSH_AUTH_SOCK'];
- break;
- default:
- user_error('SSH_AUTH_SOCK not found');
- return false;
- }
-
- $this->fsock = fsockopen('unix://' . $address, 0, $errno, $errstr);
- if (!$this->fsock) {
- user_error("Unable to connect to ssh-agent (Error $errno: $errstr)");
- }
- }
-
- /**
- * Request Identities
- *
- * See "2.5.2 Requesting a list of protocol 2 keys"
- * Returns an array containing zero or more System_SSH_Agent_Identity objects
- *
- * @return Array
- * @access public
- */
- function requestIdentities()
- {
- if (!$this->fsock) {
- return array();
- }
-
- $packet = pack('NC', 1, SYSTEM_SSH_AGENTC_REQUEST_IDENTITIES);
- if (strlen($packet) != fputs($this->fsock, $packet)) {
- user_error('Connection closed while requesting identities');
- }
-
- $length = current(unpack('N', fread($this->fsock, 4)));
- $type = ord(fread($this->fsock, 1));
- if ($type != SYSTEM_SSH_AGENT_IDENTITIES_ANSWER) {
- user_error('Unable to request identities');
- }
-
- $identities = array();
- $keyCount = current(unpack('N', fread($this->fsock, 4)));
- for ($i = 0; $i < $keyCount; $i++) {
- $length = current(unpack('N', fread($this->fsock, 4)));
- $key_blob = fread($this->fsock, $length);
- $length = current(unpack('N', fread($this->fsock, 4)));
- $key_comment = fread($this->fsock, $length);
- $length = current(unpack('N', substr($key_blob, 0, 4)));
- $key_type = substr($key_blob, 4, $length);
- switch ($key_type) {
- case 'ssh-rsa':
- if (!class_exists('Crypt_RSA')) {
- include_once 'Crypt/RSA.php';
- }
- $key = new Crypt_RSA();
- $key->loadKey('ssh-rsa ' . base64_encode($key_blob) . ' ' . $key_comment);
- break;
- case 'ssh-dss':
- // not currently supported
- break;
- }
- // resources are passed by reference by default
- if (isset($key)) {
- $identity = new System_SSH_Agent_Identity($this->fsock);
- $identity->setPublicKey($key);
- $identity->setPublicKeyBlob($key_blob);
- $identities[] = $identity;
- unset($key);
- }
- }
-
- return $identities;
- }
-}
diff --git a/apps/files_external/3rdparty/phpseclib/phpseclib/openssl.cnf b/apps/files_external/3rdparty/phpseclib/phpseclib/openssl.cnf
deleted file mode 100644
index 2b8b52f9f7fc75fa8a7e0f6244712fb523adedc1..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpseclib/openssl.cnf
+++ /dev/null
@@ -1,6 +0,0 @@
-# minimalist openssl.cnf file for use with phpseclib
-
-HOME = .
-RANDFILE = $ENV::HOME/.rnd
-
-[ v3_ca ]
diff --git a/apps/files_external/3rdparty/phpseclib/phpunit.xml.dist b/apps/files_external/3rdparty/phpseclib/phpunit.xml.dist
deleted file mode 100644
index f579ab4fd27b31b74aa0e001d0542d3e1d781b14..0000000000000000000000000000000000000000
--- a/apps/files_external/3rdparty/phpseclib/phpunit.xml.dist
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
- ./tests/
-
-
-
-
-
-
- ./phpseclib/
-
-
-
diff --git a/apps/files_external/css/settings.css b/apps/files_external/css/settings.css
index ee2c0aae64bd2fc5dea1dcdfd7443fdae2742570..01dd5aece8cfa9f96e38a47fe6ad2d72149c237c 100644
--- a/apps/files_external/css/settings.css
+++ b/apps/files_external/css/settings.css
@@ -20,3 +20,8 @@ tr:hover>td.remove>img { visibility:visible; cursor:pointer; }
position: relative;
top: 3px;
}
+
+
+#externalStorage td.status .success {
+ border-radius: 50%;
+}
diff --git a/apps/files_external/l10n/fr.php b/apps/files_external/l10n/fr.php
index ea20abc5256939ae6501f2913bad394e593e2ccb..9f7c3e19f48f4eb80b79451c3f749d0b6d8f8fda 100644
--- a/apps/files_external/l10n/fr.php
+++ b/apps/files_external/l10n/fr.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Amazon S3" => "Amazon S3",
"Key" => "Clé",
"Secret" => "Secret",
+"Bucket" => "Seau",
"Amazon S3 and compliant" => "Compatible avec Amazon S3",
"Access Key" => "Clé d'accès",
"Secret Key" => "Clé secrète",
diff --git a/apps/files_external/l10n/gl.php b/apps/files_external/l10n/gl.php
index 248afb5f6a7a8723629ecfe1bee5929160be25ff..e143fd3a8815bf99a09d09e68a9bfd42dd506324 100644
--- a/apps/files_external/l10n/gl.php
+++ b/apps/files_external/l10n/gl.php
@@ -64,7 +64,7 @@ $TRANSLATIONS = array(
"Delete" => "Eliminar",
"Enable User External Storage" => "Activar o almacenamento externo do usuario",
"Allow users to mount the following external storage" => "Permitirlle aos usuarios montar o seguinte almacenamento externo",
-"SSL root certificates" => "Certificados SSL root",
-"Import Root Certificate" => "Importar o certificado root"
+"SSL root certificates" => "Certificados raíz SSL",
+"Import Root Certificate" => "Importar o certificado raíz"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_external/l10n/ja.php b/apps/files_external/l10n/ja.php
index b70dd2a09a45678ad49260caeab20ab87fa79a2e..6dce541abaf3dadd225816b51df1e4d9f49ad706 100644
--- a/apps/files_external/l10n/ja.php
+++ b/apps/files_external/l10n/ja.php
@@ -38,7 +38,7 @@ $TRANSLATIONS = array(
"Username as share" => "共有名",
"URL" => "URL",
"Secure https://" => "セキュア https://",
-"Remote subfolder" => "リモートサブフォルダ",
+"Remote subfolder" => "リモートサブフォルダー",
"Access granted" => "アクセスは許可されました",
"Error configuring Dropbox storage" => "Dropboxストレージの設定エラー",
"Grant access" => "アクセスを許可",
@@ -63,7 +63,7 @@ $TRANSLATIONS = array(
"Users" => "ユーザー",
"Delete" => "削除",
"Enable User External Storage" => "ユーザーの外部ストレージを有効にする",
-"Allow users to mount the following external storage" => "ユーザに以下の外部ストレージのマウントを許可する",
+"Allow users to mount the following external storage" => "ユーザーに以下の外部ストレージのマウントを許可する",
"SSL root certificates" => "SSLルート証明書",
"Import Root Certificate" => "ルート証明書をインポート"
);
diff --git a/apps/files_external/l10n/ru.php b/apps/files_external/l10n/ru.php
index b4985dd5dc9dd34c2bdb5de7d34c36a15135eb79..d2b0f93290a291d789dd5918054dfdc8ea8bd42c 100644
--- a/apps/files_external/l10n/ru.php
+++ b/apps/files_external/l10n/ru.php
@@ -3,14 +3,19 @@ $TRANSLATIONS = array(
"Local" => "Локально",
"Location" => "Местоположение",
"Amazon S3" => "Amazon S3",
+"Key" => "Ключ",
+"Access Key" => "Ключ доступа",
+"Secret Key" => "Секретный ключ",
"Hostname (optional)" => "Хост (опц.)",
"Port (optional)" => "Порт (опц.)",
"Region (optional)" => "Регион (опционально)",
"Enable SSL" => "Включить SSL",
+"App key" => "Ключ приложения",
"Host" => "Сервер",
"Username" => "Имя пользователя",
"Password" => "Пароль",
"Secure ftps://" => "Безопасный ftps://",
+"Client ID" => "Идентификатор клиента",
"Username (required)" => "Имя пользователя (обяз.)",
"Share" => "Открыть доступ",
"URL" => "Ссылка",
diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php
index 21f63bf439d31cb3aec9df64216353c7470da9e5..28e28ffcde69642a9780b1453c855a7377b69f26 100755
--- a/apps/files_external/lib/config.php
+++ b/apps/files_external/lib/config.php
@@ -21,11 +21,6 @@
* License along with this library. If not, see .
*/
-set_include_path(
- get_include_path() . PATH_SEPARATOR .
- \OC_App::getAppPath('files_external') . '/3rdparty/phpseclib/phpseclib'
-);
-
/**
* Class to configure mount.json globally and for users
*/
diff --git a/apps/files_external/lib/sftp.php b/apps/files_external/lib/sftp.php
index a0816e2870dca5d514b16633c7742db393e23238..52cac9bb64a19c942069654c3908b4b026a093a3 100644
--- a/apps/files_external/lib/sftp.php
+++ b/apps/files_external/lib/sftp.php
@@ -7,11 +7,6 @@
*/
namespace OC\Files\Storage;
-set_include_path(get_include_path() . PATH_SEPARATOR .
- \OC_App::getAppPath('files_external') . '/3rdparty/phpseclib/phpseclib');
-require 'Net/SFTP.php';
-require 'Net/SFTP/Stream.php';
-
class SFTP extends \OC\Files\Storage\Common {
private $host;
private $user;
diff --git a/apps/files_external/lib/webdav.php b/apps/files_external/lib/webdav.php
index dc98dcfb8081189b81526df31f125ce4b4dbf87d..525f41c127651469e1d1a29b9fcaf0f6a2e598e0 100644
--- a/apps/files_external/lib/webdav.php
+++ b/apps/files_external/lib/webdav.php
@@ -17,7 +17,7 @@ class DAV extends \OC\Files\Storage\Common {
private $certPath;
private $ready;
/**
- * @var \Sabre_DAV_Client
+ * @var \Sabre\DAV\Client
*/
private $client;
@@ -71,7 +71,7 @@ class DAV extends \OC\Files\Storage\Common {
'password' => $this->password,
);
- $this->client = new \Sabre_DAV_Client($settings);
+ $this->client = new \Sabre\DAV\Client($settings);
if ($this->secure === true && $this->certPath) {
$this->client->addTrustedCertificates($this->certPath);
@@ -252,7 +252,7 @@ class DAV extends \OC\Files\Storage\Common {
if ($this->file_exists($path)) {
try {
$this->client->proppatch($this->encodePath($path), array('{DAV:}lastmodified' => $mtime));
- } catch (\Sabre_DAV_Exception_NotImplemented $e) {
+ } catch (\Sabre\DAV\Exception\NotImplemented $e) {
return false;
}
} else {
@@ -396,5 +396,29 @@ class DAV extends \OC\Files\Storage\Common {
return array('curl');
}
}
+
+ public function getPermissions($path) {
+ $this->init();
+ $response = $this->client->propfind($this->encodePath($path), array('{http://owncloud.org/ns}permissions'));
+ if (isset($response['{http://owncloud.org/ns}permissions'])) {
+ $permissions = 0;
+ $permissionsString = $response['{http://owncloud.org/ns}permissions'];
+ if (strpos($permissionsString, 'R') !== false) {
+ $permissions |= \OCP\PERMISSION_SHARE;
+ }
+ if (strpos($permissionsString, 'D') !== false) {
+ $permissions |= \OCP\PERMISSION_DELETE;
+ }
+ if (strpos($permissionsString, 'W') !== false) {
+ $permissions |= \OCP\PERMISSION_UPDATE;
+ }
+ if (strpos($permissionsString, 'C') !== false) {
+ $permissions |= \OCP\PERMISSION_CREATE;
+ }
+ return $permissions;
+ } else {
+ return parent::getPermissions($path);
+ }
+ }
}
diff --git a/apps/files_sharing/app/sharing.php b/apps/files_sharing/app/sharing.php
new file mode 100644
index 0000000000000000000000000000000000000000..427269755b93eb96baf3ee8b5f840d0a56eb143f
--- /dev/null
+++ b/apps/files_sharing/app/sharing.php
@@ -0,0 +1,25 @@
+getContainer();
+
+ /**
+ * Controllers
+ */
+ $container->registerService('AdminSettingsController', function($c) {
+ return new AdminSettingsController(
+ $c->query('AppName'),
+ $c->query('Request')
+ );
+ });
+ }
+}
diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php
index 21b2646c5eade7a57cde704acf06e6cc346c08a9..d44c652dd980809be1d476192d3ad18c07444b59 100644
--- a/apps/files_sharing/appinfo/app.php
+++ b/apps/files_sharing/appinfo/app.php
@@ -21,6 +21,9 @@ OCP\Util::addScript('files_sharing', 'share');
\OC_Hook::connect('OC_Filesystem', 'post_rename', '\OC\Files\Cache\Shared_Updater', 'renameHook');
\OC_Hook::connect('OC_Appconfig', 'post_set_value', '\OCA\Files\Share\Maintainer', 'configChangeHook');
+// Register settings scripts for mail template editing
+OCP\App::registerAdmin('files_sharing', 'settings-admin');
+
OC_FileProxy::register(new OCA\Files\Share\Proxy());
\OCA\Files\App::getNavigationManager()->add(
@@ -41,3 +44,12 @@ OC_FileProxy::register(new OCA\Files\Share\Proxy());
"name" => $l->t('Shared with others')
)
);
+\OCA\Files\App::getNavigationManager()->add(
+ array(
+ "id" => 'sharinglinks',
+ "appname" => 'files_sharing',
+ "script" => 'list.php',
+ "order" => 20,
+ "name" => $l->t('Shared by link')
+ )
+);
diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php
index 7c2834dc9c2b008f02fef4ea6c2e4876699fbac7..5b6286e2bfb8e5e4189dc5a1ca31b57debdd3751 100644
--- a/apps/files_sharing/appinfo/routes.php
+++ b/apps/files_sharing/appinfo/routes.php
@@ -5,6 +5,21 @@ $this->create('core_ajax_public_preview', '/publicpreview')->action(
require_once __DIR__ . '/../ajax/publicpreview.php';
});
+use \OCA\Files_Sharing\App\Sharing;
+
+$app = new Sharing();
+
+$app->registerRoutes($this, array('routes' => array(
+
+ // mailTemplate settings
+ array('name' => 'admin_settings#render', 'url' => '/settings/mailtemplate', 'verb' => 'GET'),
+
+ array('name' => 'admin_settings#update', 'url' => '/settings/mailtemplate', 'verb' => 'POST'),
+
+ array('name' => 'admin_settings#reset', 'url' => '/settings/mailtemplate', 'verb' => 'DELETE')
+
+)));
+
// OCS API
//TODO: SET: mail notification, waiting for PR #4689 to be accepted
diff --git a/apps/files_sharing/controller/adminsettingscontroller.php b/apps/files_sharing/controller/adminsettingscontroller.php
new file mode 100644
index 0000000000000000000000000000000000000000..fed3147a99c401b253dcb631c569314c9eefb369
--- /dev/null
+++ b/apps/files_sharing/controller/adminsettingscontroller.php
@@ -0,0 +1,60 @@
+getResponse();
+ } catch (\Exception $ex) {
+ return new JSONResponse(array('message' => $ex->getMessage()), $ex->getCode());
+ }
+ }
+
+ /**
+ * @param string $theme
+ * @param string $template
+ * @param string $content
+ * @return JSONResponse
+ */
+ public function update( $theme, $template, $content ) {
+ try {
+ $template = new \OCA\Files_Sharing\MailTemplate( $theme, $template );
+ $template->setContent( $content );
+ return new JSONResponse();
+ } catch (\Exception $ex) {
+ return new JSONResponse(array('message' => $ex->getMessage()), $ex->getCode());
+ }
+ }
+
+ /**
+ * @param string $theme
+ * @param string $template
+ * @return JSONResponse
+ */
+ public function reset( $theme, $template ) {
+ try {
+ $template = new \OCA\Files_Sharing\MailTemplate( $theme, $template );
+ $template->reset();
+ return new JSONResponse();
+ } catch (\Exception $ex) {
+ return new JSONResponse(array('message' => $ex->getMessage()), $ex->getCode());
+ }
+ }
+
+}
diff --git a/apps/files_sharing/css/authenticate.css b/apps/files_sharing/css/authenticate.css
index ef963ba7c65cdbdfa5522b2ecff98be90536e7bb..a5aa55632bb5fbf81885092b9fe29d8a20426a4b 100644
--- a/apps/files_sharing/css/authenticate.css
+++ b/apps/files_sharing/css/authenticate.css
@@ -1,10 +1,3 @@
-#body-login form label.infield {
- width: 190px;
- padding: 10px;
- left: 8px;
- top: 8px;
-}
-
#password {
width: 190px !important;
padding: 10px;
diff --git a/apps/files_sharing/css/settings-admin.css b/apps/files_sharing/css/settings-admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..7ee719634361d084dcb44061a50c74b0f58ea129
--- /dev/null
+++ b/apps/files_sharing/css/settings-admin.css
@@ -0,0 +1,33 @@
+#mailTemplateSettings .actions div {
+ display: inline-block;
+}
+
+#mailTemplateSettings div label {
+ display: block
+}
+
+#mailTemplateSettings textarea {
+ box-sizing: border-box;
+ width: 100%;
+ height: 150px;
+}
+
+#mailTemplateSettings .templateEditor + .actions {
+ height:28px;
+}
+
+
+#mailTemplateSettings .actions .reset {
+ margin: 0;
+}
+
+#mailTemplateSettings .actions .save {
+ float: right;
+ margin: 0;
+}
+
+#mailTemplateSettings #mts-msg {
+ float: right;
+ margin: 1px 5px;
+ padding:3px;
+}
diff --git a/apps/files_sharing/http/mailtemplateresponse.php b/apps/files_sharing/http/mailtemplateresponse.php
new file mode 100644
index 0000000000000000000000000000000000000000..98a2dfcc94e231792a7cc696fd65d5ac495e4285
--- /dev/null
+++ b/apps/files_sharing/http/mailtemplateresponse.php
@@ -0,0 +1,55 @@
+
+ *
+ * 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 .
+ *
+ */
+
+namespace OCA\Files_Sharing\Http;
+
+/**
+ * Prompts the user to download the a file
+ */
+class MailTemplateResponse extends \OCP\AppFramework\Http\Response {
+
+ private $filename;
+ private $contentType;
+
+ /**
+ * Creates a response that prompts the user to download the file
+ * @param string $filename the name that the downloaded file should have
+ * @param string $contentType the mimetype that the downloaded file should have
+ */
+ public function __construct($filename, $contentType = 'text/php') {
+ $this->filename = $filename;
+ $this->contentType = $contentType;
+
+ $this->addHeader('Content-Disposition', 'attachment; filename="' . $filename . '"');
+ $this->addHeader('Content-Type', $contentType);
+ }
+
+ /**
+ * Returns the raw template content
+ * @return string the file
+ */
+ public function render(){
+ return file_get_contents($this->filename);
+ }
+
+}
diff --git a/apps/files_sharing/js/app.js b/apps/files_sharing/js/app.js
index 3764328a5d04624107538433a2f272440d19e316..1fc13d00382bb45af2b0d69255485c114bf3adaa 100644
--- a/apps/files_sharing/js/app.js
+++ b/apps/files_sharing/js/app.js
@@ -8,7 +8,9 @@
*
*/
-OCA.Sharing = {};
+if (!OCA.Sharing) {
+ OCA.Sharing = {};
+}
OCA.Sharing.App = {
_inFileList: null,
@@ -53,6 +55,25 @@ OCA.Sharing.App = {
return this._outFileList;
},
+ initSharingLinks: function($el) {
+ if (this._linkFileList) {
+ return this._linkFileList;
+ }
+ this._linkFileList = new OCA.Sharing.FileList(
+ $el,
+ {
+ scrollContainer: $('#app-content'),
+ linksOnly: true,
+ fileActions: this._createFileActions()
+ }
+ );
+
+ this._extendFileList(this._linkFileList);
+ this._linkFileList.appName = t('files_sharing', 'Shared by link');
+ this._linkFileList.$el.find('#emptycontent').text(t('files_sharing', 'You haven\'t shared any files by link yet.'));
+ return this._linkFileList;
+ },
+
removeSharingIn: function() {
if (this._inFileList) {
this._inFileList.$fileList.empty();
@@ -65,6 +86,12 @@ OCA.Sharing.App = {
}
},
+ removeSharingLinks: function() {
+ if (this._linkFileList) {
+ this._linkFileList.$fileList.empty();
+ }
+ },
+
_createFileActions: function() {
// inherit file actions from the files app
var fileActions = new OCA.Files.FileActions();
@@ -102,5 +129,11 @@ $(document).ready(function() {
$('#app-content-sharingout').on('hide', function() {
OCA.Sharing.App.removeSharingOut();
});
+ $('#app-content-sharinglinks').on('show', function(e) {
+ OCA.Sharing.App.initSharingLinks($(e.target));
+ });
+ $('#app-content-sharinglinks').on('hide', function() {
+ OCA.Sharing.App.removeSharingLinks();
+ });
});
diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js
index 27e8d361ff9bd9d5387c88c35a77846a385d72dd..a2248405d22297bb81a90265f5c61de9dbd07f84 100644
--- a/apps/files_sharing/js/public.js
+++ b/apps/files_sharing/js/public.js
@@ -10,7 +10,9 @@
/* global FileActions, Files */
/* global dragOptions, folderDropOptions */
-OCA.Sharing = {};
+if (!OCA.Sharing) {
+ OCA.Sharing = {};
+}
if (!OCA.Files) {
OCA.Files = {};
}
diff --git a/apps/files_sharing/js/settings-admin.js b/apps/files_sharing/js/settings-admin.js
new file mode 100644
index 0000000000000000000000000000000000000000..fa9b236ea98d4bd7d485f7bc616f618cc1e87173
--- /dev/null
+++ b/apps/files_sharing/js/settings-admin.js
@@ -0,0 +1,78 @@
+$(document).ready(function() {
+
+ var loadTemplate = function (theme, template) {
+ $.get(
+ OC.generateUrl('apps/files_sharing/settings/mailtemplate'),
+ { theme: theme, template: template }
+ ).done(function( result ) {
+ $( '#mailTemplateSettings textarea' ).val(result);
+ }).fail(function( result ) {
+ OC.dialogs.alert(result.message, t('files_sharing', 'Could not load template'));
+ });
+ };
+
+ // load default template
+ var theme = $( '#mts-theme' ).val();
+ var template = $( '#mts-template' ).val();
+ loadTemplate(theme, template);
+
+ $( '#mts-template' ).change(
+ function() {
+ var theme = $( '#mts-theme' ).val();
+ var template = $( this ).val();
+ loadTemplate(theme, template);
+ }
+ );
+
+ $( '#mts-theme' ).change(
+ function() {
+ var theme = $( this ).val();
+ var template = $( '#mts-template' ).val();
+ loadTemplate(theme, template);
+ }
+ );
+
+ $( '#mailTemplateSettings .actions' ).on('click', '.save',
+ function() {
+ var theme = $( '#mts-theme' ).val();
+ var template = $( '#mts-template' ).val();
+ var content = $( '#mailTemplateSettings textarea' ).val();
+ OC.msg.startSaving('#mts-msg');
+ $.post(
+ OC.generateUrl('apps/files_sharing/settings/mailtemplate'),
+ { theme: theme, template: template, content: content }
+ ).done(function() {
+ var data = { status:'success', data:{message:t('files_sharing', 'Saved')} };
+ OC.msg.finishedSaving('#mts-msg', data);
+ }).fail(function(result) {
+ var data = { status: 'error', data:{message:result.responseJSON.message} };
+ OC.msg.finishedSaving('#mts-msg', data);
+ });
+ }
+ );
+
+ $( '#mailTemplateSettings .actions' ).on('click', '.reset',
+ function() {
+ var theme = $( '#mts-theme' ).val();
+ var template = $( '#mts-template' ).val();
+ OC.msg.startSaving('#mts-msg');
+ $.ajax({
+ type: "DELETE",
+ url: OC.generateUrl('apps/files_sharing/settings/mailtemplate'),
+ data: { theme: theme, template: template }
+ }).done(function() {
+ var data = { status:'success', data:{message:t('files_sharing', 'Reset')} };
+ OC.msg.finishedSaving('#mts-msg', data);
+
+ // load default template
+ var theme = $( '#mts-theme' ).val();
+ var template = $( '#mts-template' ).val();
+ loadTemplate(theme, template);
+ }).fail(function(result) {
+ var data = { status: 'error', data:{message:result.responseJSON.message} };
+ OC.msg.finishedSaving('#mts-msg', data);
+ });
+ }
+ );
+
+});
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index 5a42604c866dbc3c10d84a80f4897ac22e2fc783..d63a590fb8e60ab39144c118c1fa032a3f6d1c6d 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -8,103 +8,166 @@
*
*/
-$(document).ready(function() {
- if (!_.isUndefined(OC.Share) && !_.isUndefined(OCA.Files)) {
- // TODO: make a separate class for this or a hook or jQuery event ?
- if (OCA.Files.FileList) {
- var oldCreateRow = OCA.Files.FileList.prototype._createRow;
- OCA.Files.FileList.prototype._createRow = function(fileData) {
- var tr = oldCreateRow.apply(this, arguments);
- if (fileData.shareOwner) {
- tr.attr('data-share-owner', fileData.shareOwner);
- // user should always be able to rename a mount point
- if (fileData.isShareMountPoint) {
- tr.attr('data-permissions', fileData.permissions | OC.PERMISSION_UPDATE);
- tr.attr('data-reshare-permissions', fileData.permissions);
+(function() {
+ if (!OCA.Sharing) {
+ OCA.Sharing = {};
+ }
+ OCA.Sharing.Util = {
+ initialize: function(fileActions) {
+ if (OCA.Files.FileList) {
+ var oldCreateRow = OCA.Files.FileList.prototype._createRow;
+ OCA.Files.FileList.prototype._createRow = function(fileData) {
+ var tr = oldCreateRow.apply(this, arguments);
+ if (fileData.shareOwner) {
+ tr.attr('data-share-owner', fileData.shareOwner);
+ // user should always be able to rename a mount point
+ if (fileData.isShareMountPoint) {
+ tr.attr('data-permissions', fileData.permissions | OC.PERMISSION_UPDATE);
+ tr.attr('data-reshare-permissions', fileData.permissions);
+ }
}
- }
- return tr;
- };
- }
+ if (fileData.recipientsDisplayName) {
+ tr.attr('data-share-recipients', fileData.recipientsDisplayName);
+ }
+ return tr;
+ };
- // use delegate to catch the case with multiple file lists
- $('#content').delegate('#fileList', 'fileActionsReady',function(ev){
- // if no share action exists because the admin disabled sharing for this user
- // we create a share notification action to inform the user about files
- // shared with him otherwise we just update the existing share action.
- var fileList = ev.fileList;
- var $fileList = $(this);
- $fileList.find('[data-share-owner]').each(function() {
- var $tr = $(this);
- var $action;
- var owner;
- var message;
- var permissions = $tr.data('permissions');
- if(permissions & OC.PERMISSION_SHARE) {
- $action = $tr.find('[data-Action="Share"]');
- $action.addClass('permanent');
- owner = $tr.closest('tr').attr('data-share-owner');
- message = ' ' + t('files_sharing', 'Shared by {owner}', {owner: owner});
- $action.find('span').text(message);
- } else {
- var shareNotification = '' +
- ' ';
- $tr.find('.fileactions').append(function() {
- var owner = $(this).closest('tr').attr('data-share-owner');
- var shareBy = t('files_sharing', 'Shared by {owner}', {owner: owner});
- var $result = $(shareNotification + ' ' + shareBy + ' ');
- $result.on('click', function() {
- return false;
- });
- return $result;
- });
+ var oldRenderRow = OCA.Files.FileList.prototype._renderRow;
+ OCA.Files.FileList.prototype._renderRow = function(fileData) {
+ var $tr = oldRenderRow.apply(this, arguments);
+ // if the statuses are loaded already, use them for the icon
+ // (needed when scrolling to the next page)
+ var shareStatus = OC.Share.statuses[fileData.id];
+ if (fileData.shareOwner || fileData.recipientsDisplayName || shareStatus) {
+ var permissions = $tr.data('permissions');
+ var hasLink = !!(shareStatus && shareStatus.link);
+ if (permissions & OC.PERMISSION_SHARE) {
+ OC.Share.markFileAsShared($tr, true, hasLink);
+ } else {
+ // if no share action exists because the admin disabled sharing for this user
+ // we create a share notification action to inform the user about files
+ // shared with him otherwise we just update the existing share action.
+ // TODO: make this work like/with OC.Share.markFileAsShared()
+ var shareNotification = ' ' +
+ ' ';
+ $tr.find('.fileactions').append(function() {
+ var shareBy = t('files_sharing', 'Shared by {owner}', {owner: fileData.shareOwner});
+ var $result = $(shareNotification + ' ' + shareBy + ' ');
+ $result.on('click', function() {
+ return false;
+ });
+ return $result;
+ });
+ }
+ }
+ return $tr;
+ };
+ }
+
+ // use delegate to catch the case with multiple file lists
+ $('#content').delegate('#fileList', 'fileActionsReady',function(ev){
+ var fileList = ev.fileList;
+ if (!OCA.Sharing.sharesLoaded){
+ OC.Share.loadIcons('file', fileList);
+ // assume that we got all shares, so switching directories
+ // will not invalidate that list
+ OCA.Sharing.sharesLoaded = true;
+ }
+ else{
+ // this will update the icons for all the currently visible elements
+ // additionally added elements when scrolling down will be
+ // updated in the _renderRow override
+ OC.Share.updateIcons('file', fileList);
}
});
- if (!OCA.Sharing.sharesLoaded){
- OC.Share.loadIcons('file', fileList);
- // assume that we got all shares, so switching directories
- // will not invalidate that list
- OCA.Sharing.sharesLoaded = true;
- }
- else{
- OC.Share.updateIcons('file', fileList);
- }
- });
-
- OCA.Files.fileActions.register(
- 'all',
- 'Share',
- OC.PERMISSION_SHARE,
- OC.imagePath('core', 'actions/share'),
- function(filename, context) {
+ fileActions.register(
+ 'all',
+ 'Share',
+ OC.PERMISSION_SHARE,
+ OC.imagePath('core', 'actions/share'),
+ function(filename, context) {
- var $tr = context.$file;
- var itemType = 'file';
- if ($tr.data('type') === 'dir') {
- itemType = 'folder';
- }
- var possiblePermissions = $tr.data('reshare-permissions');
- if (_.isUndefined(possiblePermissions)) {
- possiblePermissions = $tr.data('permissions');
- }
+ var $tr = context.$file;
+ var itemType = 'file';
+ if ($tr.data('type') === 'dir') {
+ itemType = 'folder';
+ }
+ var possiblePermissions = $tr.data('reshare-permissions');
+ if (_.isUndefined(possiblePermissions)) {
+ possiblePermissions = $tr.data('permissions');
+ }
- var appendTo = $tr.find('td.filename');
- // Check if drop down is already visible for a different file
- if (OC.Share.droppedDown) {
- if ($tr.data('id') !== $('#dropdown').attr('data-item-source')) {
- OC.Share.hideDropDown(function () {
- $tr.addClass('mouseOver');
- OC.Share.showDropDown(itemType, $tr.data('id'), appendTo, true, possiblePermissions, filename);
- });
+ var appendTo = $tr.find('td.filename');
+ // Check if drop down is already visible for a different file
+ if (OC.Share.droppedDown) {
+ if ($tr.data('id') !== $('#dropdown').attr('data-item-source')) {
+ OC.Share.hideDropDown(function () {
+ $tr.addClass('mouseOver');
+ OC.Share.showDropDown(itemType, $tr.data('id'), appendTo, true, possiblePermissions, filename);
+ });
+ } else {
+ OC.Share.hideDropDown();
+ }
} else {
- OC.Share.hideDropDown();
+ $tr.addClass('mouseOver');
+ OC.Share.showDropDown(itemType, $tr.data('id'), appendTo, true, possiblePermissions, filename);
}
- } else {
- $tr.addClass('mouseOver');
- OC.Share.showDropDown(itemType, $tr.data('id'), appendTo, true, possiblePermissions, filename);
+ $('#dropdown').on('sharesChanged', function(ev) {
+ // files app current cannot show recipients on load, so we don't update the
+ // icon when changed for consistency
+ if (context.fileList.$el.closest('#app-content-files').length) {
+ return;
+ }
+ var recipients = _.pluck(ev.shares[OC.Share.SHARE_TYPE_USER], 'share_with_displayname');
+ var groupRecipients = _.pluck(ev.shares[OC.Share.SHARE_TYPE_GROUP], 'share_with_displayname');
+ recipients = recipients.concat(groupRecipients);
+ // note: we only update the data attribute because updateIcon()
+ // is called automatically after this event
+ if (recipients.length) {
+ $tr.attr('data-share-recipients', OCA.Sharing.Util.formatRecipients(recipients));
+ }
+ else {
+ $tr.removeAttr('data-share-recipients');
+ }
+ });
+ });
+ },
+
+ /**
+ * Formats a recipients array to be displayed.
+ * The first four recipients will be shown and the
+ * other ones will be shown as "+x" where "x" is the number of
+ * remaining recipients.
+ *
+ * @param recipients recipients array
+ * @param count optional total recipients count (in case the array was shortened)
+ * @return formatted recipients display text
+ */
+ formatRecipients: function(recipients, count) {
+ var maxRecipients = 4;
+ var text;
+ if (!_.isNumber(count)) {
+ count = recipients.length;
+ }
+ // TODO: use natural sort
+ recipients = _.first(recipients, maxRecipients).sort();
+ text = recipients.join(', ');
+ if (count > maxRecipients) {
+ text += ', +' + (count - maxRecipients);
}
- });
+ return text;
+ }
+ };
+})();
+
+$(document).ready(function() {
+ // FIXME: HACK: do not init when running unit tests, need a better way
+ if (!window.TESTING) {
+ if (!_.isUndefined(OC.Share) && !_.isUndefined(OCA.Files)) {
+ OCA.Sharing.Util.initialize(OCA.Files.fileActions);
+ }
}
});
+
diff --git a/apps/files_sharing/js/sharedfilelist.js b/apps/files_sharing/js/sharedfilelist.js
index ef1034ecfdc874b97a0334a07d351f337bb6df8b..304f77a8d772fe5de79c48a717548c6ec508173a 100644
--- a/apps/files_sharing/js/sharedfilelist.js
+++ b/apps/files_sharing/js/sharedfilelist.js
@@ -26,6 +26,7 @@
* the files that the user shared with others (false).
*/
_sharedWithUser: false,
+ _linksOnly: false,
initialize: function($el, options) {
OCA.Files.FileList.prototype.initialize.apply(this, arguments);
@@ -33,9 +34,20 @@
return;
}
+ // TODO: consolidate both options
if (options && options.sharedWithUser) {
this._sharedWithUser = true;
}
+ if (options && options.linksOnly) {
+ this._linksOnly = true;
+ }
+ },
+
+ _renderRow: function() {
+ // HACK: needed to call the overridden _renderRow
+ // this is because at the time this class is created
+ // the overriding hasn't been done yet...
+ return OCA.Files.FileList.prototype._renderRow.apply(this, arguments);
},
_createRow: function(fileData) {
@@ -46,7 +58,7 @@
$tr.find('td.filename input:checkbox').remove();
$tr.attr('data-share-id', _.pluck(fileData.shares, 'id').join(','));
if (this._sharedWithUser) {
- $tr.attr('data-share-owner', fileData.shares[0].ownerDisplayName);
+ $tr.attr('data-share-owner', fileData.shareOwner);
}
return $tr;
},
@@ -130,12 +142,20 @@
* @return array of file info maps
*/
_makeFilesFromShares: function(data) {
+ /* jshint camelcase: false */
var self = this;
+ var files = data;
+
+ if (this._linksOnly) {
+ files = _.filter(data, function(share) {
+ return share.share_type === OC.Share.SHARE_TYPE_LINK;
+ });
+ }
+
// OCS API uses non-camelcased names
- var files = _.chain(data)
+ files = _.chain(files)
// convert share data to file data
.map(function(share) {
- /* jshint camelcase: false */
var file = {
id: share.file_source,
mimetype: share.mimetype
@@ -159,7 +179,7 @@
stime: share.stime * 1000,
};
if (self._sharedWithUser) {
- file.share.ownerDisplayName = share.displayname_owner;
+ file.shareOwner = share.displayname_owner;
file.name = OC.basename(share.file_target);
file.path = OC.dirname(share.file_target);
file.permissions = share.permissions;
@@ -179,15 +199,15 @@
// inside the same file object (by file id).
.reduce(function(memo, file) {
var data = memo[file.id];
- var counterPart = file.share.ownerDisplayName || file.share.targetDisplayName;
+ var recipient = file.share.targetDisplayName;
if (!data) {
data = memo[file.id] = file;
data.shares = [file.share];
// using a hash to make them unique,
// this is only a list to be displayed
- data.counterParts = {};
+ data.recipients = {};
// counter is cheaper than calling _.keys().length
- data.counterPartsCount = 0;
+ data.recipientsCount = 0;
data.mtime = file.share.stime;
}
else {
@@ -198,12 +218,14 @@
data.shares.push(file.share);
}
- if (file.share.type === OC.Share.SHARE_TYPE_LINK) {
- data.hasLinkShare = true;
- } else if (counterPart && data.counterPartsCount < 10) {
+ if (recipient) {
// limit counterparts for output
- data.counterParts[counterPart] = true;
- data.counterPartsCount++;
+ if (data.recipientsCount < 4) {
+ // only store the first ones, they will be the only ones
+ // displayed
+ data.recipients[recipient] = true;
+ }
+ data.recipientsCount++;
}
delete file.share;
@@ -213,14 +235,14 @@
.values()
// Clean up
.each(function(data) {
- // convert the counterParts map to a flat
+ // convert the recipients map to a flat
// array of sorted names
- data.counterParts = _.chain(data.counterParts).keys().sort().value();
- if (data.hasLinkShare) {
- data.counterParts.unshift(t('files_sharing', 'link'));
- delete data.hasLinkShare;
- }
- delete data.counterPartsCount;
+ data.recipients = _.keys(data.recipients);
+ data.recipientsDisplayName = OCA.Sharing.Util.formatRecipients(
+ data.recipients,
+ data.recipientsCount
+ );
+ delete data.recipientsCount;
})
// Sort by expected sort comparator
.sortBy(this._sortComparator)
diff --git a/apps/files_sharing/l10n/ar.php b/apps/files_sharing/l10n/ar.php
index 3f8b49913f260247ddb27f9f04c960e3caab7dc8..efb51a22fc04f960966dd259d561952280fd4f29 100644
--- a/apps/files_sharing/l10n/ar.php
+++ b/apps/files_sharing/l10n/ar.php
@@ -1,9 +1,11 @@
"مشاركة من طرف {owner}",
+"Shared by" => "تم مشاركتها بواسطة",
"This share is password-protected" => "هذه المشاركة محمية بكلمة مرور",
"The password is wrong. Try again." => "كلمة المرور خاطئة. حاول مرة أخرى",
"Password" => "كلمة المرور",
+"Name" => "اسم",
"Sorry, this link doesn’t seem to work anymore." => "عذرا، يبدو أن هذا الرابط لم يعد يعمل.",
"Reasons might be:" => "الأسباب الممكنة :",
"the item was removed" => "تم حذف العنصر المطلوب",
diff --git a/apps/files_sharing/l10n/ast.php b/apps/files_sharing/l10n/ast.php
index fa3704ea6ba952ee11c55a72fd1e19f66d9237a2..112f6de9e3dce505650bc1658494d668939a5cd5 100644
--- a/apps/files_sharing/l10n/ast.php
+++ b/apps/files_sharing/l10n/ast.php
@@ -1,9 +1,15 @@
"Compartío contigo",
+"Shared with others" => "Compartío con otros",
+"No files have been shared with you yet." => "Entá nun se compartieron ficheros contigo.",
+"You haven't shared any files yet." => "Entá nun compartiesti dengún ficheru.",
"Shared by {owner}" => "Compartíu por {owner}",
+"Shared by" => "Compartíu por",
"This share is password-protected" => "Esta compartición tien contraseña protexida",
"The password is wrong. Try again." => "La contraseña ye incorreuta. Inténtalo otra vegada.",
"Password" => "Contraseña",
+"Name" => "Nome",
"Sorry, this link doesn’t seem to work anymore." => "Sentímoslo, esti enllaz paez que yá nun furrula.",
"Reasons might be:" => "Les razones pueden ser: ",
"the item was removed" => "desanicióse l'elementu",
diff --git a/apps/files_sharing/l10n/bg_BG.php b/apps/files_sharing/l10n/bg_BG.php
index 80bc1176873b34f0a66bf9684af31c6515bf04d7..0683c1929776d31465f1806da510fce70df7e098 100644
--- a/apps/files_sharing/l10n/bg_BG.php
+++ b/apps/files_sharing/l10n/bg_BG.php
@@ -1,6 +1,8 @@
"Споделено от",
"Password" => "Парола",
+"Name" => "Име",
"Download" => "Изтегляне"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/bn_BD.php b/apps/files_sharing/l10n/bn_BD.php
index 6c5809f5a0bf57cb26bfba6c3d62e96782acb149..9bfd1acba5ce8777ef76f3bac8ad59e0b6587a1a 100644
--- a/apps/files_sharing/l10n/bn_BD.php
+++ b/apps/files_sharing/l10n/bn_BD.php
@@ -1,6 +1,7 @@
"কূটশব্দ",
+"Name" => "রাম",
"Download" => "ডাউনলোড"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/bs.php b/apps/files_sharing/l10n/bs.php
new file mode 100644
index 0000000000000000000000000000000000000000..bf5b758a33d399de0c514756cc18d6c11cdfc08b
--- /dev/null
+++ b/apps/files_sharing/l10n/bs.php
@@ -0,0 +1,6 @@
+ "Dijeli",
+"Name" => "Ime"
+);
+$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/apps/files_sharing/l10n/ca.php b/apps/files_sharing/l10n/ca.php
index 8b23af69640b132227c8c82138c2495040f49a48..43b9549e40784e14d887e98bb68bda336016ae13 100644
--- a/apps/files_sharing/l10n/ca.php
+++ b/apps/files_sharing/l10n/ca.php
@@ -1,9 +1,11 @@
"Compartits per {owner}",
+"Shared by" => "Compartit per",
"This share is password-protected" => "Aquest compartit està protegit amb contrasenya",
"The password is wrong. Try again." => "la contrasenya és incorrecta. Intenteu-ho de nou.",
"Password" => "Contrasenya",
+"Name" => "Nom",
"Sorry, this link doesn’t seem to work anymore." => "Aquest enllaç sembla que no funciona.",
"Reasons might be:" => "Les raons podrien ser:",
"the item was removed" => "l'element ha estat eliminat",
diff --git a/apps/files_sharing/l10n/cs_CZ.php b/apps/files_sharing/l10n/cs_CZ.php
index d77cc7949400a10ae19cf0897f02b65e691becf0..6792acda1f120fcfa52ea72dc7f98b8cca3faee4 100644
--- a/apps/files_sharing/l10n/cs_CZ.php
+++ b/apps/files_sharing/l10n/cs_CZ.php
@@ -1,9 +1,11 @@
"Sdílí {owner}",
+"Shared by" => "Sdílí",
"This share is password-protected" => "Toto sdílení je chráněno heslem",
"The password is wrong. Try again." => "Heslo není správné. Zkuste to znovu.",
"Password" => "Heslo",
+"Name" => "Název",
"Sorry, this link doesn’t seem to work anymore." => "Je nám líto, ale tento odkaz již není funkční.",
"Reasons might be:" => "Možné důvody:",
"the item was removed" => "položka byla odebrána",
diff --git a/apps/files_sharing/l10n/cy_GB.php b/apps/files_sharing/l10n/cy_GB.php
index 0012a9fa7f1752be6af17a234c7cfb06b42cdc1a..67b8ed88fc971d710ab1e4b0cff69d5c9fb83410 100644
--- a/apps/files_sharing/l10n/cy_GB.php
+++ b/apps/files_sharing/l10n/cy_GB.php
@@ -1,6 +1,8 @@
"Rhannwyd gan",
"Password" => "Cyfrinair",
+"Name" => "Enw",
"Download" => "Llwytho i lawr"
);
$PLURAL_FORMS = "nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;";
diff --git a/apps/files_sharing/l10n/da.php b/apps/files_sharing/l10n/da.php
index 07fc5392a8b2cfccb8e374c358bce0c604b59f84..7c030bb9213fff76ac0c093bf1cb44006cfe5660 100644
--- a/apps/files_sharing/l10n/da.php
+++ b/apps/files_sharing/l10n/da.php
@@ -1,9 +1,11 @@
"Delt af {owner}",
+"Shared by" => "Delt af",
"This share is password-protected" => "Delingen er beskyttet af kodeord",
"The password is wrong. Try again." => "Kodeordet er forkert. Prøv igen.",
"Password" => "Kodeord",
+"Name" => "Navn",
"Sorry, this link doesn’t seem to work anymore." => "Desværre, dette link ser ikke ud til at fungerer længere.",
"Reasons might be:" => "Årsagen kan være:",
"the item was removed" => "Filen blev fjernet",
diff --git a/apps/files_sharing/l10n/de.php b/apps/files_sharing/l10n/de.php
index 2ca1a006a93b7ded7cfba4902d0cda2729ea07c4..dde53b44ac54308dad9ff042239aa44f2bd5fa97 100644
--- a/apps/files_sharing/l10n/de.php
+++ b/apps/files_sharing/l10n/de.php
@@ -1,9 +1,16 @@
"Mit Dir geteilt",
+"Shared with others" => "Von Dir geteilt",
+"No files have been shared with you yet." => "Es wurden bis jetzt keine Dateien mit Dir geteilt.",
+"You haven't shared any files yet." => "Du hast bis jetzt keine Dateien mit anderen geteilt.",
"Shared by {owner}" => "Geteilt von {owner}",
+"Shared by" => "Geteilt von ",
"This share is password-protected" => "Diese Freigabe ist durch ein Passwort geschützt",
"The password is wrong. Try again." => "Bitte überprüfe Dein Passwort und versuche es erneut.",
"Password" => "Passwort",
+"Name" => "Name",
+"Share time" => "Zeitpunkt der Freigabe",
"Sorry, this link doesn’t seem to work anymore." => "Entschuldigung, dieser Link scheint nicht mehr zu funktionieren.",
"Reasons might be:" => "Gründe könnten sein:",
"the item was removed" => "Das Element wurde entfernt",
diff --git a/apps/files_sharing/l10n/de_CH.php b/apps/files_sharing/l10n/de_CH.php
index 8d3c5f6ed74969d6d2fda729ae6b0c951203bee2..87ca31880d1e914d54a195f0e311d598b11312dd 100644
--- a/apps/files_sharing/l10n/de_CH.php
+++ b/apps/files_sharing/l10n/de_CH.php
@@ -1,8 +1,10 @@
"Geteilt von {owner}",
+"Shared by" => "Geteilt von",
"The password is wrong. Try again." => "Das Passwort ist falsch. Bitte versuchen Sie es erneut.",
"Password" => "Passwort",
+"Name" => "Name",
"Sorry, this link doesn’t seem to work anymore." => "Entschuldigung, dieser Link scheint nicht mehr zu funktionieren.",
"Reasons might be:" => "Gründe könnten sein:",
"the item was removed" => "Das Element wurde entfernt",
diff --git a/apps/files_sharing/l10n/de_DE.php b/apps/files_sharing/l10n/de_DE.php
index 021ec041aa056c8dbe2a2585217e6fc3dbc14003..7b86917a7a061dd1fdd8bd296e77d9dbaa1bea38 100644
--- a/apps/files_sharing/l10n/de_DE.php
+++ b/apps/files_sharing/l10n/de_DE.php
@@ -1,9 +1,16 @@
"Mit Ihnen geteilt",
+"Shared with others" => "Von Ihnen geteilt",
+"No files have been shared with you yet." => "Es wurden bis jetzt keine Dateien mit Ihnen geteilt.",
+"You haven't shared any files yet." => "Sie haben bis jetzt keine Dateien mit anderen geteilt.",
"Shared by {owner}" => "Geteilt von {owner}",
+"Shared by" => "Geteilt von",
"This share is password-protected" => "Diese Freigabe ist durch ein Passwort geschützt",
"The password is wrong. Try again." => "Das Passwort ist falsch. Bitte versuchen Sie es erneut.",
"Password" => "Passwort",
+"Name" => "Name",
+"Share time" => "Zeitpunkt der Freigabe",
"Sorry, this link doesn’t seem to work anymore." => "Entschuldigung, dieser Link scheint nicht mehr zu funktionieren.",
"Reasons might be:" => "Gründe könnten sein:",
"the item was removed" => "Das Element wurde entfernt",
diff --git a/apps/files_sharing/l10n/el.php b/apps/files_sharing/l10n/el.php
index eb559a682d96bc47f591eb6173fdb8ea79561772..ee95d3e255e06033ea419a161d2833d90c0d61b0 100644
--- a/apps/files_sharing/l10n/el.php
+++ b/apps/files_sharing/l10n/el.php
@@ -1,9 +1,16 @@
"Διαμοιρασμένο με εσάς",
+"Shared with others" => "Διαμοιρασμένο με άλλους",
+"No files have been shared with you yet." => "Κανένα αρχείο δνε έχει διαμοιραστεί ακόμα με εσάς.",
+"You haven't shared any files yet." => "Δεν έχετε διαμοιραστεί κανένα αρχείο ακόμα.",
"Shared by {owner}" => "Διαμοιράστηκε από τον {owner}",
+"Shared by" => "Διαμοιράστηκε από",
"This share is password-protected" => "Αυτός ο κοινόχρηστος φάκελος προστατεύεται με κωδικό",
"The password is wrong. Try again." => "Εσφαλμένος κωδικός πρόσβασης. Προσπαθήστε ξανά.",
"Password" => "Κωδικός πρόσβασης",
+"Name" => "Όνομα",
+"Share time" => "Χρόνος διαμοιρασμού",
"Sorry, this link doesn’t seem to work anymore." => "Συγγνώμη, αυτός ο σύνδεσμος μοιάζει να μην ισχύει πια.",
"Reasons might be:" => "Οι λόγοι μπορεί να είναι:",
"the item was removed" => "το αντικείμενο απομακρύνθηκε",
diff --git a/apps/files_sharing/l10n/en_GB.php b/apps/files_sharing/l10n/en_GB.php
index e263f3cf6df54e336b0775eacb621e03ba9eccdd..96f4e34893ba381fd8533095b5e406407580654b 100644
--- a/apps/files_sharing/l10n/en_GB.php
+++ b/apps/files_sharing/l10n/en_GB.php
@@ -1,9 +1,16 @@
"Shared with you",
+"Shared with others" => "Shared with others",
+"No files have been shared with you yet." => "No files have been shared with you yet.",
+"You haven't shared any files yet." => "You haven't shared any files yet.",
"Shared by {owner}" => "Shared by {owner}",
+"Shared by" => "Shared by",
"This share is password-protected" => "This share is password-protected",
"The password is wrong. Try again." => "The password is wrong. Try again.",
"Password" => "Password",
+"Name" => "Name",
+"Share time" => "Share time",
"Sorry, this link doesn’t seem to work anymore." => "Sorry, this link doesn’t seem to work anymore.",
"Reasons might be:" => "Reasons might be:",
"the item was removed" => "the item was removed",
diff --git a/apps/files_sharing/l10n/eo.php b/apps/files_sharing/l10n/eo.php
index 127ac02206e2dc578dbf0e197634f9818038a107..7cff8ca4a4a98cb4cbf8cf718dc749396a5fdd20 100644
--- a/apps/files_sharing/l10n/eo.php
+++ b/apps/files_sharing/l10n/eo.php
@@ -1,8 +1,10 @@
"Kunhavigita de {owner}",
+"Shared by" => "Kunhavigita de",
"This share is password-protected" => "Ĉi tiu kunhavigo estas protektata per pasvorto",
"Password" => "Pasvorto",
+"Name" => "Nomo",
"Sorry, this link doesn’t seem to work anymore." => "Pardonu, ĉi tiu ligilo ŝajne ne plu funkcias.",
"Reasons might be:" => "Kialoj povas esti:",
"the item was removed" => "la ero foriĝis",
diff --git a/apps/files_sharing/l10n/es.php b/apps/files_sharing/l10n/es.php
index 6978c7ce72c472fa0d9769a77d718f94ea648a32..dbe2a5fce8324b541e2f0c12ea95a59f8c7c7953 100644
--- a/apps/files_sharing/l10n/es.php
+++ b/apps/files_sharing/l10n/es.php
@@ -1,9 +1,15 @@
"Compartido contigo",
+"Shared with others" => "Compartido con otros",
+"No files have been shared with you yet." => "Aún no han compartido contigo ningún archivo.",
+"You haven't shared any files yet." => "Aún no has compartido ningún archivo.",
"Shared by {owner}" => "Compartido por {owner}",
+"Shared by" => "Compartido por",
"This share is password-protected" => "Este elemento compartido esta protegido por contraseña",
"The password is wrong. Try again." => "La contraseña introducida es errónea. Inténtelo de nuevo.",
"Password" => "Contraseña",
+"Name" => "Nombre",
"Sorry, this link doesn’t seem to work anymore." => "Vaya, este enlace parece que no volverá a funcionar.",
"Reasons might be:" => "Las causas podrían ser:",
"the item was removed" => "el elemento fue eliminado",
diff --git a/apps/files_sharing/l10n/es_AR.php b/apps/files_sharing/l10n/es_AR.php
index 9a9db79493864c91202239425528b336912e1b19..5fc12ca2af53a5212c17f66048cd1444ccc00a54 100644
--- a/apps/files_sharing/l10n/es_AR.php
+++ b/apps/files_sharing/l10n/es_AR.php
@@ -1,9 +1,11 @@
"Compartido por {owner}",
+"Shared by" => "Compartido por",
"This share is password-protected" => "Esto está protegido por contraseña",
"The password is wrong. Try again." => "La contraseña no es correcta. Probá de nuevo.",
"Password" => "Contraseña",
+"Name" => "Nombre",
"Sorry, this link doesn’t seem to work anymore." => "Perdón, este enlace parece no funcionar más.",
"Reasons might be:" => "Las causas podrían ser:",
"the item was removed" => "el elemento fue borrado",
diff --git a/apps/files_sharing/l10n/es_MX.php b/apps/files_sharing/l10n/es_MX.php
index 1a1ebe4b4c6df99e02b8f2f6be7199f6ebd177b4..a7a7302def3f702ba35ea0de1a2358dc975b3c4a 100644
--- a/apps/files_sharing/l10n/es_MX.php
+++ b/apps/files_sharing/l10n/es_MX.php
@@ -1,9 +1,11 @@
"Compartido por {owner}",
+"Shared by" => "Compartido por",
"This share is password-protected" => "Este elemento compartido esta protegido por contraseña",
"The password is wrong. Try again." => "La contraseña introducida es errónea. Inténtelo de nuevo.",
"Password" => "Contraseña",
+"Name" => "Nombre",
"Sorry, this link doesn’t seem to work anymore." => "Lo siento, este enlace al parecer ya no funciona.",
"Reasons might be:" => "Las causas podrían ser:",
"the item was removed" => "el elemento fue eliminado",
diff --git a/apps/files_sharing/l10n/et_EE.php b/apps/files_sharing/l10n/et_EE.php
index e95e6271957c2c7b5e721aa8d8033df5b9c80e36..9122c6e2360db240d0a01fb30160d9fad949bf27 100644
--- a/apps/files_sharing/l10n/et_EE.php
+++ b/apps/files_sharing/l10n/et_EE.php
@@ -1,9 +1,11 @@
"Jagas {owner}",
+"Shared by" => "Jagas",
"This share is password-protected" => "See jagamine on parooliga kaitstud",
"The password is wrong. Try again." => "Parool on vale. Proovi uuesti.",
"Password" => "Parool",
+"Name" => "Nimi",
"Sorry, this link doesn’t seem to work anymore." => "Vabandust, see link ei tundu enam toimivat.",
"Reasons might be:" => "Põhjused võivad olla:",
"the item was removed" => "üksus on eemaldatud",
diff --git a/apps/files_sharing/l10n/eu.php b/apps/files_sharing/l10n/eu.php
index 8be7bcb2a4bc36becae0106a03ca2331e7220508..1e18ab765930b94348ccf06f0b40c897f667f250 100644
--- a/apps/files_sharing/l10n/eu.php
+++ b/apps/files_sharing/l10n/eu.php
@@ -1,9 +1,11 @@
"{owner}-k partekatuta",
+"Shared by" => "Honek elkarbanatuta",
"This share is password-protected" => "Elkarbanatutako hau pasahitzarekin babestuta dago",
"The password is wrong. Try again." => "Pasahitza ez da egokia. Saiatu berriro.",
"Password" => "Pasahitza",
+"Name" => "Izena",
"Sorry, this link doesn’t seem to work anymore." => "Barkatu, lotura ez dirudi eskuragarria dagoenik.",
"Reasons might be:" => "Arrazoiak hurrengoak litezke:",
"the item was removed" => "fitxategia ezbatua izan da",
diff --git a/apps/files_sharing/l10n/fa.php b/apps/files_sharing/l10n/fa.php
index fb6a4bc87098af7d1306b5e36ee1cfa366dfffb2..ce036184d38ba655bfe62992eebb66e1c348152f 100644
--- a/apps/files_sharing/l10n/fa.php
+++ b/apps/files_sharing/l10n/fa.php
@@ -1,9 +1,11 @@
"اشتراک گذارنده {owner}",
+"Shared by" => "اشتراک گذاشته شده به وسیله",
"This share is password-protected" => "این اشتراک توسط رمز عبور محافظت می شود",
"The password is wrong. Try again." => "رمزعبور اشتباه می باشد. دوباره امتحان کنید.",
"Password" => "گذرواژه",
+"Name" => "نام",
"Sorry, this link doesn’t seem to work anymore." => "متاسفانه این پیوند دیگر کار نمی کند",
"Reasons might be:" => "ممکن است به این دلایل باشد:",
"the item was removed" => "این مورد حذف شده است",
diff --git a/apps/files_sharing/l10n/fi_FI.php b/apps/files_sharing/l10n/fi_FI.php
index 851463c4b83a1faa9bd107063531f4b3ddee8a23..6c9b3e61476dface5d4a21eaedb41fa4a38bb2c4 100644
--- a/apps/files_sharing/l10n/fi_FI.php
+++ b/apps/files_sharing/l10n/fi_FI.php
@@ -1,9 +1,16 @@
"Jaettu kanssasi",
+"Shared with others" => "Jaettu muiden kanssa",
+"No files have been shared with you yet." => "Kukaan ei ole jakanut tiedostoja kanssasi vielä.",
+"You haven't shared any files yet." => "Et ole jakanut yhtäkään tiedostoa vielä.",
"Shared by {owner}" => "Jakanut {owner}",
+"Shared by" => "Jakanut",
"This share is password-protected" => "Tämä jako on suojattu salasanalla",
"The password is wrong. Try again." => "Väärä salasana. Yritä uudelleen.",
"Password" => "Salasana",
+"Name" => "Nimi",
+"Share time" => "Jakamisen ajankohta",
"Sorry, this link doesn’t seem to work anymore." => "Valitettavasti linkki ei vaikuta enää toimivan.",
"Reasons might be:" => "Mahdollisia syitä:",
"the item was removed" => "kohde poistettiin",
diff --git a/apps/files_sharing/l10n/fr.php b/apps/files_sharing/l10n/fr.php
index a5b75e412f7160f0d111f8ab09e632eea0f3c3da..1a661225584b246924b280a3c55460c884757459 100644
--- a/apps/files_sharing/l10n/fr.php
+++ b/apps/files_sharing/l10n/fr.php
@@ -1,9 +1,16 @@
"Partagé avec vous",
+"Shared with others" => "Partagé avec d'autres",
+"No files have been shared with you yet." => "Aucun fichier n'est partagé avec vous pour l'instant",
+"You haven't shared any files yet." => "Vous ne partagez pas de fichier pour l'instant",
"Shared by {owner}" => "Partagé par {owner}",
+"Shared by" => "Partagé par",
"This share is password-protected" => "Ce partage est protégé par un mot de passe",
"The password is wrong. Try again." => "Le mot de passe est incorrect. Veuillez réessayer.",
"Password" => "Mot de passe",
+"Name" => "Nom",
+"Share time" => "Date de partage",
"Sorry, this link doesn’t seem to work anymore." => "Désolé, mais le lien semble ne plus fonctionner.",
"Reasons might be:" => "Les raisons peuvent être :",
"the item was removed" => "l'item a été supprimé",
diff --git a/apps/files_sharing/l10n/gl.php b/apps/files_sharing/l10n/gl.php
index f5e1c6645f6ca6ca2c63d6e2201b400e4b45feab..aaebe2c0b7e386c36eafb951403bd2b0724afe2f 100644
--- a/apps/files_sharing/l10n/gl.php
+++ b/apps/files_sharing/l10n/gl.php
@@ -1,9 +1,16 @@
"Compartido con vostede",
+"Shared with others" => "Compartido con outros",
+"No files have been shared with you yet." => "Aínda non hai ficheiros compartidos con vostede.",
+"You haven't shared any files yet." => "Aínda non compartiu ningún ficheiro.",
"Shared by {owner}" => "Compartido por {owner}",
+"Shared by" => "Compartido por",
"This share is password-protected" => "Esta compartición está protexida con contrasinal",
"The password is wrong. Try again." => "O contrasinal é incorrecto. Ténteo de novo.",
"Password" => "Contrasinal",
+"Name" => "Nome",
+"Share time" => "Compartir o tempo",
"Sorry, this link doesn’t seem to work anymore." => "Semella que esta ligazón non funciona.",
"Reasons might be:" => "As razóns poderían ser:",
"the item was removed" => "o elemento foi retirado",
diff --git a/apps/files_sharing/l10n/he.php b/apps/files_sharing/l10n/he.php
index e56fdb2c8010fb3fda74a5c842ad1a948f6c1219..923234c7cb29b980999b01076c1a928f80d784c2 100644
--- a/apps/files_sharing/l10n/he.php
+++ b/apps/files_sharing/l10n/he.php
@@ -1,7 +1,9 @@
"שותף בידי {owner}",
+"Shared by" => "שותף על־ידי",
"Password" => "סיסמא",
+"Name" => "שם",
"Download" => "הורדה"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/hi.php b/apps/files_sharing/l10n/hi.php
index 74a2c320438158d5d3dfb359556d07927acc09bc..47625e00207e73020c3d7c56c31149e7b1686246 100644
--- a/apps/files_sharing/l10n/hi.php
+++ b/apps/files_sharing/l10n/hi.php
@@ -1,5 +1,6 @@
"द्वारा साझा",
"Password" => "पासवर्ड"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/hr.php b/apps/files_sharing/l10n/hr.php
index 16776cdba2736d915e34ffb8b48d11a910e5bc52..45a29df4448db536e959fb0a6e994d4078fff168 100644
--- a/apps/files_sharing/l10n/hr.php
+++ b/apps/files_sharing/l10n/hr.php
@@ -1,6 +1,7 @@
"Lozinka",
+"Name" => "Ime",
"Download" => "Preuzimanje"
);
$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/apps/files_sharing/l10n/hu_HU.php b/apps/files_sharing/l10n/hu_HU.php
index 822101161003bc7d7f6b2d703a45b0512cec4bb6..82683852d25b624642d508799faef24ee2214128 100644
--- a/apps/files_sharing/l10n/hu_HU.php
+++ b/apps/files_sharing/l10n/hu_HU.php
@@ -1,9 +1,11 @@
"Megosztotta: {owner}",
+"Shared by" => "Megosztotta Önnel",
"This share is password-protected" => "Ez egy jelszóval védett megosztás",
"The password is wrong. Try again." => "A megadott jelszó nem megfelelő. Próbálja újra!",
"Password" => "Jelszó",
+"Name" => "Név",
"Sorry, this link doesn’t seem to work anymore." => "Sajnos úgy tűnik, ez a link már nem működik.",
"Reasons might be:" => "Ennek az oka a következő lehet:",
"the item was removed" => "az állományt időközben eltávolították",
diff --git a/apps/files_sharing/l10n/ia.php b/apps/files_sharing/l10n/ia.php
index 03e2deb431a350fb8f6332da7df37115100b73dd..a872a83797c01bf05ba6dc5b38bc67d117c4ed9a 100644
--- a/apps/files_sharing/l10n/ia.php
+++ b/apps/files_sharing/l10n/ia.php
@@ -1,6 +1,7 @@
"Contrasigno",
+"Name" => "Nomine",
"Download" => "Discargar"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/id.php b/apps/files_sharing/l10n/id.php
index 72670c23b3946f86abedb3d5d647cd978793c166..6411d18462f30d9443523479e6db26eb5f00d8fe 100644
--- a/apps/files_sharing/l10n/id.php
+++ b/apps/files_sharing/l10n/id.php
@@ -1,9 +1,11 @@
"Dibagikan oleh {owner}",
+"Shared by" => "Dibagikan oleh",
"This share is password-protected" => "Berbagi ini dilindungi sandi",
"The password is wrong. Try again." => "Sandi salah. Coba lagi",
"Password" => "Sandi",
+"Name" => "Nama",
"Sorry, this link doesn’t seem to work anymore." => "Maaf, tautan ini tampaknya tidak berfungsi lagi.",
"Reasons might be:" => "Alasan mungkin:",
"the item was removed" => "item telah dihapus",
diff --git a/apps/files_sharing/l10n/is.php b/apps/files_sharing/l10n/is.php
index 795dfeb6bfec3eb9d206fa661807b2bddc5ef6b9..c8e1e146c50ca9d1ec5c04b0dbdb9c23366d682d 100644
--- a/apps/files_sharing/l10n/is.php
+++ b/apps/files_sharing/l10n/is.php
@@ -1,6 +1,8 @@
"Deilt af",
"Password" => "Lykilorð",
+"Name" => "Nafn",
"Download" => "Niðurhal"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/it.php b/apps/files_sharing/l10n/it.php
index 94c2a66808cd91e3916752a676e4ebfa3c203812..f69b4d4468c064631f05b9e4a3d5cbb58fe84050 100644
--- a/apps/files_sharing/l10n/it.php
+++ b/apps/files_sharing/l10n/it.php
@@ -1,9 +1,16 @@
"Condiviso con te",
+"Shared with others" => "Condiviso con altri",
+"No files have been shared with you yet." => "Non è stato ancora condiviso alcun file con te.",
+"You haven't shared any files yet." => "Non hai ancora condiviso alcun file.",
"Shared by {owner}" => "Condiviso da {owner}",
+"Shared by" => "Condiviso da",
"This share is password-protected" => "Questa condivione è protetta da password",
"The password is wrong. Try again." => "La password è errata. Prova ancora.",
"Password" => "Password",
+"Name" => "Nome",
+"Share time" => "Tempo di condivisione",
"Sorry, this link doesn’t seem to work anymore." => "Spiacenti, questo collegamento sembra non essere più attivo.",
"Reasons might be:" => "I motivi potrebbero essere:",
"the item was removed" => "l'elemento è stato rimosso",
diff --git a/apps/files_sharing/l10n/ja.php b/apps/files_sharing/l10n/ja.php
index a45da97dcad4ada73de4d573cd24f94b491f4057..0478202014ee6c260689c0eac201da4d871ddd39 100644
--- a/apps/files_sharing/l10n/ja.php
+++ b/apps/files_sharing/l10n/ja.php
@@ -1,9 +1,15 @@
"あなたと共有",
+"Shared with others" => "他人と共有",
+"No files have been shared with you yet." => "まだ共有を行なっているファイルはありません。",
+"You haven't shared any files yet." => "まだ共有を行なっているファイルはありません。",
"Shared by {owner}" => "{owner} と共有中",
+"Shared by" => "共有者:",
"This share is password-protected" => "この共有はパスワードで保護されています",
"The password is wrong. Try again." => "パスワードが間違っています。再試行してください。",
"Password" => "パスワード",
+"Name" => "名前",
"Sorry, this link doesn’t seem to work anymore." => "申し訳ございません。このリンクはもう利用できません。",
"Reasons might be:" => "理由は以下の通りと考えられます:",
"the item was removed" => "アイテムが削除されました",
diff --git a/apps/files_sharing/l10n/ka_GE.php b/apps/files_sharing/l10n/ka_GE.php
index 132bcb274c82b3dd8611febad421434392c12d2b..57927466c2ced58e109fc4efec92c72adbda648f 100644
--- a/apps/files_sharing/l10n/ka_GE.php
+++ b/apps/files_sharing/l10n/ka_GE.php
@@ -1,7 +1,9 @@
"გაზიარდა {owner} –ის მიერ",
+"Shared by" => "აზიარებს",
"Password" => "პაროლი",
+"Name" => "სახელი",
"Download" => "ჩამოტვირთვა"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/km.php b/apps/files_sharing/l10n/km.php
index 75f5679d97a37016b9ecd20212a7ad05a83393e8..d609345f45425840f72d84331c01525f521b7f8a 100644
--- a/apps/files_sharing/l10n/km.php
+++ b/apps/files_sharing/l10n/km.php
@@ -1,9 +1,11 @@
"{owner} បានចែករំលែក",
+"Shared by" => "បានចែករំលែកដោយ",
"This share is password-protected" => "ការចែករំលែកនេះត្រូវបានការពារដោយពាក្យសម្ងាត់",
"The password is wrong. Try again." => "ពាក្យសម្ងាត់ខុសហើយ។ ព្យាយាមម្ដងទៀត។",
"Password" => "ពាក្យសម្ងាត់",
+"Name" => "ឈ្មោះ",
"Sorry, this link doesn’t seem to work anymore." => "សូមទោស តំណនេះហាក់ដូចជាលែងដើរហើយ។",
"Reasons might be:" => "មូលហេតុអាចជា៖",
"the item was removed" => "របស់ត្រូវបានដកចេញ",
diff --git a/apps/files_sharing/l10n/ko.php b/apps/files_sharing/l10n/ko.php
index 00818abf4a473523aa50ce010c84adc33aff9d51..22b76509a6b50c7eb9c05888e7ec76292e5be55a 100644
--- a/apps/files_sharing/l10n/ko.php
+++ b/apps/files_sharing/l10n/ko.php
@@ -1,9 +1,11 @@
"{owner} 님이 공유함",
+"Shared by" => "공유한 사용자:",
"This share is password-protected" => "이 공유는 암호로 보호되어 있습니다",
"The password is wrong. Try again." => "암호가 잘못되었습니다. 다시 입력해 주십시오.",
"Password" => "암호",
+"Name" => "이름",
"Sorry, this link doesn’t seem to work anymore." => "죄송합니다. 이 링크는 더 이상 작동하지 않습니다.",
"Reasons might be:" => "이유는 다음과 같을 수 있습니다:",
"the item was removed" => "항목이 삭제됨",
diff --git a/apps/files_sharing/l10n/ku_IQ.php b/apps/files_sharing/l10n/ku_IQ.php
index b16e87d81c399324c425b1210d70e32993f85e25..f7765a95398aaad92286a093187a0182f0c8e775 100644
--- a/apps/files_sharing/l10n/ku_IQ.php
+++ b/apps/files_sharing/l10n/ku_IQ.php
@@ -1,6 +1,7 @@
"وشەی تێپەربو",
+"Name" => "ناو",
"Download" => "داگرتن"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/lb.php b/apps/files_sharing/l10n/lb.php
index a3e98138225bc70d2e37e5064514ca602f9e91eb..f0e5b7624408c6882b2db59b6af642bba0b3b7c8 100644
--- a/apps/files_sharing/l10n/lb.php
+++ b/apps/files_sharing/l10n/lb.php
@@ -1,7 +1,9 @@
"Gedeelt vun",
"The password is wrong. Try again." => "Den Passwuert ass incorrect. Probeier ed nach eng keier.",
"Password" => "Passwuert",
+"Name" => "Numm",
"Download" => "Download"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/lt_LT.php b/apps/files_sharing/l10n/lt_LT.php
index 4c05e9217a268bb8cc47cb57c8df585766aa22b4..770a56d465bab69397bb71302eacc788dc02fdfe 100644
--- a/apps/files_sharing/l10n/lt_LT.php
+++ b/apps/files_sharing/l10n/lt_LT.php
@@ -1,9 +1,11 @@
"Bendrina {owner}",
+"Shared by" => "Dalinasi",
"This share is password-protected" => "Turinys apsaugotas slaptažodžiu",
"The password is wrong. Try again." => "Netinka slaptažodis: Bandykite dar kartą.",
"Password" => "Slaptažodis",
+"Name" => "Pavadinimas",
"Sorry, this link doesn’t seem to work anymore." => "Atleiskite, panašu, kad nuoroda yra neveiksni.",
"Reasons might be:" => "Galimos priežastys:",
"the item was removed" => "elementas buvo pašalintas",
diff --git a/apps/files_sharing/l10n/lv.php b/apps/files_sharing/l10n/lv.php
index 693f91d3b5c92e50ab117722f7ece033f41ddeef..286dd431baefe910b409de79e1b963b206e90d14 100644
--- a/apps/files_sharing/l10n/lv.php
+++ b/apps/files_sharing/l10n/lv.php
@@ -1,7 +1,9 @@
"Dalījās {owner}",
+"Shared by" => "Dalījās",
"Password" => "Parole",
+"Name" => "Nosaukums",
"Download" => "Lejupielādēt"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);";
diff --git a/apps/files_sharing/l10n/mk.php b/apps/files_sharing/l10n/mk.php
index b7281825a83bcb80209e2cfc7d7e8af97ffc9686..aaeca27feabaa4a2121a2e53f4bf89e200a7558b 100644
--- a/apps/files_sharing/l10n/mk.php
+++ b/apps/files_sharing/l10n/mk.php
@@ -1,7 +1,9 @@
"Споделени од {owner}",
+"Shared by" => "Споделено од",
"Password" => "Лозинка",
+"Name" => "Име",
"Download" => "Преземи"
);
$PLURAL_FORMS = "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;";
diff --git a/apps/files_sharing/l10n/ms_MY.php b/apps/files_sharing/l10n/ms_MY.php
index 43ea0b2d8805ea8c0d19f2a426edbafd24630251..63e48b3872966ea4e18c62863581cd4bd8c3dc07 100644
--- a/apps/files_sharing/l10n/ms_MY.php
+++ b/apps/files_sharing/l10n/ms_MY.php
@@ -1,6 +1,8 @@
"Dikongsi dengan",
"Password" => "Kata laluan",
+"Name" => "Nama",
"Download" => "Muat turun"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/nb_NO.php b/apps/files_sharing/l10n/nb_NO.php
index 3595a49cbf730c0e7902fe7103ea856ddeca94cd..3a30d8166b44c3e89516b3e5a5b580781b6c4dfc 100644
--- a/apps/files_sharing/l10n/nb_NO.php
+++ b/apps/files_sharing/l10n/nb_NO.php
@@ -1,9 +1,16 @@
"Delt med deg",
+"Shared with others" => "Delt med andre",
+"No files have been shared with you yet." => "Ingen filer er delt med deg ennå.",
+"You haven't shared any files yet." => "Du har ikke delt noen filer ennå.",
"Shared by {owner}" => "Delt av {owner}",
+"Shared by" => "Delt av",
"This share is password-protected" => "Denne delingen er passordbeskyttet",
"The password is wrong. Try again." => "Passordet er feil. Prøv på nytt.",
"Password" => "Passord",
+"Name" => "Navn",
+"Share time" => "Delingstidspunkt",
"Sorry, this link doesn’t seem to work anymore." => "Beklager, denne lenken ser ikke ut til å virke lenger.",
"Reasons might be:" => "Mulige årsaker:",
"the item was removed" => "elementet er fjernet",
diff --git a/apps/files_sharing/l10n/nl.php b/apps/files_sharing/l10n/nl.php
index e35898862cf71f5e011bf83438b4b4a8d7574b58..f5f4e22602ee71c65777187206df4047ec19b828 100644
--- a/apps/files_sharing/l10n/nl.php
+++ b/apps/files_sharing/l10n/nl.php
@@ -1,9 +1,11 @@
"Gedeeld door {owner}",
+"Shared by" => "Gedeeld door",
"This share is password-protected" => "Deze share is met een wachtwoord beveiligd",
"The password is wrong. Try again." => "Wachtwoord ongeldig. Probeer het nogmaals.",
"Password" => "Wachtwoord",
+"Name" => "Naam",
"Sorry, this link doesn’t seem to work anymore." => "Sorry, deze link lijkt niet meer in gebruik te zijn.",
"Reasons might be:" => "Redenen kunnen zijn:",
"the item was removed" => "bestand was verwijderd",
diff --git a/apps/files_sharing/l10n/nn_NO.php b/apps/files_sharing/l10n/nn_NO.php
index e85c019d5c72a2028c95e57a51040fd9c752899d..34c70a554d3b89480b264555d8a674cca950f33e 100644
--- a/apps/files_sharing/l10n/nn_NO.php
+++ b/apps/files_sharing/l10n/nn_NO.php
@@ -1,8 +1,10 @@
"Delt av {owner}",
+"Shared by" => "Delt av",
"The password is wrong. Try again." => "Passordet er gale. Prøv igjen.",
"Password" => "Passord",
+"Name" => "Namn",
"Sorry, this link doesn’t seem to work anymore." => "Orsak, denne lenkja fungerer visst ikkje lenger.",
"Reasons might be:" => "Moglege grunnar:",
"the item was removed" => "fila/mappa er fjerna",
diff --git a/apps/files_sharing/l10n/oc.php b/apps/files_sharing/l10n/oc.php
index 15ef1720ad2a8e594ba25a70aa3baf39dfaf93e7..2127e9dcfacdcc2c6f7550ab3f2a13bb029690b5 100644
--- a/apps/files_sharing/l10n/oc.php
+++ b/apps/files_sharing/l10n/oc.php
@@ -1,6 +1,7 @@
"Senhal",
+"Name" => "Nom",
"Download" => "Avalcarga"
);
$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/files_sharing/l10n/pl.php b/apps/files_sharing/l10n/pl.php
index bf62ead10766af368cbe6b3625bdbc479f132e72..e319170fa9f573df1a8d6ae451e9d9c7c117e326 100644
--- a/apps/files_sharing/l10n/pl.php
+++ b/apps/files_sharing/l10n/pl.php
@@ -1,9 +1,16 @@
"Współdzielony z Tobą",
+"Shared with others" => "Współdzielony z innymi",
+"No files have been shared with you yet." => "Nie ma jeszcze żadnych plików współdzielonych z Tobą",
+"You haven't shared any files yet." => "Nie współdzielisz jeszcze żadnych plików.",
"Shared by {owner}" => "Udostępnione przez {owner}",
+"Shared by" => "Udostępniane przez",
"This share is password-protected" => "Udział ten jest chroniony hasłem",
"The password is wrong. Try again." => "To hasło jest niewłaściwe. Spróbuj ponownie.",
"Password" => "Hasło",
+"Name" => "Nazwa",
+"Share time" => "Czas współdzielenia",
"Sorry, this link doesn’t seem to work anymore." => "Przepraszamy ale wygląda na to, że ten link już nie działa.",
"Reasons might be:" => "Możliwe powody:",
"the item was removed" => "element został usunięty",
diff --git a/apps/files_sharing/l10n/pt_BR.php b/apps/files_sharing/l10n/pt_BR.php
index 7167f99c2d24a914623ed3ed7bccb9cc298c650e..7dd503a5b9d5813e64b35b5c1d2831dd8d747378 100644
--- a/apps/files_sharing/l10n/pt_BR.php
+++ b/apps/files_sharing/l10n/pt_BR.php
@@ -1,9 +1,16 @@
"Compartilhado com você",
+"Shared with others" => "Compartilhados com outros",
+"No files have been shared with you yet." => "Nenhum arquivo ainda foi compartilhado com você.",
+"You haven't shared any files yet." => "Você ainda não compartilhou nenhum arquivo.",
"Shared by {owner}" => "Compartilhado por {owner}",
+"Shared by" => "Compartilhada por",
"This share is password-protected" => "Este compartilhamento esta protegido por senha",
"The password is wrong. Try again." => "Senha incorreta. Tente novamente.",
"Password" => "Senha",
+"Name" => "Nome",
+"Share time" => "Tempo de compartilhamento",
"Sorry, this link doesn’t seem to work anymore." => "Desculpe, este link parece não mais funcionar.",
"Reasons might be:" => "As razões podem ser:",
"the item was removed" => "o item foi removido",
diff --git a/apps/files_sharing/l10n/pt_PT.php b/apps/files_sharing/l10n/pt_PT.php
index b28e2b188dc3bedaed14fcd4fa341102c457732e..03c57847d854757ba93f20699e72f56d1a93be3b 100644
--- a/apps/files_sharing/l10n/pt_PT.php
+++ b/apps/files_sharing/l10n/pt_PT.php
@@ -1,9 +1,14 @@
"Partilhado consigo ",
+"Shared with others" => "Partilhado com outros",
"Shared by {owner}" => "Partilhado por {owner}",
+"Shared by" => "Partilhado por",
"This share is password-protected" => "Esta partilha está protegida por palavra-chave",
"The password is wrong. Try again." => "Password errada, por favor tente de novo",
"Password" => "Palavra-passe",
+"Name" => "Nome",
+"Share time" => "Partilhar hora",
"Sorry, this link doesn’t seem to work anymore." => "Desculpe, mas este link parece não estar a funcionar.",
"Reasons might be:" => "As razões poderão ser:",
"the item was removed" => "O item foi removido",
diff --git a/apps/files_sharing/l10n/ro.php b/apps/files_sharing/l10n/ro.php
index 024011bf29c40a7082eceade7c88f776015ffc5c..49ef06b5fd7e530fb6b44c3912939a656e7a2641 100644
--- a/apps/files_sharing/l10n/ro.php
+++ b/apps/files_sharing/l10n/ro.php
@@ -1,7 +1,9 @@
"impartite in ",
"The password is wrong. Try again." => "Parola este incorectă. Încercaţi din nou.",
"Password" => "Parolă",
+"Name" => "Nume",
"Download" => "Descarcă"
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));";
diff --git a/apps/files_sharing/l10n/ru.php b/apps/files_sharing/l10n/ru.php
index 468bcdd85e6ecd0e6c0b5f2b2fac6e505ca53e5d..635508ac75ec96bccfb0f07cd23423623fbdef5a 100644
--- a/apps/files_sharing/l10n/ru.php
+++ b/apps/files_sharing/l10n/ru.php
@@ -1,9 +1,11 @@
"Доступ открыл {owner}",
+"Shared by" => "Опубликовано",
"This share is password-protected" => "Для доступа к информации необходимо ввести пароль",
"The password is wrong. Try again." => "Неверный пароль. Попробуйте еще раз.",
"Password" => "Пароль",
+"Name" => "Имя",
"Sorry, this link doesn’t seem to work anymore." => "Эта ссылка устарела и более не действительна.",
"Reasons might be:" => "Причиной может быть:",
"the item was removed" => "объект был удалён",
diff --git a/apps/files_sharing/l10n/si_LK.php b/apps/files_sharing/l10n/si_LK.php
index da0390033af1911438bcbb72f23226b1d3c2bab0..bd71de99b34abbfd898e7240a71b439b2470e215 100644
--- a/apps/files_sharing/l10n/si_LK.php
+++ b/apps/files_sharing/l10n/si_LK.php
@@ -1,6 +1,7 @@
"මුර පදය",
+"Name" => "නම",
"Download" => "බාන්න"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/sk_SK.php b/apps/files_sharing/l10n/sk_SK.php
index 48054b6c7aff6eaca15885db2e3b345039a7a8db..44754d4e16afb8bde891078a927373154c8a52d3 100644
--- a/apps/files_sharing/l10n/sk_SK.php
+++ b/apps/files_sharing/l10n/sk_SK.php
@@ -1,9 +1,11 @@
"Zdieľa {owner}",
+"Shared by" => "Zdieľa",
"This share is password-protected" => "Toto zdieľanie je chránené heslom",
"The password is wrong. Try again." => "Heslo je chybné. Skúste to znova.",
"Password" => "Heslo",
+"Name" => "Názov",
"Sorry, this link doesn’t seem to work anymore." => "To je nepríjemné, ale tento odkaz už nie je funkčný.",
"Reasons might be:" => "Možné dôvody:",
"the item was removed" => "položka bola presunutá",
diff --git a/apps/files_sharing/l10n/sl.php b/apps/files_sharing/l10n/sl.php
index 361f2f1b04fadadce8411e92376925259752711f..4c6fdbfd3a4ee1c64a9a66d203a6812d163d3321 100644
--- a/apps/files_sharing/l10n/sl.php
+++ b/apps/files_sharing/l10n/sl.php
@@ -1,9 +1,11 @@
"Souporabo omogoča {owner}",
+"Shared by" => "V souporabi z",
"This share is password-protected" => "To mesto je zaščiteno z geslom.",
"The password is wrong. Try again." => "Geslo je napačno. Poskusite znova.",
"Password" => "Geslo",
+"Name" => "Ime",
"Sorry, this link doesn’t seem to work anymore." => "Povezava očitno ni več v uporabi.",
"Reasons might be:" => "Vzrok je lahko:",
"the item was removed" => "predmet je odstranjen,",
diff --git a/apps/files_sharing/l10n/sq.php b/apps/files_sharing/l10n/sq.php
index f6729dafc3ee1da9d4fc1e998c6af350f498ce36..ee8207e6d91176b2f6bf13181adc64a65e358ac8 100644
--- a/apps/files_sharing/l10n/sq.php
+++ b/apps/files_sharing/l10n/sq.php
@@ -1,8 +1,10 @@
"Ndarë nga",
"This share is password-protected" => "Kjo pjesë është e mbrojtur me fjalëkalim",
"The password is wrong. Try again." => "Kodi është i gabuar. Provojeni përsëri.",
"Password" => "Kodi",
+"Name" => "Emri",
"Sorry, this link doesn’t seem to work anymore." => "Ju kërkojmë ndjesë, kjo lidhje duket sikur nuk punon më.",
"Reasons might be:" => "Arsyet mund të jenë:",
"the item was removed" => "elementi është eliminuar",
diff --git a/apps/files_sharing/l10n/sr.php b/apps/files_sharing/l10n/sr.php
index 947e57551ac760e59e74e985c5833ce733a854b7..e5b72d3a5017df71060a58bb48ec5de03aeb61a4 100644
--- a/apps/files_sharing/l10n/sr.php
+++ b/apps/files_sharing/l10n/sr.php
@@ -1,6 +1,8 @@
"Делио",
"Password" => "Лозинка",
+"Name" => "Име",
"Download" => "Преузми"
);
$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/apps/files_sharing/l10n/sr@latin.php b/apps/files_sharing/l10n/sr@latin.php
index f44821fc0d8b954f5854c9d266b12b70ef999b8e..a0cf64c0f1dcd0f08567b6493b46f61114963c62 100644
--- a/apps/files_sharing/l10n/sr@latin.php
+++ b/apps/files_sharing/l10n/sr@latin.php
@@ -1,6 +1,7 @@
"Lozinka",
+"Name" => "Ime",
"Download" => "Preuzmi"
);
$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/apps/files_sharing/l10n/sv.php b/apps/files_sharing/l10n/sv.php
index a1951401d75158529cda41311ec7af889abdd535..e5fbd7a90af9d0ab25c361b4a2df2dfd7fa25400 100644
--- a/apps/files_sharing/l10n/sv.php
+++ b/apps/files_sharing/l10n/sv.php
@@ -1,9 +1,16 @@
"Delat med dig",
+"Shared with others" => "Delat med andra",
+"No files have been shared with you yet." => "Inga filer har ännu delats med dig.",
+"You haven't shared any files yet." => "Du har inte delat några filer ännu.",
"Shared by {owner}" => "Delad av {owner}",
+"Shared by" => "Delad av",
"This share is password-protected" => "Den här delningen är lösenordsskyddad",
"The password is wrong. Try again." => "Lösenordet är fel. Försök igen.",
"Password" => "Lösenord",
+"Name" => "Namn",
+"Share time" => "Delningstid",
"Sorry, this link doesn’t seem to work anymore." => "Tyvärr, denna länk verkar inte fungera längre.",
"Reasons might be:" => "Orsaker kan vara:",
"the item was removed" => "objektet togs bort",
diff --git a/apps/files_sharing/l10n/ta_LK.php b/apps/files_sharing/l10n/ta_LK.php
index 05443e0522c2ca0d7897265a74cf81248512072a..c1b451ae7f8629699acb8e2722e5cf47e705af52 100644
--- a/apps/files_sharing/l10n/ta_LK.php
+++ b/apps/files_sharing/l10n/ta_LK.php
@@ -2,6 +2,7 @@
$TRANSLATIONS = array(
"Shared by {owner}" => "பகிரப்பட்டது {சொந்தகாரர்}",
"Password" => "கடவுச்சொல்",
+"Name" => "பெயர்",
"Download" => "பதிவிறக்குக"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/te.php b/apps/files_sharing/l10n/te.php
index 94ca7650e5ffe4b950b95c02dc4d23dfbbdf49ee..e9da4e6963d207c534938ff9aacbd3e248403d9c 100644
--- a/apps/files_sharing/l10n/te.php
+++ b/apps/files_sharing/l10n/te.php
@@ -1,5 +1,6 @@
"సంకేతపదం"
+"Password" => "సంకేతపదం",
+"Name" => "పేరు"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/th_TH.php b/apps/files_sharing/l10n/th_TH.php
index f2f90088da76e3390dfacbfeeaaea73f09a9aacd..fdb9555babeee8ab9f61809a9dcdcb32f1572156 100644
--- a/apps/files_sharing/l10n/th_TH.php
+++ b/apps/files_sharing/l10n/th_TH.php
@@ -1,7 +1,9 @@
"ถูกแชร์โดย {owner}",
+"Shared by" => "ถูกแชร์โดย",
"Password" => "รหัสผ่าน",
+"Name" => "ชื่อ",
"Download" => "ดาวน์โหลด"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/tr.php b/apps/files_sharing/l10n/tr.php
index ac3cb526562dcb1ed13da6a52824d5ca256ebd9d..061d2bb7b2e4ddc928fde5aa07b72f03e56713f1 100644
--- a/apps/files_sharing/l10n/tr.php
+++ b/apps/files_sharing/l10n/tr.php
@@ -1,9 +1,16 @@
"Sizinle paylaşılmış",
+"Shared with others" => "Diğerleri ile paylaşılmış",
+"No files have been shared with you yet." => "Henüz sizinle paylaşılan bir dosya yok.",
+"You haven't shared any files yet." => "Henüz hiçbir dosya paylaşmadınız.",
"Shared by {owner}" => "{owner} tarafından paylaşılmış",
+"Shared by" => "Paylaşan",
"This share is password-protected" => "Bu paylaşım parola korumalı",
"The password is wrong. Try again." => "Parola hatalı. Yeniden deneyin.",
"Password" => "Parola",
+"Name" => "Ad",
+"Share time" => "Paylaşma zamanı",
"Sorry, this link doesn’t seem to work anymore." => "Üzgünüz, bu bağlantı artık çalışıyor gibi görünmüyor.",
"Reasons might be:" => "Sebepleri şunlar olabilir:",
"the item was removed" => "öge kaldırılmış",
diff --git a/apps/files_sharing/l10n/ug.php b/apps/files_sharing/l10n/ug.php
index fd6a1c71c9b85f020d93f24713b692cf6a37cc88..544f2f3f76cdca5e56e7d625cab85b0baf36cb65 100644
--- a/apps/files_sharing/l10n/ug.php
+++ b/apps/files_sharing/l10n/ug.php
@@ -1,6 +1,8 @@
"ھەمبەھىرلىگۈچى",
"Password" => "ئىم",
+"Name" => "ئاتى",
"Download" => "چۈشۈر"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/uk.php b/apps/files_sharing/l10n/uk.php
index 7b0acb661b63bd7db5e6747eec91d0b9c2638f1c..0033c5036e36267fd1ccb51bd55ed5ac7abff9a2 100644
--- a/apps/files_sharing/l10n/uk.php
+++ b/apps/files_sharing/l10n/uk.php
@@ -1,9 +1,11 @@
"Опублікував {owner}",
+"Shared by" => "Опубліковано",
"This share is password-protected" => "Цей ресурс обміну захищений паролем",
"The password is wrong. Try again." => "Невірний пароль. Спробуйте ще раз.",
"Password" => "Пароль",
+"Name" => "Ім'я",
"Sorry, this link doesn’t seem to work anymore." => "На жаль, посилання більше не працює.",
"Reasons might be:" => "Можливі причини:",
"the item was removed" => "цей пункт був вилучений",
diff --git a/apps/files_sharing/l10n/ur_PK.php b/apps/files_sharing/l10n/ur_PK.php
index b0b90367771436d87d505ebb24b9b4248b8a9c62..f96b0c0cba00d7f9147cad0b059a62beefa3a628 100644
--- a/apps/files_sharing/l10n/ur_PK.php
+++ b/apps/files_sharing/l10n/ur_PK.php
@@ -1,6 +1,8 @@
"سے اشتراک شدہ",
"Password" => "پاسورڈ",
+"Name" => "اسم",
"Download" => "ڈاؤن لوڈ،"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_sharing/l10n/vi.php b/apps/files_sharing/l10n/vi.php
index 1db740c0234147a45cdfeb43a570e7efffc4af64..33c0d2188d835d8d1c0f8a895f6c2a35722e2b37 100644
--- a/apps/files_sharing/l10n/vi.php
+++ b/apps/files_sharing/l10n/vi.php
@@ -1,7 +1,9 @@
"Được chia sẽ bởi {owner}",
+"Shared by" => "Chia sẻ bởi",
"Password" => "Mật khẩu",
+"Name" => "Tên",
"Download" => "Tải về"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/zh_CN.php b/apps/files_sharing/l10n/zh_CN.php
index 5cc95b71af70204b59858c9a2e39cce8c74a27f4..0a8c0950497e6000be8ece4128c304cf11e6e898 100644
--- a/apps/files_sharing/l10n/zh_CN.php
+++ b/apps/files_sharing/l10n/zh_CN.php
@@ -1,9 +1,11 @@
"由{owner}共享",
+"Shared by" => "共享人",
"This share is password-protected" => "这是一个密码保护的共享",
"The password is wrong. Try again." => "用户名或密码错误!请重试",
"Password" => "密码",
+"Name" => "名称",
"Sorry, this link doesn’t seem to work anymore." => "抱歉,此链接已失效",
"Reasons might be:" => "可能原因是:",
"the item was removed" => "此项已移除",
diff --git a/apps/files_sharing/l10n/zh_HK.php b/apps/files_sharing/l10n/zh_HK.php
index 3c561acce43c829ec13abc59fa7cafc18fab805c..9856b504cfa44a37afb3296264be4db22e97f64b 100644
--- a/apps/files_sharing/l10n/zh_HK.php
+++ b/apps/files_sharing/l10n/zh_HK.php
@@ -1,6 +1,7 @@
"密碼",
+"Name" => "名稱",
"Download" => "下載"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_sharing/l10n/zh_TW.php b/apps/files_sharing/l10n/zh_TW.php
index 07abcb6999d301e4d3bf9bc854cba823b027d099..d603059ec9e22aa243255b95605f0d85b519a6fb 100644
--- a/apps/files_sharing/l10n/zh_TW.php
+++ b/apps/files_sharing/l10n/zh_TW.php
@@ -1,9 +1,11 @@
"由 {owner} 分享",
+"Shared by" => "由...分享",
"This share is password-protected" => "這個分享有密碼保護",
"The password is wrong. Try again." => "請檢查您的密碼並再試一次",
"Password" => "密碼",
+"Name" => "名稱",
"Sorry, this link doesn’t seem to work anymore." => "抱歉,此連結已經失效",
"Reasons might be:" => "可能的原因:",
"the item was removed" => "項目已經移除",
diff --git a/apps/files_sharing/lib/api.php b/apps/files_sharing/lib/api.php
index dc4e5cf6c49f03ad1b69782f49fcd92cf4c5ddf0..2e824a4a9dfa151a3b3e483f62a8ad90c240e1ac 100644
--- a/apps/files_sharing/lib/api.php
+++ b/apps/files_sharing/lib/api.php
@@ -58,10 +58,8 @@ class Api {
return new \OC_OCS_Result(null, 404, 'could not get shares');
} else {
foreach ($shares as &$share) {
- // file_target might not be set if the target user hasn't mounted
- // the filesystem yet
- if ($share['item_type'] === 'file' && isset($share['file_target'])) {
- $share['mimetype'] = \OC_Helper::getFileNameMimeType($share['file_target']);
+ if ($share['item_type'] === 'file' && isset($share['path'])) {
+ $share['mimetype'] = \OC_Helper::getFileNameMimeType($share['path']);
}
$newShares[] = $share;
}
@@ -156,7 +154,7 @@ class Api {
return $shares;
}
- $select = '`*PREFIX*share`.`id`, `item_type`, `*PREFIX*share`.`parent`, `share_type`, `share_with`, `file_source`, `path` , `permissions`, `stime`, `expiration`, `token`, `storage`, `mail_send`, `mail_send`';
+ $select = '`*PREFIX*share`.`id`, `item_type`, `*PREFIX*share`.`parent`, `share_type`, `share_with`, `file_source`, `path` , `*PREFIX*share`.`permissions`, `stime`, `expiration`, `token`, `storage`, `mail_send`, `mail_send`';
$getReshares = \OC_DB::prepare('SELECT ' . $select . ' FROM `*PREFIX*share` INNER JOIN `*PREFIX*filecache` ON `file_source` = `*PREFIX*filecache`.`fileid` WHERE `*PREFIX*share`.`file_source` = ? AND `*PREFIX*share`.`item_type` IN (\'file\', \'folder\') AND `uid_owner` != ?');
$reshares = $getReshares->execute(array($itemSource, \OCP\User::getUser()))->fetchAll();
@@ -337,6 +335,7 @@ class Api {
return self::updatePublicUpload($share, $params);
}
} catch (\Exception $e) {
+
return new \OC_OCS_Result(null, 400, $e->getMessage());
}
diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php
index 9d83ed13b87a2be161611303e97a1a918d68ac4d..f6c42e930d15acba11397d06870e0d9518c5151e 100644
--- a/apps/files_sharing/lib/cache.php
+++ b/apps/files_sharing/lib/cache.php
@@ -105,7 +105,7 @@ class Shared_Cache extends Cache {
}
$query = \OC_DB::prepare(
'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`,'
- . ' `size`, `mtime`, `encrypted`, `unencrypted_size`, `storage_mtime`, `etag`'
+ . ' `size`, `mtime`, `encrypted`, `unencrypted_size`, `storage_mtime`, `etag`, `permissions`'
. ' FROM `*PREFIX*filecache` WHERE `fileid` = ?');
$result = $query->execute(array($sourceId));
$data = $result->fetchRow();
@@ -124,6 +124,7 @@ class Shared_Cache extends Cache {
} else {
$data['size'] = (int)$data['size'];
}
+ $data['permissions'] = (int)$data['permissions'];
if (!is_int($file) || $file === 0) {
$data['path'] = '';
$data['name'] = basename($this->storage->getMountPoint());
diff --git a/apps/files_sharing/lib/connector/publicauth.php b/apps/files_sharing/lib/connector/publicauth.php
index 0831129ce79a2b85a8e009f6671d313c86d6611e..ec7b68ba69ce2eddebbd6c5afcad0b30cf388540 100644
--- a/apps/files_sharing/lib/connector/publicauth.php
+++ b/apps/files_sharing/lib/connector/publicauth.php
@@ -9,7 +9,7 @@
namespace OCA\Files_Sharing\Connector;
-class PublicAuth extends \Sabre_DAV_Auth_Backend_AbstractBasic {
+class PublicAuth extends \Sabre\DAV\Auth\Backend\AbstractBasic {
/**
* @var \OCP\IConfig
diff --git a/apps/files_sharing/lib/mailtemplate.php b/apps/files_sharing/lib/mailtemplate.php
new file mode 100644
index 0000000000000000000000000000000000000000..ca1b0234ccff9d04b3f94d26f7ec1541b3c2ebaf
--- /dev/null
+++ b/apps/files_sharing/lib/mailtemplate.php
@@ -0,0 +1,126 @@
+theme = $theme;
+ $this->path = $path;
+
+ //determine valid theme names
+ $this->editableThemes = self::getEditableThemes();
+ //for now hard code the valid mail template paths
+ $this->editableTemplates = self::getEditableTemplates();
+ }
+
+ /**
+ *
+ * @return \OCA\Files_Sharing\Http\MailTemplateResponse
+ */
+ public function getResponse() {
+ if($this->isEditable()) {
+ list($app, $filename) = explode('/templates/', $this->path, 2);
+ $name = substr($filename, 0, -4);
+ list($path, $template) = $this->findTemplate($this->theme, $app, $name, '');
+ return new MailTemplateResponse($template);
+ }
+ throw new SecurityException('Template not editable.', 403);
+ }
+
+ public function renderContent() {
+ if($this->isEditable()) {
+ list($app, $filename) = explode('/templates/', $this->path, 2);
+ $name = substr($filename, 0, -4);
+ list($path, $template) = $this->findTemplate($this->theme, $app, $name, '');
+ \OC_Response::sendFile($template);
+ } else {
+ throw new SecurityException('Template not editable.', 403);
+ }
+ }
+
+ public function isEditable() {
+ if ($this->editableThemes[$this->theme]
+ && $this->editableTemplates[$this->path]
+ ) {
+ return true;
+ }
+ return false;
+ }
+
+ public function setContent($data) {
+ if($this->isEditable()) {
+ //save default templates in default folder to overwrite core template
+ $absolutePath = \OC::$SERVERROOT.'/themes/'.$this->theme.'/'.$this->path;
+ $parent = dirname($absolutePath);
+ if ( ! is_dir($parent) ) {
+ if ( ! mkdir(dirname($absolutePath), 0777, true) ){
+ throw new \Exception('Could not create directory.', 500);
+ }
+ }
+ if ( $this->theme !== 'default' && is_file($absolutePath) ) {
+ if ( ! copy($absolutePath, $absolutePath.'.bak') ){
+ throw new \Exception('Could not overwrite template.', 500);
+ }
+ }
+ //overwrite theme templates? versioning?
+ return file_put_contents($absolutePath, $data);
+ }
+ throw new SecurityException('Template not editable.', 403);
+ }
+
+ public function reset(){
+ if($this->isEditable()) {
+ $absolutePath = \OC::$SERVERROOT.'/themes/'.$this->theme.'/'.$this->path;
+ if ($this->theme === 'default') {
+ //templates can simply be deleted in the themes folder
+ if (unlink($absolutePath)) {
+ return true;
+ }
+ } else {
+ //if a bak file exists overwrite the template with it
+ if (is_file($absolutePath.'.bak')) {
+ if (rename($absolutePath.'.bak', $absolutePath)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ throw new NotPermittedException('Template not editable.', 403);
+ }
+
+ public static function getEditableThemes() {
+ $themes = array(
+ 'default' => true
+ );
+ if ($handle = opendir(\OC::$SERVERROOT.'/themes')) {
+ while (false !== ($entry = readdir($handle))) {
+ if ($entry != '.' && $entry != '..' && $entry != 'default') {
+ if (is_dir(\OC::$SERVERROOT.'/themes/'.$entry)) {
+ $themes[$entry] = true;
+ }
+ }
+ }
+ closedir($handle);
+ }
+ return $themes;
+ }
+
+ public static function getEditableTemplates() {
+ return array(
+ 'core/templates/mail.php' => true,
+ 'core/templates/altmail.php' => true,
+ 'core/lostpassword/templates/email.php' => true,
+ );
+ }
+}
diff --git a/apps/files_sharing/lib/permissions.php b/apps/files_sharing/lib/permissions.php
deleted file mode 100644
index f32ebabe40d4763821d0824be65b11d0cd045b99..0000000000000000000000000000000000000000
--- a/apps/files_sharing/lib/permissions.php
+++ /dev/null
@@ -1,132 +0,0 @@
-.
-*/
-namespace OC\Files\Cache;
-
-class Shared_Permissions extends Permissions {
-
- /**
- * get the permissions for a single file
- *
- * @param int $fileId
- * @param string $user
- * @return int (-1 if file no permissions set)
- */
- public function get($fileId, $user) {
-
- if ($fileId == -1) {
- // if we ask for the mount point return -1 so that we can get the correct
- // permissions by the path, with the root fileId we have no idea which share is meant
- return -1;
- }
- $source = \OCP\Share::getItemSharedWithBySource('file', $fileId, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE,
- null, true);
-
- $permission = -1;
-
- if ($source) {
- $permission = $this->updatePermissions($source['permissions']);
- }
-
- return $permission;
- }
-
- /**
- * @param integer $fileId
- * @param string $user
- */
- private function getFile($fileId, $user) {
- if ($fileId == -1) {
- return \OCP\PERMISSION_READ;
- }
- $source = \OCP\Share::getItemSharedWithBySource('file', $fileId, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE,
- null, false);
- if ($source) {
- return $this->updatePermissions($source['permissions']);
- } else {
- return -1;
- }
- }
-
- /**
- * set the permissions of a file
- *
- * @param int $fileId
- * @param string $user
- * @param int $permissions
- */
- public function set($fileId, $user, $permissions) {
- // Not a valid action for Shared Permissions
- }
-
- /**
- * get the permissions of multiply files
- *
- * @param int[] $fileIds
- * @param string $user
- * @return int[]
- */
- public function getMultiple($fileIds, $user) {
- if (count($fileIds) === 0) {
- return array();
- }
- foreach ($fileIds as $fileId) {
- $filePermissions[$fileId] = self::get($fileId, $user);
- }
- return $filePermissions;
- }
-
- /**
- * get the permissions for all files in a folder
- *
- * @param int $parentId
- * @param string $user
- * @return int[]
- */
- public function getDirectoryPermissions($parentId, $user) {
- // Root of the Shared folder
- if ($parentId === -1) {
- return \OCP\Share::getItemsSharedWith('file', \OC_Share_Backend_File::FORMAT_PERMISSIONS);
- }
- $permissions = $this->getFile($parentId, $user);
- $query = \OC_DB::prepare('SELECT `fileid` FROM `*PREFIX*filecache` WHERE `parent` = ?');
- $result = $query->execute(array($parentId));
- $filePermissions = array();
- while ($row = $result->fetchRow()) {
- $filePermissions[$row['fileid']] = $this->updatePermissions($permissions);
- }
- return $filePermissions;
- }
-
- /**
- * remove the permissions for a file
- *
- * @param int $fileId
- * @param string $user
- */
- public function remove($fileId, $user = null) {
- // Not a valid action for Shared Permissions
- }
-
- public function removeMultiple($fileIds, $user) {
- // Not a valid action for Shared Permissions
- }
-
-}
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index a7dd2b3afa1df6c78a03c484b0d9130a7d0db60c..f93982ee8577e8e8a9ca2d166ddd5cbba47c94bb 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -102,7 +102,7 @@ class Shared extends \OC\Files\Storage\Common {
* @param string $target Shared target file path
* @return int CRUDS permissions granted
*/
- public function getPermissions($target) {
+ public function getPermissions($target = '') {
$permissions = $this->share['permissions'];
// part file are always have delete permissions
if (pathinfo($target, PATHINFO_EXTENSION) === 'part') {
@@ -578,10 +578,6 @@ class Shared extends \OC\Files\Storage\Common {
return new \OC\Files\Cache\Scanner($this);
}
- public function getPermissionsCache($path = '') {
- return new \OC\Files\Cache\Shared_Permissions($this);
- }
-
public function getWatcher($path = '') {
return new \OC\Files\Cache\Shared_Watcher($this);
}
diff --git a/apps/files_sharing/public.php b/apps/files_sharing/public.php
index 8a86cb3806a6f2c29ca3017ca93ae9fc6e621bea..4782c4dbe324f1b135d43d7d5aea22b1e051dfbf 100644
--- a/apps/files_sharing/public.php
+++ b/apps/files_sharing/public.php
@@ -160,17 +160,12 @@ if (isset($path)) {
$folder->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize));
$folder->assign('freeSpace', $freeSpace);
$folder->assign('uploadLimit', $uploadLimit); // PHP upload limit
- $folder->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
$folder->assign('usedSpacePercent', 0);
$folder->assign('trash', false);
$tmpl->assign('folder', $folder->fetchPage());
- $allowZip = OCP\Config::getSystemValue('allowZipDownload', true);
- $tmpl->assign('allowZipDownload', intval($allowZip));
- $tmpl->assign('showDownloadButton', intval($allowZip));
$tmpl->assign('downloadURL',
OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&download&path=' . urlencode($getPath));
} else {
- $tmpl->assign('showDownloadButton', true);
$tmpl->assign('dir', $dir);
// Show file preview if viewer is available
diff --git a/apps/files_sharing/publicwebdav.php b/apps/files_sharing/publicwebdav.php
index 954c3a3144d2dbe6bcfb0a66184e84cb05c0c4e2..df2c04cf45c60df6e77240ad573cd84c0a98da43 100644
--- a/apps/files_sharing/publicwebdav.php
+++ b/apps/files_sharing/publicwebdav.php
@@ -26,9 +26,9 @@ $server->setBaseUri($baseuri);
// Load plugins
$defaults = new OC_Defaults();
-$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend, $defaults->getName()));
-$server->addPlugin(new Sabre_DAV_Locks_Plugin($lockBackend));
-$server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload
+$server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, $defaults->getName()));
+$server->addPlugin(new \Sabre\DAV\Locks\Plugin($lockBackend));
+$server->addPlugin(new \Sabre\DAV\Browser\Plugin(false)); // Show something in the Browser, but no upload
$server->addPlugin(new OC_Connector_Sabre_FilesPlugin());
$server->addPlugin(new OC_Connector_Sabre_MaintenancePlugin());
$server->addPlugin(new OC_Connector_Sabre_ExceptionLoggerPlugin('webdav'));
diff --git a/apps/files_sharing/settings-admin.php b/apps/files_sharing/settings-admin.php
new file mode 100644
index 0000000000000000000000000000000000000000..8f15e272312a58fdd6ca60c8d37dcf60e27a6d57
--- /dev/null
+++ b/apps/files_sharing/settings-admin.php
@@ -0,0 +1,21 @@
+
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+\OC_Util::checkAdminUser();
+
+\OCP\Util::addStyle('files_sharing', 'settings-admin');
+\OCP\Util::addScript('files_sharing', 'settings-admin');
+
+$themes = \OCA\Files_Sharing\MailTemplate::getEditableThemes();
+$editableTemplates = \OCA\Files_Sharing\MailTemplate::getEditableTemplates();
+
+$tmpl = new OCP\Template('files_sharing', 'settings-admin');
+$tmpl->assign('themes', $themes);
+$tmpl->assign('editableTemplates', $editableTemplates);
+
+return $tmpl->fetchPage();
diff --git a/apps/files_sharing/templates/authenticate.php b/apps/files_sharing/templates/authenticate.php
index 055329ecabfce483a777f9c18b9c6542cdd9d295..f899a54e0f9256fc92554d254acf33bfa30b10f8 100644
--- a/apps/files_sharing/templates/authenticate.php
+++ b/apps/files_sharing/templates/authenticate.php
@@ -6,10 +6,10 @@
t('The password is wrong. Try again.')); ?>
-
+
t('Password')); ?>
diff --git a/apps/files_sharing/templates/public.php b/apps/files_sharing/templates/public.php
index 234b6d098387bca9f88d87408256e0371c7696a2..7b5f603a1053387a2c3b11a325874c498c028712 100644
--- a/apps/files_sharing/templates/public.php
+++ b/apps/files_sharing/templates/public.php
@@ -15,12 +15,10 @@
src="" alt="getName()); ?>" />
getLogoClaim()); ?>
diff --git a/apps/files_sharing/templates/settings-admin.php b/apps/files_sharing/templates/settings-admin.php
new file mode 100644
index 0000000000000000000000000000000000000000..4021be871cd26ffe8c8a4b9114f0bba5360ae92e
--- /dev/null
+++ b/apps/files_sharing/templates/settings-admin.php
@@ -0,0 +1,41 @@
+
+
+
t('Mail templates'));?>
+
+
+
+
+ t('Theme'));?>
+
+ $editable): ?>
+
+
+
+
+
+
+ t('Template'));?>
+
+ $editable): ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ t('Reset'));?>
+
+ t('Save'));?>
+
+
+
+
+
+
diff --git a/apps/files_sharing/tests/js/appSpec.js b/apps/files_sharing/tests/js/appSpec.js
index ad95ee5394251157121f25fc6a3bceaea8f3a503..9c46b7caf1b6bf74f3a07450448249c41e7d399e 100644
--- a/apps/files_sharing/tests/js/appSpec.js
+++ b/apps/files_sharing/tests/js/appSpec.js
@@ -67,7 +67,7 @@ describe('OCA.Sharing.App tests', function() {
expect(fileActions.actions.all).toBeDefined();
expect(fileActions.actions.all.Delete).toBeDefined();
expect(fileActions.actions.all.Rename).toBeDefined();
- expect(fileActions.actions.file.Download).toBeDefined();
+ expect(fileActions.actions.all.Download).toBeDefined();
expect(fileActions.defaults.dir).toEqual('Open');
});
@@ -122,9 +122,7 @@ describe('OCA.Sharing.App tests', function() {
type: 'dir',
path: '/somewhere/inside/subdir',
counterParts: ['user2'],
- shares: [{
- ownerDisplayName: 'user2'
- }]
+ shareOwner: 'user2'
}]);
fileListIn.findFileEl('testdir').find('td a.name').click();
diff --git a/apps/files_sharing/tests/js/shareSpec.js b/apps/files_sharing/tests/js/shareSpec.js
new file mode 100644
index 0000000000000000000000000000000000000000..455addaccc0d9587476a17f39ef1ef5385ae6d4b
--- /dev/null
+++ b/apps/files_sharing/tests/js/shareSpec.js
@@ -0,0 +1,450 @@
+/*
+ * Copyright (c) 2014 Vincent Petry
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+
+describe('OCA.Sharing.Util tests', function() {
+ var oldFileListPrototype;
+ var fileList;
+ var testFiles;
+
+ function getImageUrl($el) {
+ // might be slightly different cross-browser
+ var url = $el.css('background-image');
+ var r = url.match(/url\(['"]?([^'")]*)['"]?\)/);
+ if (!r) {
+ return url;
+ }
+ return r[1];
+ }
+
+ beforeEach(function() {
+ // back up prototype, as it will be extended by
+ // the sharing code
+ oldFileListPrototype = _.extend({}, OCA.Files.FileList.prototype);
+
+ var $content = $('
');
+ $('#testArea').append($content);
+ // dummy file list
+ var $div = $(
+ '');
+ $('#content').append($div);
+
+ var fileActions = new OCA.Files.FileActions();
+ OCA.Sharing.Util.initialize(fileActions);
+ fileList = new OCA.Files.FileList(
+ $div, {
+ fileActions : fileActions
+ }
+ );
+
+ testFiles = [{
+ id: 1,
+ type: 'file',
+ name: 'One.txt',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc',
+ shareOwner: 'User One',
+ isShareMountPoint: false
+ }];
+
+ OCA.Sharing.sharesLoaded = true;
+ OC.Share.statuses = {
+ 1: {link: false, path: '/subdir'}
+ };
+ });
+ afterEach(function() {
+ OCA.Files.FileList.prototype = oldFileListPrototype;
+ delete OCA.Sharing.sharesLoaded;
+ delete OC.Share.droppedDown;
+ OC.Share.statuses = {};
+ OC.Share.currentShares = {};
+ });
+
+ describe('Sharing data in table row', function() {
+ // TODO: test data-permissions, data-share-owner, etc
+ });
+ describe('Share action icon', function() {
+ it('do not shows share text when not shared', function() {
+ var $action, $tr;
+ OC.Share.statuses = {};
+ fileList.setFiles([{
+ id: 1,
+ type: 'dir',
+ name: 'One',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc'
+ }]);
+ $tr = fileList.$el.find('tbody tr:first');
+ $action = $tr.find('.action-share');
+ expect($action.hasClass('permanent')).toEqual(false);
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder.svg');
+ expect($action.find('img').length).toEqual(1);
+ });
+ it('shows simple share text with share icon', function() {
+ var $action, $tr;
+ fileList.setFiles([{
+ id: 1,
+ type: 'dir',
+ name: 'One',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc'
+ }]);
+ $tr = fileList.$el.find('tbody tr:first');
+ $action = $tr.find('.action-share');
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text()).toEqual('Shared');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg');
+ expect($action.find('img').length).toEqual(1);
+ });
+ it('shows simple share text with public icon when shared with link', function() {
+ var $action, $tr;
+ OC.Share.statuses = {1: {link: true, path: '/subdir'}};
+ fileList.setFiles([{
+ id: 1,
+ type: 'dir',
+ name: 'One',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc'
+ }]);
+ $tr = fileList.$el.find('tbody tr:first');
+ $action = $tr.find('.action-share');
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text()).toEqual('Shared');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('public.svg');
+ expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-public.svg');
+ expect($action.find('img').length).toEqual(1);
+ });
+ it('shows owner name when owner is available', function() {
+ var $action, $tr;
+ fileList.setFiles([{
+ id: 1,
+ type: 'dir',
+ name: 'One.txt',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ shareOwner: 'User One',
+ etag: 'abc'
+ }]);
+ $tr = fileList.$el.find('tbody tr:first');
+ $action = $tr.find('.action-share');
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text()).toEqual('Shared by User One');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg');
+ });
+ it('shows recipients when recipients are available', function() {
+ var $action, $tr;
+ fileList.setFiles([{
+ id: 1,
+ type: 'dir',
+ name: 'One.txt',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ recipientsDisplayName: 'User One, User Two',
+ etag: 'abc'
+ }]);
+ $tr = fileList.$el.find('tbody tr:first');
+ $action = $tr.find('.action-share');
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text()).toEqual('Shared with User One, User Two');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg');
+ expect($action.find('img').length).toEqual(1);
+ });
+ it('shows static share text when file shared with user that has no share permission', function() {
+ var $action, $tr;
+ fileList.setFiles([{
+ id: 1,
+ type: 'dir',
+ name: 'One',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_CREATE,
+ etag: 'abc',
+ shareOwner: 'User One'
+ }]);
+ $tr = fileList.$el.find('tbody tr:first');
+ expect($tr.find('.action-share').length).toEqual(0);
+ $action = $tr.find('.action-share-notification');
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text().trim()).toEqual('Shared by User One');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg');
+ expect($action.find('img').length).toEqual(1);
+ });
+ });
+ describe('Share action', function() {
+ var showDropDownStub;
+
+ function makeDummyShareItem(displayName) {
+ return {
+ share_with_displayname: displayName
+ };
+ }
+
+ beforeEach(function() {
+ showDropDownStub = sinon.stub(OC.Share, 'showDropDown', function() {
+ $('#testArea').append($('
'));
+ });
+ });
+ afterEach(function() {
+ showDropDownStub.restore();
+ });
+ it('adds share icon after sharing a non-shared file', function() {
+ var $action, $tr;
+ OC.Share.statuses = {};
+ fileList.setFiles([{
+ id: 1,
+ type: 'file',
+ name: 'One.txt',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc'
+ }]);
+ $action = fileList.$el.find('tbody tr:first .action-share');
+ $tr = fileList.$el.find('tr:first');
+
+ expect($action.hasClass('permanent')).toEqual(false);
+
+ $tr.find('.action-share').click();
+
+ expect(showDropDownStub.calledOnce).toEqual(true);
+
+ // simulate what the dropdown does
+ var shares = {};
+ OC.Share.itemShares[OC.Share.SHARE_TYPE_USER] = ['user1', 'user2'];
+ OC.Share.itemShares[OC.Share.SHARE_TYPE_GROUP] = ['group1', 'group2'];
+ shares[OC.Share.SHARE_TYPE_USER] = _.map(['User One', 'User Two'], makeDummyShareItem);
+ shares[OC.Share.SHARE_TYPE_GROUP] = _.map(['Group One', 'Group Two'], makeDummyShareItem);
+ $('#dropdown').trigger(new $.Event('sharesChanged', {shares: shares}));
+
+ expect($tr.attr('data-share-recipients')).toEqual('Group One, Group Two, User One, User Two');
+
+ OC.Share.updateIcon('file', 1);
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text()).toEqual('Shared with Group One, Group Two, User One, User Two');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ });
+ it('updates share icon after updating shares of a file', function() {
+ var $action, $tr;
+ OC.Share.statuses = {1: {link: false, path: '/subdir'}};
+ fileList.setFiles([{
+ id: 1,
+ type: 'file',
+ name: 'One.txt',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc'
+ }]);
+ $action = fileList.$el.find('tbody tr:first .action-share');
+ $tr = fileList.$el.find('tr:first');
+
+ expect($action.hasClass('permanent')).toEqual(true);
+
+ $tr.find('.action-share').click();
+
+ expect(showDropDownStub.calledOnce).toEqual(true);
+
+ // simulate what the dropdown does
+ var shares = {};
+ OC.Share.itemShares[OC.Share.SHARE_TYPE_USER] = ['user1', 'user2', 'user3'];
+ shares[OC.Share.SHARE_TYPE_USER] = _.map(['User One', 'User Two', 'User Three'], makeDummyShareItem);
+ $('#dropdown').trigger(new $.Event('sharesChanged', {shares: shares}));
+
+ expect($tr.attr('data-share-recipients')).toEqual('User One, User Three, User Two');
+
+ OC.Share.updateIcon('file', 1);
+
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text()).toEqual('Shared with User One, User Three, User Two');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ });
+ it('removes share icon after removing all shares from a file', function() {
+ var $action, $tr;
+ OC.Share.statuses = {1: {link: false, path: '/subdir'}};
+ fileList.setFiles([{
+ id: 1,
+ type: 'file',
+ name: 'One.txt',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc',
+ recipients: 'User One, User Two'
+ }]);
+ $action = fileList.$el.find('tbody tr:first .action-share');
+ $tr = fileList.$el.find('tr:first');
+
+ expect($action.hasClass('permanent')).toEqual(true);
+
+ $tr.find('.action-share').click();
+
+ expect(showDropDownStub.calledOnce).toEqual(true);
+
+ // simulate what the dropdown does
+ OC.Share.itemShares = {};
+ $('#dropdown').trigger(new $.Event('sharesChanged', {shares: {}}));
+
+ expect($tr.attr('data-share-recipients')).not.toBeDefined();
+
+ OC.Share.updateIcon('file', 1);
+ expect($action.hasClass('permanent')).toEqual(false);
+ });
+ it('keep share text after updating reshare', function() {
+ var $action, $tr;
+ OC.Share.statuses = {1: {link: false, path: '/subdir'}};
+ fileList.setFiles([{
+ id: 1,
+ type: 'file',
+ name: 'One.txt',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc',
+ shareOwner: 'User One'
+ }]);
+ $action = fileList.$el.find('tbody tr:first .action-share');
+ $tr = fileList.$el.find('tr:first');
+
+ expect($action.hasClass('permanent')).toEqual(true);
+
+ $tr.find('.action-share').click();
+
+ expect(showDropDownStub.calledOnce).toEqual(true);
+
+ // simulate what the dropdown does
+ var shares = {};
+ OC.Share.itemShares[OC.Share.SHARE_TYPE_USER] = ['user2'];
+ shares[OC.Share.SHARE_TYPE_USER] = _.map(['User Two'], makeDummyShareItem);
+ $('#dropdown').trigger(new $.Event('sharesChanged', {shares: shares}));
+
+ expect($tr.attr('data-share-recipients')).toEqual('User Two');
+
+ OC.Share.updateIcon('file', 1);
+
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text()).toEqual('Shared by User One');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ });
+ it('keep share text after unsharing reshare', function() {
+ var $action, $tr;
+ OC.Share.statuses = {1: {link: false, path: '/subdir'}};
+ fileList.setFiles([{
+ id: 1,
+ type: 'file',
+ name: 'One.txt',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc',
+ shareOwner: 'User One',
+ recipients: 'User Two'
+ }]);
+ $action = fileList.$el.find('tbody tr:first .action-share');
+ $tr = fileList.$el.find('tr:first');
+
+ expect($action.hasClass('permanent')).toEqual(true);
+
+ $tr.find('.action-share').click();
+
+ expect(showDropDownStub.calledOnce).toEqual(true);
+
+ // simulate what the dropdown does
+ OC.Share.itemShares = {};
+ $('#dropdown').trigger(new $.Event('sharesChanged', {shares: {}}));
+
+ expect($tr.attr('data-share-recipients')).not.toBeDefined();
+
+ OC.Share.updateIcon('file', 1);
+
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text()).toEqual('Shared by User One');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ });
+ });
+ describe('formatRecipients', function() {
+ it('returns a single recipient when one passed', function() {
+ expect(OCA.Sharing.Util.formatRecipients(['User one']))
+ .toEqual('User one');
+ });
+ it('returns two recipients when two passed', function() {
+ expect(OCA.Sharing.Util.formatRecipients(['User one', 'User two']))
+ .toEqual('User one, User two');
+ });
+ it('returns four recipients with plus when five passed', function() {
+ var recipients = [
+ 'User one',
+ 'User two',
+ 'User three',
+ 'User four',
+ 'User five'
+ ];
+ expect(OCA.Sharing.Util.formatRecipients(recipients))
+ .toEqual('User four, User one, User three, User two, +1');
+ });
+ it('returns four recipients with plus when ten passed', function() {
+ var recipients = [
+ 'User one',
+ 'User two',
+ 'User three',
+ 'User four',
+ 'User five',
+ 'User six',
+ 'User seven',
+ 'User eight',
+ 'User nine',
+ 'User ten'
+ ];
+ expect(OCA.Sharing.Util.formatRecipients(recipients))
+ .toEqual('User four, User one, User three, User two, +6');
+ });
+ it('returns four recipients with plus when four passed with counter', function() {
+ var recipients = [
+ 'User one',
+ 'User two',
+ 'User three',
+ 'User four'
+ ];
+ expect(OCA.Sharing.Util.formatRecipients(recipients, 10))
+ .toEqual('User four, User one, User three, User two, +6');
+ });
+ });
+
+});
diff --git a/apps/files_sharing/tests/js/sharedfilelistSpec.js b/apps/files_sharing/tests/js/sharedfilelistSpec.js
index 7aec8322a4467a4b3ec25880a5155a0e6ce61220..0f6d0a0ba49a2b6d23c131ca145484c6f24e5c4e 100644
--- a/apps/files_sharing/tests/js/sharedfilelistSpec.js
+++ b/apps/files_sharing/tests/js/sharedfilelistSpec.js
@@ -9,7 +9,8 @@
*/
describe('OCA.Sharing.FileList tests', function() {
- var testFiles, alertStub, notificationStub, fileList;
+ var testFiles, alertStub, notificationStub, fileList, fileActions;
+ var oldFileListPrototype;
beforeEach(function() {
alertStub = sinon.stub(OC.dialogs, 'alert');
@@ -45,10 +46,17 @@ describe('OCA.Sharing.FileList tests', function() {
'Empty content message
' +
' '
);
+ // back up prototype, as it will be extended by
+ // the sharing code
+ oldFileListPrototype = _.extend({}, OCA.Files.FileList.prototype);
+ fileActions = new OCA.Files.FileActions();
+ OCA.Sharing.Util.initialize(fileActions);
});
afterEach(function() {
+ OCA.Files.FileList.prototype = oldFileListPrototype;
testFiles = undefined;
fileList = undefined;
+ fileActions = undefined;
notificationStub.restore();
alertStub.restore();
@@ -409,4 +417,95 @@ describe('OCA.Sharing.FileList tests', function() {
expect($tr.find('.nametext').text().trim()).toEqual('local name.txt');
});
});
+ describe('loading file list for link shares', function() {
+ var ocsResponse;
+
+ beforeEach(function() {
+ fileList = new OCA.Sharing.FileList(
+ $('#app-content-container'), {
+ linksOnly: true
+ }
+ );
+
+ fileList.reload();
+
+ ocsResponse = {
+ ocs: {
+ meta: {
+ status: 'ok',
+ statuscode: 100,
+ message: null
+ },
+ data: [{
+ id: 7,
+ item_type: 'file',
+ item_source: 49,
+ file_source: 49,
+ path: '/local path/local name.txt',
+ permissions: 1,
+ stime: 11111,
+ share_type: OC.Share.SHARE_TYPE_LINK,
+ share_with: null,
+ token: 'abc',
+ mimetype: 'text/plain',
+ uid_owner: 'user1',
+ displayname_owner: 'User One'
+ }]
+ }
+ };
+ });
+ it('render only link shares', function() {
+ /* jshint camelcase: false */
+ var request;
+ ocsResponse.ocs.data.push({
+ // non-link share
+ id: 8,
+ item_type: 'file',
+ item_source: 49,
+ file_source: 49,
+ path: '/local path/local name.txt',
+ permissions: 27,
+ stime: 11111,
+ share_type: OC.Share.SHARE_TYPE_USER,
+ share_with: 'user2',
+ share_with_displayname: 'User Two',
+ mimetype: 'text/plain',
+ uid_owner: 'user1',
+ displayname_owner: 'User One'
+ });
+ expect(fakeServer.requests.length).toEqual(1);
+ request = fakeServer.requests[0];
+ expect(request.url).toEqual(
+ OC.linkToOCS('apps/files_sharing/api/v1') +
+ 'shares?format=json&shared_with_me=false'
+ );
+
+ fakeServer.requests[0].respond(
+ 200,
+ { 'Content-Type': 'application/json' },
+ JSON.stringify(ocsResponse)
+ );
+
+ // only renders the link share entry
+ var $rows = fileList.$el.find('tbody tr');
+ var $tr = $rows.eq(0);
+ expect($rows.length).toEqual(1);
+ expect($tr.attr('data-id')).toEqual('49');
+ expect($tr.attr('data-type')).toEqual('file');
+ expect($tr.attr('data-file')).toEqual('local name.txt');
+ expect($tr.attr('data-path')).toEqual('/local path');
+ expect($tr.attr('data-size')).not.toBeDefined();
+ expect($tr.attr('data-permissions')).toEqual('31'); // read and delete
+ expect($tr.attr('data-mime')).toEqual('text/plain');
+ expect($tr.attr('data-mtime')).toEqual('11111000');
+ expect($tr.attr('data-share-owner')).not.toBeDefined();
+ expect($tr.attr('data-share-id')).toEqual('7');
+ expect($tr.find('a.name').attr('href')).toEqual(
+ OC.webroot +
+ '/index.php/apps/files/ajax/download.php' +
+ '?dir=%2Flocal%20path&files=local%20name.txt');
+
+ expect($tr.find('.nametext').text().trim()).toEqual('local name.txt');
+ });
+ });
});
diff --git a/apps/files_trashbin/appinfo/database.xml b/apps/files_trashbin/appinfo/database.xml
index db104ee92981205509e11baf1674a72e5fe67466..a6ba242c1cfece11b63cf26855fab43404addf09 100644
--- a/apps/files_trashbin/appinfo/database.xml
+++ b/apps/files_trashbin/appinfo/database.xml
@@ -89,30 +89,4 @@
-
-
- *dbprefix*files_trashsize
-
-
-
-
- user
- text
-
- true
- 64
-
-
-
- size
- text
-
- true
- 50
-
-
-
-
-
-
diff --git a/apps/files_trashbin/appinfo/update.php b/apps/files_trashbin/appinfo/update.php
index ca7b87a86817c4cc8a8280b8d7f9b55e1cbd9f74..191d3cf25d9b90837a09cdcae7a31ffbc3f14f2c 100644
--- a/apps/files_trashbin/appinfo/update.php
+++ b/apps/files_trashbin/appinfo/update.php
@@ -5,6 +5,5 @@ $installedVersion=OCP\Config::getAppValue('files_trashbin', 'installed_version')
if (version_compare($installedVersion, '0.6', '<')) {
//size of the trash bin could be incorrect, remove it for all users to
//enforce a recalculation during next usage.
- $query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trashsize`');
- $result = $query->execute();
+ \OC_DB::dropTable('files_trashsize');
}
diff --git a/apps/files_trashbin/l10n/gl.php b/apps/files_trashbin/l10n/gl.php
index 143cf0e6df564d3fff90c8d72124e38ffb53882e..475d7075c70ad544698086db76a67f5955d3d1ea 100644
--- a/apps/files_trashbin/l10n/gl.php
+++ b/apps/files_trashbin/l10n/gl.php
@@ -3,7 +3,7 @@ $TRANSLATIONS = array(
"Couldn't delete %s permanently" => "Non foi posíbel eliminar %s permanente",
"Couldn't restore %s" => "Non foi posíbel restaurar %s",
"Deleted files" => "Ficheiros eliminados",
-"Restore" => "Restablecer",
+"Restore" => "Restabelecer",
"Error" => "Erro",
"restored" => "restaurado",
"Nothing in here. Your trash bin is empty!" => "Aquí non hai nada. O cesto do lixo está baleiro!",
diff --git a/apps/files_trashbin/lib/trashbin.php b/apps/files_trashbin/lib/trashbin.php
index e95f1b13c37fbfb98dc9226530188860740bb4f2..1838c48d95d52869855442cda24132d9477490e1 100644
--- a/apps/files_trashbin/lib/trashbin.php
+++ b/apps/files_trashbin/lib/trashbin.php
@@ -655,17 +655,12 @@ class Trashbin {
/**
* deletes used space for trash bin in db if user was deleted
*
- * @param type $uid id of deleted user
+ * @param string $uid id of deleted user
* @return bool result of db delete operation
*/
public static function deleteUser($uid) {
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trash` WHERE `user`=?');
- $result = $query->execute(array($uid));
- if ($result) {
- $query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trashsize` WHERE `user`=?');
- return $query->execute(array($uid));
- }
- return false;
+ return $query->execute(array($uid));
}
/**
@@ -730,6 +725,8 @@ class Trashbin {
*/
private static function expire($trashbinSize, $user) {
+ $view = new \OC\Files\View('/' . $user . '/files_trashbin');
+
// let the admin disable auto expire
$autoExpire = \OC_Config::getValue('trashbin_auto_expire', true);
if ($autoExpire === false) {
@@ -740,19 +737,18 @@ class Trashbin {
$availableSpace = self::calculateFreeSpace($trashbinSize);
$size = 0;
- $query = \OC_DB::prepare('SELECT `location`,`type`,`id`,`timestamp` FROM `*PREFIX*files_trash` WHERE `user`=?');
- $result = $query->execute(array($user))->fetchAll();
-
$retention_obligation = \OC_Config::getValue('trashbin_retention_obligation', self::DEFAULT_RETENTION_OBLIGATION);
$limit = time() - ($retention_obligation * 86400);
- foreach ($result as $r) {
- $timestamp = $r['timestamp'];
- $filename = $r['id'];
- if ($r['timestamp'] < $limit) {
+ $dirContent = $view->getDirectoryContent('/files');
+
+ foreach ($dirContent as $file) {
+ $timestamp = $file['mtime'];
+ $filename = pathinfo($file['name'], PATHINFO_FILENAME);
+ if ($timestamp < $limit) {
$size += self::delete($filename, $timestamp);
- \OC_Log::write('files_trashbin', 'remove "' . $filename . '" fom trash bin because it is older than ' . $retention_obligation, \OC_log::INFO);
+ \OC_Log::write('files_trashbin', 'remove "' . $filename . '" from trash bin because it is older than ' . $retention_obligation, \OC_log::INFO);
}
}
$availableSpace += $size;
@@ -904,12 +900,12 @@ class Trashbin {
* get current size of trash bin from a given user
*
* @param string $user user who owns the trash bin
- * @return mixed trash bin size or false if no trash bin size is stored
+ * @return integer trash bin size
*/
private static function getTrashbinSize($user) {
$view = new \OC\Files\View('/' . $user);
$fileInfo = $view->getFileInfo('/files_trashbin');
- return $fileInfo['size'];
+ return isset($fileInfo['size']) ? $fileInfo['size'] : 0;
}
/**
diff --git a/apps/files_versions/appinfo/database.xml b/apps/files_versions/appinfo/database.xml
deleted file mode 100644
index d385477698069402d94def7609e88dbfb24bce1e..0000000000000000000000000000000000000000
--- a/apps/files_versions/appinfo/database.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
- *dbname*
- true
- false
-
- utf8
-
-
-
- *dbprefix*files_versions
-
-
-
-
- user
- text
-
- true
- 64
-
-
- size
- text
-
- true
- 50
-
-
-
-
-
-
-
diff --git a/apps/files_versions/appinfo/update.php b/apps/files_versions/appinfo/update.php
index 52a4850758a0b416372180dc1c94a58fc0c6144d..fdc6b1e5f1b6d574344c1b5825b61a0b64c45436 100644
--- a/apps/files_versions/appinfo/update.php
+++ b/apps/files_versions/appinfo/update.php
@@ -2,14 +2,6 @@
$installedVersion=OCP\Config::getAppValue('files_versions', 'installed_version');
// move versions to new directory
-if (version_compare($installedVersion, '1.0.2', '<')) {
- $users = \OCP\User::getUsers();
- $datadir = \OCP\Config::getSystemValue('datadirectory').'/';
- foreach ($users as $user) {
- $oldPath = $datadir.$user.'/versions';
- $newPath = $datadir.$user.'/files_versions';
- if(is_dir($oldPath)) {
- rename($oldPath, $newPath);
- }
- }
+if (version_compare($installedVersion, '1.0.4', '<')) {
+ \OC_DB::dropTable("files_versions");
}
diff --git a/apps/files_versions/appinfo/version b/apps/files_versions/appinfo/version
index e4c0d46e55ffb2237c9e900aa77172886f6c8aa5..ee90284c27f187a315f1267b063fa81b5b84f613 100644
--- a/apps/files_versions/appinfo/version
+++ b/apps/files_versions/appinfo/version
@@ -1 +1 @@
-1.0.3
\ No newline at end of file
+1.0.4
diff --git a/apps/files_versions/l10n/gl.php b/apps/files_versions/l10n/gl.php
index 1ccdc95f1eba50bfdbc47413898313a6f80ec5d2..48eef193e431b98d16243de669e89bbe4db94adf 100644
--- a/apps/files_versions/l10n/gl.php
+++ b/apps/files_versions/l10n/gl.php
@@ -5,6 +5,6 @@ $TRANSLATIONS = array(
"Failed to revert {file} to revision {timestamp}." => "Non foi posíbel reverter {file} á revisión {timestamp}.",
"More versions..." => "Máis versións...",
"No other versions available" => "Non hai outras versións dispoñíbeis",
-"Restore" => "Restablecer"
+"Restore" => "Restabelecer"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php
index 56e1dfc2e2416cb7fd8ad49e48ef2a608288cb34..15d0e032ea0e779d0dc74f2190066f76e4ba6398 100644
--- a/apps/files_versions/lib/versions.php
+++ b/apps/files_versions/lib/versions.php
@@ -54,31 +54,12 @@ class Storage {
* get current size of all versions from a given user
*
* @param string $user user who owns the versions
- * @return mixed versions size or false if no versions size is stored
+ * @return int versions size
*/
private static function getVersionsSize($user) {
- $query = \OC_DB::prepare('SELECT `size` FROM `*PREFIX*files_versions` WHERE `user`=?');
- $result = $query->execute(array($user))->fetchAll();
-
- if ($result) {
- return $result[0]['size'];
- }
- return false;
- }
-
- /**
- * write to the database how much space is in use for versions
- *
- * @param string $user owner of the versions
- * @param int $size size of the versions
- */
- private static function setVersionsSize($user, $size) {
- if ( self::getVersionsSize($user) === false) {
- $query = \OC_DB::prepare('INSERT INTO `*PREFIX*files_versions` (`size`, `user`) VALUES (?, ?)');
- }else {
- $query = \OC_DB::prepare('UPDATE `*PREFIX*files_versions` SET `size`=? WHERE `user`=?');
- }
- $query->execute(array($size, $user));
+ $view = new \OC\Files\View('/' . $user);
+ $fileInfo = $view->getFileInfo('/files_versions');
+ return isset($fileInfo['size']) ? $fileInfo['size'] : 0;
}
/**
@@ -115,16 +96,13 @@ class Storage {
self::createMissingDirectories($filename, $users_view);
$versionsSize = self::getVersionsSize($uid);
- if ( $versionsSize === false || $versionsSize < 0 ) {
- $versionsSize = self::calculateSize($uid);
- }
// assumption: we need filesize($filename) for the new version +
// some more free space for the modified file which might be
// 1.5 times as large as the current version -> 2.5
$neededSpace = $files_view->filesize($filename) * 2.5;
- $versionsSize = self::expire($filename, $versionsSize, $neededSpace);
+ self::expire($filename, $versionsSize, $neededSpace);
// disable proxy to prevent multiple fopen calls
$proxyStatus = \OC_FileProxy::$enabled;
@@ -138,10 +116,6 @@ class Storage {
// reset proxy state
\OC_FileProxy::$enabled = $proxyStatus;
-
- $versionsSize += $users_view->filesize('files'.$filename);
-
- self::setVersionsSize($uid, $versionsSize);
}
}
@@ -173,17 +147,11 @@ class Storage {
$abs_path = $versions_fileview->getLocalFile($filename . '.v');
$versions = self::getVersions($uid, $filename);
if (!empty($versions)) {
- $versionsSize = self::getVersionsSize($uid);
- if ($versionsSize === false || $versionsSize < 0) {
- $versionsSize = self::calculateSize($uid);
- }
foreach ($versions as $v) {
\OC_Hook::emit('\OCP\Versions', 'preDelete', array('path' => $abs_path . $v['version']));
unlink($abs_path . $v['version']);
\OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $abs_path . $v['version']));
- $versionsSize -= $v['size'];
}
- self::setVersionsSize($uid, $versionsSize);
}
}
unset(self::$deletedFiles[$path]);
@@ -344,33 +312,6 @@ class Storage {
return $query->execute(array($uid));
}
- /**
- * get the size of all stored versions from a given user
- * @param string $uid id from the user
- * @return int size of versions
- */
- private static function calculateSize($uid) {
- if (\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED) == 'true') {
- $view = new \OC\Files\View('/' . $uid . '/files_versions');
-
- $size = 0;
-
- $dirContent = $view->getDirectoryContent('/');
-
- while (!empty($dirContent)) {
- $path = reset($dirContent);
- if ($path['type'] === 'dir') {
- $dirContent = array_merge($dirContent, $view->getDirectoryContent(substr($path['path'], strlen('files_versions'))));
- } else {
- $size += $view->filesize(substr($path['path'], strlen('files_versions')));
- }
- unset($dirContent[key($dirContent)]);
- }
-
- return $size;
- }
- }
-
/**
* returns all stored file versions from a given user
* @param string $uid id of the user
@@ -500,9 +441,6 @@ class Storage {
// make sure that we have the current size of the version history
if ( $versionsSize === null ) {
$versionsSize = self::getVersionsSize($uid);
- if ( $versionsSize === false || $versionsSize < 0 ) {
- $versionsSize = self::calculateSize($uid);
- }
}
// calculate available space for version history
diff --git a/apps/user_ldap/appinfo/app.php b/apps/user_ldap/appinfo/app.php
index c2cd295523eaf309190996c7879705f1df085398..a26c7709d41096b34cc16c8ae26dd5e018ee9a7c 100644
--- a/apps/user_ldap/appinfo/app.php
+++ b/apps/user_ldap/appinfo/app.php
@@ -26,8 +26,14 @@ OCP\App::registerAdmin('user_ldap', 'settings');
$configPrefixes = OCA\user_ldap\lib\Helper::getServerConfigurationPrefixes(true);
$ldapWrapper = new OCA\user_ldap\lib\LDAP();
if(count($configPrefixes) === 1) {
+ $ocConfig = \OC::$server->getConfig();
+ $userManager = new OCA\user_ldap\lib\user\Manager($ocConfig,
+ new OCA\user_ldap\lib\FilesystemHelper(),
+ new OCA\user_ldap\lib\LogWrapper(),
+ \OC::$server->getAvatarManager(),
+ new \OCP\Image());
$connector = new OCA\user_ldap\lib\Connection($ldapWrapper, $configPrefixes[0]);
- $ldapAccess = new OCA\user_ldap\lib\Access($connector, $ldapWrapper);
+ $ldapAccess = new OCA\user_ldap\lib\Access($connector, $ldapWrapper, $userManager);
$userBackend = new OCA\user_ldap\USER_LDAP($ldapAccess);
$groupBackend = new OCA\user_ldap\GROUP_LDAP($ldapAccess);
} else if(count($configPrefixes) > 1) {
diff --git a/apps/user_ldap/appinfo/register_command.php b/apps/user_ldap/appinfo/register_command.php
new file mode 100644
index 0000000000000000000000000000000000000000..10d992531c4a6e58b76342d9e64af1e211a88c08
--- /dev/null
+++ b/apps/user_ldap/appinfo/register_command.php
@@ -0,0 +1,11 @@
+
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+$application->add(new OCA\user_ldap\Command\ShowConfig());
+$application->add(new OCA\user_ldap\Command\SetConfig());
+$application->add(new OCA\user_ldap\Command\TestConfig());
diff --git a/apps/user_ldap/appinfo/update.php b/apps/user_ldap/appinfo/update.php
index 41770cf97b16209ba74660d2b7859b309624a911..1e706ce869bcd10a694f64ac1582ef5d5bb6656b 100644
--- a/apps/user_ldap/appinfo/update.php
+++ b/apps/user_ldap/appinfo/update.php
@@ -7,21 +7,39 @@ if($state === 'unset') {
OCP\Config::setSystemValue('ldapIgnoreNamingRules', false);
}
+$installedVersion = OCP\Config::getAppValue('user_ldap', 'installed_version');
+$enableRawMode = version_compare($installedVersion, '0.4.1', '<');
+
$configPrefixes = OCA\user_ldap\lib\Helper::getServerConfigurationPrefixes(true);
$ldap = new OCA\user_ldap\lib\LDAP();
foreach($configPrefixes as $config) {
$connection = new OCA\user_ldap\lib\Connection($ldap, $config);
- $value = \OCP\Config::getAppValue('user_ldap',
- $config.'ldap_uuid_attribute', 'auto');
- \OCP\Config::setAppValue('user_ldap',
- $config.'ldap_uuid_user_attribute', $value);
- \OCP\Config::setAppValue('user_ldap',
- $config.'ldap_uuid_group_attribute', $value);
- $value = \OCP\Config::getAppValue('user_ldap',
- $config.'ldap_expert_uuid_attr', 'auto');
- \OCP\Config::setAppValue('user_ldap',
- $config.'ldap_expert_uuid_user_attr', $value);
- \OCP\Config::setAppValue('user_ldap',
- $config.'ldap_expert_uuid_group_attr', $value);
+ $state = \OCP\Config::getAppValue(
+ 'user_ldap', $config.'ldap_uuid_user_attribute', 'not existing');
+ if($state === 'non existing') {
+ $value = \OCP\Config::getAppValue(
+ 'user_ldap', $config.'ldap_uuid_attribute', 'auto');
+ \OCP\Config::setAppValue(
+ 'user_ldap', $config.'ldap_uuid_user_attribute', $value);
+ \OCP\Config::setAppValue(
+ 'user_ldap', $config.'ldap_uuid_group_attribute', $value);
+ }
+
+ $state = \OCP\Config::getAppValue(
+ 'user_ldap', $config.'ldap_expert_uuid_user_attr', 'not existing');
+ if($state === 'non existing') {
+ $value = \OCP\Config::getAppValue(
+ 'user_ldap', $config.'ldap_expert_uuid_attr', 'auto');
+ \OCP\Config::setAppValue(
+ 'user_ldap', $config.'ldap_expert_uuid_user_attr', $value);
+ \OCP\Config::setAppValue(
+ 'user_ldap', $config.'ldap_expert_uuid_group_attr', $value);
+ }
+
+ if($enableRawMode) {
+ \OCP\Config::setAppValue('user_ldap', $config.'ldap_user_filter_mode', 1);
+ \OCP\Config::setAppValue('user_ldap', $config.'ldap_login_filter_mode', 1);
+ \OCP\Config::setAppValue('user_ldap', $config.'ldap_group_filter_mode', 1);
+ }
}
diff --git a/apps/user_ldap/appinfo/version b/apps/user_ldap/appinfo/version
index 44bb5d1f74358758e75a906eebebb458e9de7fcb..2b7c5ae01848a77d95e2792eb83ab605c9aed91a 100644
--- a/apps/user_ldap/appinfo/version
+++ b/apps/user_ldap/appinfo/version
@@ -1 +1 @@
-0.4.1
\ No newline at end of file
+0.4.2
diff --git a/apps/user_ldap/command/setconfig.php b/apps/user_ldap/command/setconfig.php
new file mode 100644
index 0000000000000000000000000000000000000000..ab1c8d39eada8670b3731c6db8c076f2d2ac3eaf
--- /dev/null
+++ b/apps/user_ldap/command/setconfig.php
@@ -0,0 +1,69 @@
+
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OCA\user_ldap\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use \OCA\user_ldap\lib\Helper;
+use \OCA\user_ldap\lib\Configuration;
+
+class SetConfig extends Command {
+
+ protected function configure() {
+ $this
+ ->setName('ldap:set-config')
+ ->setDescription('modifies an LDAP configuration')
+ ->addArgument(
+ 'configID',
+ InputArgument::REQUIRED,
+ 'the configuration ID'
+ )
+ ->addArgument(
+ 'configKey',
+ InputArgument::REQUIRED,
+ 'the configuration key'
+ )
+ ->addArgument(
+ 'configValue',
+ InputArgument::REQUIRED,
+ 'the new configuration value'
+ )
+ ;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $availableConfigs = Helper::getServerConfigurationPrefixes();
+ $configID = $input->getArgument('configID');
+ if(!in_array($configID, $availableConfigs)) {
+ $output->writeln("Invalid configID");
+ return;
+ }
+
+ $this->setValue(
+ $configID,
+ $input->getArgument('configKey'),
+ $input->getArgument('configValue')
+ );
+ }
+
+ /**
+ * save the configuration value as provided
+ * @param string $configID
+ * @param string $configKey
+ * @param string $configValue
+ */
+ protected function setValue($configID, $key, $value) {
+ $configHolder = new Configuration($configID);
+ $configHolder->$key = $value;
+ $configHolder->saveConfiguration();
+ }
+}
diff --git a/apps/user_ldap/command/showconfig.php b/apps/user_ldap/command/showconfig.php
new file mode 100644
index 0000000000000000000000000000000000000000..f51d641beecee6979be08ed44bff910b757dc45a
--- /dev/null
+++ b/apps/user_ldap/command/showconfig.php
@@ -0,0 +1,76 @@
+
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OCA\user_ldap\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use \OCA\user_ldap\lib\Helper;
+use \OCA\user_ldap\lib\Configuration;
+
+class ShowConfig extends Command {
+
+ protected function configure() {
+ $this
+ ->setName('ldap:show-config')
+ ->setDescription('shows the LDAP configuration')
+ ->addArgument(
+ 'configID',
+ InputArgument::OPTIONAL,
+ 'will show the configuration of the specified id'
+ )
+ ;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $availableConfigs = Helper::getServerConfigurationPrefixes();
+ $configID = $input->getArgument('configID');
+ if(!is_null($configID)) {
+ $configIDs[] = $configID;
+ if(!in_array($configIDs[0], $availableConfigs)) {
+ $output->writeln("Invalid configID");
+ return;
+ }
+ } else {
+ $configIDs = $availableConfigs;
+ }
+
+ $this->renderConfigs($configIDs, $output);
+ }
+
+ /**
+ * prints the LDAP configuration(s)
+ * @param string[] configID(s)
+ * @param OutputInterface $output
+ */
+ protected function renderConfigs($configIDs, $output) {
+ foreach($configIDs as $id) {
+ $configHolder = new Configuration($id);
+ $configuration = $configHolder->getConfiguration();
+ ksort($configuration);
+
+ $table = $this->getHelperSet()->get('table');
+ $table->setHeaders(array('Configuration', $id));
+ $rows = array();
+ foreach($configuration as $key => $value) {
+ if($key === 'ldapAgentPassword') {
+ $value = '***';
+ }
+ if(is_array($value)) {
+ $value = implode(';', $value);
+ }
+ $rows[] = array($key, $value);
+ }
+ $table->setRows($rows);
+ $table->render($output);
+ }
+ }
+}
diff --git a/apps/user_ldap/command/testconfig.php b/apps/user_ldap/command/testconfig.php
new file mode 100644
index 0000000000000000000000000000000000000000..00b4acf2f6642a429b61f5d448deeb759a52ec7b
--- /dev/null
+++ b/apps/user_ldap/command/testconfig.php
@@ -0,0 +1,75 @@
+
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OCA\user_ldap\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use \OCA\user_ldap\lib\Helper;
+use \OCA\user_ldap\lib\Connection;
+
+class TestConfig extends Command {
+
+ protected function configure() {
+ $this
+ ->setName('ldap:test-config')
+ ->setDescription('tests an LDAP configuration')
+ ->addArgument(
+ 'configID',
+ InputArgument::REQUIRED,
+ 'the configuration ID'
+ )
+ ;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $availableConfigs = Helper::getServerConfigurationPrefixes();
+ $configID = $input->getArgument('configID');
+ if(!in_array($configID, $availableConfigs)) {
+ $output->writeln("Invalid configID");
+ return;
+ }
+
+ $result = $this->testConfig($configID);
+ if($result === 0) {
+ $output->writeln('The configuration is valid and the connection could be established!');
+ } else if($result === 1) {
+ $output->writeln('The configuration is invalid. Please have a look at the logs for further details.');
+ } else if($result === 2) {
+ $output->writeln('The configuration is valid, but the Bind failed. Please check the server settings and credentials.');
+ } else {
+ $output->writeln('Your LDAP server was kidnapped by aliens.');
+ }
+ }
+
+ /**
+ * tests the specified connection
+ * @param string $configID
+ * @return int
+ */
+ protected function testConfig($configID) {
+ $lw = new \OCA\user_ldap\lib\LDAP();
+ $connection = new Connection($lw, $configID);
+
+ //ensure validation is run before we attempt the bind
+ $connection->getConfiguration();
+
+ if(!$connection->setConfiguration(array(
+ 'ldap_configuration_active' => 1,
+ ))) {
+ return 1;
+ }
+ if($connection->bind()) {
+ return 0;
+ }
+ return 2;
+ }
+}
diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js
index 8c18cc4c58c6005e1b9e685ee048d3e58d813121..87d755697cb19974c3c0ff1dcfdc1b1e64031965 100644
--- a/apps/user_ldap/js/settings.js
+++ b/apps/user_ldap/js/settings.js
@@ -90,7 +90,7 @@ var LdapConfiguration = {
);
}
$('#ldap_serverconfig_chooser option:selected').removeAttr('selected');
- var html = '
'+t('user_ldap','{nbServer}. Server', {nbServer: $('#ldap_serverconfig_chooser option').length})+' ';
+ var html = '
'+t('user_ldap','{nthServer}. Server', {nthServer: $('#ldap_serverconfig_chooser option').length})+' ';
$('#ldap_serverconfig_chooser option:last').before(html);
LdapWizard.init();
} else {
diff --git a/apps/user_ldap/l10n/ast.php b/apps/user_ldap/l10n/ast.php
index 620454a9561e1c296646f101ee6317bbbca29918..bdb11a457e85a6db85615782de7cf4caa8b000d3 100644
--- a/apps/user_ldap/l10n/ast.php
+++ b/apps/user_ldap/l10n/ast.php
@@ -19,6 +19,7 @@ $TRANSLATIONS = array(
"Select attributes" => "Esbillar atributos",
"Connection test succeeded" => "Test de conexón esitosu",
"Connection test failed" => "Falló'l test de conexón",
+"Confirm Deletion" => "Confirmar desaniciu",
"_%s group found_::_%s groups found_" => array("%s grupu alcontráu","%s grupos alcontraos"),
"_%s user found_::_%s users found_" => array("%s usuariu alcontráu","%s usuarios alcontraos"),
"Could not find the desired feature" => "Nun pudo alcontrase la carauterística deseyada",
diff --git a/apps/user_ldap/l10n/de.php b/apps/user_ldap/l10n/de.php
index 99e40b1f0d8aab5021eb739444d45ff0dad255d9..26562b91c67e5a9122a8984ca7fd7b0d63fa13cb 100644
--- a/apps/user_ldap/l10n/de.php
+++ b/apps/user_ldap/l10n/de.php
@@ -12,7 +12,7 @@ $TRANSLATIONS = array(
"Deletion failed" => "Löschen fehlgeschlagen",
"Take over settings from recent server configuration?" => "Einstellungen von letzter Konfiguration übernehmen?",
"Keep settings?" => "Einstellungen beibehalten?",
-"{nbServer}. Server" => "{nbServer}. Server",
+"{nthServer}. Server" => "{nthServer}. - Server",
"Cannot add server configuration" => "Das Hinzufügen der Serverkonfiguration schlug fehl",
"mappings cleared" => "Zuordnungen gelöscht",
"Success" => "Erfolgreich",
diff --git a/apps/user_ldap/l10n/de_DE.php b/apps/user_ldap/l10n/de_DE.php
index 43cc5e80777e126d32520c83b365f48e667ea73b..4e859e853cd773fd322a0cc5314eb2d1c74ecfc0 100644
--- a/apps/user_ldap/l10n/de_DE.php
+++ b/apps/user_ldap/l10n/de_DE.php
@@ -12,7 +12,7 @@ $TRANSLATIONS = array(
"Deletion failed" => "Löschen fehlgeschlagen",
"Take over settings from recent server configuration?" => "Einstellungen von letzter Konfiguration übernehmen?",
"Keep settings?" => "Einstellungen beibehalten?",
-"{nbServer}. Server" => "{nbServer}. Server",
+"{nthServer}. Server" => "{nthServer}. - Server",
"Cannot add server configuration" => "Das Hinzufügen der Serverkonfiguration schlug fehl",
"mappings cleared" => "Zuordnungen gelöscht",
"Success" => "Erfolg",
diff --git a/apps/user_ldap/l10n/el.php b/apps/user_ldap/l10n/el.php
index bbafe123174d991c4d17d326936e56e401ef29d8..0aec45d52b7077464de8392a0d2046c06e0c187f 100644
--- a/apps/user_ldap/l10n/el.php
+++ b/apps/user_ldap/l10n/el.php
@@ -35,6 +35,7 @@ $TRANSLATIONS = array(
"Could not find the desired feature" => "Αδυναμία εύρεσης επιθυμητου χαρακτηριστικού",
"Server" => "Διακομιστής",
"User Filter" => "Φίλτρο χρηστών",
+"Login Filter" => "Φίλτρο Εισόδου",
"Group Filter" => "Group Filter",
"Save" => "Αποθήκευση",
"Test Configuration" => "Δοκιμαστικες ρυθμισεις",
@@ -52,6 +53,7 @@ $TRANSLATIONS = array(
"Other Attributes:" => "Άλλες Ιδιότητες:",
"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "Ορίζει το φίλτρο που θα εφαρμοστεί, όταν επιχειριθεί σύνδεση. Το %%uid αντικαθιστά το όνομα χρήστη κατά τη σύνδεση. Παράδειγμα: \"uid=%%uid\"",
"1. Server" => "1. Διακομιστής",
+"%s. Server:" => "%s. Διακομιστής:",
"Add Server Configuration" => "Προσθήκη Ρυθμίσεων Διακομιστή",
"Delete Configuration" => "Απαλοιφή ρυθμίσεων",
"Host" => "Διακομιστής",
@@ -68,6 +70,7 @@ $TRANSLATIONS = array(
"users found" => "χρήστες βρέθηκαν",
"Back" => "Επιστροφή",
"Continue" => "Συνέχεια",
+"Expert" => "Ειδικός",
"Advanced" => "Για προχωρημένους",
"
Warning: Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." => "
Προσοχή: Οι εφαρμογές user_ldap και user_webdavauth είναι ασύμβατες. Μπορεί να αντιμετωπίσετε απρόβλεπτη συμπεριφορά. Παρακαλώ ζητήστε από τον διαχειριστή συστήματος να απενεργοποιήσει μία από αυτές.",
"
Warning: The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "
Προσοχή: Το άρθρωμα PHP LDAP δεν είναι εγκατεστημένο και το σύστημα υποστήριξης δεν θα δουλέψει. Παρακαλώ ζητήστε από τον διαχειριστή συστήματος να το εγκαταστήσει.",
diff --git a/apps/user_ldap/l10n/en_GB.php b/apps/user_ldap/l10n/en_GB.php
index 59ff86cb2411762ecae8c910e73fc8c8fdd01a51..b71a7d4f1aa9c3222b7e189907a8cd06e7ccf3e7 100644
--- a/apps/user_ldap/l10n/en_GB.php
+++ b/apps/user_ldap/l10n/en_GB.php
@@ -12,7 +12,6 @@ $TRANSLATIONS = array(
"Deletion failed" => "Deletion failed",
"Take over settings from recent server configuration?" => "Take over settings from recent server configuration?",
"Keep settings?" => "Keep settings?",
-"{nbServer}. Server" => "{nbServer}. Server",
"Cannot add server configuration" => "Cannot add server configuration",
"mappings cleared" => "mappings cleared",
"Success" => "Success",
diff --git a/apps/user_ldap/l10n/es.php b/apps/user_ldap/l10n/es.php
index 50c19f5634caa773dac9ea0228fe1ae2ac3d6368..2ab323d0876c30d85b4249ad2141bd3b0607fdba 100644
--- a/apps/user_ldap/l10n/es.php
+++ b/apps/user_ldap/l10n/es.php
@@ -12,7 +12,6 @@ $TRANSLATIONS = array(
"Deletion failed" => "Falló el borrado",
"Take over settings from recent server configuration?" => "¿Asumir los ajustes actuales de la configuración del servidor?",
"Keep settings?" => "¿Mantener la configuración?",
-"{nbServer}. Server" => "{nbServer}. Servidor",
"Cannot add server configuration" => "No se puede añadir la configuración del servidor",
"mappings cleared" => "Asignaciones borradas",
"Success" => "Éxito",
diff --git a/apps/user_ldap/l10n/et_EE.php b/apps/user_ldap/l10n/et_EE.php
index 3af3915588a75fecf7a1a99d80ac9988350e8714..604e5e890ed7c91c3aebdb1c86bff716cf22ba07 100644
--- a/apps/user_ldap/l10n/et_EE.php
+++ b/apps/user_ldap/l10n/et_EE.php
@@ -12,7 +12,6 @@ $TRANSLATIONS = array(
"Deletion failed" => "Kustutamine ebaõnnestus",
"Take over settings from recent server configuration?" => "Võta sätted viimasest serveri seadistusest?",
"Keep settings?" => "Säilitada seadistused?",
-"{nbServer}. Server" => "{nbServer}. Server",
"Cannot add server configuration" => "Ei suuda lisada serveri seadistust",
"mappings cleared" => "vastendused puhastatud",
"Success" => "Korras",
diff --git a/apps/user_ldap/l10n/fi_FI.php b/apps/user_ldap/l10n/fi_FI.php
index f558fa78977510bba6954c7da46095155a1f678b..2fedc2a9460d13d8c70fa0098af2dec2ba4701a0 100644
--- a/apps/user_ldap/l10n/fi_FI.php
+++ b/apps/user_ldap/l10n/fi_FI.php
@@ -3,6 +3,7 @@ $TRANSLATIONS = array(
"Failed to delete the server configuration" => "Palvelinmäärityksen poistaminen epäonnistui",
"The configuration is valid and the connection could be established!" => "Määritys on kelvollinen ja yhteys kyettiin muodostamaan!",
"Deletion failed" => "Poisto epäonnistui",
+"Take over settings from recent server configuration?" => "Otetaanko asetukset viimeisimmistä palvelinmäärityksistä?",
"Keep settings?" => "Säilytetäänkö asetukset?",
"Cannot add server configuration" => "Palvelinasetusten lisäys epäonnistui",
"Success" => "Onnistui!",
@@ -42,6 +43,7 @@ $TRANSLATIONS = array(
"Back" => "Takaisin",
"Continue" => "Jatka",
"Advanced" => "Lisäasetukset",
+"
Warning: The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "
Varoitus: PHP:n LDAP-moduulia ei ole asennettu, taustaosa ei toimi. Pyydä järjestelmän ylläpitäjää asentamaan se.",
"Connection Settings" => "Yhteysasetukset",
"Backup (Replica) Port" => "Varmuuskopioinnin (replikoinnin) portti",
"Disable Main Server" => "Poista pääpalvelin käytöstä",
diff --git a/apps/user_ldap/l10n/fr.php b/apps/user_ldap/l10n/fr.php
index 97b8387f2f1eedcee066f7b044e3f997ddc35911..8e125aabeae087eadd3593fd41ebf6897da7caf3 100644
--- a/apps/user_ldap/l10n/fr.php
+++ b/apps/user_ldap/l10n/fr.php
@@ -12,7 +12,6 @@ $TRANSLATIONS = array(
"Deletion failed" => "La suppression a échoué",
"Take over settings from recent server configuration?" => "Récupérer les paramètres depuis une configuration récente du serveur ?",
"Keep settings?" => "Garder ces paramètres ?",
-"{nbServer}. Server" => "{nbServer}. Serveur",
"Cannot add server configuration" => "Impossible d'ajouter la configuration du serveur",
"mappings cleared" => "associations supprimées",
"Success" => "Succès",
diff --git a/apps/user_ldap/l10n/gl.php b/apps/user_ldap/l10n/gl.php
index 07c99e32bc4419a89f882462b35ddf617f2e50ec..6906ea5e751f3f43c52fbe1dba8c4f6a3a03e1ba 100644
--- a/apps/user_ldap/l10n/gl.php
+++ b/apps/user_ldap/l10n/gl.php
@@ -12,7 +12,7 @@ $TRANSLATIONS = array(
"Deletion failed" => "Produciuse un fallo ao eliminar",
"Take over settings from recent server configuration?" => "Tomar os recentes axustes de configuración do servidor?",
"Keep settings?" => "Manter os axustes?",
-"{nbServer}. Server" => "{nbServer}. Servidor",
+"{nthServer}. Server" => "{nthServer}. Servidor",
"Cannot add server configuration" => "Non é posíbel engadir a configuración do servidor",
"mappings cleared" => "limpadas as asignacións",
"Success" => "Correcto",
@@ -120,7 +120,7 @@ $TRANSLATIONS = array(
"UUID Attribute for Users:" => "Atributo do UUID para usuarios:",
"UUID Attribute for Groups:" => "Atributo do UUID para grupos:",
"Username-LDAP User Mapping" => "Asignación do usuario ao «nome de usuario LDAP»",
-"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "Os nomes de usuario empreganse para almacenar e asignar (meta) datos. Coa fin de identificar con precisión e recoñecer aos usuarios, cada usuario LDAP terá un nome de usuario interno. Isto require unha asignación de ownCloud nome de usuario a usuario LDAP. O nome de usuario creado asignase ao UUID do usuario LDAP. Ademais o DN almacenase na caché, para así reducir a interacción do LDAP, mais non se utiliza para a identificación. Se o DN cambia, os cambios poden ser atopados polo ownCloud. O nome interno no ownCloud utilizase en todo o ownCloud. A limpeza das asignacións deixará rastros en todas partes. A limpeza das asignacións non é sensíbel á configuración, afecta a todas as configuracións de LDAP! Non limpar nunca as asignacións nun entorno de produción. Limpar as asignacións só en fases de proba ou experimentais.",
+"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "Os nomes de usuario empréganse para almacenar e asignar (meta) datos. Coa fin de identificar con precisión e recoñecer aos usuarios, cada usuario LDAP terá un nome de usuario interno. Isto require unha asignación de ownCloud nome de usuario a usuario LDAP. O nome de usuario creado asignase ao UUID do usuario LDAP. Ademais o DN almacenase na caché, para así reducir a interacción do LDAP, mais non se utiliza para a identificación. Se o DN cambia, os cambios poden ser atopados polo ownCloud. O nome interno no ownCloud utilizase en todo o ownCloud. A limpeza das asignacións deixará rastros en todas partes. A limpeza das asignacións non é sensíbel á configuración, afecta a todas as configuracións de LDAP! Non limpar nunca as asignacións nun entorno de produción. Limpar as asignacións só en fases de proba ou experimentais.",
"Clear Username-LDAP User Mapping" => "Limpar a asignación do usuario ao «nome de usuario LDAP»",
"Clear Groupname-LDAP Group Mapping" => "Limpar a asignación do grupo ao «nome de grupo LDAP»"
);
diff --git a/apps/user_ldap/l10n/it.php b/apps/user_ldap/l10n/it.php
index 23ced96cf8cbb8d26bb924c18dc4053be164c71b..8750c8d7f69a18be01f364c44da69e94f0480ad0 100644
--- a/apps/user_ldap/l10n/it.php
+++ b/apps/user_ldap/l10n/it.php
@@ -12,7 +12,7 @@ $TRANSLATIONS = array(
"Deletion failed" => "Eliminazione non riuscita",
"Take over settings from recent server configuration?" => "Vuoi recuperare le impostazioni dalla configurazione recente del server?",
"Keep settings?" => "Vuoi mantenere le impostazioni?",
-"{nbServer}. Server" => "{nbServer}. server",
+"{nthServer}. Server" => "{nthServer}. server",
"Cannot add server configuration" => "Impossibile aggiungere la configurazione del server",
"mappings cleared" => "associazioni cancellate",
"Success" => "Riuscito",
diff --git a/apps/user_ldap/l10n/ja.php b/apps/user_ldap/l10n/ja.php
index eb85c055eff0ccd130a2570fc2b4449d56397534..135ffece2db333077442049edcf15803f559463c 100644
--- a/apps/user_ldap/l10n/ja.php
+++ b/apps/user_ldap/l10n/ja.php
@@ -12,10 +12,12 @@ $TRANSLATIONS = array(
"Deletion failed" => "削除に失敗しました",
"Take over settings from recent server configuration?" => "最近のサーバー設定から設定を引き継ぎますか?",
"Keep settings?" => "設定を保持しますか?",
+"{nthServer}. Server" => "{nthServer}. サーバー",
"Cannot add server configuration" => "サーバー設定を追加できません",
"mappings cleared" => "マッピングをクリアしました",
"Success" => "成功",
"Error" => "エラー",
+"Please specify the port" => "ポートを指定してください",
"Configuration OK" => "設定OK",
"Configuration incorrect" => "設定に誤りがあります",
"Configuration incomplete" => "設定が不完全です",
@@ -30,6 +32,9 @@ $TRANSLATIONS = array(
"_%s user found_::_%s users found_" => array("%s ユーザーが見つかりました"),
"Invalid Host" => "無効なホスト",
"Could not find the desired feature" => "望ましい機能は見つかりませんでした",
+"Server" => "サーバー",
+"User Filter" => "ユーザーフィルター",
+"Login Filter" => "ログインフィルター",
"Group Filter" => "グループフィルタ",
"Save" => "保存",
"Test Configuration" => "設定をテスト",
@@ -43,10 +48,12 @@ $TRANSLATIONS = array(
"groups found" => "グループが見つかりました",
"Users login with this attribute:" => "この属性でユーザーログイン:",
"LDAP Username:" => "LDAP ユーザー名:",
-"LDAP Email Address:" => "LDAP メールアドレス:",
+"LDAP Email Address:" => "LDAPメールアドレス:",
"Other Attributes:" => "他の属性:",
"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "ログイン実行時に適用するフィルタを定義します。%%uid にはログイン操作におけるユーザー名が入ります。例: \"uid=%%uid\"",
+"1. Server" => "1. Server",
"Add Server Configuration" => "サーバー設定を追加",
+"Delete Configuration" => "設定を削除",
"Host" => "ホスト",
"You can omit the protocol, except you require SSL. Then start with ldaps://" => "SSL通信しない場合には、プロトコル名を省略することができます。そうでない場合には、ldaps:// から始めてください。",
"Port" => "ポート",
@@ -56,7 +63,7 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "匿名アクセスの場合は、DNとパスワードを空にしてください。",
"One Base DN per line" => "1行に1つのベースDN",
"You can specify Base DN for users and groups in the Advanced tab" => "拡張タブでユーザーとグループのベースDNを指定することができます。",
-"Limit %s access to users meeting these criteria:" => "この基準を満たすユーザに対し %s へのアクセスを制限:",
+"Limit %s access to users meeting these criteria:" => "この基準を満たすユーザーに対し %s へのアクセスを制限:",
"The filter specifies which LDAP users shall have access to the %s instance." => "フィルタは、どのLDAPユーザーが %s にアクセスするかを指定します。",
"users found" => "ユーザーが見つかりました",
"Back" => "戻る",
@@ -72,7 +79,7 @@ $TRANSLATIONS = array(
"Backup (Replica) Port" => "バックアップ(レプリカ)ポート",
"Disable Main Server" => "メインサーバーを無効にする",
"Only connect to the replica server." => "レプリカサーバーにのみ接続します。",
-"Case insensitive LDAP server (Windows)" => "大文字と小文字を区別しない LDAP サーバ (Windows)",
+"Case insensitive LDAP server (Windows)" => "大文字と小文字を区別しないLDAPサーバー (Windows)",
"Turn off SSL certificate validation." => "SSL証明書の確認を無効にする。",
"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." => "推奨されません、テストにおいてのみ使用してください!このオプションでのみ接続が動作する場合は、LDAP サーバーのSSL証明書を %s サーバーにインポートしてください。",
"Cache Time-To-Live" => "キャッシュのTTL",
@@ -85,7 +92,7 @@ $TRANSLATIONS = array(
"User Search Attributes" => "ユーザー検索属性",
"Optional; one attribute per line" => "オプション:1行に1属性",
"Group Display Name Field" => "グループ表示名のフィールド",
-"The LDAP attribute to use to generate the groups's display name." => "ユーザのグループ表示名の生成に利用するLDAP属性",
+"The LDAP attribute to use to generate the groups's display name." => "ユーザーのグループ表示名の生成に利用するLDAP属性",
"Base Group Tree" => "ベースグループツリー",
"One Group Base DN per line" => "1行に1つのグループベースDN",
"Group Search Attributes" => "グループ検索属性",
@@ -106,7 +113,7 @@ $TRANSLATIONS = array(
"Internal Username Attribute:" => "内部ユーザー名属性:",
"Override UUID detection" => "UUID検出を再定義する",
"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." => "デフォルトでは、UUID 属性は自動的に検出されます。UUID属性は、LDAPユーザーとLDAPグループを間違いなく識別するために利用されます。また、もしこれを指定しない場合は、内部ユーザー名はUUIDに基づいて作成されます。この設定は再定義することができ、あなたの選択した属性を用いることができます。選択した属性がユーザーとグループの両方に対して適用でき、かつユニークであることを確認してください。空であればデフォルトの振る舞いとなります。変更は、新しくマッピング(追加)されたLDAPユーザーとLDAPグループに対してのみ有効となります。",
-"UUID Attribute for Users:" => "ユーザーの UUID 属性:",
+"UUID Attribute for Users:" => "ユーザーのUUID属性:",
"UUID Attribute for Groups:" => "グループの UUID 属性:",
"Username-LDAP User Mapping" => "ユーザー名とLDAPユーザのマッピング",
"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "ユーザー名は(メタ)データの保存と割り当てに使用されます。ユーザーを正確に識別して認識するために、個々のLDAPユーザは内部ユーザ名を持っています。これは、ユーザー名からLDAPユーザーへのマッピングが必要であることを意味しています。この生成されたユーザ名は、LDAPユーザのUUIDにマッピングされます。加えて、DNがLDAPとのインタラクションを削減するためにキャッシュされますが、識別には利用されません。DNが変わった場合は、変更が検出されます。内部ユーザ名は全体に亘って利用されます。マッピングをクリアすると、いたるところに使われないままの物が残るでしょう。マッピングのクリアは設定に敏感ではありませんが、全てのLDAPの設定に影響を与えます!本番の環境では決してマッピングをクリアしないでください。テストもしくは実験の段階でのみマッピングのクリアを行なってください。",
diff --git a/apps/user_ldap/l10n/nb_NO.php b/apps/user_ldap/l10n/nb_NO.php
index 0cb94eb27fd65eab11378e8b2594ad22bd9105c4..bbfaa9f97c68000d89f7dd8620b7bc834148c13b 100644
--- a/apps/user_ldap/l10n/nb_NO.php
+++ b/apps/user_ldap/l10n/nb_NO.php
@@ -12,7 +12,6 @@ $TRANSLATIONS = array(
"Deletion failed" => "Sletting mislyktes",
"Take over settings from recent server configuration?" => "Hent innstillinger fra tidligere tjener-konfigurasjon?",
"Keep settings?" => "Behold innstillinger?",
-"{nbServer}. Server" => "{nbServer}. Server",
"Cannot add server configuration" => "Kan ikke legge til tjener-konfigurasjon",
"mappings cleared" => "tilknytninger nullstilt",
"Success" => "Suksess",
diff --git a/apps/user_ldap/l10n/nl.php b/apps/user_ldap/l10n/nl.php
index 8b9c5bc672d0bec4d4e70e343696400f4e19e19c..8e0495e50a28a651189db3c351fbda44c18b6558 100644
--- a/apps/user_ldap/l10n/nl.php
+++ b/apps/user_ldap/l10n/nl.php
@@ -12,7 +12,6 @@ $TRANSLATIONS = array(
"Deletion failed" => "Verwijderen mislukt",
"Take over settings from recent server configuration?" => "Overnemen instellingen van de recente serverconfiguratie?",
"Keep settings?" => "Instellingen bewaren?",
-"{nbServer}. Server" => "{nbServer}. Server",
"Cannot add server configuration" => "Kon de serverconfiguratie niet toevoegen",
"mappings cleared" => "vertaaltabel leeggemaakt",
"Success" => "Succes",
diff --git a/apps/user_ldap/l10n/pl.php b/apps/user_ldap/l10n/pl.php
index 4b23dc7a2382626da1f5299be22462e8cd8504c6..c9d696e40504a00db1dd24b617724eea4d14ce40 100644
--- a/apps/user_ldap/l10n/pl.php
+++ b/apps/user_ldap/l10n/pl.php
@@ -12,11 +12,13 @@ $TRANSLATIONS = array(
"Deletion failed" => "Usunięcie nie powiodło się",
"Take over settings from recent server configuration?" => "Przejmij ustawienia z ostatnich konfiguracji serwera?",
"Keep settings?" => "Zachować ustawienia?",
-"{nbServer}. Server" => "{nbServer}. Serwer",
"Cannot add server configuration" => "Nie można dodać konfiguracji serwera",
"mappings cleared" => "Mapoanie wyczyszczone",
"Success" => "Sukces",
"Error" => "Błąd",
+"Please specify a Base DN" => "Proszę podać bazowy DN",
+"Could not determine Base DN" => "Nie można ustalić bazowego DN",
+"Please specify the port" => "Proszę podać port",
"Configuration OK" => "Konfiguracja poprawna",
"Configuration incorrect" => "Konfiguracja niepoprawna",
"Configuration incomplete" => "Konfiguracja niekompletna",
diff --git a/apps/user_ldap/l10n/pt_BR.php b/apps/user_ldap/l10n/pt_BR.php
index f9916a2cefad870d80ade7a24187dbb5cc57bb11..77c9f5077d3ba83f8b2a51ed800d345549b079bf 100644
--- a/apps/user_ldap/l10n/pt_BR.php
+++ b/apps/user_ldap/l10n/pt_BR.php
@@ -12,7 +12,6 @@ $TRANSLATIONS = array(
"Deletion failed" => "Remoção falhou",
"Take over settings from recent server configuration?" => "Tomar parámetros de recente configuração de servidor?",
"Keep settings?" => "Manter ajustes?",
-"{nbServer}. Server" => "{nbServer}. Servidor",
"Cannot add server configuration" => "Impossível adicionar a configuração do servidor",
"mappings cleared" => "mapeamentos limpos",
"Success" => "Sucesso",
diff --git a/apps/user_ldap/l10n/pt_PT.php b/apps/user_ldap/l10n/pt_PT.php
index 09b1935c8c1aa5d81b77751a454574bdfec71005..65f49d45dfedebd72c0ffaec83381792badf7c6d 100644
--- a/apps/user_ldap/l10n/pt_PT.php
+++ b/apps/user_ldap/l10n/pt_PT.php
@@ -16,6 +16,9 @@ $TRANSLATIONS = array(
"mappings cleared" => "Mapas limpos",
"Success" => "Sucesso",
"Error" => "Erro",
+"Please specify a Base DN" => "Por favor indique a Base DN",
+"Could not determine Base DN" => "Não foi possível determinar a Base DN",
+"Please specify the port" => "Por favor indique a porta",
"Configuration OK" => "Configuração OK",
"Configuration incorrect" => "Configuração incorreta",
"Configuration incomplete" => "Configuração incompleta",
@@ -30,6 +33,9 @@ $TRANSLATIONS = array(
"_%s user found_::_%s users found_" => array("%s utilizador encontrado","%s utilizadores encontrados"),
"Invalid Host" => "Hospedeiro Inválido",
"Could not find the desired feature" => "Não se encontrou a função desejada",
+"Server" => "Servidor",
+"User Filter" => "Filtro de utilizadores",
+"Login Filter" => "Filtro de Login",
"Group Filter" => "Filtrar por grupo",
"Save" => "Guardar",
"Test Configuration" => "Testar a configuração",
@@ -44,7 +50,10 @@ $TRANSLATIONS = array(
"LDAP Email Address:" => "Endereço de correio eletrónico LDAP:",
"Other Attributes:" => "Outros Atributos:",
"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "Define o filtro a aplicar, quando se tenta uma sessão. %%uid substitui o nome de utilizador na ação de início de sessão. Exemplo: \"uid=%%uid\"",
+"1. Server" => "1. Servidor",
+"%s. Server:" => "%s. Servvidor",
"Add Server Configuration" => "Adicionar configurações do servidor",
+"Delete Configuration" => "Apagar Configuração",
"Host" => "Anfitrião",
"You can omit the protocol, except you require SSL. Then start with ldaps://" => "Pode omitir o protocolo, excepto se necessitar de SSL. Neste caso, comece com ldaps://",
"Port" => "Porto",
@@ -55,9 +64,11 @@ $TRANSLATIONS = array(
"One Base DN per line" => "Uma base DN por linho",
"You can specify Base DN for users and groups in the Advanced tab" => "Pode especificar o ND Base para utilizadores e grupos no separador Avançado",
"Limit %s access to users meeting these criteria:" => "Limitar o acesso a %s de utilizadores com estes critérios:",
+"The filter specifies which LDAP users shall have access to the %s instance." => "O filtro especifica quais utilizadores do LDAP devem ter acesso à instância %s.",
"users found" => "utilizadores encontrados",
"Back" => "Voltar",
"Continue" => "Continuar",
+"Expert" => "Perito",
"Advanced" => "Avançado",
"
Warning: Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." => "
Aviso: A aplicação user_ldap e user_webdavauth são incompativeis. A aplicação pode tornar-se instável. Por favor, peça ao seu administrador para desactivar uma das aplicações.",
"
Warning: The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "
Aviso: O módulo PHP LDAP não está instalado, logo não irá funcionar. Por favor peça ao administrador para o instalar.",
@@ -69,6 +80,7 @@ $TRANSLATIONS = array(
"Backup (Replica) Port" => "Porta do servidor de backup (Replica)",
"Disable Main Server" => "Desactivar servidor principal",
"Only connect to the replica server." => "Ligar apenas ao servidor de réplicas.",
+"Case insensitive LDAP server (Windows)" => "Servidor LDAP (Windows) não é sensível a maiúsculas.",
"Turn off SSL certificate validation." => "Desligar a validação de certificado SSL.",
"Cache Time-To-Live" => "Cache do tempo de vida dos objetos no servidor",
"in seconds. A change empties the cache." => "em segundos. Uma alteração esvazia a cache.",
diff --git a/apps/user_ldap/l10n/ru.php b/apps/user_ldap/l10n/ru.php
index 04b8a25945d2fa70640ab23a1f6e0b22708b3f8f..547cce15273c30795cd2f7c07c7c216462605eb8 100644
--- a/apps/user_ldap/l10n/ru.php
+++ b/apps/user_ldap/l10n/ru.php
@@ -12,7 +12,6 @@ $TRANSLATIONS = array(
"Deletion failed" => "Удаление не удалось",
"Take over settings from recent server configuration?" => "Принять настройки из последней конфигурации сервера?",
"Keep settings?" => "Сохранить настройки?",
-"{nbServer}. Server" => "{nbServer}. Сервер",
"Cannot add server configuration" => "Не получилось добавить конфигурацию сервера",
"mappings cleared" => "Соответствия очищены",
"Success" => "Успешно",
diff --git a/apps/user_ldap/l10n/sv.php b/apps/user_ldap/l10n/sv.php
index 8204c604ad10ea3ec3ec76d72908fd2510757190..5655f8de22738bd44358b77e90ddd1c2d79348ed 100644
--- a/apps/user_ldap/l10n/sv.php
+++ b/apps/user_ldap/l10n/sv.php
@@ -12,7 +12,6 @@ $TRANSLATIONS = array(
"Deletion failed" => "Raderingen misslyckades",
"Take over settings from recent server configuration?" => "Ta över inställningar från tidigare serverkonfiguration?",
"Keep settings?" => "Behåll inställningarna?",
-"{nbServer}. Server" => "{nbServer}. Server",
"Cannot add server configuration" => "Kunde inte lägga till serverinställning",
"mappings cleared" => "mappningar rensade",
"Success" => "Lyckat",
diff --git a/apps/user_ldap/l10n/tr.php b/apps/user_ldap/l10n/tr.php
index 5a575de98097471110b8484ceea834ab727861ad..e5d855751ccad4cf7700274ba9107985a7319a68 100644
--- a/apps/user_ldap/l10n/tr.php
+++ b/apps/user_ldap/l10n/tr.php
@@ -12,7 +12,7 @@ $TRANSLATIONS = array(
"Deletion failed" => "Silme başarısız oldu",
"Take over settings from recent server configuration?" => "Ayarlar son sunucu yapılandırmalarından devralınsın mı?",
"Keep settings?" => "Ayarlar korunsun mu?",
-"{nbServer}. Server" => "{nbServer}. Sunucu",
+"{nthServer}. Server" => "{nthServer}. Sunucu",
"Cannot add server configuration" => "Sunucu yapılandırması eklenemedi",
"mappings cleared" => "eşleştirmeler temizlendi",
"Success" => "Başarılı",
diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php
index 78de14f4ee9848c133d5ee610e5de2d6e444b70f..d488d2da1292ef6fbb3a6bd5df26d8a50816aa1c 100644
--- a/apps/user_ldap/lib/access.php
+++ b/apps/user_ldap/lib/access.php
@@ -27,20 +27,21 @@ namespace OCA\user_ldap\lib;
* Class Access
* @package OCA\user_ldap\lib
*/
-class Access extends LDAPUtility {
+class Access extends LDAPUtility implements user\IUserTools {
public $connection;
+ public $userManager;
//never ever check this var directly, always use getPagedSearchResultState
protected $pagedSearchedSuccessful;
protected $cookies = array();
- /**
- * @param Connection $connection
- * @param ILDAPWrapper $ldap
- */
- public function __construct(Connection $connection, ILDAPWrapper $ldap) {
+
+ public function __construct(Connection $connection, ILDAPWrapper $ldap,
+ user\Manager $userManager) {
parent::__construct($ldap);
$this->connection = $connection;
+ $this->userManager = $userManager;
+ $this->userManager->setLdapAccess($this);
}
/**
@@ -50,10 +51,18 @@ class Access extends LDAPUtility {
return ($this->connection instanceof Connection);
}
+ /**
+ * returns the Connection instance
+ * @return \OCA\user_ldap\lib\Connection
+ */
+ public function getConnection() {
+ return $this->connection;
+ }
+
/**
* reads a given attribute for an LDAP record identified by a DN
- * @param string $dn the record in question
- * @param string $attr the attribute that shall be retrieved
+ * @param $dn the record in question
+ * @param $attr the attribute that shall be retrieved
* if empty, just check the record's existence
* @param string $filter
* @return array|false an array of values on success or an empty
@@ -626,6 +635,12 @@ class Access extends LDAPUtility {
return false;
}
+ if($isUser) {
+ //make sure that email address is retrieved prior to login, so user
+ //will be notified when something is shared with him
+ $this->userManager->get($ocname)->update();
+ }
+
return true;
}
diff --git a/apps/user_ldap/lib/configuration.php b/apps/user_ldap/lib/configuration.php
index 9c455929b4a1784b88f895e5f14ee25672a3e082..4cb00561b3f32469e94316247e2a670394c9aa0d 100644
--- a/apps/user_ldap/lib/configuration.php
+++ b/apps/user_ldap/lib/configuration.php
@@ -272,7 +272,7 @@ class Configuration {
if(empty($value)) {
$value = '';
} else if (!is_array($value)) {
- $value = preg_split('/\r\n|\r|\n/', $value);
+ $value = preg_split('/\r\n|\r|\n|;/', $value);
if($value === false) {
$value = '';
}
diff --git a/apps/user_ldap/lib/filesystemhelper.php b/apps/user_ldap/lib/filesystemhelper.php
new file mode 100644
index 0000000000000000000000000000000000000000..abf0e8a7b5935aa072b11a2c309a056c7899e740
--- /dev/null
+++ b/apps/user_ldap/lib/filesystemhelper.php
@@ -0,0 +1,46 @@
+.
+ *
+ */
+
+namespace OCA\user_ldap\lib;
+
+/**
+ * @brief wraps around static ownCloud core methods
+ */
+class FilesystemHelper {
+
+ /**
+ * @brief states whether the filesystem was loaded
+ * @return bool
+ */
+ public function isLoaded() {
+ return \OC\Files\Filesystem::$loaded;
+ }
+
+ /**
+ * @brief initializes the filesystem for the given user
+ * @param string the ownCloud username of the user
+ */
+ public function setup($uid) {
+ \OC_Util::setupFS($uid);
+ }
+}
diff --git a/apps/user_ldap/lib/logwrapper.php b/apps/user_ldap/lib/logwrapper.php
new file mode 100644
index 0000000000000000000000000000000000000000..4826cb0358582d86506787c1b7b064eaf4323f52
--- /dev/null
+++ b/apps/user_ldap/lib/logwrapper.php
@@ -0,0 +1,39 @@
+.
+ *
+ */
+
+namespace OCA\user_ldap\lib;
+
+/**
+ * @brief wraps around static ownCloud core methods
+ */
+class LogWrapper {
+ protected $app = 'user_ldap';
+
+ /**
+ * @brief states whether the filesystem was loaded
+ * @return bool
+ */
+ public function log($msg, $level) {
+ \OCP\Util::writeLog($this->app, $msg, $level);
+ }
+}
diff --git a/apps/user_ldap/lib/proxy.php b/apps/user_ldap/lib/proxy.php
index d15d1ae861630197424d2bc47e42805093e80b99..73a52a7ddd9040eb75f593e9828292ed8d65684f 100644
--- a/apps/user_ldap/lib/proxy.php
+++ b/apps/user_ldap/lib/proxy.php
@@ -41,8 +41,21 @@ abstract class Proxy {
* @param string $configPrefix
*/
private function addAccess($configPrefix) {
+ static $ocConfig;
+ static $fs;
+ static $log;
+ static $avatarM;
+ if(is_null($fs)) {
+ $ocConfig = \OC::$server->getConfig();
+ $fs = new FilesystemHelper();
+ $log = new LogWrapper();
+ $avatarM = \OC::$server->getAvatarManager();
+ }
+ $userManager =
+ new user\Manager($ocConfig, $fs, $log, $avatarM, new \OCP\Image());
$connector = new Connection($this->ldap, $configPrefix);
- self::$accesses[$configPrefix] = new Access($connector, $this->ldap);
+ self::$accesses[$configPrefix] =
+ new Access($connector, $this->ldap, $userManager);
}
/**
diff --git a/apps/user_ldap/lib/user/iusertools.php b/apps/user_ldap/lib/user/iusertools.php
new file mode 100644
index 0000000000000000000000000000000000000000..e409f3afed34460f03bfe63c475d4101ddfd365a
--- /dev/null
+++ b/apps/user_ldap/lib/user/iusertools.php
@@ -0,0 +1,40 @@
+.
+ *
+ */
+
+namespace OCA\user_ldap\lib\user;
+
+/**
+ * IUserTools
+ *
+ * defines methods that are required by User class for LDAP interaction
+ */
+interface IUserTools {
+ public function getConnection();
+
+ public function readAttribute($dn, $attr, $filter = 'objectClass=*');
+
+ public function dn2username($dn, $ldapname = null);
+
+ public function username2dn($name);
+
+}
diff --git a/apps/user_ldap/lib/user/manager.php b/apps/user_ldap/lib/user/manager.php
new file mode 100644
index 0000000000000000000000000000000000000000..6c635518d95552f945ee3b11c38194251dc16e8c
--- /dev/null
+++ b/apps/user_ldap/lib/user/manager.php
@@ -0,0 +1,167 @@
+.
+ *
+ */
+
+namespace OCA\user_ldap\lib\user;
+
+use OCA\user_ldap\lib\user\IUserTools;
+use OCA\user_ldap\lib\user\User;
+use OCA\user_ldap\lib\LogWrapper;
+use OCA\user_ldap\lib\FilesystemHelper;
+
+/**
+ * Manager
+ *
+ * upon request, returns an LDAP user object either by creating or from run-time
+ * cache
+ */
+class Manager {
+ /**
+ * @var IUserTools
+ */
+ protected $access;
+ /**
+ * @var \OCP\IConfig
+ */
+ protected $ocConfig;
+ /**
+ * @var FilesystemHelper
+ */
+ protected $ocFilesystem;
+ /**
+ * @var LogWrapper
+ */
+ protected $ocLog;
+ /**
+ * @var \OCP\Image
+ */
+ protected $image;
+ /**
+ * @param \OCP\IAvatarManager
+ */
+ protected $avatarManager;
+ /**
+ * @var string[][]
+ */
+ protected $users = array(
+ 'byDN' => array(),
+ 'byUid' => array(),
+ );
+
+ /**
+ * @brief Constructor
+ * @param \OCP\IConfig respectively an instance that provides the methods
+ * setUserValue and getUserValue as implemented in \OCP\Config
+ * @param \OCA\user_ldap\lib\FilesystemHelper object that gives access to
+ * necessary functions from the OC filesystem
+ * @param \OCA\user_ldap\lib\LogWrapper
+ * @param \OCP\IAvatarManager
+ * @param \OCP\Image an empty image instance
+ * @throws Exception when the methods mentioned above do not exist
+ */
+ public function __construct(\OCP\IConfig $ocConfig,
+ FilesystemHelper $ocFilesystem, LogWrapper $ocLog,
+ \OCP\IAvatarManager $avatarManager, \OCP\Image $image) {
+
+ if(!method_exists($ocConfig, 'setUserValue')
+ || !method_exists($ocConfig, 'getUserValue')) {
+ throw new \Exception('Invalid ownCloud User Config object');
+ }
+ $this->ocConfig = $ocConfig;
+ $this->ocFilesystem = $ocFilesystem;
+ $this->ocLog = $ocLog;
+ $this->avatarManager = $avatarManager;
+ $this->image = $image;
+ }
+
+ /**
+ * @brief binds manager to an instance of IUserTools (implemented by
+ * Access). It needs to be assigned first before the manager can be used.
+ * @param IUserTools
+ */
+ public function setLdapAccess(IUserTools $access) {
+ $this->access = $access;
+ }
+
+ /**
+ * @brief creates an instance of User and caches (just runtime) it in the
+ * property array
+ * @param string the DN of the user
+ * @param string the internal (owncloud) username
+ * @return \OCA\user_ldap\lib\User
+ */
+ private function createAndCache($dn, $uid) {
+ $this->checkAccess();
+ $user = new User($uid, $dn, $this->access, $this->ocConfig,
+ $this->ocFilesystem, clone $this->image, $this->ocLog,
+ $this->avatarManager);
+ $users['byDN'][$dn] = $user;
+ $users['byUid'][$uid] = $user;
+ return $user;
+ }
+
+ /**
+ * @brief checks whether the Access instance has been set
+ * @throws Exception if Access has not been set
+ * @return null
+ */
+ private function checkAccess() {
+ if(is_null($this->access)) {
+ throw new \Exception('LDAP Access instance must be set first');
+ }
+ }
+
+ /**
+ * @brief returns a User object by it's DN or ownCloud username
+ * @param string the DN or username of the user
+ * @return \OCA\user_ldap\lib\User | null
+ */
+ public function get($id) {
+ $this->checkAccess();
+ if(isset($this->users['byDN'][$id])) {
+ return $this->users['byDN'][$id];
+ } else if(isset($this->users['byUid'][$id])) {
+ return $this->users['byUid'][$id];
+ }
+
+ if(strpos(mb_strtolower($id, 'UTF-8'), 'dc=') === false) {
+ //most likely a uid
+ $dn = $this->access->username2dn($id);
+ if($dn !== false) {
+ return $this->createAndCache($dn, $id);
+ }
+ } else {
+ //so it's a DN
+ $uid = $this->access->dn2username($id);
+ if($uid !== false) {
+ return $this->createAndCache($id, $uid);
+ }
+ }
+ //either funny uid or invalid. Assume funny to be on the safe side.
+ $dn = $this->access->username2dn($id);
+ if($dn !== false) {
+ return $this->createAndCache($dn, $id);
+ }
+ return null;
+ }
+
+}
diff --git a/apps/user_ldap/lib/user/user.php b/apps/user_ldap/lib/user/user.php
new file mode 100644
index 0000000000000000000000000000000000000000..d4d2294307dbcc1ac15cedd567935b8ea2aad636
--- /dev/null
+++ b/apps/user_ldap/lib/user/user.php
@@ -0,0 +1,324 @@
+.
+ *
+ */
+
+namespace OCA\user_ldap\lib\user;
+
+use OCA\user_ldap\lib\user\IUserTools;
+use OCA\user_ldap\lib\Connection;
+use OCA\user_ldap\lib\FilesystemHelper;
+use OCA\user_ldap\lib\LogWrapper;
+
+/**
+ * User
+ *
+ * represents an LDAP user, gets and holds user-specific information from LDAP
+ */
+class User {
+ /**
+ * @var IUserTools
+ */
+ protected $access;
+ /**
+ * @var Connection
+ */
+ protected $connection;
+ /**
+ * @var \OCP\IConfig
+ */
+ protected $config;
+ /**
+ * @var FilesystemHelper
+ */
+ protected $fs;
+ /**
+ * @var \OCP\Image
+ */
+ protected $image;
+ /**
+ * @var LogWrapper
+ */
+ protected $log;
+ /**
+ * @var \OCP\IAvatarManager
+ */
+ protected $avatarManager;
+
+ /**
+ * @var string
+ */
+ protected $dn;
+ /**
+ * @var string
+ */
+ protected $uid;
+ /**
+ * @var string[]
+ */
+ protected $refreshedFeatures = array();
+ /**
+ * @var string
+ */
+ protected $avatarImage;
+
+ /**
+ * DB config keys for user preferences
+ */
+ const USER_PREFKEY_FIRSTLOGIN = 'firstLoginAccomplished';
+ const USER_PREFKEY_LASTREFRESH = 'lastFeatureRefresh';
+
+ /**
+ * @brief constructor, make sure the subclasses call this one!
+ * @param string the internal username
+ * @param string the LDAP DN
+ * @param IUserTools $access an instance that implements IUserTools for
+ * LDAP interaction
+ * @param \OCP\Config
+ * @param FilesystemHelper
+ * @param \OCP\Image any empty instance
+ * @param LogWrapper
+ * @param \OCP\IAvatarManager
+ */
+ public function __construct($username, $dn, IUserTools $access,
+ \OCP\IConfig $config, FilesystemHelper $fs, \OCP\Image $image,
+ LogWrapper $log, \OCP\IAvatarManager $avatarManager) {
+
+ $this->access = $access;
+ $this->connection = $access->getConnection();
+ $this->config = $config;
+ $this->fs = $fs;
+ $this->dn = $dn;
+ $this->uid = $username;
+ $this->image = $image;
+ $this->log = $log;
+ $this->avatarManager = $avatarManager;
+ }
+
+ /**
+ * @brief updates properties like email, quota or avatar provided by LDAP
+ * @return null
+ */
+ public function update() {
+ if(is_null($this->dn)) {
+ return null;
+ }
+
+ $hasLoggedIn = $this->config->getUserValue($this->uid, 'user_ldap',
+ self::USER_PREFKEY_FIRSTLOGIN, 0);
+
+ if($this->needsRefresh()) {
+ $this->updateEmail();
+ $this->updateQuota();
+ if($hasLoggedIn !== 0) {
+ //we do not need to try it, when the user has not been logged in
+ //before, because the file system will not be ready.
+ $this->updateAvatar();
+ //in order to get an avatar as soon as possible, mark the user
+ //as refreshed only when updating the avatar did happen
+ $this->markRefreshTime();
+ }
+ }
+ }
+
+ /**
+ * @brief returns the LDAP DN of the user
+ * @return string
+ */
+ public function getDN() {
+ return $this->dn;
+ }
+
+ /**
+ * @brief returns the ownCloud internal username of the user
+ * @return string
+ */
+ public function getUsername() {
+ return $this->uid;
+ }
+
+ /**
+ * @brief reads the image from LDAP that shall be used as Avatar
+ * @return string data (provided by LDAP) | false
+ */
+ public function getAvatarImage() {
+ if(!is_null($this->avatarImage)) {
+ return $this->avatarImage;
+ }
+
+ $this->avatarImage = false;
+ $attributes = array('jpegPhoto', 'thumbnailPhoto');
+ foreach($attributes as $attribute) {
+ $result = $this->access->readAttribute($this->dn, $attribute);
+ if($result !== false && is_array($result) && isset($result[0])) {
+ $this->avatarImage = $result[0];
+ break;
+ }
+ }
+
+ return $this->avatarImage;
+ }
+
+ /**
+ * @brief marks the user as having logged in at least once
+ * @return null
+ */
+ public function markLogin() {
+ $this->config->setUserValue(
+ $this->uid, 'user_ldap', self::USER_PREFKEY_FIRSTLOGIN, 1);
+ }
+
+ /**
+ * @brief marks the time when user features like email have been updated
+ * @return null
+ */
+ private function markRefreshTime() {
+ $this->config->setUserValue(
+ $this->uid, 'user_ldap', self::USER_PREFKEY_LASTREFRESH, time());
+ }
+
+ /**
+ * @brief checks whether user features needs to be updated again by
+ * comparing the difference of time of the last refresh to now with the
+ * desired interval
+ * @return bool
+ */
+ private function needsRefresh() {
+ $lastChecked = $this->config->getUserValue($this->uid, 'user_ldap',
+ self::USER_PREFKEY_LASTREFRESH, 0);
+
+ //TODO make interval configurable
+ if((time() - intval($lastChecked)) < 86400 ) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * @brief checks whether an update method specified by feature was run
+ * already. If not, it will marked like this, because it is expected that
+ * the method will be run, when false is returned.
+ * @param string email | quota | avatar (can be extended)
+ * @return bool
+ */
+ private function wasRefreshed($feature) {
+ if(isset($this->refreshedFeatures[$feature])) {
+ return true;
+ }
+ $this->refreshedFeatures[$feature] = 1;
+ return false;
+ }
+
+ /**
+ * @brief fetches the email from LDAP and stores it as ownCloud user value
+ * @return null
+ */
+ public function updateEmail() {
+ if($this->wasRefreshed('email')) {
+ return;
+ }
+
+ $email = null;
+ $emailAttribute = $this->connection->ldapEmailAttribute;
+ if(!empty($emailAttribute)) {
+ $aEmail = $this->access->readAttribute($this->dn, $emailAttribute);
+ if($aEmail && (count($aEmail) > 0)) {
+ $email = $aEmail[0];
+ }
+ if(!is_null($email)) {
+ $this->config->setUserValue(
+ $this->uid, 'settings', 'email', $email);
+ }
+ }
+ }
+
+ /**
+ * @brief fetches the quota from LDAP and stores it as ownCloud user value
+ * @return null
+ */
+ public function updateQuota() {
+ if($this->wasRefreshed('quota')) {
+ return;
+ }
+
+ $quota = null;
+ $quotaDefault = $this->connection->ldapQuotaDefault;
+ $quotaAttribute = $this->connection->ldapQuotaAttribute;
+ if(!empty($quotaDefault)) {
+ $quota = $quotaDefault;
+ }
+ if(!empty($quotaAttribute)) {
+ $aQuota = $this->access->readAttribute($this->dn, $quotaAttribute);
+
+ if($aQuota && (count($aQuota) > 0)) {
+ $quota = $aQuota[0];
+ }
+ }
+ if(!is_null($quota)) {
+ $this->config->setUserValue($this->uid, 'files', 'quota', $quota);
+ }
+ }
+
+ /**
+ * @brief attempts to get an image from LDAP and sets it as ownCloud avatar
+ * @return null
+ */
+ public function updateAvatar() {
+ if($this->wasRefreshed('avatar')) {
+ return;
+ }
+ $avatarImage = $this->getAvatarImage();
+ if($avatarImage === false) {
+ //not set, nothing left to do;
+ return;
+ }
+ $this->image->loadFromBase64(base64_encode($avatarImage));
+ $this->setOwnCloudAvatar();
+ }
+
+ /**
+ * @brief sets an image as ownCloud avatar
+ * @return null
+ */
+ private function setOwnCloudAvatar() {
+ if(!$this->image->valid()) {
+ $this->log->log('user_ldap', 'jpegPhoto data invalid for '.$this->dn,
+ \OCP\Util::ERROR);
+ return;
+ }
+ //make sure it is a square and not bigger than 128x128
+ $size = min(array($this->image->width(), $this->image->height(), 128));
+ if(!$this->image->centerCrop($size)) {
+ $this->log->log('user_ldap',
+ 'croping image for avatar failed for '.$this->dn,
+ \OCP\Util::ERROR);
+ return;
+ }
+
+ if(!$this->fs->isLoaded()) {
+ $this->fs->setup($this->uid);
+ }
+
+ $avatar = $this->avatarManager->getAvatar($this->uid);
+ $avatar->set($this->image);
+ }
+
+}
diff --git a/apps/user_ldap/templates/part.settingcontrols.php b/apps/user_ldap/templates/part.settingcontrols.php
index dfc495490322d91297a509f59f9fcba53f1c85ed..ddf65e8a7541a3b7036dc54cbf9cc85b88f6015d 100644
--- a/apps/user_ldap/templates/part.settingcontrols.php
+++ b/apps/user_ldap/templates/part.settingcontrols.php
@@ -3,7 +3,7 @@
t('Test Configuration'));?>
-
diff --git a/apps/user_ldap/templates/part.wizardcontrols.php b/apps/user_ldap/templates/part.wizardcontrols.php
index 862e10bdd128a88edd74986611dd355b4b0f5183..33e1614c9c64253411fc1a8525422b4c999e9135 100644
--- a/apps/user_ldap/templates/part.wizardcontrols.php
+++ b/apps/user_ldap/templates/part.wizardcontrols.php
@@ -7,7 +7,7 @@
t('Continue'));?>
-
diff --git a/apps/user_ldap/tests/access.php b/apps/user_ldap/tests/access.php
index 9beb2b973365a051b0436dbeb4d05358049d7cc4..8ead5d684821a4b3429185495736308512fae257 100644
--- a/apps/user_ldap/tests/access.php
+++ b/apps/user_ldap/tests/access.php
@@ -30,30 +30,39 @@ class Test_Access extends \PHPUnit_Framework_TestCase {
private function getConnecterAndLdapMock() {
static $conMethods;
static $accMethods;
+ static $umMethods;
if(is_null($conMethods) || is_null($accMethods)) {
$conMethods = get_class_methods('\OCA\user_ldap\lib\Connection');
$accMethods = get_class_methods('\OCA\user_ldap\lib\Access');
+ $umMethods = get_class_methods('\OCA\user_ldap\lib\user\Manager');
}
$lw = $this->getMock('\OCA\user_ldap\lib\ILDAPWrapper');
$connector = $this->getMock('\OCA\user_ldap\lib\Connection',
$conMethods,
array($lw, null, null));
+ $um = $this->getMock('\OCA\user_ldap\lib\user\Manager',
+ $umMethods, array(
+ $this->getMock('\OCP\IConfig'),
+ $this->getMock('\OCA\user_ldap\lib\FilesystemHelper'),
+ $this->getMock('\OCA\user_ldap\lib\LogWrapper'),
+ $this->getMock('\OCP\IAvatarManager'),
+ $this->getMock('\OCP\Image')));
- return array($lw, $connector);
+ return array($lw, $connector, $um);
}
public function testEscapeFilterPartValidChars() {
- list($lw, $con) = $this->getConnecterAndLdapMock();
- $access = new Access($con, $lw);
+ list($lw, $con, $um) = $this->getConnecterAndLdapMock();
+ $access = new Access($con, $lw, $um);
$input = 'okay';
$this->assertTrue($input === $access->escapeFilterPart($input));
}
public function testEscapeFilterPartEscapeWildcard() {
- list($lw, $con) = $this->getConnecterAndLdapMock();
- $access = new Access($con, $lw);
+ list($lw, $con, $um) = $this->getConnecterAndLdapMock();
+ $access = new Access($con, $lw, $um);
$input = '*';
$expected = '\\\\*';
@@ -61,8 +70,8 @@ class Test_Access extends \PHPUnit_Framework_TestCase {
}
public function testEscapeFilterPartEscapeWildcard2() {
- list($lw, $con) = $this->getConnecterAndLdapMock();
- $access = new Access($con, $lw);
+ list($lw, $con, $um) = $this->getConnecterAndLdapMock();
+ $access = new Access($con, $lw, $um);
$input = 'foo*bar';
$expected = 'foo\\\\*bar';
diff --git a/apps/user_ldap/tests/group_ldap.php b/apps/user_ldap/tests/group_ldap.php
index ecbd42319e319706f791fde97bcca59c4d0b7ddf..1184fe1e82ecf6d562a9a89412de9612249a7a9a 100644
--- a/apps/user_ldap/tests/group_ldap.php
+++ b/apps/user_ldap/tests/group_ldap.php
@@ -42,9 +42,16 @@ class Test_Group_Ldap extends \PHPUnit_Framework_TestCase {
$connector = $this->getMock('\OCA\user_ldap\lib\Connection',
$conMethods,
array($lw, null, null));
+ $um = new \OCA\user_ldap\lib\user\Manager(
+ $this->getMock('\OCP\IConfig'),
+ $this->getMock('\OCA\user_ldap\lib\FilesystemHelper'),
+ $this->getMock('\OCA\user_ldap\lib\LogWrapper'),
+ $this->getMock('\OCP\IAvatarManager'),
+ $this->getMock('\OCP\Image')
+ );
$access = $this->getMock('\OCA\user_ldap\lib\Access',
$accMethods,
- array($connector, $lw));
+ array($connector, $lw, $um));
return $access;
}
@@ -112,4 +119,4 @@ class Test_Group_Ldap extends \PHPUnit_Framework_TestCase {
$this->assertSame(2, $users);
}
-}
\ No newline at end of file
+}
diff --git a/apps/user_ldap/tests/user/user.php b/apps/user_ldap/tests/user/user.php
new file mode 100644
index 0000000000000000000000000000000000000000..b66a92372667ff2eab0e8427a563304b78f63447
--- /dev/null
+++ b/apps/user_ldap/tests/user/user.php
@@ -0,0 +1,680 @@
+.
+*
+*/
+
+namespace OCA\user_ldap\tests;
+
+use OCA\user_ldap\lib\user\User;
+
+class Test_User_User extends \PHPUnit_Framework_TestCase {
+
+ private function getTestInstances() {
+ $access = $this->getMock('\OCA\user_ldap\lib\user\IUserTools');
+ $config = $this->getMock('\OCP\IConfig');
+ $filesys = $this->getMock('\OCA\user_ldap\lib\FilesystemHelper');
+ $log = $this->getMock('\OCA\user_ldap\lib\LogWrapper');
+ $avaMgr = $this->getMock('\OCP\IAvatarManager');
+ $image = $this->getMock('\OCP\Image');
+
+ return array($access, $config, $filesys, $image, $log, $avaMgr);
+ }
+
+ private function getAdvancedMocks($cfMock, $fsMock, $logMock, $avaMgr) {
+ static $conMethods;
+ static $accMethods;
+ static $umMethods;
+
+ if(is_null($conMethods) || is_null($accMethods)) {
+ $conMethods = get_class_methods('\OCA\user_ldap\lib\Connection');
+ $accMethods = get_class_methods('\OCA\user_ldap\lib\Access');
+ //getConnection shall not be replaced
+ unset($accMethods[array_search('getConnection', $accMethods)]);
+ $umMethods = get_class_methods('\OCA\user_ldap\lib\user\Manager');
+ }
+ $lw = $this->getMock('\OCA\user_ldap\lib\ILDAPWrapper');
+ $im = $this->getMock('\OCP\Image');
+ $um = $this->getMock('\OCA\user_ldap\lib\user\Manager',
+ $umMethods, array($cfMock, $fsMock, $logMock, $avaMgr, $im));
+ $connector = $this->getMock('\OCA\user_ldap\lib\Connection',
+ $conMethods, array($lw, null, null));
+ $access = $this->getMock('\OCA\user_ldap\lib\Access',
+ $accMethods, array($connector, $lw, $um));
+
+ return array($access, $connector);
+ }
+
+ public function testGetDNandUsername() {
+ list($access, $config, $filesys, $image, $log, $avaMgr) =
+ $this->getTestInstances();
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $this->assertSame($dn, $user->getDN());
+ $this->assertSame($uid, $user->getUsername());
+ }
+
+ public function testUpdateEmailProvided() {
+ list($access, $config, $filesys, $image, $log, $avaMgr) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr);
+
+ $connection->expects($this->once())
+ ->method('__get')
+ ->with($this->equalTo('ldapEmailAttribute'))
+ ->will($this->returnValue('email'));
+
+ $access->expects($this->once())
+ ->method('readAttribute')
+ ->with($this->equalTo('uid=alice,dc=foo,dc=bar'),
+ $this->equalTo('email'))
+ ->will($this->returnValue(array('alice@foo.bar')));
+
+ $config->expects($this->once())
+ ->method('setUserValue')
+ ->with($this->equalTo('alice'), $this->equalTo('settings'),
+ $this->equalTo('email'),
+ $this->equalTo('alice@foo.bar'))
+ ->will($this->returnValue(true));
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $user->updateEmail();
+ }
+
+ public function testUpdateEmailNotProvided() {
+ list($access, $config, $filesys, $image, $log, $avaMgr) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr);
+
+ $connection->expects($this->once())
+ ->method('__get')
+ ->with($this->equalTo('ldapEmailAttribute'))
+ ->will($this->returnValue('email'));
+
+ $access->expects($this->once())
+ ->method('readAttribute')
+ ->with($this->equalTo('uid=alice,dc=foo,dc=bar'),
+ $this->equalTo('email'))
+ ->will($this->returnValue(false));
+
+ $config->expects($this->never())
+ ->method('setUserValue');
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $user->updateEmail();
+ }
+
+ public function testUpdateEmailNotConfigured() {
+ list($access, $config, $filesys, $image, $log, $avaMgr) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr);
+
+ $connection->expects($this->once())
+ ->method('__get')
+ ->with($this->equalTo('ldapEmailAttribute'))
+ ->will($this->returnValue(''));
+
+ $access->expects($this->never())
+ ->method('readAttribute');
+
+ $config->expects($this->never())
+ ->method('setUserValue');
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $user->updateEmail();
+ }
+
+ public function testUpdateQuotaAllProvided() {
+ list($access, $config, $filesys, $image, $log, $avaMgr) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr);
+
+ $connection->expects($this->at(0))
+ ->method('__get')
+ ->with($this->equalTo('ldapQuotaDefault'))
+ ->will($this->returnValue('23 GB'));
+
+ $connection->expects($this->at(1))
+ ->method('__get')
+ ->with($this->equalTo('ldapQuotaAttribute'))
+ ->will($this->returnValue('myquota'));
+
+ $connection->expects($this->exactly(2))
+ ->method('__get');
+
+ $access->expects($this->once())
+ ->method('readAttribute')
+ ->with($this->equalTo('uid=alice,dc=foo,dc=bar'),
+ $this->equalTo('myquota'))
+ ->will($this->returnValue(array('42 GB')));
+
+ $config->expects($this->once())
+ ->method('setUserValue')
+ ->with($this->equalTo('alice'),
+ $this->equalTo('files'),
+ $this->equalTo('quota'),
+ $this->equalTo('42 GB'))
+ ->will($this->returnValue(true));
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $user->updateQuota();
+ }
+
+ public function testUpdateQuotaDefaultProvided() {
+ list($access, $config, $filesys, $image, $log, $avaMgr) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr);
+
+ $connection->expects($this->at(0))
+ ->method('__get')
+ ->with($this->equalTo('ldapQuotaDefault'))
+ ->will($this->returnValue('23 GB'));
+
+ $connection->expects($this->at(1))
+ ->method('__get')
+ ->with($this->equalTo('ldapQuotaAttribute'))
+ ->will($this->returnValue('myquota'));
+
+ $connection->expects($this->exactly(2))
+ ->method('__get');
+
+ $access->expects($this->once())
+ ->method('readAttribute')
+ ->with($this->equalTo('uid=alice,dc=foo,dc=bar'),
+ $this->equalTo('myquota'))
+ ->will($this->returnValue(false));
+
+ $config->expects($this->once())
+ ->method('setUserValue')
+ ->with($this->equalTo('alice'),
+ $this->equalTo('files'),
+ $this->equalTo('quota'),
+ $this->equalTo('23 GB'))
+ ->will($this->returnValue(true));
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $user->updateQuota();
+ }
+
+ public function testUpdateQuotaIndividualProvided() {
+ list($access, $config, $filesys, $image, $log, $avaMgr) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr);
+
+ $connection->expects($this->at(0))
+ ->method('__get')
+ ->with($this->equalTo('ldapQuotaDefault'))
+ ->will($this->returnValue(''));
+
+ $connection->expects($this->at(1))
+ ->method('__get')
+ ->with($this->equalTo('ldapQuotaAttribute'))
+ ->will($this->returnValue('myquota'));
+
+ $connection->expects($this->exactly(2))
+ ->method('__get');
+
+ $access->expects($this->once())
+ ->method('readAttribute')
+ ->with($this->equalTo('uid=alice,dc=foo,dc=bar'),
+ $this->equalTo('myquota'))
+ ->will($this->returnValue(array('23 GB')));
+
+ $config->expects($this->once())
+ ->method('setUserValue')
+ ->with($this->equalTo('alice'),
+ $this->equalTo('files'),
+ $this->equalTo('quota'),
+ $this->equalTo('23 GB'))
+ ->will($this->returnValue(true));
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $user->updateQuota();
+ }
+
+ public function testUpdateQuotaNoneProvided() {
+ list($access, $config, $filesys, $image, $log, $avaMgr) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr);
+
+ $connection->expects($this->at(0))
+ ->method('__get')
+ ->with($this->equalTo('ldapQuotaDefault'))
+ ->will($this->returnValue(''));
+
+ $connection->expects($this->at(1))
+ ->method('__get')
+ ->with($this->equalTo('ldapQuotaAttribute'))
+ ->will($this->returnValue('myquota'));
+
+ $connection->expects($this->exactly(2))
+ ->method('__get');
+
+ $access->expects($this->once())
+ ->method('readAttribute')
+ ->with($this->equalTo('uid=alice,dc=foo,dc=bar'),
+ $this->equalTo('myquota'))
+ ->will($this->returnValue(false));
+
+ $config->expects($this->never())
+ ->method('setUserValue');
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $user->updateQuota();
+ }
+
+ public function testUpdateQuotaNoneConfigured() {
+ list($access, $config, $filesys, $image, $log, $avaMgr) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr);
+
+ $connection->expects($this->at(0))
+ ->method('__get')
+ ->with($this->equalTo('ldapQuotaDefault'))
+ ->will($this->returnValue(''));
+
+ $connection->expects($this->at(1))
+ ->method('__get')
+ ->with($this->equalTo('ldapQuotaAttribute'))
+ ->will($this->returnValue(''));
+
+ $connection->expects($this->exactly(2))
+ ->method('__get');
+
+ $access->expects($this->never())
+ ->method('readAttribute');
+
+ $config->expects($this->never())
+ ->method('setUserValue');
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $user->updateQuota();
+ }
+
+ //the testUpdateAvatar series also implicitely tests getAvatarImage
+ public function testUpdateAvatarJpegPhotoProvided() {
+ list($access, $config, $filesys, $image, $log, $avaMgr) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr);
+
+ $access->expects($this->once())
+ ->method('readAttribute')
+ ->with($this->equalTo('uid=alice,dc=foo,dc=bar'),
+ $this->equalTo('jpegPhoto'))
+ ->will($this->returnValue(array('this is a photo')));
+
+ $image->expects($this->once())
+ ->method('valid')
+ ->will($this->returnValue(true));
+ $image->expects($this->once())
+ ->method('width')
+ ->will($this->returnValue(128));
+ $image->expects($this->once())
+ ->method('height')
+ ->will($this->returnValue(128));
+ $image->expects($this->once())
+ ->method('centerCrop')
+ ->will($this->returnValue(true));
+
+ $filesys->expects($this->once())
+ ->method('isLoaded')
+ ->will($this->returnValue(true));
+
+ $avatar = $this->getMock('\OCP\IAvatar');
+ $avatar->expects($this->once())
+ ->method('set')
+ ->with($this->isInstanceOf($image));
+
+ $avaMgr->expects($this->once())
+ ->method('getAvatar')
+ ->with($this->equalTo('alice'))
+ ->will($this->returnValue($avatar));
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $user->updateAvatar();
+ }
+
+ public function testUpdateAvatarThumbnailPhotoProvided() {
+ list($access, $config, $filesys, $image, $log, $avaMgr) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr);
+
+ $access->expects($this->at(0))
+ ->method('readAttribute')
+ ->with($this->equalTo('uid=alice,dc=foo,dc=bar'),
+ $this->equalTo('jpegPhoto'))
+ ->will($this->returnValue(false));
+
+ $access->expects($this->at(1))
+ ->method('readAttribute')
+ ->with($this->equalTo('uid=alice,dc=foo,dc=bar'),
+ $this->equalTo('thumbnailPhoto'))
+ ->will($this->returnValue(array('this is a photo')));
+
+ $access->expects($this->exactly(2))
+ ->method('readAttribute');
+
+ $image->expects($this->once())
+ ->method('valid')
+ ->will($this->returnValue(true));
+ $image->expects($this->once())
+ ->method('width')
+ ->will($this->returnValue(128));
+ $image->expects($this->once())
+ ->method('height')
+ ->will($this->returnValue(128));
+ $image->expects($this->once())
+ ->method('centerCrop')
+ ->will($this->returnValue(true));
+
+ $filesys->expects($this->once())
+ ->method('isLoaded')
+ ->will($this->returnValue(true));
+
+ $avatar = $this->getMock('\OCP\IAvatar');
+ $avatar->expects($this->once())
+ ->method('set')
+ ->with($this->isInstanceOf($image));
+
+ $avaMgr->expects($this->once())
+ ->method('getAvatar')
+ ->with($this->equalTo('alice'))
+ ->will($this->returnValue($avatar));
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $user->updateAvatar();
+ }
+
+ public function testUpdateAvatarNotProvided() {
+ list($access, $config, $filesys, $image, $log, $avaMgr) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr);
+
+ $access->expects($this->at(0))
+ ->method('readAttribute')
+ ->with($this->equalTo('uid=alice,dc=foo,dc=bar'),
+ $this->equalTo('jpegPhoto'))
+ ->will($this->returnValue(false));
+
+ $access->expects($this->at(1))
+ ->method('readAttribute')
+ ->with($this->equalTo('uid=alice,dc=foo,dc=bar'),
+ $this->equalTo('thumbnailPhoto'))
+ ->will($this->returnValue(false));
+
+ $access->expects($this->exactly(2))
+ ->method('readAttribute');
+
+ $image->expects($this->never())
+ ->method('valid');
+ $image->expects($this->never())
+ ->method('width');
+ $image->expects($this->never())
+ ->method('height');
+ $image->expects($this->never())
+ ->method('centerCrop');
+
+ $filesys->expects($this->never())
+ ->method('isLoaded');
+
+ $avaMgr->expects($this->never())
+ ->method('getAvatar');
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $user->updateAvatar();
+ }
+
+ public function testUpdateBeforeFirstLogin() {
+ list($access, $config, $filesys, $image, $log, $avaMgr) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr);
+
+ $config->expects($this->at(0))
+ ->method('getUserValue')
+ ->with($this->equalTo('alice'), $this->equalTo('user_ldap'),
+ $this->equalTo(User::USER_PREFKEY_FIRSTLOGIN),
+ $this->equalTo(0))
+ ->will($this->returnValue(0));
+
+ $config->expects($this->at(1))
+ ->method('getUserValue')
+ ->with($this->equalTo('alice'), $this->equalTo('user_ldap'),
+ $this->equalTo(User::USER_PREFKEY_LASTREFRESH),
+ $this->equalTo(0))
+ ->will($this->returnValue(0));
+
+ $config->expects($this->exactly(2))
+ ->method('getUserValue');
+
+ $config->expects($this->never())
+ ->method('setUserValue');
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $user->update();
+ }
+
+ public function testUpdateAfterFirstLogin() {
+ list($access, $config, $filesys, $image, $log, $avaMgr) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr);
+
+ $config->expects($this->at(0))
+ ->method('getUserValue')
+ ->with($this->equalTo('alice'), $this->equalTo('user_ldap'),
+ $this->equalTo(User::USER_PREFKEY_FIRSTLOGIN),
+ $this->equalTo(0))
+ ->will($this->returnValue(1));
+
+ $config->expects($this->at(1))
+ ->method('getUserValue')
+ ->with($this->equalTo('alice'), $this->equalTo('user_ldap'),
+ $this->equalTo(User::USER_PREFKEY_LASTREFRESH),
+ $this->equalTo(0))
+ ->will($this->returnValue(0));
+
+ $config->expects($this->exactly(2))
+ ->method('getUserValue');
+
+ $config->expects($this->once())
+ ->method('setUserValue')
+ ->with($this->equalTo('alice'), $this->equalTo('user_ldap'),
+ $this->equalTo(User::USER_PREFKEY_LASTREFRESH),
+ $this->anything())
+ ->will($this->returnValue(true));
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $user->update();
+ }
+
+ public function testUpdateNoRefresh() {
+ list($access, $config, $filesys, $image, $log, $avaMgr) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr);
+
+ $config->expects($this->at(0))
+ ->method('getUserValue')
+ ->with($this->equalTo('alice'), $this->equalTo('user_ldap'),
+ $this->equalTo(User::USER_PREFKEY_FIRSTLOGIN),
+ $this->equalTo(0))
+ ->will($this->returnValue(1));
+
+ $config->expects($this->at(1))
+ ->method('getUserValue')
+ ->with($this->equalTo('alice'), $this->equalTo('user_ldap'),
+ $this->equalTo(User::USER_PREFKEY_LASTREFRESH),
+ $this->equalTo(0))
+ ->will($this->returnValue(time()));
+
+ $config->expects($this->exactly(2))
+ ->method('getUserValue');
+
+ $config->expects($this->never())
+ ->method('setUserValue');
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $user->update();
+ }
+
+ public function testMarkLogin() {
+ list($access, $config, $filesys, $image, $log, $avaMgr) =
+ $this->getTestInstances();
+
+ $config->expects($this->once())
+ ->method('setUserValue')
+ ->with($this->equalTo('alice'),
+ $this->equalTo('user_ldap'),
+ $this->equalTo(User::USER_PREFKEY_FIRSTLOGIN),
+ $this->equalTo(1))
+ ->will($this->returnValue(true));
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $user->markLogin();
+ }
+
+ public function testGetAvatarImageProvided() {
+ list($access, $config, $filesys, $image, $log, $avaMgr) =
+ $this->getTestInstances();
+
+ $access->expects($this->once())
+ ->method('readAttribute')
+ ->with($this->equalTo('uid=alice,dc=foo,dc=bar'),
+ $this->equalTo('jpegPhoto'))
+ ->will($this->returnValue(array('this is a photo')));
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $photo = $user->getAvatarImage();
+ $this->assertSame('this is a photo', $photo);
+ //make sure readAttribute is not called again but the already fetched
+ //photo is returned
+ $photo = $user->getAvatarImage();
+ }
+}
diff --git a/apps/user_ldap/tests/user_ldap.php b/apps/user_ldap/tests/user_ldap.php
index 2535c34bcf5fa2604ae555daf78ee61da5dbeefa..8787e023655933bdfe2ebdc40c266a3f66856e49 100644
--- a/apps/user_ldap/tests/user_ldap.php
+++ b/apps/user_ldap/tests/user_ldap.php
@@ -29,6 +29,7 @@ use \OCA\user_ldap\lib\ILDAPWrapper;
class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
protected $backend;
+ protected $access;
public function setUp() {
\OC_User::clearBackends();
@@ -38,18 +39,35 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
private function getAccessMock() {
static $conMethods;
static $accMethods;
+ static $uMethods;
if(is_null($conMethods) || is_null($accMethods)) {
$conMethods = get_class_methods('\OCA\user_ldap\lib\Connection');
$accMethods = get_class_methods('\OCA\user_ldap\lib\Access');
+ unset($accMethods[array_search('getConnection', $accMethods)]);
+ $uMethods = get_class_methods('\OCA\user_ldap\lib\user\User');
+ unset($uMethods[array_search('getUsername', $uMethods)]);
+ unset($uMethods[array_search('getDN', $uMethods)]);
+ unset($uMethods[array_search('__construct', $uMethods)]);
}
$lw = $this->getMock('\OCA\user_ldap\lib\ILDAPWrapper');
$connector = $this->getMock('\OCA\user_ldap\lib\Connection',
$conMethods,
array($lw, null, null));
+
+ $um = new \OCA\user_ldap\lib\user\Manager(
+ $this->getMock('\OCP\IConfig'),
+ $this->getMock('\OCA\user_ldap\lib\FilesystemHelper'),
+ $this->getMock('\OCA\user_ldap\lib\LogWrapper'),
+ $this->getMock('\OCP\IAvatarManager'),
+ $this->getMock('\OCP\Image')
+ );
+
$access = $this->getMock('\OCA\user_ldap\lib\Access',
$accMethods,
- array($connector, $lw));
+ array($connector, $lw, $um));
+
+ $um->setLdapAccess($access);
return $access;
}
@@ -60,16 +78,16 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
->will($this->returnCallback(function($uid) {
switch ($uid) {
case 'gunslinger':
- return 'dnOfRoland';
+ return 'dnOfRoland,dc=test';
break;
case 'formerUser':
- return 'dnOfFormerUser';
+ return 'dnOfFormerUser,dc=test';
break;
case 'newyorker':
- return 'dnOfNewYorker';
+ return 'dnOfNewYorker,dc=test';
break;
case 'ladyofshadows':
- return 'dnOfLadyOfShadows';
+ return 'dnOfLadyOfShadows,dc=test';
break;
default:
return false;
@@ -102,14 +120,14 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
->method('fetchListOfUsers')
->will($this->returnCallback(function($filter) {
if($filter === 'roland') {
- return array('dnOfRoland');
+ return array('dnOfRoland,dc=test');
}
return array();
}));
$access->expects($this->any())
->method('dn2username')
- ->with($this->equalTo('dnOfRoland'))
+ ->with($this->equalTo('dnOfRoland,dc=test'))
->will($this->returnValue('gunslinger'));
$access->expects($this->any())
@@ -337,7 +355,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
$access->expects($this->any())
->method('readAttribute')
->will($this->returnCallback(function($dn) {
- if($dn === 'dnOfRoland') {
+ if($dn === 'dnOfRoland,dc=test') {
return array();
}
return false;
@@ -365,7 +383,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
$access->expects($this->any())
->method('readAttribute')
->will($this->returnCallback(function($dn) {
- if($dn === 'dnOfRoland') {
+ if($dn === 'dnOfRoland,dc=test') {
return array();
}
return false;
@@ -411,13 +429,13 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
->method('readAttribute')
->will($this->returnCallback(function($dn, $attr) {
switch ($dn) {
- case 'dnOfRoland':
+ case 'dnOfRoland,dc=test':
if($attr === 'testAttribute') {
return array('/tmp/rolandshome/');
}
return array();
break;
- case 'dnOfLadyOfShadows':
+ case 'dnOfLadyOfShadows,dc=test':
if($attr === 'testAttribute') {
return array('susannah/');
}
@@ -457,7 +475,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
->method('readAttribute')
->will($this->returnCallback(function($dn, $attr) {
switch ($dn) {
- case 'dnOfRoland':
+ case 'dnOfRoland,dc=test':
if($attr === 'displayname') {
return array('Roland Deschain');
}
diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php
index aece2ee9aa2bfca9c33f9213a925f4f7a440a53c..9fa2a6b418c8a920dea050fa95f9b12ed7d2727e 100644
--- a/apps/user_ldap/user_ldap.php
+++ b/apps/user_ldap/user_ldap.php
@@ -28,128 +28,19 @@ namespace OCA\user_ldap;
use OCA\user_ldap\lib\BackendUtility;
class USER_LDAP extends BackendUtility implements \OCP\UserInterface {
-
- private function updateQuota($dn) {
- $quota = null;
- $quotaDefault = $this->access->connection->ldapQuotaDefault;
- $quotaAttribute = $this->access->connection->ldapQuotaAttribute;
- if(!empty($quotaDefault)) {
- $quota = $quotaDefault;
- }
- if(!empty($quotaAttribute)) {
- $aQuota = $this->access->readAttribute($dn, $quotaAttribute);
-
- if($aQuota && (count($aQuota) > 0)) {
- $quota = $aQuota[0];
- }
- }
- if(!is_null($quota)) {
- \OCP\Config::setUserValue( $this->access->dn2username($dn),
- 'files',
- 'quota',
- \OCP\Util::computerFileSize($quota));
- }
- }
-
- private function updateEmail($dn) {
- $email = null;
- $emailAttribute = $this->access->connection->ldapEmailAttribute;
- if(!empty($emailAttribute)) {
- $aEmail = $this->access->readAttribute($dn, $emailAttribute);
- if($aEmail && (count($aEmail) > 0)) {
- $email = $aEmail[0];
- }
- if(!is_null($email)) {
- \OCP\Config::setUserValue( $this->access->dn2username($dn),
- 'settings',
- 'email',
- $email);
- }
- }
- }
-
- /**
- * reads jpegPhoto and set is as avatar if available
- * @param string $uid ownCloud user name
- * @param string $dn the user's LDAP DN
- * @return void
- */
- private function updateAvatar($uid, $dn) {
- $hasLoggedIn = \OCP\Config::getUserValue($uid, 'user_ldap',
- 'firstLoginAccomplished', 0);
- $lastChecked = \OCP\Config::getUserValue($uid, 'user_ldap',
- 'lastJpegPhotoLookup', 0);
- if(($hasLoggedIn !== '1') || (time() - intval($lastChecked)) < 86400 ) {
- //update only once a day
- return;
- }
-
- $avatarImage = $this->getAvatarImage($uid, $dn);
- if($avatarImage === false) {
- //not set, nothing left to do;
- return;
- }
-
- $image = new \OCP\Image();
- $image->loadFromBase64(base64_encode($avatarImage));
-
- if(!$image->valid()) {
- \OCP\Util::writeLog('user_ldap', 'jpegPhoto data invalid for '.$dn,
- \OCP\Util::ERROR);
- return;
- }
- //make sure it is a square and not bigger than 128x128
- $size = min(array($image->width(), $image->height(), 128));
- if(!$image->centerCrop($size)) {
- \OCP\Util::writeLog('user_ldap',
- 'croping image for avatar failed for '.$dn,
- \OCP\Util::ERROR);
- return;
- }
-
- if(!\OC\Files\Filesystem::$loaded) {
- \OC_Util::setupFS($uid);
- }
-
- $avatarManager = \OC::$server->getAvatarManager();
- $avatar = $avatarManager->getAvatar($uid);
- $avatar->set($image);
- }
-
/**
* checks whether the user is allowed to change his avatar in ownCloud
* @param string $uid the ownCloud user name
* @return boolean either the user can or cannot
*/
public function canChangeAvatar($uid) {
- $dn = $this->access->username2dn($uid);
- if(!$dn) {
+ $user = $this->access->userManager->get($uid);
+ if(is_null($user)) {
return false;
}
- if($this->getAvatarImage($uid, $dn) === false) {
- //The user is allowed to change his avatar in ownCloud only if no
- //avatar is provided by LDAP
+ if($user->getAvatarImage() === false) {
return true;
}
- return false;
- }
-
- /**
- * reads the image from LDAP that shall be used as Avatar
- * @param string $uid the ownCloud user name
- * @param string $dn the user DN
- * @return string data (provided by LDAP) | false
- */
- private function getAvatarImage($uid, $dn) {
- $attributes = array('jpegPhoto', 'thumbnailPhoto');
- foreach($attributes as $attribute) {
- $result = $this->access->readAttribute($dn, $attribute);
- \OCP\Config::setUserValue($uid, 'user_ldap', 'lastJpegPhotoLookup',
- time());
- if($result !== false && is_array($result) && isset($result[0])) {
- return $result[0];
- }
- }
return false;
}
@@ -174,25 +65,17 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface {
}
$dn = $ldap_users[0];
- //do we have a username for him/her?
- $ocname = $this->access->dn2username($dn);
-
- if($ocname) {
- //update some settings, if necessary
- $this->updateQuota($dn);
- $this->updateEmail($dn);
-
+ $user = $this->access->userManager->get($dn);
+ if($user->getUsername() !== false) {
//are the credentials OK?
if(!$this->access->areCredentialsValid($dn, $password)) {
return false;
}
- \OCP\Config::setUserValue($ocname, 'user_ldap',
- 'firstLoginAccomplished', 1);
+ $user->markLogin();
+ $user->update();
- $this->updateAvatar($ocname, $dn);
- //give back the display name
- return $ocname;
+ return $user->getUsername();
}
return false;
@@ -249,13 +132,14 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface {
return $this->access->connection->getFromCache('userExists'.$uid);
}
//getting dn, if false the user does not exist. If dn, he may be mapped only, requires more checking.
- $dn = $this->access->username2dn($uid);
- if(!$dn) {
+ $user = $this->access->userManager->get($uid);
+ if(is_null($user)) {
\OCP\Util::writeLog('user_ldap', 'No DN found for '.$uid.' on '.
$this->access->connection->ldapHost, \OCP\Util::DEBUG);
$this->access->connection->writeToCache('userExists'.$uid, false);
return false;
}
+ $dn = $user->getDN();
//check if user really still exists by reading its entry
if(!is_array($this->access->readAttribute($dn, ''))) {
\OCP\Util::writeLog('user_ldap', 'LDAP says no user '.$dn.' on '.
@@ -265,8 +149,7 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface {
}
$this->access->connection->writeToCache('userExists'.$uid, true);
- $this->updateQuota($dn);
- $this->updateAvatar($uid, $dn);
+ $user->update();
return true;
}
diff --git a/apps/user_webdavauth/l10n/ar.php b/apps/user_webdavauth/l10n/ar.php
index bdb335fadb49ff864f69e91ef89ad3f5e7ac1b5c..fd26e9acd18ee37dfdc34a668920a28e107e80fe 100644
--- a/apps/user_webdavauth/l10n/ar.php
+++ b/apps/user_webdavauth/l10n/ar.php
@@ -1,5 +1,6 @@
"تأكد شخصية ال WebDAV"
+"WebDAV Authentication" => "تأكد شخصية ال WebDAV",
+"Save" => "حفظ"
);
$PLURAL_FORMS = "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;";
diff --git a/apps/user_webdavauth/l10n/ast.php b/apps/user_webdavauth/l10n/ast.php
index 118fa2ce30fd9b84b9a8eff32c0cc89fbb223318..7f87e130a9afbcc5986bdc23ec39eea3ada0c018 100644
--- a/apps/user_webdavauth/l10n/ast.php
+++ b/apps/user_webdavauth/l10n/ast.php
@@ -1,7 +1,7 @@
"Autenticación per aciu de WevDAV",
-"Address: " => "Direición:",
+"Save" => "Guardar",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Les credenciales d'usuariu van unviase a esta direición. Esti complementu verifica la rempuesta y va interpretar los códigos de rempuesta HTTP 401 y 403 como credenciales inválides y toles otres rempuestes como credenciales válides."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/bg_BG.php b/apps/user_webdavauth/l10n/bg_BG.php
index 14e6b280fd21b20606a1a1c034888a61553eb6ce..639bc9ebf6ddb315498f53962b6f1e4b7c08870f 100644
--- a/apps/user_webdavauth/l10n/bg_BG.php
+++ b/apps/user_webdavauth/l10n/bg_BG.php
@@ -1,5 +1,6 @@
"WebDAV идентификация"
+"WebDAV Authentication" => "WebDAV идентификация",
+"Save" => "Запис"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/bn_BD.php b/apps/user_webdavauth/l10n/bn_BD.php
index 5366552efae004346a719cbb5d66ba2d839058b6..354df7c32d975d948bf802f82e85dda06d14aa56 100644
--- a/apps/user_webdavauth/l10n/bn_BD.php
+++ b/apps/user_webdavauth/l10n/bn_BD.php
@@ -1,3 +1,5 @@
- "URL:http://"
+ "সংরক্ষণ"
);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/bs.php b/apps/user_webdavauth/l10n/bs.php
new file mode 100644
index 0000000000000000000000000000000000000000..2624f90daa8e1f581ca64eb4c40f296c320ae31c
--- /dev/null
+++ b/apps/user_webdavauth/l10n/bs.php
@@ -0,0 +1,5 @@
+ "Spasi"
+);
+$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/apps/user_webdavauth/l10n/ca.php b/apps/user_webdavauth/l10n/ca.php
index e1f8fd9b2ecd63b56716a548200cacdadfc1d74c..ed64e5896a8993c057f1fb5dbfaf97c24ca7f8b7 100644
--- a/apps/user_webdavauth/l10n/ca.php
+++ b/apps/user_webdavauth/l10n/ca.php
@@ -1,7 +1,7 @@
"Autenticació WebDAV",
-"Address: " => "Adreça:",
+"Save" => "Desa",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Les credencials d'usuari s'enviaran a aquesta adreça. Aquest connector comprova la resposta i interpreta els codis d'estat 401 i 403 com a credencials no vàlides, i qualsevol altra resposta com a credencials vàlides."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/cs_CZ.php b/apps/user_webdavauth/l10n/cs_CZ.php
index dfeac535eb8e0db15582f420646a20a3129a2511..bbc118d840430231ea0df017ac9b559005fa8eed 100644
--- a/apps/user_webdavauth/l10n/cs_CZ.php
+++ b/apps/user_webdavauth/l10n/cs_CZ.php
@@ -1,7 +1,7 @@
"Ověření WebDAV",
-"Address: " => "Adresa:",
+"Save" => "Uložit",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Uživatelské přihlašovací údaje budou odeslány na tuto adresu. Tento plugin zkontroluje odpověď serveru a interpretuje návratový kód HTTP 401 a 403 jako neplatné přihlašovací údaje a jakýkoli jiný jako platné přihlašovací údaje."
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;";
diff --git a/apps/user_webdavauth/l10n/cy_GB.php b/apps/user_webdavauth/l10n/cy_GB.php
new file mode 100644
index 0000000000000000000000000000000000000000..765f844a90c6ef068dfcecf5126d8a63e1e977bb
--- /dev/null
+++ b/apps/user_webdavauth/l10n/cy_GB.php
@@ -0,0 +1,5 @@
+ "Cadw"
+);
+$PLURAL_FORMS = "nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;";
diff --git a/apps/user_webdavauth/l10n/da.php b/apps/user_webdavauth/l10n/da.php
index 2889a1b42a0b251dfbd761533934602d670d67fc..219cac8b69954546bbaf34eef69a1a3c24058e58 100644
--- a/apps/user_webdavauth/l10n/da.php
+++ b/apps/user_webdavauth/l10n/da.php
@@ -1,7 +1,7 @@
"WebDAV-godkendelse",
-"Address: " => "Adresse:",
+"Save" => "Gem",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Bruger oplysningerne vil blive sendt til denne adresse. Plugin'et registrerer responsen og fortolker HTTP-statuskode 401 og 403 som ugyldige oplysninger, men alle andre besvarelser som gyldige oplysninger."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/de.php b/apps/user_webdavauth/l10n/de.php
index 3ddc03313340b3c8a834827d5870b9f9bcb21bec..86b2da8d9efda6242584118916230cb28f0fb4bb 100644
--- a/apps/user_webdavauth/l10n/de.php
+++ b/apps/user_webdavauth/l10n/de.php
@@ -1,7 +1,8 @@
"WebDAV Authentifikation",
-"Address: " => "Addresse: ",
+"Address:" => "Adresse:",
+"Save" => "Speichern",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Die Benutzerdaten werden an diese Adresse gesendet. Dieses Plugin prüft die Antwort und wird die HTTP-Statuscodes 401 und 403 als ungültige Daten interpretieren und alle anderen Antworten als gültige Daten."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/de_AT.php b/apps/user_webdavauth/l10n/de_AT.php
new file mode 100644
index 0000000000000000000000000000000000000000..60e8abdbf26425e23592c6bcd1ea1069b5db9f8f
--- /dev/null
+++ b/apps/user_webdavauth/l10n/de_AT.php
@@ -0,0 +1,5 @@
+ "Speichern"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/de_CH.php b/apps/user_webdavauth/l10n/de_CH.php
index 2c31957d2515627eae7aa19daa946e6291568a44..1683c56e4da7ee95b7844c1b4f0be8768e2b8fbf 100644
--- a/apps/user_webdavauth/l10n/de_CH.php
+++ b/apps/user_webdavauth/l10n/de_CH.php
@@ -1,7 +1,7 @@
"WebDAV-Authentifizierung",
-"Address: " => "Adresse:",
+"Save" => "Speichern",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Die Benutzerdaten werden an diese Adresse gesendet. Dieses Plugin prüft die Antwort und wird die HTTP-Statuscodes 401 und 403 als ungültige Daten interpretieren und alle anderen Antworten als gültige Daten."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/de_DE.php b/apps/user_webdavauth/l10n/de_DE.php
index 2c31957d2515627eae7aa19daa946e6291568a44..5888529624dd912262a0f041ec3dee06b9097b0d 100644
--- a/apps/user_webdavauth/l10n/de_DE.php
+++ b/apps/user_webdavauth/l10n/de_DE.php
@@ -1,7 +1,8 @@
"WebDAV-Authentifizierung",
-"Address: " => "Adresse:",
+"Address:" => "Adresse:",
+"Save" => "Speichern",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Die Benutzerdaten werden an diese Adresse gesendet. Dieses Plugin prüft die Antwort und wird die HTTP-Statuscodes 401 und 403 als ungültige Daten interpretieren und alle anderen Antworten als gültige Daten."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/el.php b/apps/user_webdavauth/l10n/el.php
index e7403f9a8c39da754c44599f7213c49be41600e1..0a9be9f8559eaea91a62b25ffa32382b0d00174e 100644
--- a/apps/user_webdavauth/l10n/el.php
+++ b/apps/user_webdavauth/l10n/el.php
@@ -1,7 +1,7 @@
"Πιστοποίηση μέσω WebDAV ",
-"Address: " => "Διεύθυνση:",
+"Save" => "Αποθήκευση",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Τα διαπιστευτήρια του χρήστη θα σταλούν σε αυτή την διεύθυνση. Αυτό το πρόσθετο ελέγχει την απόκριση και θα ερμηνεύσει τους κωδικούς κατάστασης HTTP 401 και 402 ως μη έγκυρα διαπιστευτήρια και όλες τις άλλες αποκρίσεις ως έγκυρα διαπιστευτήρια."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/en_GB.php b/apps/user_webdavauth/l10n/en_GB.php
index c0982083377141e2f7e89bb27d504197c6396c7a..345c0c2899890b64f0d1b335f389ec18cb452101 100644
--- a/apps/user_webdavauth/l10n/en_GB.php
+++ b/apps/user_webdavauth/l10n/en_GB.php
@@ -1,7 +1,7 @@
"WebDAV Authentication",
-"Address: " => "Address: ",
+"Save" => "Save",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/eo.php b/apps/user_webdavauth/l10n/eo.php
index 3a82bfdf41e9da01fe9e48e07a31fa37a099d6b6..b5d824fdc996337a0ec32121ed8617db17b62163 100644
--- a/apps/user_webdavauth/l10n/eo.php
+++ b/apps/user_webdavauth/l10n/eo.php
@@ -1,6 +1,6 @@
"WebDAV-aŭtentigo",
-"Address: " => "Adreso:"
+"Save" => "Konservi"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/es.php b/apps/user_webdavauth/l10n/es.php
index 951aabe24aed434a87e6cf46c4f298c41920ac8b..360724f89862ee56adf95f8e142596130178d1ca 100644
--- a/apps/user_webdavauth/l10n/es.php
+++ b/apps/user_webdavauth/l10n/es.php
@@ -1,7 +1,7 @@
"Autenticación mediante WevDAV",
-"Address: " => "Dirección:",
+"Save" => "Guardar",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Las credenciales de usuario se enviarán a esta dirección. Este complemento verifica la respuesta e interpretará los códigos de respuesta HTTP 401 y 403 como credenciales inválidas y todas las otras respuestas como credenciales válidas."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/es_AR.php b/apps/user_webdavauth/l10n/es_AR.php
index 4ec0bf5a626c55dd0429a983fc89b0f611a702af..38164f9fba41194c72b58f0efd0f16fd12f21bf6 100644
--- a/apps/user_webdavauth/l10n/es_AR.php
+++ b/apps/user_webdavauth/l10n/es_AR.php
@@ -1,7 +1,7 @@
"Autenticación de WebDAV",
-"Address: " => "Dirección:",
+"Save" => "Guardar",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Las credenciales del usuario serán enviadas a esta dirección. Este plug-in verificará la respuesta e interpretará los códigos de estado HTTP 401 y 403 como credenciales inválidas y cualquier otra respuesta como válida."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/es_MX.php b/apps/user_webdavauth/l10n/es_MX.php
index 951aabe24aed434a87e6cf46c4f298c41920ac8b..360724f89862ee56adf95f8e142596130178d1ca 100644
--- a/apps/user_webdavauth/l10n/es_MX.php
+++ b/apps/user_webdavauth/l10n/es_MX.php
@@ -1,7 +1,7 @@
"Autenticación mediante WevDAV",
-"Address: " => "Dirección:",
+"Save" => "Guardar",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Las credenciales de usuario se enviarán a esta dirección. Este complemento verifica la respuesta e interpretará los códigos de respuesta HTTP 401 y 403 como credenciales inválidas y todas las otras respuestas como credenciales válidas."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/et_EE.php b/apps/user_webdavauth/l10n/et_EE.php
index 2727cc98dc9f0ad67243372fcb004288b189a60b..961375692d94f119ef8ad656dd08c9daa5a0174f 100644
--- a/apps/user_webdavauth/l10n/et_EE.php
+++ b/apps/user_webdavauth/l10n/et_EE.php
@@ -1,7 +1,7 @@
"WebDAV autentimine",
-"Address: " => "Aadress:",
+"Save" => "Salvesta",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud saadab kasutajatunnused sellel aadressil. See vidin kontrollib vastust ning tuvastab ning tõlgendab HTTP olekukoodid 401 ja 403 valedeks andmeteks ning kõik teised vastused korrektseteks andmeteks."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/eu.php b/apps/user_webdavauth/l10n/eu.php
index 29794115fcd72dc6d0e1e191ee7305fc827f5ad4..8a083701ce6837497b49dfabffc60e92588fba80 100644
--- a/apps/user_webdavauth/l10n/eu.php
+++ b/apps/user_webdavauth/l10n/eu.php
@@ -1,7 +1,7 @@
"WebDAV Autentikazioa",
-"Address: " => "Helbidea:",
+"Save" => "Gorde",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Erabiltzailearen kredentzialak helbide honetara bidaliko dira. Plugin honek erantzuna aztertu eta HTTP 401 eta 403 egoera-kodeak kredentzial ez-egokitzat hartuko ditu, eta beste edozein erantzun, aldiz, kredentzial egokitzat."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/eu_ES.php b/apps/user_webdavauth/l10n/eu_ES.php
new file mode 100644
index 0000000000000000000000000000000000000000..a1d57a93b5265d0830f56a91aefba574106b1303
--- /dev/null
+++ b/apps/user_webdavauth/l10n/eu_ES.php
@@ -0,0 +1,5 @@
+ "Gorde"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/fa.php b/apps/user_webdavauth/l10n/fa.php
index ad061226d43f20b9bdf3f80d6c5947f4cc629a69..0bf8b6f67331d1f1cbbc9d7123e830bf9e4e7124 100644
--- a/apps/user_webdavauth/l10n/fa.php
+++ b/apps/user_webdavauth/l10n/fa.php
@@ -1,5 +1,6 @@
"اعتبار سنجی WebDAV "
+"WebDAV Authentication" => "اعتبار سنجی WebDAV ",
+"Save" => "ذخیره"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/fi_FI.php b/apps/user_webdavauth/l10n/fi_FI.php
index a31e09bc72a73bf8583d83da485e02f3e5d7a07e..7209a889f1b274bb296eea6e1da2191b65b867c5 100644
--- a/apps/user_webdavauth/l10n/fi_FI.php
+++ b/apps/user_webdavauth/l10n/fi_FI.php
@@ -1,7 +1,8 @@
"WebDAV-todennus",
-"Address: " => "Osoite:",
+"Address:" => "Osoite:",
+"Save" => "Tallenna",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Käyttäjätiedot lähetetään tähän osoitteeseen. Liitännäinen tarkistaa vastauksen, ja tulkitsee HTTP-tilakoodit 401 ja 403 vääriksi käyttäjätiedoiksi. Kaikki muut vastaukset tulkitaan kelvollisiksi käyttäjätiedoiksi."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/fr.php b/apps/user_webdavauth/l10n/fr.php
index 709fa53dac5b807362b794bb588f020d0917da16..2f838a503b3d40369a4616ddbc263cb5e27b0751 100644
--- a/apps/user_webdavauth/l10n/fr.php
+++ b/apps/user_webdavauth/l10n/fr.php
@@ -1,7 +1,7 @@
"Authentification WebDAV",
-"Address: " => "Adresse :",
+"Save" => "Sauvegarder",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Les informations de connexion de l'utilisateur seront envoyées à cette adresse. Ce module analyse le code de la réponse HTTP et considère les codes 401 et 403 comme une authentification invalide et tout autre valeur comme une authentification valide."
);
$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/user_webdavauth/l10n/gl.php b/apps/user_webdavauth/l10n/gl.php
index 1d0c38e08f85dde3679e53d14189eef5900e6c9b..93ea1773cb1549e57f5e0892849ea77daa713677 100644
--- a/apps/user_webdavauth/l10n/gl.php
+++ b/apps/user_webdavauth/l10n/gl.php
@@ -1,7 +1,8 @@
"Autenticación WebDAV",
-"Address: " => "Enderezo:",
+"Address:" => "Enderezo:",
+"Save" => "Gardar",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "As credenciais do usuario serán enviadas a este enderezo. Este engadido comproba a resposta e interpretará os códigos de estado 401 e 403 como credenciais incorrectas, e todas as outras respostas como credenciais correctas."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/he.php b/apps/user_webdavauth/l10n/he.php
index d11fce81a365b3441c7df3ee368beeef0d58ce18..4b037cc537f3ac6fcdf4836e25b151d79fc35f1f 100644
--- a/apps/user_webdavauth/l10n/he.php
+++ b/apps/user_webdavauth/l10n/he.php
@@ -1,5 +1,6 @@
"הזדהות מול WebDAV"
+"WebDAV Authentication" => "הזדהות מול WebDAV",
+"Save" => "שמירה"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/hi.php b/apps/user_webdavauth/l10n/hi.php
new file mode 100644
index 0000000000000000000000000000000000000000..d373ff080cbfec8c9577dc40c36c0fbcc33a886c
--- /dev/null
+++ b/apps/user_webdavauth/l10n/hi.php
@@ -0,0 +1,5 @@
+ "सहेजें"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/hr.php b/apps/user_webdavauth/l10n/hr.php
new file mode 100644
index 0000000000000000000000000000000000000000..5df22b34400a8f21df0af1a7e675a9ff5e29ba5b
--- /dev/null
+++ b/apps/user_webdavauth/l10n/hr.php
@@ -0,0 +1,5 @@
+ "Snimi"
+);
+$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/apps/user_webdavauth/l10n/hu_HU.php b/apps/user_webdavauth/l10n/hu_HU.php
index 0b946e25e70fa212f198c9076bb835c42b1c02a0..97bab9a583fbc6a81c53b4503413d550401c2d87 100644
--- a/apps/user_webdavauth/l10n/hu_HU.php
+++ b/apps/user_webdavauth/l10n/hu_HU.php
@@ -1,7 +1,7 @@
"WebDAV hitelesítés",
-"Address: " => "Címek:",
+"Save" => "Mentés",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "A felhasználói hitelesítő adatai el lesznek küldve erre a címre. Ez a bővítőmodul leellenőrzi a választ és ha a HTTP hibakód nem 401 vagy 403 azaz érvénytelen a hitelesítő adat, akkor minden más válasz érvényes lesz."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/hy.php b/apps/user_webdavauth/l10n/hy.php
new file mode 100644
index 0000000000000000000000000000000000000000..3f79bc37ffa2dd86577d8a42e383e964640fe9b3
--- /dev/null
+++ b/apps/user_webdavauth/l10n/hy.php
@@ -0,0 +1,5 @@
+ "Պահպանել"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/ia.php b/apps/user_webdavauth/l10n/ia.php
new file mode 100644
index 0000000000000000000000000000000000000000..413d8990659ad044bf9ada09ad0e5cfe35f7e0d9
--- /dev/null
+++ b/apps/user_webdavauth/l10n/ia.php
@@ -0,0 +1,5 @@
+ "Salveguardar"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/id.php b/apps/user_webdavauth/l10n/id.php
index 50084bf7f29e45f8ea7ce034fb2b705913869387..25d5d6cac02629d33028f439fa74fa3149f8e417 100644
--- a/apps/user_webdavauth/l10n/id.php
+++ b/apps/user_webdavauth/l10n/id.php
@@ -1,7 +1,7 @@
"Otentikasi WebDAV",
-"Address: " => "Alamat:",
+"Save" => "Simpan",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Kredensial pengguna akan dikirim ke alamat ini. Pengaya ini memeriksa respon dan akan menafsirkan kode status HTTP 401 dan 403 sebagai kredensial yang tidak valid, dan semua tanggapan lain akan dianggap sebagai kredensial yang valid."
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/is.php b/apps/user_webdavauth/l10n/is.php
index 4fcab07654249eba79049bbe043ed7b5708ab51a..c583862c31138583eb723c01766aa62bc8536fc7 100644
--- a/apps/user_webdavauth/l10n/is.php
+++ b/apps/user_webdavauth/l10n/is.php
@@ -1,5 +1,6 @@
"WebDAV Auðkenni"
+"WebDAV Authentication" => "WebDAV Auðkenni",
+"Save" => "Vista"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/it.php b/apps/user_webdavauth/l10n/it.php
index 7e2003997e50676630f531b2e69c371c894e9ac8..f068209d3fc3a8b569fcc19ae47cabda1b80ea08 100644
--- a/apps/user_webdavauth/l10n/it.php
+++ b/apps/user_webdavauth/l10n/it.php
@@ -1,7 +1,8 @@
"Autenticazione WebDAV",
-"Address: " => "Indirizzo:",
+"Address:" => "Indirizzo:",
+"Save" => "Salva",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Le credenziali dell'utente saranno inviate a questo indirizzo. Questa estensione controlla la risposta e interpreterà i codici di stato HTTP 401 e 403 come credenziali non valide, e tutte le altre risposte come credenziali valide."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/ja.php b/apps/user_webdavauth/l10n/ja.php
index bab7be008efdd7e96574e9a25a361aed469b2de7..74c66e85312d9702a22bb1d6a75779b46239d263 100644
--- a/apps/user_webdavauth/l10n/ja.php
+++ b/apps/user_webdavauth/l10n/ja.php
@@ -1,7 +1,7 @@
"WebDAV 認証",
-"Address: " => "アドレス:",
-"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ユーザーの権限情報をこのアドレスに送信します。このプラグインは応答をチェックし、HTTP状態コードが 401 と 403 の場合は無効な資格情報とし、他の応答はすべて有効な資格情報として処理します。"
+"Save" => "保存",
+"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ユーザー資格情報をこのアドレスに送信します。このプラグインは応答をチェックし、HTTP状態コードが 401 と 403 の場合は無効な資格情報とし、他の応答はすべて有効な資格情報として処理します。"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/ka_GE.php b/apps/user_webdavauth/l10n/ka_GE.php
index c2aa956072cecb3a46980fd7d4ec466207fc9910..e5deb0ea67d39f4a151a40f0855e264bcfee4c30 100644
--- a/apps/user_webdavauth/l10n/ka_GE.php
+++ b/apps/user_webdavauth/l10n/ka_GE.php
@@ -1,5 +1,6 @@
"WebDAV აუთენთიფიკაცია"
+"WebDAV Authentication" => "WebDAV აუთენთიფიკაცია",
+"Save" => "შენახვა"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/km.php b/apps/user_webdavauth/l10n/km.php
index 74e61861a9eb9b8e63ff4291a1663e05564d3fe6..eee76d0821461ec741a81964e38f8978463d946a 100644
--- a/apps/user_webdavauth/l10n/km.php
+++ b/apps/user_webdavauth/l10n/km.php
@@ -1,7 +1,7 @@
"ការផ្ទៀងផ្ទាត់ភាពត្រឹមត្រូវ WebDAV",
-"Address: " => "អាសយដ្ឋាន៖",
+"Save" => "រក្សាទុក",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "អត្តសញ្ញាណអ្នកប្រើនឹងត្រូវផ្ញើទៅអាសយដ្ឋាននេះ។ កម្មវិធីបន្ថែមនេះពិនិត្យចម្លើយតប ហើយនឹងបកស្រាយកូដស្ថានភាព HTTP ដូចជា 401 និង 403 ថាជាអត្តសញ្ញាណមិនត្រឹមត្រូវ ហើយនិងចម្លើយតបផ្សេងៗថាត្រឹមត្រូវ។"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/ko.php b/apps/user_webdavauth/l10n/ko.php
index 19565f28522f984702595c5ee53d7b2804dd0cf3..68a113025b27eece68571b7202807f3189ef0e3f 100644
--- a/apps/user_webdavauth/l10n/ko.php
+++ b/apps/user_webdavauth/l10n/ko.php
@@ -1,7 +1,7 @@
"WebDAV 인증",
-"Address: " => "주소:",
+"Save" => "저장",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud에서 이 URL로 사용자 인증 정보를 보냅니다. 이 플러그인은 응답을 확인하여 HTTP 상태 코드 401이나 403이 돌아온 경우에 잘못된 인증 정보로 간주합니다. 다른 모든 상태 코드는 올바른 인증 정보로 간주합니다."
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/ku_IQ.php b/apps/user_webdavauth/l10n/ku_IQ.php
new file mode 100644
index 0000000000000000000000000000000000000000..4e2be8ad0d68bd262364071885f7dde698d96b20
--- /dev/null
+++ b/apps/user_webdavauth/l10n/ku_IQ.php
@@ -0,0 +1,5 @@
+ "پاشکهوتکردن"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/lb.php b/apps/user_webdavauth/l10n/lb.php
new file mode 100644
index 0000000000000000000000000000000000000000..053c7e747d50837580efb98bcfc24fd25926f30f
--- /dev/null
+++ b/apps/user_webdavauth/l10n/lb.php
@@ -0,0 +1,5 @@
+ "Späicheren"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/lt_LT.php b/apps/user_webdavauth/l10n/lt_LT.php
index 41a7fa9502d52832ac244ad9d05e3d2acb3b97fc..29e0b7821d66d633c6b547bb81c930c0b2f69c96 100644
--- a/apps/user_webdavauth/l10n/lt_LT.php
+++ b/apps/user_webdavauth/l10n/lt_LT.php
@@ -1,7 +1,7 @@
"WebDAV autentikacija",
-"Address: " => "Adresas:",
+"Save" => "Išsaugoti",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Naudotojo duomenys bus nusiųsti šiuo adresu. Šis įskiepis patikrins gautą atsakymą ir interpretuos HTTP būsenos kodą 401 ir 403 kaip negaliojančius duomenis, ir visus kitus gautus atsakymus kaip galiojančius duomenis. "
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/user_webdavauth/l10n/lv.php b/apps/user_webdavauth/l10n/lv.php
index 7ce96285881b8ad4c28d2de7740958bfdd89fd3c..a55bb24ee8d10e0c7fd32ade1bce876201a78e65 100644
--- a/apps/user_webdavauth/l10n/lv.php
+++ b/apps/user_webdavauth/l10n/lv.php
@@ -1,5 +1,6 @@
"WebDAV autentifikācija"
+"WebDAV Authentication" => "WebDAV autentifikācija",
+"Save" => "Saglabāt"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);";
diff --git a/apps/user_webdavauth/l10n/mk.php b/apps/user_webdavauth/l10n/mk.php
index 6ebe36423b243817d82f8e376c24bc362af5255b..2146b81745252fa8735b02ff2542e2114b4b86bd 100644
--- a/apps/user_webdavauth/l10n/mk.php
+++ b/apps/user_webdavauth/l10n/mk.php
@@ -1,5 +1,5 @@
"Адреса:"
+"Save" => "Сними"
);
$PLURAL_FORMS = "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;";
diff --git a/apps/user_webdavauth/l10n/ms_MY.php b/apps/user_webdavauth/l10n/ms_MY.php
index a9266aa56caccc936108906b80e2975fae7cd351..5142c1d0f4a993ecf4df7956193788e86e58be24 100644
--- a/apps/user_webdavauth/l10n/ms_MY.php
+++ b/apps/user_webdavauth/l10n/ms_MY.php
@@ -1,7 +1,7 @@
"Pengesahan ",
-"Address: " => "Alamat:",
+"Save" => "Simpan",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Butiran pengguna akan dihantar ke alamat ini. Plugin ini memeriksa maklum balas dan akan mentafsir kod status HTTP 401 dan 403 sebagai butiran tidak sah, dan semua maklum balas lain sebagai butiran yang sah."
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/nb_NO.php b/apps/user_webdavauth/l10n/nb_NO.php
index c472270388782c07268d1d886f1b6d46754474ba..624ff1969bcf7eb7d32eac259416b4e810d1f36d 100644
--- a/apps/user_webdavauth/l10n/nb_NO.php
+++ b/apps/user_webdavauth/l10n/nb_NO.php
@@ -1,7 +1,7 @@
"WebDAV-autentisering",
-"Address: " => "Adresse:",
+"Save" => "Lagre",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Brukerens påloggingsinformasjon vil bli sendt til denne adressen. Denne utvidelsen sjekker svaret og vil tolke HTTP-statuskodene 401 og 403 som ugyldig bruker eller passord, og alle andre svar tolkes som gyldig påloggings."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/nl.php b/apps/user_webdavauth/l10n/nl.php
index d763789f17adecb1ab2b764404447cd4811b131b..d8e8b6f3f249127b4620982e1f24aa7aa51c8dc0 100644
--- a/apps/user_webdavauth/l10n/nl.php
+++ b/apps/user_webdavauth/l10n/nl.php
@@ -1,7 +1,7 @@
"WebDAV authenticatie",
-"Address: " => "Adres:",
+"Save" => "Bewaren",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "De ingloggegevens worden opgestuurd naar dit adres. Deze plugin controleert de terugkoppeling en interpreteert de HTTP statuscodes 401 en 403 als invalide inloggegevens, en alle andere terugkoppelingen als valide inloggegevens."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/nn_NO.php b/apps/user_webdavauth/l10n/nn_NO.php
index 909231b5f5826ca6c91bd72e77bec3bc5b03d24e..e52c6c653fc2869ff79f222902573862d0ff5a8d 100644
--- a/apps/user_webdavauth/l10n/nn_NO.php
+++ b/apps/user_webdavauth/l10n/nn_NO.php
@@ -1,7 +1,7 @@
"WebDAV-autentisering",
-"Address: " => "Adresse:",
+"Save" => "Lagra",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Innloggingsinformasjon blir sendt til denne nettadressa. Dette programtillegget kontrollerer svaret og tolkar HTTP-statuskodane 401 og 403 som ugyldige, og alle andre svar som gyldige."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/oc.php b/apps/user_webdavauth/l10n/oc.php
new file mode 100644
index 0000000000000000000000000000000000000000..42ef978066ee5d64a848e20e7d7495a8f82747ec
--- /dev/null
+++ b/apps/user_webdavauth/l10n/oc.php
@@ -0,0 +1,5 @@
+ "Enregistra"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/user_webdavauth/l10n/pl.php b/apps/user_webdavauth/l10n/pl.php
index 9c39be043854a8ef9397aa449b31bf6f6e68c911..1f884f895aff0656c81586a0fa27330fc634dc22 100644
--- a/apps/user_webdavauth/l10n/pl.php
+++ b/apps/user_webdavauth/l10n/pl.php
@@ -1,7 +1,7 @@
"Uwierzytelnienie WebDAV",
-"Address: " => "Adres:",
+"Save" => "Zapisz",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Dane uwierzytelniające użytkownika zostaną wysłane na ten adres. Wtyczka sprawdza odpowiedź i będzie interpretował status HTTP 401 i 403 jako nieprawidłowe dane uwierzytelniające i wszystkie inne odpowiedzi jako prawidłowe uwierzytelnienie."
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/user_webdavauth/l10n/pt_BR.php b/apps/user_webdavauth/l10n/pt_BR.php
index 6dde16ff4e0db42fa4c1c79d37e089c7255af1f0..e3534fd90bf5614db8376a2afabb1e83a6ec2f89 100644
--- a/apps/user_webdavauth/l10n/pt_BR.php
+++ b/apps/user_webdavauth/l10n/pt_BR.php
@@ -1,7 +1,7 @@
"Autenticação WebDAV",
-"Address: " => "Endereço:",
+"Save" => "Guardar",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "As credenciais de usuário serão enviadas para este endereço. Este plugin verifica a resposta e interpretará os códigos de status HTTP 401 e 403 como \"credenciais inválidas\", e todas as outras respostas como \"credenciais válidas\"."
);
$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/user_webdavauth/l10n/pt_PT.php b/apps/user_webdavauth/l10n/pt_PT.php
index f21d9c0bb9a7d302fcecce05e25fdc34d24a4fda..4cf989a968c4a1805c8fc99228c913c220ab173b 100644
--- a/apps/user_webdavauth/l10n/pt_PT.php
+++ b/apps/user_webdavauth/l10n/pt_PT.php
@@ -1,7 +1,7 @@
"Autenticação WebDAV",
-"Address: " => "Endereço:",
+"Save" => "Guardar",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "As credenciais do utilizador vão ser enviadas para endereço URL. Este plugin verifica a resposta e vai interpretar os códigos de estado HTTP 401 e 403 como credenciais inválidas, e todas as outras respostas como válidas."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/ro.php b/apps/user_webdavauth/l10n/ro.php
index 24e3c9f917c1542585dde53f42df9ac21dc1d2e4..8fafe932ad0d79d1e963cf904f6717edb924e22a 100644
--- a/apps/user_webdavauth/l10n/ro.php
+++ b/apps/user_webdavauth/l10n/ro.php
@@ -1,6 +1,6 @@
"Autentificare WebDAV",
-"Address: " => "Adresa :"
+"Save" => "Salvează"
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));";
diff --git a/apps/user_webdavauth/l10n/ru.php b/apps/user_webdavauth/l10n/ru.php
index 76c18a37c207180adc49dcaf3f110f5e2ce091b6..cfb31b1cb1e7ff4df4125a7eb41b6f1e1300175f 100644
--- a/apps/user_webdavauth/l10n/ru.php
+++ b/apps/user_webdavauth/l10n/ru.php
@@ -1,7 +1,7 @@
"Идентификация WebDAV",
-"Address: " => "Адрес:",
+"Save" => "Сохранить",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Учётные данные пользователя будут отправлены на этот адрес. Плагин проверит ответ и будет рассматривать HTTP коды 401 и 403 как неверные учётные данные, при любом другом ответе - учётные данные пользователя верны."
);
$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/apps/user_webdavauth/l10n/si_LK.php b/apps/user_webdavauth/l10n/si_LK.php
index cc5cfb3c9b2aad38015897e48c4fd44922faec45..661a8495c3058c093327dcd6c51741a439e70745 100644
--- a/apps/user_webdavauth/l10n/si_LK.php
+++ b/apps/user_webdavauth/l10n/si_LK.php
@@ -1,3 +1,5 @@
- "WebDAV යොමුව: http://"
+ "සුරකින්න"
);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/sk.php b/apps/user_webdavauth/l10n/sk.php
new file mode 100644
index 0000000000000000000000000000000000000000..9efe9fe65497e248d1c3eabedec3c6b7fd62f44b
--- /dev/null
+++ b/apps/user_webdavauth/l10n/sk.php
@@ -0,0 +1,5 @@
+ "Uložiť"
+);
+$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;";
diff --git a/apps/user_webdavauth/l10n/sk_SK.php b/apps/user_webdavauth/l10n/sk_SK.php
index 017f923c2b5699fe420c9da2db3e904146f1452e..694653d98771946a06f7bcbc553f4bd9af99d026 100644
--- a/apps/user_webdavauth/l10n/sk_SK.php
+++ b/apps/user_webdavauth/l10n/sk_SK.php
@@ -1,7 +1,7 @@
"WebDAV overenie",
-"Address: " => "Adresa: ",
+"Save" => "Uložiť",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Používateľské prihlasovacie údaje budú odoslané na túto adresu. Tento plugin skontroluje odpoveď servera a interpretuje návratový kód HTTP 401 a 403 ako neplatné prihlasovacie údaje a akýkoľvek iný ako platné prihlasovacie údaje."
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;";
diff --git a/apps/user_webdavauth/l10n/sl.php b/apps/user_webdavauth/l10n/sl.php
index 3bf3068c55fc20c23e7f3f95768c5ed8f81504c0..1b0eed781415118443e7e56b1f573aa00ca763cb 100644
--- a/apps/user_webdavauth/l10n/sl.php
+++ b/apps/user_webdavauth/l10n/sl.php
@@ -1,7 +1,7 @@
"Overitev WebDAV",
-"Address: " => "Naslov:",
+"Save" => "Shrani",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Uporabniška poverila bodo poslana na naveden naslov. Vstavek preveri odziv in kodi stanja 401 in 403 obravnava kot neveljavna poverila, vse ostale odzive pa kot veljavna."
);
$PLURAL_FORMS = "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);";
diff --git a/apps/user_webdavauth/l10n/sq.php b/apps/user_webdavauth/l10n/sq.php
new file mode 100644
index 0000000000000000000000000000000000000000..66d3b2fb102a864b1ea385783aface41aded6ce0
--- /dev/null
+++ b/apps/user_webdavauth/l10n/sq.php
@@ -0,0 +1,5 @@
+ "Ruaj"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/sr.php b/apps/user_webdavauth/l10n/sr.php
index 5cb00494033f9a7bc901c3bf30661df9b8562238..78f24013e5e04d94593da2cc0fab2f25a67a17eb 100644
--- a/apps/user_webdavauth/l10n/sr.php
+++ b/apps/user_webdavauth/l10n/sr.php
@@ -1,5 +1,6 @@
"WebDAV провера идентитета"
+"WebDAV Authentication" => "WebDAV провера идентитета",
+"Save" => "Сачувај"
);
$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/apps/user_webdavauth/l10n/sr@latin.php b/apps/user_webdavauth/l10n/sr@latin.php
new file mode 100644
index 0000000000000000000000000000000000000000..3eb281117694071d0563b1002ace4871a6ead569
--- /dev/null
+++ b/apps/user_webdavauth/l10n/sr@latin.php
@@ -0,0 +1,5 @@
+ "Snimi"
+);
+$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/apps/user_webdavauth/l10n/sv.php b/apps/user_webdavauth/l10n/sv.php
index 7595e61efe587d8965dc01d4e8859090e339cb66..b0404000cb23d8fb9f292f35c0b4a4c8b076e813 100644
--- a/apps/user_webdavauth/l10n/sv.php
+++ b/apps/user_webdavauth/l10n/sv.php
@@ -1,7 +1,7 @@
"WebDAV Autentisering",
-"Address: " => "Adress: ",
+"Save" => "Spara",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud kommer skicka användaruppgifterna till denna URL. Denna plugin kontrollerar svaret och tolkar HTTP-statuskoderna 401 och 403 som felaktiga uppgifter, och alla andra svar som giltiga uppgifter."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/ta_LK.php b/apps/user_webdavauth/l10n/ta_LK.php
index 9bd32954b058d9ad5c43d6604e9ba18e4bd559f3..fdf3ac7b15e0a2ca04fcf808426c1904a0a6b479 100644
--- a/apps/user_webdavauth/l10n/ta_LK.php
+++ b/apps/user_webdavauth/l10n/ta_LK.php
@@ -1,3 +1,5 @@
- "WebDAV URL: http://"
+ "சேமிக்க "
);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/te.php b/apps/user_webdavauth/l10n/te.php
new file mode 100644
index 0000000000000000000000000000000000000000..f3bf5e83cdebdf3d20ef2d6dba342ddb0d61b01c
--- /dev/null
+++ b/apps/user_webdavauth/l10n/te.php
@@ -0,0 +1,5 @@
+ "భద్రపరచు"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/th_TH.php b/apps/user_webdavauth/l10n/th_TH.php
index 102adaca4abaee6924a5725b014b3bb65163b046..c6120ba3090ad920c18679a1bc07b0edbad12961 100644
--- a/apps/user_webdavauth/l10n/th_TH.php
+++ b/apps/user_webdavauth/l10n/th_TH.php
@@ -1,5 +1,6 @@
"WebDAV Authentication"
+"WebDAV Authentication" => "WebDAV Authentication",
+"Save" => "บันทึก"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/tr.php b/apps/user_webdavauth/l10n/tr.php
index 6c6b0c5c9d43f8932a7eea9a3988ce37f0c933aa..f07b3d8174664cdd96cafb5e8203e095165fdeee 100644
--- a/apps/user_webdavauth/l10n/tr.php
+++ b/apps/user_webdavauth/l10n/tr.php
@@ -1,7 +1,8 @@
"WebDAV Kimlik Doğrulaması",
-"Address: " => "WebDAV Kimlik Doğrulaması",
+"Address:" => "Adres:",
+"Save" => "Kaydet",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Kullanıcı kimlik bilgileri bu adrese gönderilecek. Bu eklenti yanıtı kontrol edecek ve 401 ile 403 HTTP durum kodlarını geçersiz kimlik bilgileri olarak, diğer yanıtları ise doğru kimlik bilgileri olarak algılayacaktır."
);
$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/user_webdavauth/l10n/ug.php b/apps/user_webdavauth/l10n/ug.php
index 8ad7963d49fa4fa9fd3a72e9a60e4acfe28094f2..f4e736952c4bfd4850b102f1c12b51b9cda75122 100644
--- a/apps/user_webdavauth/l10n/ug.php
+++ b/apps/user_webdavauth/l10n/ug.php
@@ -1,5 +1,6 @@
"WebDAV سالاھىيەت دەلىللەش"
+"WebDAV Authentication" => "WebDAV سالاھىيەت دەلىللەش",
+"Save" => "ساقلا"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/uk.php b/apps/user_webdavauth/l10n/uk.php
index 00d26cb252cf6963c289b61935ffec54f0451110..b548b01951b1e31fe054b3063e1ef7dffb499bf7 100644
--- a/apps/user_webdavauth/l10n/uk.php
+++ b/apps/user_webdavauth/l10n/uk.php
@@ -1,7 +1,7 @@
"Аутентифікація WebDAV",
-"Address: " => "Адреса:",
+"Save" => "Зберегти",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Облікові дані користувача буде надіслано на цю адресу. Цей плагін перевіряє відповідь і буде інтерпретувати коди статусу HTTP 401 і 403, як неправильні облікові дані, а всі інші відповіді, вважатимуться правильними."
);
$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/apps/user_webdavauth/l10n/ur_PK.php b/apps/user_webdavauth/l10n/ur_PK.php
new file mode 100644
index 0000000000000000000000000000000000000000..3546754a0d2e4954dea2ef90fb55207fb87e1ec5
--- /dev/null
+++ b/apps/user_webdavauth/l10n/ur_PK.php
@@ -0,0 +1,5 @@
+ "حفظ"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/vi.php b/apps/user_webdavauth/l10n/vi.php
index 0ba38cc26f00654544cf0c829a91621dfa885eef..ee8a47151cec53dd0211580c04ecc902a34149e5 100644
--- a/apps/user_webdavauth/l10n/vi.php
+++ b/apps/user_webdavauth/l10n/vi.php
@@ -1,7 +1,7 @@
"Xác thực WebDAV",
-"Address: " => "Địa chỉ :",
+"Save" => "Lưu",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Các thông tin người dùng sẽ được gửi đến địa chỉ này. Plugin này sẽ kiểm tra các phản hồi và các statuscodes HTTP 401 và 403 không hợp lệ, và tất cả những phản h khác như thông tin hợp lệ."
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/zh_CN.php b/apps/user_webdavauth/l10n/zh_CN.php
index a225ea7f577edf1c76ee2a0e43e65c7b194b27a6..c3ee68849b992743e0a3a61cb5f667cea0d27ab7 100644
--- a/apps/user_webdavauth/l10n/zh_CN.php
+++ b/apps/user_webdavauth/l10n/zh_CN.php
@@ -1,7 +1,7 @@
"WebDAV 认证",
-"Address: " => "地址:",
+"Save" => "保存",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "用户的身份将会被发送到此 URL。这个插件检查返回值并且将 HTTP 状态编码 401 和 403 解释为非法身份,其他所有返回值为合法身份。"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/zh_HK.php b/apps/user_webdavauth/l10n/zh_HK.php
index 61a0270fb70bc20fbf8e1487f5200400b5735d7b..fa0e987fa3c7ee22b4b5a15f42d681421ec773ab 100644
--- a/apps/user_webdavauth/l10n/zh_HK.php
+++ b/apps/user_webdavauth/l10n/zh_HK.php
@@ -1,7 +1,7 @@
"WebDAV 認證",
-"Address: " => "位址:",
+"Save" => "儲存",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "使用者憑證將會被傳送到此位址。此外掛程式將會檢查回應,HTTP狀態碼 401與403將會被理解為無效憑證,而所有其他的回應將會被理解為有效憑證。"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/zh_TW.php b/apps/user_webdavauth/l10n/zh_TW.php
index 61a0270fb70bc20fbf8e1487f5200400b5735d7b..fa0e987fa3c7ee22b4b5a15f42d681421ec773ab 100644
--- a/apps/user_webdavauth/l10n/zh_TW.php
+++ b/apps/user_webdavauth/l10n/zh_TW.php
@@ -1,7 +1,7 @@
"WebDAV 認證",
-"Address: " => "位址:",
+"Save" => "儲存",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "使用者憑證將會被傳送到此位址。此外掛程式將會檢查回應,HTTP狀態碼 401與403將會被理解為無效憑證,而所有其他的回應將會被理解為有效憑證。"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/templates/settings.php b/apps/user_webdavauth/templates/settings.php
index 4596fdf3c78959d902cfc725e0830d111d4e5bf8..a87c0ad159a868a80e33e181a4582d521d19a707 100755
--- a/apps/user_webdavauth/templates/settings.php
+++ b/apps/user_webdavauth/templates/settings.php
@@ -1,7 +1,7 @@
diff --git a/config/config.sample.php b/config/config.sample.php
index 0a81543589bdc216b88d76c4f5cf856b726d7ff5..4b1ab2fce5fa24f0e5021d83d949f1c882cef11a 100755
--- a/config/config.sample.php
+++ b/config/config.sample.php
@@ -291,6 +291,9 @@ $CONFIG = array(
*/
'cache_path' => '',
+/* EXPERIMENTAL: option whether to include external storage in quota calculation, defaults to false */
+'quota_include_external_storage' => false,
+
/*
* specifies how often the filesystem is checked for changes made outside owncloud
* 0 -> never check the filesystem for outside changes, provides a performance increase when it's certain that no changes are made directly to the filesystem
@@ -301,5 +304,4 @@ $CONFIG = array(
/* If true, prevent owncloud from changing the cache due to changes in the filesystem for all storage */
'filesystem_cache_readonly' => false,
-
);
diff --git a/core/ajax/update.php b/core/ajax/update.php
index 84d7a21209e4be4225776ab2e53d8e3fddcf90db..698614c975f2a865068d5e49124ab9a62ad1a2f7 100644
--- a/core/ajax/update.php
+++ b/core/ajax/update.php
@@ -15,6 +15,9 @@ if (OC::checkUpgrade(false)) {
$updater->listen('\OC\Updater', 'dbUpgrade', function () use ($eventSource, $l) {
$eventSource->send('success', (string)$l->t('Updated database'));
});
+ $updater->listen('\OC\Updater', 'dbSimulateUpgrade', function () use ($eventSource, $l) {
+ $eventSource->send('success', (string)$l->t('Checked database schema update'));
+ });
$updater->listen('\OC\Updater', 'disabledApps', function ($appList) use ($eventSource, $l) {
$list = array();
foreach ($appList as $appId) {
diff --git a/core/avatar/controller.php b/core/avatar/controller.php
index 06efbec3f3ca2e658cf287d7a44fcd98a63e5aa1..03eb9da1dc575dd7963073fc4f01877dd6569862 100644
--- a/core/avatar/controller.php
+++ b/core/avatar/controller.php
@@ -46,7 +46,12 @@ class Controller {
if (isset($_POST['path'])) {
$path = stripslashes($_POST['path']);
$view = new \OC\Files\View('/'.$user.'/files');
- $newAvatar = $view->file_get_contents($path);
+ $fileInfo = $view->getFileInfo($path);
+ if($fileInfo['encrypted'] === true) {
+ $fileName = $view->toTmpFile($path);
+ } else {
+ $fileName = $view->getLocalFile($path);
+ }
} elseif (!empty($_FILES)) {
$files = $_FILES['files'];
if (
@@ -54,7 +59,9 @@ class Controller {
is_uploaded_file($files['tmp_name'][0]) &&
!\OC\Files\Filesystem::isFileBlacklisted($files['tmp_name'][0])
) {
- $newAvatar = file_get_contents($files['tmp_name'][0]);
+ \OC\Cache::set('avatar_upload', file_get_contents($files['tmp_name'][0]), 7200);
+ $view = new \OC\Files\View('/'.$user.'/cache');
+ $fileName = $view->getLocalFile('avatar_upload');
unlink($files['tmp_name'][0]);
}
} else {
@@ -64,11 +71,9 @@ class Controller {
}
try {
- $avatar = new \OC_Avatar($user);
- $avatar->set($newAvatar);
- \OC_JSON::success();
- } catch (\OC\NotSquareException $e) {
- $image = new \OC_Image($newAvatar);
+ $image = new \OC_Image();
+ $image->loadFromFile($fileName);
+ $image->fixOrientation();
if ($image->valid()) {
\OC\Cache::set('tmpavatar', $image->data(), 7200);
diff --git a/core/command/upgrade.php b/core/command/upgrade.php
index 8ce8ef9b6e5e4b9753bba37d6d2c1bb0c3f8e489..c3946d2aab5276c5ef634b0b3ae3161f8533c6ba 100644
--- a/core/command/upgrade.php
+++ b/core/command/upgrade.php
@@ -56,6 +56,9 @@ class Upgrade extends Command {
$updater->listen('\OC\Updater', 'dbUpgrade', function () use($output) {
$output->writeln('Updated database ');
});
+ $updater->listen('\OC\Updater', 'dbSimulateUpgrade', function () use($output) {
+ $output->writeln('Checked database schema update ');
+ });
$updater->listen('\OC\Updater', 'disabledApps', function ($appList) use($output) {
$output->writeln('Disabled incompatible apps: ' . implode(', ', $appList) . ' ');
});
diff --git a/core/css/apps.css b/core/css/apps.css
index 377878467c0be2f8c84abe06d8f108bfb83e8162..4bcf89c7ee4d08dc5cc28cad0345a6349b6cd613 100644
--- a/core/css/apps.css
+++ b/core/css/apps.css
@@ -10,7 +10,7 @@
/* Navigation: folder like structure */
#app-navigation {
- width: 300px;
+ width: 230px;
height: 100%;
float: left;
-moz-box-sizing: border-box; box-sizing: border-box;
@@ -19,6 +19,7 @@
padding-bottom: 44px;
}
#app-navigation > ul {
+ position: relative;
height: 100%;
overflow: auto;
-moz-box-sizing: border-box; box-sizing: border-box;
@@ -167,6 +168,7 @@
/* Part where the content will be loaded into */
#app-content {
+ position: relative;
height: 100%;
overflow-y: auto;
}
@@ -174,7 +176,7 @@
/* settings area */
#app-settings {
position: fixed;
- width: 299px;
+ width: 229px;
bottom: 0;
border-top: 1px solid #ccc;
}
@@ -277,3 +279,12 @@ button.loading {
.appear.transparent {
opacity: 0;
}
+
+
+/* do not use italic typeface style, instead lighter color */
+em {
+ font-style: normal;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
+ filter: alpha(opacity=50);
+ opacity: .5;
+}
diff --git a/core/css/fixes.css b/core/css/fixes.css
index 91267c276ae72573c6bc444f812d4c0874d94a7f..acea53258eb920d66a7d3fbec940399a1568ca5b 100644
--- a/core/css/fixes.css
+++ b/core/css/fixes.css
@@ -7,7 +7,12 @@
/* fix height of select boxes for OS X */
select {
- min-height: 29px;
+ height: 32px;
+}
+
+/* reset typeface for IE8 because OpenSans renders too small */
+.ie8 body {
+ font-family: Frutiger, Calibri, 'Myriad Pro', Myriad, Arial, sans-serif;
}
.lte8 .delete-icon { background-image: url('../img/actions/delete.png'); }
@@ -42,10 +47,6 @@ select {
border-bottom: 1px solid lightgrey;
background-color: white; /* don't change background on hover */
}
-.lte9 #body-login form label.infield {
- background-color: white; /* don't change background on hover */
- -ms-filter: "progid:DXImageTransform.Microsoft.Chroma(color='white')";
-}
/* disable opacity of info text on gradient
since we cannot set a good backround color to use the filter&background hack as with the input labels */
@@ -76,7 +77,7 @@ select {
/* IE8 isn't able to display transparent background. So it is specified using a gradient */
.ie8 #nojavascript {
- filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#4c320000', endColorstr='#4c320000'); /* IE */
+ filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#4c320000', endColorstr='#4c320000');
}
/* IE8 doesn't have rounded corners, so the strengthify bar should be wider */
@@ -84,3 +85,4 @@ select {
width: 271px;
left: 6px;
}
+
diff --git a/core/css/fonts.css b/core/css/fonts.css
new file mode 100644
index 0000000000000000000000000000000000000000..aa6e71bef21fa77a3ede9daa76c75cf56fa91073
--- /dev/null
+++ b/core/css/fonts.css
@@ -0,0 +1,13 @@
+@font-face {
+ font-family: 'Open Sans';
+ font-style: normal;
+ font-weight: normal;
+ src: local('Open Sans'), local('OpenSans'), url(../fonts/OpenSans-Regular.woff) format('woff');
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ font-style: normal;
+ font-weight: bold;
+ src: local('Open Sans Bold'), local('OpenSans-Bold'), url(../fonts/OpenSans-Bold.woff) format('woff');
+}
\ No newline at end of file
diff --git a/core/css/header.css b/core/css/header.css
new file mode 100644
index 0000000000000000000000000000000000000000..83612c674456d51572676097c72f4c6e005a1dd3
--- /dev/null
+++ b/core/css/header.css
@@ -0,0 +1,293 @@
+/* prevent ugly selection effect on accidental selection */
+#header,
+#navigation,
+#expanddiv {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+}
+
+
+
+/* HEADERS ------------------------------------------------------------------ */
+
+#body-user #header,
+#body-settings #header,
+#body-public #header {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ z-index: 100;
+ height: 45px;
+ line-height: 2.5em;
+ background-color: #1d2d44;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+
+
+/* LOGO and APP NAME -------------------------------------------------------- */
+
+#owncloud {
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding: 6px;
+ padding-bottom: 0;
+ height: 45px; /* header height */
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+#header .logo {
+ background-image: url(../img/logo.svg);
+ background-repeat: no-repeat;
+ width: 250px;
+ height: 118px;
+ margin: 0 auto;
+}
+
+#header .logo-wide {
+ background-image: url(../img/logo-wide.svg);
+ background-repeat: no-repeat;
+ width: 147px;
+ height: 32px;
+}
+
+#header .logo-icon {
+ /* display logo so appname can be shown next to it */
+ display: inline-block;
+ background-image: url(../img/logo-icon.svg);
+ background-repeat: no-repeat;
+ width: 60px;
+ height: 32px;
+}
+
+#header .menutoggle {
+ display: inline-block;
+ position: absolute;
+ left: 70px;
+ height: 27px;
+ padding-top: 18px;
+ padding-right: 10px;
+}
+
+/* hover effect for app switcher label */
+.menutoggle .header-appname,
+.menutoggle .icon-caret {
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=75)";
+ filter: alpha(opacity=75);
+ opacity: .75;
+}
+.menutoggle:hover .header-appname,
+.menutoggle:hover .icon-caret,
+.menutoggle:focus .header-appname
+.menutoggle:focus .icon-caret
+.menutoggle.active .header-appname
+.menutoggle.active .icon-caret {
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
+ filter: alpha(opacity=100);
+ opacity: 1;
+}
+
+/* show appname next to logo */
+.header-appname {
+ display: inline-block;
+ position: relative;
+ color: #fff;
+ font-size: 16px;
+ margin: 0;
+ margin-top: -24px;
+ padding: 7px 0 7px 5px;
+ vertical-align: middle;
+}
+/* show caret indicator next to logo to make clear it is tappable */
+#header .icon-caret {
+ display: inline-block;
+ width: 12px;
+ height: 12px;
+ margin: 0;
+ margin-top: -21px;
+ padding: 0;
+ vertical-align: middle;
+}
+/* do not show menu toggle on public share links as there is no menu */
+#body-public #header .icon-caret {
+ display: none;
+}
+
+
+
+/* NAVIGATION --------------------------------------------------------------- */
+
+#content-wrapper {
+ padding-left: 0;
+}
+
+#navigation {
+ position: fixed;
+ top: 45px;
+ width: 265px;
+ max-height: 85%;
+ margin-top: 0;
+ padding-bottom: 10px;
+ background-color: rgba(36, 40, 47, .97);
+ border-bottom-right-radius: 7px;
+ box-shadow: 0 0 7px rgba(29,45,68,.97);
+ display: none;
+ overflow-y: auto;
+ overflow-x: hidden;
+ z-index: 150;
+}
+#navigation, #navigation * {
+ -moz-box-sizing:border-box;
+ box-sizing:border-box;
+}
+#navigation li {
+ display: inline-block;
+}
+#navigation a {
+ position: relative;
+ width: 80px;
+ height: 80px;
+ display: inline-block;
+ text-align: center;
+ padding: 20px 0;
+}
+#navigation a span {
+ display: inline-block;
+ font-size: 13px;
+ padding-bottom: 0;
+ padding-left: 0;
+ width: 80px;
+ text-align: center;
+ color: #fff;
+ white-space:nowrap;
+ overflow:hidden;
+ text-overflow:ellipsis;
+}
+ /* icon opacity and hover effect */
+ #navigation a img,
+ #navigation a span {
+ /* 50% opacity when inactive */
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
+ filter: alpha(opacity=50);
+ opacity: .5;
+ }
+ #navigation a:hover img, #navigation a:focus img,
+ #navigation a:hover span, #navigation a:focus span {
+ /* 80% opacity when hovered or focused */
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
+ filter: alpha(opacity=80);
+ opacity: .8;
+ }
+ #navigation a.active img,
+ #navigation a.active span {
+ /* full opacity for the active app */
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
+ filter: alpha(opacity=100);
+ opacity: 1;
+ }
+
+#navigation .app-icon {
+ margin: 0 auto;
+ padding: 0;
+}
+
+/* Apps management */
+#apps-management {
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";
+ filter: alpha(opacity=60);
+ opacity: .6;
+ min-height: initial;
+ height: initial;
+ margin: 0;
+}
+
+
+/* loading feedback for apps */
+#navigation .app-loading .icon-loading-dark {
+ display: inline !important;
+ position: absolute;
+ top: 20px;
+ left: 24px;
+ width: 32px;
+ height: 32px;
+}
+#navigation .app-loading .app-icon {
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)";
+ filter: alpha(opacity=10);
+ opacity: .1;
+}
+
+
+
+
+/* USER MENU -----------------------------------------------------------------*/
+
+/* info part on the right, used e.g. for info on who shared something */
+.header-right {
+ position: absolute;
+ right: 0;
+ padding: 7px 5px;
+ color: #fff;
+ height: 100%;
+ max-width: 40%;
+ white-space: nowrap;
+}
+
+/* Profile picture in header */
+#header .avatardiv {
+ float: left;
+ display: inline-block;
+ margin-right: 5px;
+}
+#header .avatardiv img {
+ opacity: 1;
+}
+
+#settings {
+ float: right;
+ color: #bbb;
+}
+#expand {
+ display: block;
+ padding: 7px 12px 6px 7px;
+ cursor: pointer;
+}
+#expand:hover, #expand:focus, #expand:active { color:#fff; }
+#expand img { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; filter:alpha(opacity=70); opacity:.7; margin-bottom:-2px; }
+#expand:hover img, #expand:focus img, #expand:active img { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; }
+#expanddiv {
+ position: absolute;
+ right: 0;
+ top: 45px;
+ z-index: 150;
+ display: none;
+ background-color: #383c43;
+ border-bottom-left-radius:7px; border-bottom:1px #333 solid; border-left:1px #333 solid;
+ box-shadow:0 0 7px rgb(29,45,68);
+ -moz-box-sizing: border-box; box-sizing: border-box;
+}
+ #expanddiv a {
+ display: block;
+ height: 40px;
+ color: #fff;
+ padding: 4px 12px 0;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";
+ filter: alpha(opacity=70);
+ opacity: .7;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ #expanddiv a img {
+ margin-bottom: -3px;
+ margin-right: 6px;
+ }
+ #expanddiv a:hover, #expanddiv a:focus, #expanddiv a:active {
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
+ filter: alpha(opacity=100);
+ opacity: 1;
+ }
diff --git a/core/css/mobile.css b/core/css/mobile.css
index 018526130622419bdc67792ea88fc95c665d76b2..9cea0dddc8f1e0bb1fd8d3bbe36dd8733df2bf3c 100644
--- a/core/css/mobile.css
+++ b/core/css/mobile.css
@@ -21,19 +21,6 @@
box-align: center;
}
-/* show caret indicator next to logo to make clear it is tappable */
-#owncloud.menutoggle {
- background-image: url('../img/actions/caret.svg');
- background-repeat: no-repeat;
- background-position: right 26px;
- padding-right: 16px !important;
-}
-/* do not show menu toggle on public share links as there is no menu */
-#body-public #owncloud.menutoggle {
- background-image: none;
- padding-right: 0 !important;
-}
-
/* compress search box on mobile, expand when focused */
.searchbox input[type="search"] {
width: 15%;
@@ -53,70 +40,6 @@
display: none;
}
-/* toggle navigation */
-#content-wrapper {
- padding-left: 0;
-}
-
-#navigation {
- top: 45px;
- bottom: initial;
- width: 255px;
- max-height: 90%;
- margin-top: 0;
- top: 45px;
- background-color: rgba(36, 40, 47, .97);
- overflow-x: initial;
- border-bottom-right-radius: 7px;
- border-bottom: 1px #333 solid;
- border-right: 1px #333 solid;
- box-shadow: 0 0 7px rgba(29,45,68,.97);
- display: none;
-}
-#navigation, #navigation * {
- box-sizing:border-box; -moz-box-sizing:border-box;
-}
-#navigation li {
- display: inline-block;
-}
-#navigation a {
- width: 80px;
- height: 80px;
- display: inline-block;
- text-align: center;
- padding: 20px 0;
-}
-#navigation a span {
- display: inline-block;
- font-size: 13px;
- padding-bottom: 0;
- padding-left: 0;
- width: 80px;
-}
-#navigation .icon {
- margin: 0 auto;
- padding: 0;
-}
-#navigation li:first-child .icon {
- padding-top: 0;
-}
-/* Apps management as sticky footer */
-#navigation .wrapper {
- min-height: initial;
- margin: 0;
-}
-#apps-management, #navigation .push {
- height: initial;
-}
-
-
-
-/* shift to account for missing navigation */
-#body-user #controls,
-#body-settings #controls {
- padding-left: 0;
-}
-
/* don’t require a minimum width for controls bar */
#controls {
min-width: initial !important;
diff --git a/core/css/share.css b/core/css/share.css
index 1527a3a0c0fdf07def2bb9295bac976e05ea506d..0859c195858535e9411de3777f1e2f5df3d3544c 100644
--- a/core/css/share.css
+++ b/core/css/share.css
@@ -8,7 +8,7 @@
border-bottom-right-radius: 5px;
box-shadow:0 1px 1px #777;
display:block;
- margin-right:112px;
+ margin-right: 0;
position:absolute;
right:0;
width:420px;
diff --git a/core/css/styles.css b/core/css/styles.css
index 4a84568244ca661110dd12a91860d27807922427..6eb09e6e9423889bb0335e6e8ed5e2d1296abbc2 100644
--- a/core/css/styles.css
+++ b/core/css/styles.css
@@ -16,28 +16,14 @@ ul { list-style:none; }
body {
background: #fefefe;
- font: normal .8em/1.6em "Helvetica Neue",Helvetica,Arial,FreeSans,sans-serif;
+ font-weight: normal;
+ font-size: .8em;
+ line-height: 1.6em;
+ font-family: 'Open Sans', Frutiger, Calibri, 'Myriad Pro', Myriad, sans-serif;
color: #000;
height: auto;
}
-
-/* HEADERS */
-#body-user #header,
-#body-settings #header,
-#body-public #header {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- z-index: 100;
- height: 45px;
- line-height: 2.5em;
- background-color: #1d2d44;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
#body-login {
text-align: center;
background: #1d2d44; /* Old browsers */
@@ -50,34 +36,7 @@ body {
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#35537a', endColorstr='#1d2d44',GradientType=0 ); /* IE6-9 */
}
-#owncloud {
- position: absolute;
- top: 0;
- left: 0;
- padding: 6px;
- padding-bottom: 0;
-}
-/* info part on the right, used e.g. for info on who shared something */
-.header-right {
- position: absolute;
- right: 0;
- padding: 7px 5px;
- color: #fff;
- height: 100%;
- max-width: 40%;
- white-space: nowrap;
-}
-
-/* Profile picture in header */
-#header .avatardiv {
- float: left;
- display: inline-block;
- margin-right: 5px;
-}
-#header .avatardiv img {
- opacity: 1;
-}
#nojavascript {
position: absolute;
@@ -107,20 +66,6 @@ body {
color: #aaa;
}
-#header .logo {
- background-image: url(../img/logo.svg);
- background-repeat: no-repeat;
- width: 250px;
- height: 118px;
- margin: 0 auto;
-}
-
-#header .logo-wide {
- background-image: url(../img/logo-wide.svg);
- background-repeat: no-repeat;
- width: 147px;
- height: 32px;
-}
/* INPUTS */
input[type="text"],
@@ -204,16 +149,6 @@ input img, button img, .button img {
}
-/* prevent ugly selection effect on accidental selection */
-#header,
-#navigation,
-#expanddiv {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
-}
-
-
/* SCROLLING */
::-webkit-scrollbar {
width: 8px;
@@ -231,6 +166,7 @@ input[type="submit"], input[type="button"],
button, .button,
#quota, select, .pager li a {
width: auto;
+ min-width: 25px;
padding: 5px;
background-color: rgba(240,240,240,.9);
font-weight: bold;
@@ -309,7 +245,7 @@ input[type="submit"].enabled {
position: fixed;
top:45px;
right: 0;
- left: 0;
+ left:0;
height: 44px;
width: 100%;
padding: 0;
@@ -318,11 +254,6 @@ input[type="submit"].enabled {
border-bottom: 1px solid #e7e7e7;
z-index: 50;
}
-/* account for shift of controls bar due to app navigation */
-#body-user #controls,
-#body-settings #controls {
- padding-left: 80px;
-}
#controls .button,
#controls button,
#controls input[type='submit'],
@@ -469,14 +400,14 @@ input[name='password-clone'] {
#user+label+img,
#password-icon {
position: absolute;
- left: 1.25em;
- top: 1.65em;
+ left: 16px;
+ top: 20px;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)";
filter: alpha(opacity=30);
opacity: .3;
}
#adminpass-icon, #password-icon {
- top: 1.1em;
+ top: 15px;
}
/* General new input field look */
@@ -489,6 +420,11 @@ input[name='password-clone'] {
}
/* Nicely grouping input field sets */
+.grouptop,
+.groupmiddle,
+.groupbottom {
+ position: relative;
+}
#body-login .grouptop input {
margin-bottom: 0;
border-bottom: 0;
@@ -511,23 +447,11 @@ input[name='password-clone'] {
box-shadow: 0 1px 0 rgba(0,0,0,.1) inset !important;
}
-/* In field labels. No, HTML placeholder does not work as well. */
-#body-login .groupmiddle label, #body-login .groupbottom label { top:.65em; }
-p.infield { position:relative; }
-label.infield { cursor:text !important; top:1.05em; left:.85em; }
-#body-login form label.infield { /* labels are ellipsized when too long, keep them short */
- position: absolute;
- width: 82%;
- margin-left: 26px;
- font-size: 19px;
- color: #aaa;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-#body-login #databaseField .infield {
- margin-left: 0;
+/* keep the labels for screen readers but hide them since we use placeholders */
+label.infield {
+ display: none;
}
+
#body-login form input[type="checkbox"]+label {
position: relative;
margin: 0;
@@ -558,7 +482,7 @@ label.infield { cursor:text !important; top:1.05em; left:.85em; }
}
-#body-login p.info{
+#body-login footer .info {
white-space: nowrap;
}
@@ -585,7 +509,7 @@ label.infield { cursor:text !important; top:1.05em; left:.85em; }
}
#show + label, #dbpassword + label, #personal-show + label {
position: absolute !important;
- height: 14px;
+ height: 20px;
width: 24px;
background-image: url("../img/actions/toggle.png");
background-repeat: no-repeat;
@@ -599,8 +523,9 @@ label.infield { cursor:text !important; top:1.05em; left:.85em; }
width: 8em;
}
#personal-show + label {
- margin-top: 1em;
- margin-left: -3em;
+ height: 14px;
+ margin-top: 14px;
+ margin-left: -36px;
}
#passwordbutton {
margin-left: .5em;
@@ -685,7 +610,7 @@ label.infield { cursor:text !important; top:1.05em; left:.85em; }
#body-login input {
font-size: 20px;
margin: 5px;
- padding: 12px 10px 8px;
+ padding: 11px 10px 9px;
}
#body-login input[type="text"],
#body-login input[type="password"] {
@@ -716,132 +641,6 @@ label.infield { cursor:text !important; top:1.05em; left:.85em; }
-/* NAVIGATION ------------------------------------------------------------- */
-#navigation {
- position: fixed;
- top: 0;
- bottom: 0;
- left: 0;
- width: 80px;
- margin-top:45px;
- z-index: 75;
- background-color: #383c43;
- overflow-y: auto;
- overflow-x: hidden;
- -moz-box-sizing:border-box; box-sizing:border-box;
-}
-#apps {
- height: 100%;
-}
-#navigation a span {
- display: block;
- text-decoration: none;
- font-size: 11px;
- text-align: center;
- color: #fff;
- white-space:nowrap; overflow:hidden; text-overflow:ellipsis; /* ellipsize long app names */
- padding-bottom: 10px;
- /* prevent shift caused by scrollbar */
- padding-left: 8px;
- width: 64px;
-}
-
- /* icon opacity and hover effect */
- #navigation a img,
- #navigation a span {
- /* 50% opacity when inactive */
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
- filter: alpha(opacity=50);
- opacity: .5;
- }
- #navigation a:hover img, #navigation a:focus img,
- #navigation a:hover span, #navigation a:focus span {
- /* 80% opacity when hovered or focused */
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
- filter: alpha(opacity=80);
- opacity: .8;
- }
- #navigation a.active img,
- #navigation a.active span {
- /* full opacity for the active app */
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
- filter: alpha(opacity=100);
- opacity: 1;
- }
- #navigation .icon {
- display: block;
- width: 32px;
- height: 32px;
- margin-left: 24px;
- padding: 10px 0 4px;
- }
- #navigation li:first-child .icon { /* special rule for Files icon as it's first */
- padding-top: 20px;
- }
-
-/* Apps management as sticky footer, less obtrusive in the list */
-#navigation .wrapper {
- min-height: 100%;
- margin: 0 auto -82px 0;
-}
-#apps-management, #navigation .push {
- height: 72px;
-}
-#apps-management {
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";
- filter: alpha(opacity=60);
- opacity: .6;
-}
-#apps-management .icon {
- padding-bottom: 0;
-}
-
-
-
-
-/* USER MENU */
-#settings {
- float: right;
- color: #bbb;
-}
-#expand {
- display: block;
- padding: 7px 12px 6px 7px;
- cursor: pointer;
- font-weight: bold;
-}
-#expand:hover, #expand:focus, #expand:active { color:#fff; }
-#expand img { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; filter:alpha(opacity=70); opacity:.7; margin-bottom:-2px; }
-#expand:hover img, #expand:focus img, #expand:active img { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; }
-#expanddiv {
- position:absolute; right:0; top:45px; z-index:76; display:none;
- background-color: #383c43;
- border-bottom-left-radius:7px; border-bottom:1px #333 solid; border-left:1px #333 solid;
- box-shadow:0 0 7px rgb(29,45,68);
- -moz-box-sizing: border-box; box-sizing: border-box;
-}
- #expanddiv a {
- display: block;
- height: 40px;
- color: #fff;
- padding: 4px 12px 0;
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";
- filter: alpha(opacity=70);
- opacity: .7;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- #expanddiv a img {
- margin-bottom: -3px;
- margin-right: 6px;
- }
- #expanddiv a:hover, #expanddiv a:focus, #expanddiv a:active {
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
- filter: alpha(opacity=100);
- opacity: 1;
- }
-
-
/* VARIOUS REUSABLE SELECTORS */
.hidden { display:none; }
.bold { font-weight:bold; }
@@ -975,15 +774,6 @@ span.ui-icon {float: left; margin: 3px 7px 30px 0;}
.arrow.left { left:-13px; bottom:1.2em; -webkit-transform:rotate(270deg); -moz-transform:rotate(270deg); -o-transform:rotate(270deg); -ms-transform:rotate(270deg); transform:rotate(270deg); }
.arrow.up { top:-8px; right:6px; }
.arrow.down { -webkit-transform:rotate(180deg); -moz-transform:rotate(180deg); -o-transform:rotate(180deg); -ms-transform:rotate(180deg); transform:rotate(180deg); }
-.help-includes {
- overflow: hidden;
- width: 100%;
- height: 100%;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- padding-top: 44px;
-}
-.help-iframe {width: 100%; height: 100%; margin: 0;padding: 0; border: 0; overflow: auto;}
/* ---- BREADCRUMB ---- */
diff --git a/core/fonts/LICENSE.txt b/core/fonts/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..75b52484ea471f882c29e02693b4f02dba175b5e
--- /dev/null
+++ b/core/fonts/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/core/fonts/OpenSans-Bold.woff b/core/fonts/OpenSans-Bold.woff
new file mode 100644
index 0000000000000000000000000000000000000000..ee2ea797d1c4910f0eef8c06a37dfb4df72a2904
Binary files /dev/null and b/core/fonts/OpenSans-Bold.woff differ
diff --git a/core/fonts/OpenSans-Regular.woff b/core/fonts/OpenSans-Regular.woff
new file mode 100644
index 0000000000000000000000000000000000000000..2abc3ed69fd619c57169a7515ea0b4481dfbf2a0
Binary files /dev/null and b/core/fonts/OpenSans-Regular.woff differ
diff --git a/core/img/actions/caret.png b/core/img/actions/caret.png
index 7066b767a288f9ca47b36b3bf1d8d7e802d63a7e..f6d76b0628ba8423bc7e0e791cfdb9189d3bcdad 100644
Binary files a/core/img/actions/caret.png and b/core/img/actions/caret.png differ
diff --git a/core/img/actions/caret.svg b/core/img/actions/caret.svg
index 8cd758daf84878378e3d8892fee639eda47d7b3c..41e880e0311bb4a68d71d74fea44763860bef08a 100644
--- a/core/img/actions/caret.svg
+++ b/core/img/actions/caret.svg
@@ -1,11 +1,76 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core/img/actions/logout.png b/core/img/actions/logout.png
index 5b94147732cbc39c90e523f4c4502c79fd5178a3..64126a556252c69138e8c1df8cf7cf851bf923ab 100644
Binary files a/core/img/actions/logout.png and b/core/img/actions/logout.png differ
diff --git a/core/img/actions/logout.svg b/core/img/actions/logout.svg
index 895080dab8f1d72f5849df1b1101c14278e86a38..1a0ee167184c5f2ac248b4da6b0c9553b0dbdc62 100644
--- a/core/img/actions/logout.svg
+++ b/core/img/actions/logout.svg
@@ -1,5 +1,58 @@
-
-
-
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
diff --git a/core/img/filetypes/folder-shared.png b/core/img/filetypes/folder-shared.png
index e3c0ee9815abeb49ed7098de5a550cefa57edb58..b4f02ac739917f376687566e3f40913b609327b0 100644
Binary files a/core/img/filetypes/folder-shared.png and b/core/img/filetypes/folder-shared.png differ
diff --git a/core/img/filetypes/folder-shared.svg b/core/img/filetypes/folder-shared.svg
index a389e535439826c69e759bc1026b0acede06cb2d..aba8cadbe28f853059c92a5ef32c20de749240cc 100644
--- a/core/img/filetypes/folder-shared.svg
+++ b/core/img/filetypes/folder-shared.svg
@@ -1,60 +1,64 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
+
diff --git a/core/img/logo-icon.png b/core/img/logo-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..26ed8b4641637cbc997ba85c6361bee64cdcacef
Binary files /dev/null and b/core/img/logo-icon.png differ
diff --git a/core/img/logo-icon.svg b/core/img/logo-icon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..05b467e87a7da68b316b04a5dc5dbcace0e6355a
--- /dev/null
+++ b/core/img/logo-icon.svg
@@ -0,0 +1,51 @@
+
+image/svg+xml
\ No newline at end of file
diff --git a/core/js/apps.js b/core/js/apps.js
new file mode 100644
index 0000000000000000000000000000000000000000..5f221bb9826a045b294741ffa057ddc7d1bb15f2
--- /dev/null
+++ b/core/js/apps.js
@@ -0,0 +1,76 @@
+/**
+ * ownCloud - core
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ *
+ * @author Bernhard Posselt
+ * @copyright Bernhard Posselt 2014
+ */
+
+(function (document, $, exports) {
+
+ 'use strict';
+
+ var dynamicSlideToggleEnabled = false;
+
+ exports.Apps = {
+ enableDynamicSlideToggle: function () {
+ dynamicSlideToggleEnabled = true;
+ }
+ };
+
+ /**
+ * Provides a way to slide down a target area through a button and slide it
+ * up if the user clicks somewhere else. Used for the news app settings and
+ * add new field.
+ *
+ * Usage:
+ * slide
+ * I'm sliding up
+ */
+ var registerAppsSlideToggle = function () {
+ var buttons = $('[data-apps-slide-toggle]');
+
+ $(document).click(function (event) {
+
+ if (dynamicSlideToggleEnabled) {
+ buttons = $('[data-apps-slide-toggle]');
+ }
+
+ buttons.each(function (index, button) {
+
+ var areaSelector = $(button).data('apps-slide-toggle');
+ var area = $(areaSelector);
+
+ // do nothing if the area is animated
+ if (!area.is(':animated')) {
+
+ // button toggles the area
+ if (button === event.target) {
+ if (area.is(':visible')) {
+ area.slideUp();
+ } else {
+ area.slideDown();
+ }
+
+ // all other areas that have not been clicked but are open
+ // should be slid up
+ } else {
+ var closest = $(event.target).closest(areaSelector);
+ if (area.is(':visible') && closest[0] !== area[0]) {
+ area.slideUp();
+ }
+ }
+ }
+ });
+
+ });
+ };
+
+
+ $(document).ready(function () {
+ registerAppsSlideToggle();
+ });
+
+}(document, jQuery, OC));
\ No newline at end of file
diff --git a/core/js/avatar.js b/core/js/avatar.js
index 67d6b9b7b954469158c11b6b7f83fe99a994ea86..6835f6ef0acac6ef799ffe50ac1c9fbe1c845577 100644
--- a/core/js/avatar.js
+++ b/core/js/avatar.js
@@ -7,7 +7,9 @@ $(document).ready(function(){
}
};
- $('#header .avatardiv').avatar(OC.currentUser, 32, undefined, true, callback);
+ $('#header .avatardiv').avatar(
+ OC.currentUser, 32, undefined, true, callback
+ );
// Personal settings
$('#avatar .avatardiv').avatar(OC.currentUser, 128);
}
diff --git a/core/js/compatibility.js b/core/js/compatibility.js
index c07288857f27d5a45fa05049f29451466e852e5a..ac942d202e82483cb2c7337c29f4764d20bc49fd 100644
--- a/core/js/compatibility.js
+++ b/core/js/compatibility.js
@@ -42,8 +42,9 @@ if (!Array.prototype.filter) {
for (var i = 0; i < len; i++) {
if (i in this) {
var val = this[i]; // in case fun mutates this
- if (fun.call(thisp, val, i, this))
+ if (fun.call(thisp, val, i, this)) {
res.push(val);
+ }
}
}
return res;
diff --git a/core/js/core.json b/core/js/core.json
index f1e0ba883d0f0d9378cabacab46303c2307edaa1..4815116c338035e854f5fe41cfa667e49c147899 100644
--- a/core/js/core.json
+++ b/core/js/core.json
@@ -4,7 +4,6 @@
"jquery-migrate-1.2.1.min.js",
"jquery-ui-1.10.0.custom.js",
"jquery-showpassword.js",
- "jquery.infieldlabel.js",
"jquery.placeholder.js",
"jquery-tipsy.js",
"underscore.js"
diff --git a/core/js/eventsource.js b/core/js/eventsource.js
index 70f4a2a9aa84f5dc5b7b2dbbd971812c5e1e8bfe..ce2a13d46766a254506407bae7eab6bf35987a52 100644
--- a/core/js/eventsource.js
+++ b/core/js/eventsource.js
@@ -20,10 +20,12 @@
*/
/**
- * Wrapper for server side events (http://en.wikipedia.org/wiki/Server-sent_events)
+ * Wrapper for server side events
+ * (http://en.wikipedia.org/wiki/Server-sent_events)
* includes a fallback for older browsers and IE
*
- * Use server side events with caution, too many open requests can hang the server
+ * use server side events with caution, too many open requests can hang the
+ * server
*/
/**
@@ -43,7 +45,7 @@ OC.EventSource=function(src,data){
dataStr+='requesttoken='+oc_requesttoken;
if(!this.useFallBack && typeof EventSource !='undefined'){
var joinChar = '&';
- if(src.indexOf('?') == -1) {
+ if(src.indexOf('?') === -1) {
joinChar = '?';
}
this.source=new EventSource(src+joinChar+dataStr);
@@ -60,13 +62,13 @@ OC.EventSource=function(src,data){
this.iframe.hide();
var joinChar = '&';
- if(src.indexOf('?') == -1) {
+ if(src.indexOf('?') === -1) {
joinChar = '?';
}
this.iframe.attr('src',src+joinChar+'fallback=true&fallback_id='+OC.EventSource.iframeCount+'&'+dataStr);
$('body').append(this.iframe);
this.useFallBack=true;
- OC.EventSource.iframeCount++
+ OC.EventSource.iframeCount++;
}
//add close listener
this.listen('__internal__',function(data){
diff --git a/core/js/jquery.infieldlabel.js b/core/js/jquery.infieldlabel.js
deleted file mode 100644
index fad15102bcb9975ee6a6600a19782a6b807da4a1..0000000000000000000000000000000000000000
--- a/core/js/jquery.infieldlabel.js
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * jquery.infieldlabel
- * A simple jQuery plugin for adding labels that sit over a form field and fade away when the fields are populated.
- *
- * Copyright (c) 2009 - 2013 Doug Neiner (http://code.dougneiner.com)
- * Source: https://github.com/dcneiner/In-Field-Labels-jQuery-Plugin
- * Dual licensed MIT or GPL
- * MIT (http://www.opensource.org/licenses/mit-license)
- * GPL (http://www.opensource.org/licenses/gpl-license)
- *
- * @version 0.1.3
- */
-(function ($) {
-
- $.InFieldLabels = function (label, field, options) {
- // To avoid scope issues, use 'base' instead of 'this'
- // to reference this class from internal events and functions.
- var base = this;
-
- // Access to jQuery and DOM versions of each element
- base.$label = $(label);
- base.label = label;
-
- base.$field = $(field);
- base.field = field;
-
- base.$label.data("InFieldLabels", base);
- base.showing = true;
-
- base.init = function () {
- var initialSet;
-
- // Merge supplied options with default options
- base.options = $.extend({}, $.InFieldLabels.defaultOptions, options);
-
- // Check if the field is already filled in
- // add a short delay to handle autocomplete
- setTimeout(function() {
- if (base.$field.val() !== "") {
- base.$label.hide();
- base.showing = false;
- } else {
- base.$label.show();
- base.showing = true;
- }
- }, 200);
-
- base.$field.focus(function () {
- base.fadeOnFocus();
- }).blur(function () {
- base.checkForEmpty(true);
- }).bind('keydown.infieldlabel', function (e) {
- // Use of a namespace (.infieldlabel) allows us to
- // unbind just this method later
- base.hideOnChange(e);
- }).bind('paste', function () {
- // Since you can not paste an empty string we can assume
- // that the fieldis not empty and the label can be cleared.
- base.setOpacity(0.0);
- }).change(function () {
- base.checkForEmpty();
- }).bind('onPropertyChange', function () {
- base.checkForEmpty();
- }).bind('keyup.infieldlabel', function () {
- base.checkForEmpty();
- });
-
- if ( base.options.pollDuration > 0 ) {
- initialSet = setInterval( function () {
- if (base.$field.val() !== "") {
- base.$label.hide();
- base.showing = false;
- clearInterval( initialSet );
- }
- }, base.options.pollDuration );
-
- }
- };
-
- // If the label is currently showing
- // then fade it down to the amount
- // specified in the settings
- base.fadeOnFocus = function () {
- if (base.showing) {
- base.setOpacity(base.options.fadeOpacity);
- }
- };
-
- base.setOpacity = function (opacity) {
- base.$label.stop().animate({ opacity: opacity }, base.options.fadeDuration);
- base.showing = (opacity > 0.0);
- };
-
- // Checks for empty as a fail safe
- // set blur to true when passing from
- // the blur event
- base.checkForEmpty = function (blur) {
- if (base.$field.val() === "") {
- base.prepForShow();
- base.setOpacity(blur ? 1.0 : base.options.fadeOpacity);
- } else {
- base.setOpacity(0.0);
- }
- };
-
- base.prepForShow = function () {
- if (!base.showing) {
- // Prepare for a animate in...
- base.$label.css({opacity: 0.0}).show();
-
- // Reattach the keydown event
- base.$field.bind('keydown.infieldlabel', function (e) {
- base.hideOnChange(e);
- });
- }
- };
-
- base.hideOnChange = function (e) {
- if (
- (e.keyCode === 16) || // Skip Shift
- (e.keyCode === 9) // Skip Tab
- ) {
- return;
- }
-
- if (base.showing) {
- base.$label.hide();
- base.showing = false;
- }
-
- // Remove keydown event to save on CPU processing
- base.$field.unbind('keydown.infieldlabel');
- };
-
- // Run the initialization method
- base.init();
- };
-
- $.InFieldLabels.defaultOptions = {
- fadeOpacity: 0.5, // Once a field has focus, how transparent should the label be
- fadeDuration: 300, // How long should it take to animate from 1.0 opacity to the fadeOpacity
- pollDuration: 0, // If set to a number greater than zero, this will poll until content is detected in a field
- enabledInputTypes: [ "text", "search", "tel", "url", "email", "password", "number", "textarea" ]
- };
-
-
- $.fn.inFieldLabels = function (options) {
- var allowed_types = options && options.enabledInputTypes || $.InFieldLabels.defaultOptions.enabledInputTypes;
-
- return this.each(function () {
- // Find input or textarea based on for= attribute
- // The for attribute on the label must contain the ID
- // of the input or textarea element
- var for_attr = $(this).attr('for'), field, restrict_type;
- if (!for_attr) {
- return; // Nothing to attach, since the for field wasn't used
- }
-
- // Find the referenced input or textarea element
- field = document.getElementById( for_attr );
- if ( !field ) {
- return; // No element found
- }
-
- // Restrict input type
- restrict_type = $.inArray( field.type, allowed_types );
-
- if ( restrict_type === -1 && field.nodeName !== "TEXTAREA" ) {
- return; // Again, nothing to attach
- }
-
- // Only create object for matched input types and textarea
- (new $.InFieldLabels(this, field, options));
- });
- };
-
-}(jQuery));
diff --git a/core/js/jquery.ocdialog.js b/core/js/jquery.ocdialog.js
index e2433f5f9804a41518f621379456ff346606df8f..af32591ce5246682a9a394282a2ce939f65b8ab5 100644
--- a/core/js/jquery.ocdialog.js
+++ b/core/js/jquery.ocdialog.js
@@ -35,11 +35,18 @@
});
$(document).on('keydown keyup', function(event) {
- if(event.target !== self.$dialog.get(0) && self.$dialog.find($(event.target)).length === 0) {
+ if (
+ event.target !== self.$dialog.get(0) &&
+ self.$dialog.find($(event.target)).length === 0
+ ) {
return;
}
// Escape
- if(event.keyCode === 27 && event.type === 'keydown' && self.options.closeOnEscape) {
+ if (
+ event.keyCode === 27 &&
+ event.type === 'keydown' &&
+ self.options.closeOnEscape
+ ) {
event.stopImmediatePropagation();
self.close();
return false;
@@ -52,7 +59,10 @@
return false;
}
// If no button is selected we trigger the primary
- if(self.$buttonrow && self.$buttonrow.find($(event.target)).length === 0) {
+ if (
+ self.$buttonrow &&
+ self.$buttonrow.find($(event.target)).length === 0
+ ) {
var $button = self.$buttonrow.find('button.primary');
if($button) {
$button.trigger('click');
diff --git a/core/js/js.js b/core/js/js.js
index cf35d8aac6a9af972807cf823904d51fc180759b..b3cefa83beead1fdbdc23aff977871b065500d66 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -1,7 +1,7 @@
/**
* Disable console output unless DEBUG mode is enabled.
* Add
- * define('DEBUG', true);
+ * define('DEBUG', true);
* To the end of config/config.php to enable debug mode.
* The undefined checks fix the broken ie8 console
*/
@@ -23,7 +23,10 @@ if (typeof oc_webroot === "undefined") {
oc_webroot = oc_webroot.substr(0, oc_webroot.lastIndexOf('/'));
}
}
-if (oc_debug !== true || typeof console === "undefined" || typeof console.log === "undefined") {
+if (
+ oc_debug !== true || typeof console === "undefined" ||
+ typeof console.log === "undefined"
+) {
if (!window.console) {
window.console = {};
}
@@ -37,7 +40,8 @@ if (oc_debug !== true || typeof console === "undefined" || typeof console.log ==
function initL10N(app) {
if (!( t.cache[app] )) {
$.ajax(OC.filePath('core', 'ajax', 'translations.php'), {
- async: false,//todo a proper solution for this without sync ajax calls
+ // TODO a proper solution for this without sync ajax calls
+ async: false,
data: {'app': app},
type: 'POST',
success: function (jsondata) {
@@ -75,8 +79,8 @@ function initL10N(app) {
/* We used to use eval, but it seems IE has issues with it.
* We now use "new Function", though it carries a slightly
* bigger performance hit.
- var code = 'function (n) { var plural; var nplurals; '+pf+' return { "nplural" : nplurals, "plural" : (plural === true ? 1 : plural ? plural : 0) }; };';
- Gettext._locale_data[domain].head.plural_func = eval("("+code+")");
+ var code = 'function (n) { var plural; var nplurals; '+pf+' return { "nplural" : nplurals, "plural" : (plural === true ? 1 : plural ? plural : 0) }; };';
+ Gettext._locale_data[domain].head.plural_func = eval("("+code+")");
*/
var code = 'var plural; var nplurals; '+pf+' return { "nplural" : nplurals, "plural" : (plural === true ? 1 : plural ? plural : 0) };';
t.plural_function[app] = new Function("n", code);
@@ -154,7 +158,7 @@ function n(app, text_singular, text_plural, count, vars) {
* @return {string} Sanitized string
*/
function escapeHTML(s) {
- return s.toString().split('&').join('&').split('<').join('<').split('"').join('"');
+ return s.toString().split('&').join('&').split('<').join('<').split('>').join('>').split('"').join('"').split('\'').join(''');
}
/**
@@ -183,7 +187,8 @@ var OC={
appConfig: window.oc_appconfig || {},
theme: window.oc_defaults || {},
coreApps:['', 'admin','log','search','settings','core','3rdparty'],
-
+ menuSpeed: 100,
+
/**
* Get an absolute url to a file in an app
* @param {string} app the id of the app the file belongs to
@@ -528,10 +533,9 @@ var OC={
*/
registerMenu: function($toggle, $menuEl) {
$menuEl.addClass('menu');
- $toggle.addClass('menutoggle');
$toggle.on('click.menu', function(event) {
if ($menuEl.is(OC._currentMenu)) {
- $menuEl.hide();
+ $menuEl.slideUp(OC.menuSpeed);
OC._currentMenu = null;
OC._currentMenuToggle = null;
return false;
@@ -541,7 +545,7 @@ var OC={
// close it
OC._currentMenu.hide();
}
- $menuEl.show();
+ $menuEl.slideToggle(OC.menuSpeed);
OC._currentMenu = $menuEl;
OC._currentMenuToggle = $toggle;
return false;
@@ -554,7 +558,7 @@ var OC={
unregisterMenu: function($toggle, $menuEl) {
// close menu if opened
if ($menuEl.is(OC._currentMenu)) {
- $menuEl.hide();
+ $menuEl.slideUp(OC.menuSpeed);
OC._currentMenu = null;
OC._currentMenuToggle = null;
}
@@ -1034,11 +1038,6 @@ function initCore() {
setShowPassword($('#pass2'), $('label[for=personal-show]'));
setShowPassword($('#dbpass'), $('label[for=dbpassword]'));
- //use infield labels
- $("label.infield").inFieldLabels({
- pollDuration: 100
- });
-
var checkShowCredentials = function() {
var empty = false;
$('input#user, input#password').each(function() {
@@ -1068,7 +1067,7 @@ function initCore() {
}
});
$('#settings #expand').click(function(event) {
- $('#settings #expanddiv').slideToggle(200);
+ $('#settings #expanddiv').slideToggle(OC.menuSpeed);
event.stopPropagation();
});
$('#settings #expanddiv').click(function(event){
@@ -1076,7 +1075,7 @@ function initCore() {
});
//hide the user menu when clicking outside it
$(document).click(function(){
- $('#settings #expanddiv').slideUp(200);
+ $('#settings #expanddiv').slideUp(OC.menuSpeed);
});
// all the tipsy stuff needs to be here (in reverse order) to work
@@ -1087,6 +1086,7 @@ function initCore() {
$('a.action.delete').tipsy({gravity:'e', fade:true, live:true});
$('a.action').tipsy({gravity:'s', fade:true, live:true});
$('td .modified').tipsy({gravity:'s', fade:true, live:true});
+ $('td.lastLogin').tipsy({gravity:'s', fade:true, html:true});
$('input').tipsy({gravity:'w', fade:true});
// toggle for menus
@@ -1097,7 +1097,7 @@ function initCore() {
return false;
}
if (OC._currentMenu) {
- OC._currentMenu.hide();
+ OC._currentMenu.slideUp(OC.menuSpeed);
}
OC._currentMenu = null;
OC._currentMenuToggle = null;
@@ -1110,45 +1110,27 @@ function initCore() {
* If the screen is bigger, the main menu is not a toggle any more.
*/
function setupMainMenu() {
- // toggle the navigation on mobile
- if (!OC._matchMedia) {
- return;
- }
- var mq = OC._matchMedia('(max-width: 768px)');
- var lastMatch = mq.matches;
- var $toggle = $('#header #owncloud');
+ // toggle the navigation
+ var $toggle = $('#header .menutoggle');
var $navigation = $('#navigation');
- function updateMainMenu() {
- // mobile mode ?
- if (lastMatch && !$toggle.hasClass('menutoggle')) {
- // init the menu
- OC.registerMenu($toggle, $navigation);
- $toggle.data('oldhref', $toggle.attr('href'));
- $toggle.attr('href', '#');
- $navigation.hide();
- }
- else {
- OC.unregisterMenu($toggle, $navigation);
- $toggle.attr('href', $toggle.data('oldhref'));
- $navigation.show();
- }
- }
-
- updateMainMenu();
-
- // TODO: debounce this
- $(window).resize(function() {
- if (lastMatch !== mq.matches) {
- lastMatch = mq.matches;
- updateMainMenu();
+ // init the menu
+ OC.registerMenu($toggle, $navigation);
+ $toggle.data('oldhref', $toggle.attr('href'));
+ $toggle.attr('href', '#');
+ $navigation.hide();
+
+ // show loading feedback
+ $navigation.delegate('a', 'click', function(event) {
+ var $app = $(event.target);
+ if(!$app.is('a')) {
+ $app = $app.closest('a');
}
+ $app.addClass('app-loading');
});
}
- if (window.matchMedia) {
- setupMainMenu();
- }
+ setupMainMenu();
}
$(document).ready(initCore);
@@ -1163,9 +1145,10 @@ $.fn.filterAttr = function(attr_name, attr_value) {
/**
* Returns a human readable file size
* @param {number} size Size in bytes
+ * @param {boolean} skipSmallSizes return '< 1 kB' for small files
* @return {string}
*/
-function humanFileSize(size) {
+function humanFileSize(size, skipSmallSizes) {
var humanList = ['B', 'kB', 'MB', 'GB', 'TB'];
// Calculate Log with base 1024: size = 1024 ** order
var order = size?Math.floor(Math.log(size) / Math.log(1024)):0;
@@ -1173,6 +1156,13 @@ function humanFileSize(size) {
order = Math.min(humanList.length - 1, order);
var readableFormat = humanList[order];
var relativeSize = (size / Math.pow(1024, order)).toFixed(1);
+ if(skipSmallSizes === true && order === 0) {
+ if(relativeSize !== "0.0"){
+ return '< 1 kB';
+ } else {
+ return '0 kB';
+ }
+ }
if(order < 2){
relativeSize = parseFloat(relativeSize).toFixed(0);
}
diff --git a/core/js/listview.js b/core/js/listview.js
index 18d0bdeaf7c4cd7835bf2678c3d771b4890433ca..71466c9020746e46a57898f477a2937e692a30a3 100644
--- a/core/js/listview.js
+++ b/core/js/listview.js
@@ -46,7 +46,7 @@ ListView.prototype={
$.each(this.hoverElement,function(index,collumn){
$.each(collumn,function(index,element){
var html=' ';
- var element=$(html);
+ element = $(html);
element.append($(' '));
element.click(element.callback);
tr.children('td.'+collumn).append(element);
@@ -59,9 +59,9 @@ ListView.prototype={
hoverHandelerOut:function(tr){
tr.find('*.hoverElement').remove();
},
- addHoverElement:function(collumn,icon,title,callback){
- if(!this.hoverElements[collumn]){
- this.hoverElements[collumn]=[];
+ addHoverElement:function(column,icon,title,callback){
+ if(!this.hoverElements[column]){
+ this.hoverElements[column] = [];
}
this.hoverElements[row].push({icon:icon,callback:callback,title:title});
},
diff --git a/core/js/multiselect.js b/core/js/multiselect.js
index 02699636a2081de88b8c7f19ff68c7ee11deb0dc..565b793200f4ed4dd7e58215797dc002d222d418 100644
--- a/core/js/multiselect.js
+++ b/core/js/multiselect.js
@@ -1,14 +1,19 @@
/**
- * @param 'createCallback' A function to be called when a new entry is created. Two arguments are supplied to this function:
- * The select element used and the value of the option. If the function returns false addition will be cancelled. If it returns
- * anything else it will be used as the value of the newly added option.
+ * @param 'createCallback' A function to be called when a new entry is created.
+ * Two arguments are supplied to this function:
+ * The select element used and the value of the option. If the function
+ * returns false addition will be cancelled. If it returns
+ * anything else it will be used as the value of the newly added option.
* @param 'createText' The placeholder text for the create action.
* @param 'title' The title to show if no options are selected.
- * @param 'checked' An array containing values for options that should be checked. Any options which are already selected will be added to this array.
+ * @param 'checked' An array containing values for options that should be
+ * checked. Any options which are already selected will be added to this array.
* @param 'labels' The corresponding labels to show for the checked items.
- * @param 'oncheck' Callback function which will be called when a checkbox/radiobutton is selected. If the function returns false the input will be unchecked.
+ * @param 'oncheck' Callback function which will be called when a
+ * checkbox/radiobutton is selected. If the function returns false the input will be unchecked.
* @param 'onuncheck' @see 'oncheck'.
- * @param 'singleSelect' If true radiobuttons will be used instead of checkboxes.
+ * @param 'singleSelect' If true radiobuttons will be used instead of
+ * checkboxes.
*/
(function( $ ){
var multiSelectId=-1;
@@ -32,12 +37,18 @@
$.extend(settings,options);
$.each(this.children(),function(i,option) {
// If the option is selected, but not in the checked array, add it.
- if($(option).attr('selected') && settings.checked.indexOf($(option).val()) === -1) {
+ if (
+ $(option).attr('selected') &&
+ settings.checked.indexOf($(option).val()) === -1
+ ) {
settings.checked.push($(option).val());
settings.labels.push($(option).text().trim());
}
// If the option is in the checked array but not selected, select it.
- else if(settings.checked.indexOf($(option).val()) !== -1 && !$(option).attr('selected')) {
+ else if (
+ settings.checked.indexOf($(option).val()) !== -1 &&
+ !$(option).attr('selected')
+ ) {
$(option).attr('selected', 'selected');
settings.labels.push($(option).text().trim());
}
@@ -104,7 +115,7 @@
var label=$(' ');
label.attr('for',id);
label.text(element.text() || item);
- if(settings.checked.indexOf(item)!=-1 || checked) {
+ if(settings.checked.indexOf(item) !== -1 || checked) {
input.attr('checked', true);
}
if(checked){
@@ -151,17 +162,21 @@
settings.labels.splice(index,1);
}
var oldWidth=button.width();
- button.children('span').first().text(settings.labels.length > 0
+ button.children('span').first().text(settings.labels.length > 0
? settings.labels.join(', ')
: settings.title);
- var newOuterWidth=Math.max((button.outerWidth()-2),settings.minOuterWidth)+'px';
+ var newOuterWidth = Math.max(
+ (button.outerWidth() - 2),
+ settings.minOuterWidth
+ ) + 'px';
var newWidth=Math.max(button.width(),settings.minWidth);
var pos=button.position();
button.css('width',oldWidth);
button.animate({'width':newWidth},undefined,undefined,function(){
button.css('width','');
});
- list.animate({'width':newOuterWidth,'left':pos.left+3});
+ list.animate({'width':newOuterWidth,'left':pos.left});
+ self.change();
});
var li=$(' ');
li.append(input).append(label);
@@ -184,7 +199,7 @@
input.css('width',button.innerWidth());
button.parent().data('preventHide',true);
input.keypress(function(event) {
- if(event.keyCode == 13) {
+ if(event.keyCode === 13) {
event.preventDefault();
event.stopPropagation();
var value = $(this).val();
@@ -222,7 +237,7 @@
select.append(option);
li.prev().children('input').prop('checked', true).trigger('change');
button.parent().data('preventHide',false);
- button.children('span').first().text(settings.labels.length > 0
+ button.children('span').first().text(settings.labels.length > 0
? settings.labels.join(', ')
: settings.title);
if(self.menuDirection === 'up') {
@@ -265,13 +280,13 @@
}
list.append(list.find('li.creator'));
var pos=button.position();
- if(($(document).height() > (button.offset().top+button.outerHeight() + list.children().length * button.height())
- && $(document).height() - button.offset().top > (button.offset().top+button.outerHeight() + list.children().length * button.height()))
- || $(document).height()/2 > button.offset().top
+ if(($(document).height() > (button.offset().top + button.outerHeight() + list.children().length * button.height()) &&
+ $(document).height() - button.offset().top > (button.offset().top+button.outerHeight() + list.children().length * button.height())) ||
+ $(document).height() / 2 > button.offset().top
) {
list.css({
top:pos.top+button.outerHeight()-5,
- left:pos.left+3,
+ left:pos.left,
width:(button.outerWidth()-2)+'px',
'max-height':($(document).height()-(button.offset().top+button.outerHeight()+10))+'px'
});
@@ -282,7 +297,7 @@
list.css('max-height', $(document).height()-($(document).height()-(pos.top)+50)+'px');
list.css({
top:pos.top - list.height(),
- left:pos.left+3,
+ left:pos.left,
width:(button.outerWidth()-2)+'px'
});
diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js
index 54b9442af27e985dbc7bf733281e91c0f601a44c..0e4c346e8cc95e39694a6eaed039af9fd782ba4b 100644
--- a/core/js/oc-dialogs.js
+++ b/core/js/oc-dialogs.js
@@ -38,7 +38,14 @@ var OCdialogs = {
* @param modal make the dialog modal
*/
alert:function(text, title, callback, modal) {
- this.message(text, title, 'alert', OCdialogs.OK_BUTTON, callback, modal);
+ this.message(
+ text,
+ title,
+ 'alert',
+ OCdialogs.OK_BUTTON,
+ callback,
+ modal
+ );
},
/**
* displays info dialog
@@ -59,7 +66,14 @@ var OCdialogs = {
* @param modal make the dialog modal
*/
confirm:function(text, title, callback, modal) {
- this.message(text, title, 'notice', OCdialogs.YES_NO_BUTTONS, callback, modal);
+ this.message(
+ text,
+ title,
+ 'notice',
+ OCdialogs.YES_NO_BUTTONS,
+ callback,
+ modal
+ );
},
/**
* displays prompt dialog
diff --git a/core/js/octemplate.js b/core/js/octemplate.js
index aab705059d21dd2640f0d0f959e2616482f64b11..67aa7d69cce0f5732d7bc0d638cf8f5324b34078 100644
--- a/core/js/octemplate.js
+++ b/core/js/octemplate.js
@@ -1,7 +1,8 @@
/**
* jQuery plugin for micro templates
*
- * Strings are automatically escaped, but that can be disabled by setting escapeFunction to null.
+ * Strings are automatically escaped, but that can be disabled by setting
+ * escapeFunction to null.
*
* Usage examples:
*
@@ -11,13 +12,15 @@
* var htmlStr = 'Welcome back {user}
';
* $(htmlStr).octemplate({user: 'John Q. Public'}, {escapeFunction: null});
*
- * Be aware that the target string must be wrapped in an HTML element for the plugin to work. The following won't work:
+ * Be aware that the target string must be wrapped in an HTML element for the
+ * plugin to work. The following won't work:
*
* var textStr = 'Welcome back {user}';
* $(textStr).octemplate({user: 'John Q. Public'});
*
- * For anything larger than one-liners, you can use a simple $.get() ajax request to get the template,
- * or you can embed them it the page using the text/template type:
+ * For anything larger than one-liners, you can use a simple $.get() ajax
+ * request to get the template, or you can embed them it the page using the
+ * text/template type:
*
* for it!')).toEqual('There needs to be a <script>alert("Unit" + 'test')</script> for it!');
+ });
+ it('Returns the string without modification if no potentially dangerous character is passed.', function() {
+ expect(escapeHTML('This is a good string without HTML.')).toEqual('This is a good string without HTML.');
+ });
+ });
describe('Link functions', function() {
var TESTAPP = 'testapp';
var TESTAPP_ROOT = OC.webroot + '/appsx/testapp';
@@ -182,24 +193,24 @@ describe('Core base tests', function() {
unicode: '汉字'
})).toEqual('unicode=%E6%B1%89%E5%AD%97');
expect(OC.buildQueryString({
- b: 'spaace value',
- 'space key': 'normalvalue',
- 'slash/this': 'amp&ersand'
+ b: 'spaace value',
+ 'space key': 'normalvalue',
+ 'slash/this': 'amp&ersand'
})).toEqual('b=spaace%20value&space%20key=normalvalue&slash%2Fthis=amp%26ersand');
});
it('Encodes data types and empty values', function() {
expect(OC.buildQueryString({
'keywithemptystring': '',
- 'keywithnull': null,
- 'keywithundefined': null,
+ 'keywithnull': null,
+ 'keywithundefined': null,
something: 'else'
})).toEqual('keywithemptystring=&keywithnull&keywithundefined&something=else');
expect(OC.buildQueryString({
- 'booleanfalse': false,
+ 'booleanfalse': false,
'booleantrue': true
})).toEqual('booleanfalse=false&booleantrue=true');
expect(OC.buildQueryString({
- 'number': 123
+ 'number': 123
})).toEqual('number=123');
});
});
@@ -345,108 +356,38 @@ describe('Core base tests', function() {
});
});
describe('Main menu mobile toggle', function() {
- var oldMatchMedia;
+ var clock;
var $toggle;
var $navigation;
+ var clock;
beforeEach(function() {
- oldMatchMedia = OC._matchMedia;
- // a separate method was needed because window.matchMedia
- // cannot be stubbed due to a bug in PhantomJS:
- // https://github.com/ariya/phantomjs/issues/12069
- OC._matchMedia = sinon.stub();
+ clock = sinon.useFakeTimers();
$('#testArea').append('' +
'
');
- $toggle = $('#owncloud');
+ $toggle = $('#header').find('.menutoggle');
$navigation = $('#navigation');
});
-
afterEach(function() {
- OC._matchMedia = oldMatchMedia;
+ clock.restore();
});
- it('Sets up menu toggle in mobile mode', function() {
- OC._matchMedia.returns({matches: true});
+ it('Sets up menu toggle', function() {
window.initCore();
- expect($toggle.hasClass('menutoggle')).toEqual(true);
expect($navigation.hasClass('menu')).toEqual(true);
});
- it('Does not set up menu toggle in desktop mode', function() {
- OC._matchMedia.returns({matches: false});
- window.initCore();
- expect($toggle.hasClass('menutoggle')).toEqual(false);
- expect($navigation.hasClass('menu')).toEqual(false);
- });
- it('Switches on menu toggle when mobile mode changes', function() {
- var mq = {matches: false};
- OC._matchMedia.returns(mq);
- window.initCore();
- expect($toggle.hasClass('menutoggle')).toEqual(false);
- mq.matches = true;
- $(window).trigger('resize');
- expect($toggle.hasClass('menutoggle')).toEqual(true);
- });
- it('Switches off menu toggle when mobile mode changes', function() {
- var mq = {matches: true};
- OC._matchMedia.returns(mq);
- window.initCore();
- expect($toggle.hasClass('menutoggle')).toEqual(true);
- mq.matches = false;
- $(window).trigger('resize');
- expect($toggle.hasClass('menutoggle')).toEqual(false);
- });
- it('Clicking menu toggle toggles navigation in mobile mode', function() {
- OC._matchMedia.returns({matches: true});
+ it('Clicking menu toggle toggles navigation in', function() {
window.initCore();
$navigation.hide(); // normally done through media query triggered CSS
expect($navigation.is(':visible')).toEqual(false);
$toggle.click();
+ clock.tick(1 * 1000);
expect($navigation.is(':visible')).toEqual(true);
$toggle.click();
+ clock.tick(1 * 1000);
expect($navigation.is(':visible')).toEqual(false);
});
- it('Clicking menu toggle does not toggle navigation in desktop mode', function() {
- OC._matchMedia.returns({matches: false});
- window.initCore();
- expect($navigation.is(':visible')).toEqual(true);
- $toggle.click();
- expect($navigation.is(':visible')).toEqual(true);
- });
- it('Switching to mobile mode hides navigation', function() {
- var mq = {matches: false};
- OC._matchMedia.returns(mq);
- window.initCore();
- expect($navigation.is(':visible')).toEqual(true);
- mq.matches = true;
- $(window).trigger('resize');
- expect($navigation.is(':visible')).toEqual(false);
- });
- it('Switching to desktop mode shows navigation', function() {
- var mq = {matches: true};
- OC._matchMedia.returns(mq);
- window.initCore();
- expect($navigation.is(':visible')).toEqual(false);
- mq.matches = false;
- $(window).trigger('resize');
- expect($navigation.is(':visible')).toEqual(true);
- });
- it('Switch to desktop with opened menu then back to mobile resets toggle', function() {
- var mq = {matches: true};
- OC._matchMedia.returns(mq);
- window.initCore();
- expect($navigation.is(':visible')).toEqual(false);
- $toggle.click();
- expect($navigation.is(':visible')).toEqual(true);
- mq.matches = false;
- $(window).trigger('resize');
- expect($navigation.is(':visible')).toEqual(true);
- mq.matches = true;
- $(window).trigger('resize');
- expect($navigation.is(':visible')).toEqual(false);
- $toggle.click();
- expect($navigation.is(':visible')).toEqual(true);
- });
});
describe('SVG extension replacement', function() {
var svgSupportStub;
@@ -489,6 +430,19 @@ describe('Core base tests', function() {
expect(OC.Util.humanFileSize(data[i][0])).toEqual(data[i][1]);
}
});
+ it('renders file sizes with the correct unit for small sizes', function() {
+ var data = [
+ [0, '0 kB'],
+ [125, '< 1 kB'],
+ [128000, '125 kB'],
+ [128000000, '122.1 MB'],
+ [128000000000, '119.2 GB'],
+ [128000000000000, '116.4 TB']
+ ];
+ for (var i = 0; i < data.length; i++) {
+ expect(OC.Util.humanFileSize(data[i][0], true)).toEqual(data[i][1]);
+ }
+ });
});
});
});
diff --git a/core/js/tests/specs/shareSpec.js b/core/js/tests/specs/shareSpec.js
index a487b71fdbb274571097b13073edf338131d29bf..458bc41b6a17141ab950d11a4528ff7b717135a7 100644
--- a/core/js/tests/specs/shareSpec.js
+++ b/core/js/tests/specs/shareSpec.js
@@ -26,13 +26,17 @@ describe('OC.Share tests', function() {
var oldAppConfig;
var loadItemStub;
var autocompleteStub;
+
beforeEach(function() {
$('#testArea').append($('
'));
+ // horrible parameters
+ $('#testArea').append(' ');
$container = $('#shareContainer');
/* jshint camelcase:false */
- oldAppConfig = oc_appconfig.core;
- loadItemStub = sinon.stub(OC.Share, 'loadItem');
+ oldAppConfig = _.extend({}, oc_appconfig.core);
+ oc_appconfig.core.enforcePasswordForPublicLink = false;
+ loadItemStub = sinon.stub(OC.Share, 'loadItem');
loadItemStub.returns({
reshare: [],
shares: []
@@ -89,9 +93,133 @@ describe('OC.Share tests', function() {
oc_appconfig.core.defaultExpireDate = '';
// TODO: expect that default date was NOT set
});
- // TODO: test password field visibility (whenever enforced or not)
- // TODO: check link share field visibility based on whether it is allowed
- // TODO: check public upload visibility based on config
+ describe('Share with link', function() {
+ // TODO: test ajax calls
+ // TODO: test password field visibility (whenever enforced or not)
+ // TODO: check public upload visibility based on config
+ it('shows share with link checkbox when allowed', function() {
+ $('#allowShareWithLink').val('yes');
+ OC.Share.showDropDown(
+ 'file',
+ 123,
+ $container,
+ 'http://localhost/dummylink',
+ 31,
+ 'shared_file_name.txt'
+ );
+ expect($('#dropdown #linkCheckbox').length).toEqual(1);
+ });
+ it('does not show share with link checkbox when not allowed', function() {
+ $('#allowShareWithLink').val('no');
+ OC.Share.showDropDown(
+ 'file',
+ 123,
+ $container,
+ 'http://localhost/dummylink',
+ 31,
+ 'shared_file_name.txt'
+ );
+ expect($('#dropdown #linkCheckbox').length).toEqual(0);
+ });
+ });
+ describe('"sharesChanged" event', function() {
+ var autocompleteOptions;
+ var handler;
+ beforeEach(function() {
+ handler = sinon.stub();
+ loadItemStub.returns({
+ reshare: [],
+ shares: [{
+ id: 100,
+ item_source: 123,
+ permissions: 31,
+ share_type: OC.Share.SHARE_TYPE_USER,
+ share_with: 'user1',
+ share_with_displayname: 'User One'
+ }]
+ });
+ OC.Share.showDropDown(
+ 'file',
+ 123,
+ $container,
+ 'http://localhost/dummylink',
+ 31,
+ 'shared_file_name.txt'
+ );
+ $('#dropdown').on('sharesChanged', handler);
+ autocompleteOptions = autocompleteStub.getCall(0).args[0];
+ });
+ afterEach(function() {
+ autocompleteOptions = null;
+ handler = null;
+ });
+ it('triggers "sharesChanged" event when adding shares', function() {
+ // simulate autocomplete selection
+ autocompleteOptions.select(new $.Event('select'), {
+ item: {
+ label: 'User Two',
+ value: {
+ shareType: OC.Share.SHARE_TYPE_USER,
+ shareWith: 'user2'
+ }
+ }
+ });
+ fakeServer.requests[0].respond(
+ 200,
+ { 'Content-Type': 'application/json' },
+ JSON.stringify({status: 'success'})
+ );
+ expect(handler.calledOnce).toEqual(true);
+ var shares = handler.getCall(0).args[0].shares;
+ expect(shares).toBeDefined();
+ expect(shares[OC.Share.SHARE_TYPE_USER][0].share_with_displayname).toEqual('User One');
+ expect(shares[OC.Share.SHARE_TYPE_USER][1].share_with_displayname).toEqual('User Two');
+ expect(shares[OC.Share.SHARE_TYPE_GROUP]).not.toBeDefined();
+ });
+ it('triggers "sharesChanged" event when deleting shares', function() {
+ $('#dropdown .unshare:eq(0)').click();
+ fakeServer.requests[0].respond(
+ 200,
+ { 'Content-Type': 'application/json' },
+ JSON.stringify({status: 'success'})
+ );
+ expect(handler.calledOnce).toEqual(true);
+ var shares = handler.getCall(0).args[0].shares;
+ expect(shares).toBeDefined();
+ expect(shares[OC.Share.SHARE_TYPE_USER]).toEqual([]);
+ expect(shares[OC.Share.SHARE_TYPE_GROUP]).not.toBeDefined();
+ });
+ it('triggers "sharesChanged" event when toggling link share', function() {
+ // simulate autocomplete selection
+ $('#dropdown #linkCheckbox').click();
+ fakeServer.requests[0].respond(
+ 200,
+ { 'Content-Type': 'application/json' },
+ JSON.stringify({status: 'success', data: { token: 'abc' }})
+ );
+ expect(handler.calledOnce).toEqual(true);
+ var shares = handler.getCall(0).args[0].shares;
+ expect(shares).toBeDefined();
+ expect(shares[OC.Share.SHARE_TYPE_USER][0].share_with_displayname).toEqual('User One');
+ expect(shares[OC.Share.SHARE_TYPE_GROUP]).not.toBeDefined();
+
+ handler.reset();
+
+ // uncheck checkbox
+ $('#dropdown #linkCheckbox').click();
+ fakeServer.requests[1].respond(
+ 200,
+ { 'Content-Type': 'application/json' },
+ JSON.stringify({status: 'success'})
+ );
+
+ expect(handler.calledOnce).toEqual(true);
+ shares = handler.getCall(0).args[0].shares;
+ expect(shares).toBeDefined();
+ expect(shares[OC.Share.SHARE_TYPE_USER][0].share_with_displayname).toEqual('User One');
+ expect(shares[OC.Share.SHARE_TYPE_GROUP]).not.toBeDefined();
+ });
+ });
});
});
diff --git a/core/js/update.js b/core/js/update.js
index cc0f541bd7985c9e9afd8bedb4f28e0106883a2a..e5ce322df9587baf9597b55393bf78e565de9d63 100644
--- a/core/js/update.js
+++ b/core/js/update.js
@@ -28,7 +28,7 @@
this.addMessage(t(
'core',
'Updating {productName} to version {version}, this may take a while.', {
- productName: OC.theme.name,
+ productName: OC.theme.name || 'ownCloud',
version: OC.config.versionstring
}),
'bold'
diff --git a/core/js/visitortimezone.js b/core/js/visitortimezone.js
index d9b63a108798456c060cdb0640a3ca009cf2ae94..9146e00aade107bf8dce8e80eea70527fd1e21ce 100644
--- a/core/js/visitortimezone.js
+++ b/core/js/visitortimezone.js
@@ -7,4 +7,5 @@ $(document).ready(function () {
if ($loginForm.length) {
$loginForm.find('input#submit').prop('disabled', false);
}
-});
+ }
+);
diff --git a/core/l10n/af_ZA.php b/core/l10n/af_ZA.php
index a5facc4f9ef3cc4a4fa2b912a27b89e135def03f..978bbb0fc011b4a2967dabe4affba47ba3407a5a 100644
--- a/core/l10n/af_ZA.php
+++ b/core/l10n/af_ZA.php
@@ -115,7 +115,6 @@ $TRANSLATIONS = array(
"Password" => "Wagwoord",
"Data folder" => "Data vouer",
"Configure the database" => "Stel databasis op",
-"will be used" => "sal gebruik word",
"Database user" => "Databasis-gebruiker",
"Database password" => "Databasis-wagwoord",
"Database name" => "Databasis naam",
diff --git a/core/l10n/ar.php b/core/l10n/ar.php
index 8905516c42d4c6236ba684d20ca774c1ad12f135..4bb07293f5d76ac6f0e3b688421f2caceca68aeb 100644
--- a/core/l10n/ar.php
+++ b/core/l10n/ar.php
@@ -110,7 +110,6 @@ $TRANSLATIONS = array(
"Password" => "كلمة المرور",
"Data folder" => "مجلد المعلومات",
"Configure the database" => "أسس قاعدة البيانات",
-"will be used" => "سيتم استخدمه",
"Database user" => "مستخدم قاعدة البيانات",
"Database password" => "كلمة سر مستخدم قاعدة البيانات",
"Database name" => "إسم قاعدة البيانات",
diff --git a/core/l10n/ast.php b/core/l10n/ast.php
index 0624b2bbf316a54103fa3426c97965337038de0d..483bd4b7f7dced46c1b8de20668d8ff60ba42702 100644
--- a/core/l10n/ast.php
+++ b/core/l10n/ast.php
@@ -69,6 +69,7 @@ $TRANSLATIONS = array(
"Error while changing permissions" => "Fallu mientres camudaben los permisos",
"Shared with you and the group {group} by {owner}" => "Compartíu contigo y col grupu {group} por {owner}",
"Shared with you by {owner}" => "Compartíu contigo por {owner}",
+"Share with user or group …" => "Compartir col usuariu o grupu ...",
"Share link" => "Compartir enllaz",
"Password protect" => "Protexer con contraseña",
"Choose a password for the public link" => "Escueyi una contraseña pal enllaz públicu",
@@ -101,6 +102,7 @@ $TRANSLATIONS = array(
"Add" => "Amestar",
"Edit tags" => "Editar etiquetes",
"Please reload the page." => "Por favor, recarga la páxina",
+"The update was unsuccessful." => "L'anovamientu nun foi esitosu.",
"The update was successful. Redirecting you to ownCloud now." => "L'anovamientu fízose con ésitu. Redirixiendo agora al to ownCloud.",
"%s password reset" => "%s restablecer contraseña",
"Use the following link to reset your password: {link}" => "Usa'l siguiente enllaz pa restablecer la to contraseña: {link}",
@@ -122,6 +124,9 @@ $TRANSLATIONS = array(
"Apps" => "Aplicaciones",
"Admin" => "Alministrador",
"Help" => "Ayuda",
+"Error loading tags" => "Fallu cargando les etiquetes",
+"Tag already exists" => "Yá esiste la etiqueta",
+"Error tagging" => "Fallu etiquetando",
"Access forbidden" => "Accesu denegáu",
"Cloud not found" => "Ñube non atopada",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Hola, ¿qué hai?\n\nnamái déxanos dicite que %s compartió %s contigo.\nVelu: %s\n\n",
@@ -137,7 +142,7 @@ $TRANSLATIONS = array(
"Password" => "Contraseña",
"Data folder" => "Carpeta de datos",
"Configure the database" => "Configura la base de datos",
-"will be used" => "usaráse",
+"Only %s is available." => "Namái ta disponible %s",
"Database user" => "Usuariu de la base de datos",
"Database password" => "Contraseña de la base de datos",
"Database name" => "Nome de la base de datos",
@@ -155,6 +160,11 @@ $TRANSLATIONS = array(
"remember" => "recordar",
"Log in" => "Aniciar sesión",
"Alternative Logins" => "Anicios de sesión alternativos",
-"Thank you for your patience." => "Gracies pola to paciencia."
+"Hey there, just letting you know that %s shared %s with you.View it! " => "Hola, ¿qué hai?, namái déxamos dicite que %s compartió %s contigo.\n¡Velu! ",
+"Thank you for your patience." => "Gracies pola to paciencia.",
+"%s will be updated to version %s." => "%s anovaráse a la versión %s.",
+"The following apps will be disabled:" => "Deshabilitaránse les siguientes aplicaciones:",
+"Start update" => "Aniciar anovamientu",
+"This ownCloud instance is currently being updated, which may take a while." => "Esta instancia de OwnCloud ta anguaño anovándose, polo que pue tardar un pocoñín."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/core/l10n/bg_BG.php b/core/l10n/bg_BG.php
index 8653f2435cd95b3e3e43dd643c855985ca13f212..320c6d2170894eead05c9813e667554bd63d357c 100644
--- a/core/l10n/bg_BG.php
+++ b/core/l10n/bg_BG.php
@@ -87,7 +87,6 @@ $TRANSLATIONS = array(
"Password" => "Парола",
"Data folder" => "Директория за данни",
"Configure the database" => "Конфигуриране на базата",
-"will be used" => "ще се ползва",
"Database user" => "Потребител за базата",
"Database password" => "Парола за базата",
"Database name" => "Име на базата",
diff --git a/core/l10n/bn_BD.php b/core/l10n/bn_BD.php
index 90540d6ef8a7795bd1394a8ac610c7eb01be2ea7..f0b86c23ae7fdc39ae1979844467b3af9b168ce3 100644
--- a/core/l10n/bn_BD.php
+++ b/core/l10n/bn_BD.php
@@ -89,7 +89,6 @@ $TRANSLATIONS = array(
"Password" => "কূটশব্দ",
"Data folder" => "ডাটা ফোল্ডার ",
"Configure the database" => "ডাটাবেচ কনফিগার করুন",
-"will be used" => "ব্যবহৃত হবে",
"Database user" => "ডাটাবেজ ব্যবহারকারী",
"Database password" => "ডাটাবেজ কূটশব্দ",
"Database name" => "ডাটাবেজের নাম",
diff --git a/core/l10n/ca.php b/core/l10n/ca.php
index b7866bcbeb77b2d6eff492d6adec500cb011dfd3..31217c9fe01be51cfb9ae0fbc3562c8b0373e8ee 100644
--- a/core/l10n/ca.php
+++ b/core/l10n/ca.php
@@ -152,7 +152,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Emmagatzematge i base de dades",
"Data folder" => "Carpeta de dades",
"Configure the database" => "Configura la base de dades",
-"will be used" => "s'usarà",
"Database user" => "Usuari de la base de dades",
"Database password" => "Contrasenya de la base de dades",
"Database name" => "Nom de la base de dades",
diff --git a/core/l10n/cs_CZ.php b/core/l10n/cs_CZ.php
index 54ba2b4b94fde22d9e39a0a8549ae67c1989edb8..c8b81262d2b8e1891848dd297023c51186a999fe 100644
--- a/core/l10n/cs_CZ.php
+++ b/core/l10n/cs_CZ.php
@@ -155,7 +155,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Úložiště & databáze",
"Data folder" => "Složka s daty",
"Configure the database" => "Nastavit databázi",
-"will be used" => "bude použito",
"Database user" => "Uživatel databáze",
"Database password" => "Heslo databáze",
"Database name" => "Název databáze",
diff --git a/core/l10n/cy_GB.php b/core/l10n/cy_GB.php
index ade2eeb56418220956d8e25df8c955fe2caa5852..ccf6f5fae986216bfc90f93ce3cdf60dc7fbf2e9 100644
--- a/core/l10n/cy_GB.php
+++ b/core/l10n/cy_GB.php
@@ -97,7 +97,6 @@ $TRANSLATIONS = array(
"Password" => "Cyfrinair",
"Data folder" => "Plygell data",
"Configure the database" => "Cyflunio'r gronfa ddata",
-"will be used" => "ddefnyddir",
"Database user" => "Defnyddiwr cronfa ddata",
"Database password" => "Cyfrinair cronfa ddata",
"Database name" => "Enw cronfa ddata",
diff --git a/core/l10n/da.php b/core/l10n/da.php
index 9facf96ea4d4b769e9ca5959234d49ca9e6a0b3b..73e1791fab5a743118a94702c4886e40b9b475da 100644
--- a/core/l10n/da.php
+++ b/core/l10n/da.php
@@ -152,7 +152,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Lager & database",
"Data folder" => "Datamappe",
"Configure the database" => "Konfigurer databasen",
-"will be used" => "vil blive brugt",
"Database user" => "Databasebruger",
"Database password" => "Databasekodeord",
"Database name" => "Navn på database",
diff --git a/core/l10n/de.php b/core/l10n/de.php
index 20b7c8004edb1d846b1af6d0552be66232a761f0..d51a810b348b2dd331c7e654944c9c373f68b7d6 100644
--- a/core/l10n/de.php
+++ b/core/l10n/de.php
@@ -158,12 +158,13 @@ $TRANSLATIONS = array(
"Storage & database" => "Speicher & Datenbank",
"Data folder" => "Datenverzeichnis",
"Configure the database" => "Datenbank einrichten",
-"will be used" => "wird verwendet",
+"Only %s is available." => "Es sind nur %s verfügbar.",
"Database user" => "Datenbank-Benutzer",
"Database password" => "Datenbank-Passwort",
"Database name" => "Datenbank-Name",
"Database tablespace" => "Datenbank-Tablespace",
"Database host" => "Datenbank-Host",
+"SQLite will be used as database. For larger installations we recommend to change this." => "SQLite wird als Datenbank benutzt. Für größere Installationen wird empfohlen, dies zu ändern.",
"Finish setup" => "Installation abschließen",
"Finishing …" => "Abschließen ...",
"This application requires JavaScript to be enabled for correct operation. Please enable JavaScript and re-load this interface." => "Diese Anwendung benötigt ein aktiviertes JavaScript zum korrekten Betrieb. Bitte aktiviere JavaScript und lade diese Schnittstelle neu.",
diff --git a/core/l10n/de_CH.php b/core/l10n/de_CH.php
index 84ef4085d552f5ccc11b6d287bc865e6453901ea..3d377a6f82101eb5bc7910eda31cd9d938d35ad1 100644
--- a/core/l10n/de_CH.php
+++ b/core/l10n/de_CH.php
@@ -108,7 +108,6 @@ $TRANSLATIONS = array(
"Password" => "Passwort",
"Data folder" => "Datenverzeichnis",
"Configure the database" => "Datenbank einrichten",
-"will be used" => "wird verwendet",
"Database user" => "Datenbank-Benutzer",
"Database password" => "Datenbank-Passwort",
"Database name" => "Datenbank-Name",
diff --git a/core/l10n/de_DE.php b/core/l10n/de_DE.php
index b145700bfdd5ad09245c0fbb23933fdd00718a04..4d1079d81a94059d0821e8ae27670021543e8d7c 100644
--- a/core/l10n/de_DE.php
+++ b/core/l10n/de_DE.php
@@ -158,12 +158,13 @@ $TRANSLATIONS = array(
"Storage & database" => "Speicher & Datenbank",
"Data folder" => "Datenverzeichnis",
"Configure the database" => "Datenbank einrichten",
-"will be used" => "wird verwendet",
+"Only %s is available." => "Es sind nur %s verfügbar.",
"Database user" => "Datenbank-Benutzer",
"Database password" => "Datenbank-Passwort",
"Database name" => "Datenbank-Name",
"Database tablespace" => "Datenbank-Tablespace",
"Database host" => "Datenbank-Host",
+"SQLite will be used as database. For larger installations we recommend to change this." => "SQLite wird als Datenbank benutzt. Für größere Installationen wird empfohlen, dies zu ändern.",
"Finish setup" => "Installation abschließen",
"Finishing …" => "Abschließen ...",
"This application requires JavaScript to be enabled for correct operation. Please enable JavaScript and re-load this interface." => "Diese Anwendung benötigt ein aktiviertes JavaScript zum korrekten Betrieb. Bitte aktivieren Sie JavaScript und laden Sie diese Schnittstelle neu.",
diff --git a/core/l10n/el.php b/core/l10n/el.php
index ec47f40ad9849e21f9026341a94f43e65a5ab75f..500b4df3c10c6594b5a99b2125b76532ea3b3552 100644
--- a/core/l10n/el.php
+++ b/core/l10n/el.php
@@ -158,7 +158,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Αποθήκευση & βάση δεδομένων",
"Data folder" => "Φάκελος δεδομένων",
"Configure the database" => "Ρύθμιση της βάσης δεδομένων",
-"will be used" => "θα χρησιμοποιηθούν",
"Database user" => "Χρήστης της βάσης δεδομένων",
"Database password" => "Συνθηματικό βάσης δεδομένων",
"Database name" => "Όνομα βάσης δεδομένων",
diff --git a/core/l10n/en_GB.php b/core/l10n/en_GB.php
index 36753fb884e87b68b9e732ecfdf7281f06317245..ad55d831d65b09b3402b0dfa048a90a07ca0d465 100644
--- a/core/l10n/en_GB.php
+++ b/core/l10n/en_GB.php
@@ -158,7 +158,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Storage & database",
"Data folder" => "Data folder",
"Configure the database" => "Configure the database",
-"will be used" => "will be used",
"Database user" => "Database user",
"Database password" => "Database password",
"Database name" => "Database name",
diff --git a/core/l10n/eo.php b/core/l10n/eo.php
index f5844f9469ba59017b8a441ed73e1b12000801be..9efd1dfd8e7ff396e9276fc2ad3cec11ffd9275e 100644
--- a/core/l10n/eo.php
+++ b/core/l10n/eo.php
@@ -122,7 +122,6 @@ $TRANSLATIONS = array(
"Password" => "Pasvorto",
"Data folder" => "Datuma dosierujo",
"Configure the database" => "Agordi la datumbazon",
-"will be used" => "estos uzata",
"Database user" => "Datumbaza uzanto",
"Database password" => "Datumbaza pasvorto",
"Database name" => "Datumbaza nomo",
diff --git a/core/l10n/es.php b/core/l10n/es.php
index b53cbaa5c27787d7d746b8273bd5bee289690aa1..1cb5d0f2b2cb525e7f2d5368b06ae57696cfdd21 100644
--- a/core/l10n/es.php
+++ b/core/l10n/es.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Turned on maintenance mode" => "Modo mantenimiento activado",
"Turned off maintenance mode" => "Modo mantenimiento desactivado",
"Updated database" => "Base de datos actualizada",
+"Disabled incompatible apps: %s" => "Aplicaciones incompatibles desactivadas: %s",
"No image or file provided" => "No se especificó ningún archivo o imagen",
"Unknown filetype" => "Tipo de archivo desconocido",
"Invalid image" => "Imagen inválida",
@@ -108,7 +109,9 @@ $TRANSLATIONS = array(
"Edit tags" => "Editar etiquetas",
"Error loading dialog template: {error}" => "Error cargando plantilla de diálogo: {error}",
"No tags selected for deletion." => "No hay etiquetas seleccionadas para borrar.",
+"Updating {productName} to version {version}, this may take a while." => "Actualizando {productName} a la versión {version}. Esto puede tardar un poco.",
"Please reload the page." => "Recargue/Actualice la página",
+"The update was unsuccessful." => "La actualización fue exitosa.",
"The update was successful. Redirecting you to ownCloud now." => "La actualización se ha realizado con éxito. Redireccionando a ownCloud ahora.",
"%s password reset" => "%s restablecer contraseña",
"A problem has occurred whilst sending the email, please contact your administrator." => "Ocurrió un problema al enviar el mensaje de correo electrónico. Contacte a su administrador.",
@@ -155,7 +158,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Almacenamiento y base de datos",
"Data folder" => "Directorio de datos",
"Configure the database" => "Configurar la base de datos",
-"will be used" => "se utilizarán",
"Database user" => "Usuario de la base de datos",
"Database password" => "Contraseña de la base de datos",
"Database name" => "Nombre de la base de datos",
@@ -180,6 +182,11 @@ $TRANSLATIONS = array(
"This means only administrators can use the instance." => "Esto quiere decir que solo un administrador puede usarla.",
"Contact your system administrator if this message persists or appeared unexpectedly." => "Contacte con su administrador de sistemas si este mensaje persiste o aparece de forma inesperada.",
"Thank you for your patience." => "Gracias por su paciencia.",
+"%s will be updated to version %s." => "%s será actualizado a la versión %s.",
+"The following apps will be disabled:" => "Las siguientes aplicaciones serán desactivadas:",
+"The theme %s has been disabled." => "El tema %s ha sido desactivado.",
+"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." => "Antes de proceder, asegúrese de que se haya hecho un respaldo de la base de datos, la carpeta de configuración y la carpeta de datos.",
+"Start update" => "Iniciar actualización",
"This ownCloud instance is currently being updated, which may take a while." => "Esta versión de owncloud se está actualizando, esto puede demorar un tiempo.",
"Please reload this page after a short time to continue using ownCloud." => "Por favor, recargue la página tras un corto periodo de tiempo para continuar usando ownCloud"
);
diff --git a/core/l10n/es_AR.php b/core/l10n/es_AR.php
index 5548476e872fd41f76ef41e016b6002821eb6262..d8f78ee4a28be168a8b3c2a4b6e9232164f28d9f 100644
--- a/core/l10n/es_AR.php
+++ b/core/l10n/es_AR.php
@@ -146,7 +146,6 @@ $TRANSLATIONS = array(
"Password" => "Contraseña",
"Data folder" => "Directorio de almacenamiento",
"Configure the database" => "Configurar la base de datos",
-"will be used" => "se usarán",
"Database user" => "Usuario de la base de datos",
"Database password" => "Contraseña de la base de datos",
"Database name" => "Nombre de la base de datos",
diff --git a/core/l10n/es_MX.php b/core/l10n/es_MX.php
index b4c9939c5c9f2fa95ce8b5b27fb4fae3c2f9027b..152b1812b3bde867ec2d51b568dde3f8160f8356 100644
--- a/core/l10n/es_MX.php
+++ b/core/l10n/es_MX.php
@@ -140,7 +140,6 @@ $TRANSLATIONS = array(
"Password" => "Contraseña",
"Data folder" => "Directorio de datos",
"Configure the database" => "Configurar la base de datos",
-"will be used" => "se utilizarán",
"Database user" => "Usuario de la base de datos",
"Database password" => "Contraseña de la base de datos",
"Database name" => "Nombre de la base de datos",
diff --git a/core/l10n/et_EE.php b/core/l10n/et_EE.php
index 559fc2215a1167fac523bf84d4cd20db432f9916..f39d78b4d5841172df89637ef766584e89137314 100644
--- a/core/l10n/et_EE.php
+++ b/core/l10n/et_EE.php
@@ -155,7 +155,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Andmehoidla ja andmebaas",
"Data folder" => "Andmete kaust",
"Configure the database" => "Seadista andmebaasi",
-"will be used" => "kasutatakse",
"Database user" => "Andmebaasi kasutaja",
"Database password" => "Andmebaasi parool",
"Database name" => "Andmebasi nimi",
diff --git a/core/l10n/eu.php b/core/l10n/eu.php
index 7c696f50f5840288139c26fec3569a5852e9d29a..88d94241c7a191b807767771e8a505a9d6eac639 100644
--- a/core/l10n/eu.php
+++ b/core/l10n/eu.php
@@ -151,7 +151,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Biltegia & datubasea",
"Data folder" => "Datuen karpeta",
"Configure the database" => "Konfiguratu datu basea",
-"will be used" => "erabiliko da",
"Database user" => "Datubasearen erabiltzailea",
"Database password" => "Datubasearen pasahitza",
"Database name" => "Datubasearen izena",
diff --git a/core/l10n/fa.php b/core/l10n/fa.php
index cfde371e4677e017ce9f0ed3ebda49f650281e77..661a54f19efe0a13e4a39c61ad910642919bf69b 100644
--- a/core/l10n/fa.php
+++ b/core/l10n/fa.php
@@ -112,7 +112,6 @@ $TRANSLATIONS = array(
"Storage & database" => "انبارش و پایگاه داده",
"Data folder" => "پوشه اطلاعاتی",
"Configure the database" => "پایگاه داده برنامه ریزی شدند",
-"will be used" => "استفاده خواهد شد",
"Database user" => "شناسه پایگاه داده",
"Database password" => "پسورد پایگاه داده",
"Database name" => "نام پایگاه داده",
diff --git a/core/l10n/fi_FI.php b/core/l10n/fi_FI.php
index 7bfae86a2306108bb9cc0cb04f4ecc872655031f..88f94f254e16b9c016c906ff9e3484309034de8f 100644
--- a/core/l10n/fi_FI.php
+++ b/core/l10n/fi_FI.php
@@ -158,12 +158,13 @@ $TRANSLATIONS = array(
"Storage & database" => "Tallennus ja tietokanta",
"Data folder" => "Datakansio",
"Configure the database" => "Muokkaa tietokantaa",
-"will be used" => "käytetään",
+"Only %s is available." => "Vain %s on käytettävissä.",
"Database user" => "Tietokannan käyttäjä",
"Database password" => "Tietokannan salasana",
"Database name" => "Tietokannan nimi",
"Database tablespace" => "Tietokannan taulukkotila",
"Database host" => "Tietokantapalvelin",
+"SQLite will be used as database. For larger installations we recommend to change this." => "SQLitea käytetään tietokantana. Laajoja asennuksia varten tämä asetus kannattaa muuttaa. ",
"Finish setup" => "Viimeistele asennus",
"Finishing …" => "Valmistellaan…",
"This application requires JavaScript to be enabled for correct operation. Please enable JavaScript and re-load this interface." => "Tämä sovellus vaatii toimiakseen JavaScriptin käyttöä. Ota JavaScript käyttöön ja päivitä tämä käyttöliittymä.",
diff --git a/core/l10n/fr.php b/core/l10n/fr.php
index f24f0ec25905a9fda45e63eaa6091dc170614b0b..6b628e03ddac86e11cf82b3253ee4bd39fd2ae66 100644
--- a/core/l10n/fr.php
+++ b/core/l10n/fr.php
@@ -158,7 +158,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Support de stockage & base de données",
"Data folder" => "Répertoire des données",
"Configure the database" => "Configurer la base de données",
-"will be used" => "sera utilisé",
"Database user" => "Utilisateur pour la base de données",
"Database password" => "Mot de passe de la base de données",
"Database name" => "Nom de la base de données",
diff --git a/core/l10n/gl.php b/core/l10n/gl.php
index e43ca0423c145b2e0fce390f3a245928ae9e886c..c7ff0a923a5d92c5713fcf21354771262513bea5 100644
--- a/core/l10n/gl.php
+++ b/core/l10n/gl.php
@@ -33,13 +33,13 @@ $TRANSLATIONS = array(
"Settings" => "Axustes",
"Saving..." => "Gardando...",
"seconds ago" => "segundos atrás",
-"_%n minute ago_::_%n minutes ago_" => array("hai %n minuto","hai %n minutos"),
-"_%n hour ago_::_%n hours ago_" => array("hai %n hora","hai %n horas"),
+"_%n minute ago_::_%n minutes ago_" => array("hai %n minuto","vai %n minutos"),
+"_%n hour ago_::_%n hours ago_" => array("hai %n hora","vai %n horas"),
"today" => "hoxe",
"yesterday" => "onte",
"_%n day ago_::_%n days ago_" => array("hai %n día","vai %n días"),
"last month" => "último mes",
-"_%n month ago_::_%n months ago_" => array("hai %n mes","hai %n meses"),
+"_%n month ago_::_%n months ago_" => array("hai %n mes","vai %n meses"),
"last year" => "último ano",
"years ago" => "anos atrás",
"Yes" => "Si",
@@ -64,7 +64,7 @@ $TRANSLATIONS = array(
"So-so password" => "Contrasinal non moi aló",
"Good password" => "Bo contrasinal",
"Strong password" => "Contrasinal forte",
-"Shared" => "Compartir",
+"Shared" => "Compartido",
"Share" => "Compartir",
"Error" => "Erro",
"Error while sharing" => "Produciuse un erro ao compartir",
@@ -76,7 +76,7 @@ $TRANSLATIONS = array(
"Share link" => "Ligazón para compartir",
"The public link will expire no later than {days} days after it is created" => "A ligazón pública caducará, a máis tardar, {days} días após a súa creación",
"By default the public link will expire after {days} days" => "De xeito predeterminado, a ligazón pública caduca aos {days} días",
-"Password protect" => "Protexido con contrasinais",
+"Password protect" => "Protexido con contrasinal",
"Choose a password for the public link" => "Escolla un contrasinal para a ligazón pública",
"Allow Public Upload" => "Permitir o envío público",
"Email link to person" => "Enviar ligazón por correo",
@@ -86,7 +86,7 @@ $TRANSLATIONS = array(
"Share via email:" => "Compartir por correo:",
"No people found" => "Non se atopou xente",
"group" => "grupo",
-"Resharing is not allowed" => "Non se permite volver a compartir",
+"Resharing is not allowed" => "Non se permite volver compartir",
"Shared in {item} with {user}" => "Compartido en {item} con {user}",
"Unshare" => "Deixar de compartir",
"notify by email" => "notificar por correo",
@@ -110,7 +110,7 @@ $TRANSLATIONS = array(
"Error loading dialog template: {error}" => "Produciuse un erro ao cargar o modelo do dialogo: {error}",
"No tags selected for deletion." => "Non se seleccionaron etiquetas para borrado.",
"Updating {productName} to version {version}, this may take a while." => "Actualizando {productName} a versión {version}, isto pode levar un anaco.",
-"Please reload the page." => "Volva a cargar a páxina.",
+"Please reload the page." => "Volva cargar a páxina.",
"The update was unsuccessful." => "A actualización foi satisfactoria.",
"The update was successful. Redirecting you to ownCloud now." => "A actualización realizouse correctamente. Redirixíndoo agora á ownCloud.",
"%s password reset" => "Restabelecer o contrasinal %s",
@@ -158,14 +158,15 @@ $TRANSLATIONS = array(
"Storage & database" => "Almacenamento e base de datos",
"Data folder" => "Cartafol de datos",
"Configure the database" => "Configurar a base de datos",
-"will be used" => "vai ser utilizado",
+"Only %s is available." => "Só está dispoñíbel %s.",
"Database user" => "Usuario da base de datos",
"Database password" => "Contrasinal da base de datos",
"Database name" => "Nome da base de datos",
"Database tablespace" => "Táboa de espazos da base de datos",
"Database host" => "Servidor da base de datos",
+"SQLite will be used as database. For larger installations we recommend to change this." => "Empregarase SQLite como base de datos. Para instalacións máis grandes recomendámoslle que cambie isto.",
"Finish setup" => "Rematar a configuración",
-"Finishing …" => "Rematado ...",
+"Finishing …" => "Rematando ...",
"This application requires JavaScript to be enabled for correct operation. Please enable JavaScript and re-load this interface." => "Este aplicativo require que o JavaScript estea activado para unha operativa correcta. Active o JavaScript e volva a cargar a interface.",
"%s is available. Get more information on how to update." => "%s está dispoñíbel. Obteña máis información sobre como actualizar.",
"Log out" => "Desconectar",
diff --git a/core/l10n/he.php b/core/l10n/he.php
index d139056ec878b50ed177e62bd62eca2672e70ab1..d4d2824aed68c8667ac639c98734c2b5c464f786 100644
--- a/core/l10n/he.php
+++ b/core/l10n/he.php
@@ -100,7 +100,6 @@ $TRANSLATIONS = array(
"Password" => "סיסמא",
"Data folder" => "תיקיית נתונים",
"Configure the database" => "הגדרת מסד הנתונים",
-"will be used" => "ינוצלו",
"Database user" => "שם משתמש במסד הנתונים",
"Database password" => "ססמת מסד הנתונים",
"Database name" => "שם מסד הנתונים",
diff --git a/core/l10n/hi.php b/core/l10n/hi.php
index 1b156291681bb753c91de3799c757d2e484d2a2b..ada4970a029434d082f421379c45e7e7c0a832c9 100644
--- a/core/l10n/hi.php
+++ b/core/l10n/hi.php
@@ -48,7 +48,6 @@ $TRANSLATIONS = array(
"Password" => "पासवर्ड",
"Data folder" => "डाटा फोल्डर",
"Configure the database" => "डेटाबेस कॉन्फ़िगर करें ",
-"will be used" => "उपयोग होगा",
"Database user" => "डेटाबेस उपयोगकर्ता",
"Database password" => "डेटाबेस पासवर्ड",
"Database name" => "डेटाबेस का नाम",
diff --git a/core/l10n/hr.php b/core/l10n/hr.php
index 248a56e4fa195eaf85e6d73a36d637c0f5b66789..f85e4a5175fcb018002e88cd46171168a81c8dea 100644
--- a/core/l10n/hr.php
+++ b/core/l10n/hr.php
@@ -78,7 +78,6 @@ $TRANSLATIONS = array(
"Password" => "Lozinka",
"Data folder" => "Mapa baze podataka",
"Configure the database" => "Konfiguriraj bazu podataka",
-"will be used" => "će se koristiti",
"Database user" => "Korisnik baze podataka",
"Database password" => "Lozinka baze podataka",
"Database name" => "Ime baze podataka",
diff --git a/core/l10n/hu_HU.php b/core/l10n/hu_HU.php
index 7ceb0b4164158baff26a7d8c7d15c671e3878c56..d0c6fae65814502650deee22857d712efc3a45ae 100644
--- a/core/l10n/hu_HU.php
+++ b/core/l10n/hu_HU.php
@@ -155,7 +155,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Tárolás és adatbázis",
"Data folder" => "Adatkönyvtár",
"Configure the database" => "Adatbázis konfigurálása",
-"will be used" => "adatbázist fogunk használni",
"Database user" => "Adatbázis felhasználónév",
"Database password" => "Adatbázis jelszó",
"Database name" => "Az adatbázis neve",
diff --git a/core/l10n/ia.php b/core/l10n/ia.php
index 6db312b05567b4eb5e1b197e31a4ce564392d2c3..e2f32407e0d75337763d0d99d7ad9ab97f105735 100644
--- a/core/l10n/ia.php
+++ b/core/l10n/ia.php
@@ -125,7 +125,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Immagazinage & base de datos",
"Data folder" => "Dossier de datos",
"Configure the database" => "Configurar le base de datos",
-"will be used" => "essera usate",
"Database user" => "Usator de base de datos",
"Database password" => "Contrasigno de base de datos",
"Database name" => "Nomine de base de datos",
diff --git a/core/l10n/id.php b/core/l10n/id.php
index 29da84c8e5bc77229d72e87189a5887a9f09cc3d..b69ea283de9598caa602504f9ff821c7c3fb8f9d 100644
--- a/core/l10n/id.php
+++ b/core/l10n/id.php
@@ -151,7 +151,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Penyimpanan & Basis data",
"Data folder" => "Folder data",
"Configure the database" => "Konfigurasikan basis data",
-"will be used" => "akan digunakan",
"Database user" => "Pengguna basis data",
"Database password" => "Sandi basis data",
"Database name" => "Nama basis data",
diff --git a/core/l10n/is.php b/core/l10n/is.php
index aa1aee6d290e6bb12e69813255f9db4c6b895bbc..e592352e599502d551b0c1a628c0ef12be9e5a24 100644
--- a/core/l10n/is.php
+++ b/core/l10n/is.php
@@ -92,7 +92,6 @@ $TRANSLATIONS = array(
"Password" => "Lykilorð",
"Data folder" => "Gagnamappa",
"Configure the database" => "Stilla gagnagrunn",
-"will be used" => "verður notað",
"Database user" => "Gagnagrunns notandi",
"Database password" => "Gagnagrunns lykilorð",
"Database name" => "Nafn gagnagrunns",
diff --git a/core/l10n/it.php b/core/l10n/it.php
index 9e5a30cbe6481e8be1ab2ecf4afecd62e1c05864..7c5478dff07947167332ec742f33f17d6ecaa625 100644
--- a/core/l10n/it.php
+++ b/core/l10n/it.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Turned on maintenance mode" => "Modalità di manutenzione attivata",
"Turned off maintenance mode" => "Modalità di manutenzione disattivata",
"Updated database" => "Database aggiornato",
+"Disabled incompatible apps: %s" => "Applicazione incompatibili disabilitate: %s",
"No image or file provided" => "Non è stata fornita alcun immagine o file",
"Unknown filetype" => "Tipo di file sconosciuto",
"Invalid image" => "Immagine non valida",
@@ -108,7 +109,9 @@ $TRANSLATIONS = array(
"Edit tags" => "Modifica etichette",
"Error loading dialog template: {error}" => "Errore durante il caricamento del modello di finestra: {error}",
"No tags selected for deletion." => "Nessuna etichetta selezionata per l'eliminazione.",
+"Updating {productName} to version {version}, this may take a while." => "Aggiornamento di {productName} alla versione {version}, potrebbe richiedere del tempo.",
"Please reload the page." => "Ricarica la pagina.",
+"The update was unsuccessful." => "L'aggiornamento non è riuscito.",
"The update was successful. Redirecting you to ownCloud now." => "L'aggiornamento è stato effettuato correttamente. Stai per essere reindirizzato a ownCloud.",
"%s password reset" => "Ripristino password di %s",
"A problem has occurred whilst sending the email, please contact your administrator." => "Si è verificato un problema durante l'invio della email, contatta il tuo amministratore.",
@@ -155,12 +158,13 @@ $TRANSLATIONS = array(
"Storage & database" => "Archiviazione e database",
"Data folder" => "Cartella dati",
"Configure the database" => "Configura il database",
-"will be used" => "sarà utilizzato",
+"Only %s is available." => "È disponibile solo %s.",
"Database user" => "Utente del database",
"Database password" => "Password del database",
"Database name" => "Nome del database",
"Database tablespace" => "Spazio delle tabelle del database",
"Database host" => "Host del database",
+"SQLite will be used as database. For larger installations we recommend to change this." => "SQLite sarà utilizzato come database. Per installazioni più grandi consigliamo di cambiarlo.",
"Finish setup" => "Termina la configurazione",
"Finishing …" => "Completamento...",
"This application requires JavaScript to be enabled for correct operation. Please enable JavaScript and re-load this interface." => "L'applicazione richiede che JavaScript sia abilitato per un corretto funzionamento. Abilita JavaScript e ricarica questa interfaccia.",
@@ -180,6 +184,11 @@ $TRANSLATIONS = array(
"This means only administrators can use the instance." => "Ciò significa che solo gli amministratori possono utilizzare l'istanza.",
"Contact your system administrator if this message persists or appeared unexpectedly." => "Contatta il tuo amministratore di sistema se questo messaggio persiste o appare inaspettatamente.",
"Thank you for your patience." => "Grazie per la pazienza.",
+"%s will be updated to version %s." => "%s sarà aggiornato alla versione %s.",
+"The following apps will be disabled:" => "Le seguenti applicazioni saranno disabilitate:",
+"The theme %s has been disabled." => "Il tema %s è stato disabilitato.",
+"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." => "Assicurati di aver creato una copia di sicurezza del database, della cartella config e della cartella data prima di procedere. ",
+"Start update" => "Avvia l'aggiornamento",
"This ownCloud instance is currently being updated, which may take a while." => "Questa istanza di ownCloud è in fase di aggiornamento, potrebbe richiedere del tempo.",
"Please reload this page after a short time to continue using ownCloud." => "Ricarica questa pagina per poter continuare ad usare ownCloud."
);
diff --git a/core/l10n/ja.php b/core/l10n/ja.php
index 187fe575e910cdcaadb190bac45d245d9de03e00..fc87790f2896d9816c421b30edede035e37d4993 100644
--- a/core/l10n/ja.php
+++ b/core/l10n/ja.php
@@ -55,7 +55,7 @@ $TRANSLATIONS = array(
"If you select both versions, the copied file will have a number added to its name." => "両方のバージョンを選択した場合は、ファイル名の後ろに数字を追加したファイルのコピーを作成します。",
"Cancel" => "キャンセル",
"Continue" => "続ける",
-"(all selected)" => "(全て選択)",
+"(all selected)" => "(すべて選択)",
"({count} selected)" => "({count} 選択)",
"Error loading file exists template" => "既存ファイルのテンプレートの読み込みエラー",
"Very weak password" => "非常に弱いパスワード",
@@ -109,6 +109,7 @@ $TRANSLATIONS = array(
"Error loading dialog template: {error}" => "メッセージテンプレートの読み込みエラー: {error}",
"No tags selected for deletion." => "削除するタグが選択されていません。",
"Please reload the page." => "ページをリロードしてください。",
+"The update was unsuccessful." => "アップデートに失敗しました。",
"The update was successful. Redirecting you to ownCloud now." => "アップデートに成功しました。今すぐownCloudにリダイレクトします。",
"%s password reset" => "%s パスワードリセット",
"A problem has occurred whilst sending the email, please contact your administrator." => "メールの送信中に問題が発生しました。管理者に問い合わせください。",
@@ -155,7 +156,7 @@ $TRANSLATIONS = array(
"Storage & database" => "ストレージとデータベース",
"Data folder" => "データフォルダー",
"Configure the database" => "データベースを設定してください",
-"will be used" => "が使用されます",
+"Only %s is available." => "%s のみ有効です。",
"Database user" => "データベースのユーザー名",
"Database password" => "データベースのパスワード",
"Database name" => "データベース名",
@@ -180,6 +181,8 @@ $TRANSLATIONS = array(
"This means only administrators can use the instance." => "これは、管理者のみがインスタンスを利用できることを意味しています。",
"Contact your system administrator if this message persists or appeared unexpectedly." => "このメッセージが引き続きもしくは予期せず現れる場合は、システム管理者に連絡してください。",
"Thank you for your patience." => "しばらくお待ちください。",
+"%s will be updated to version %s." => "%s はバージョン %s にアップデートされました。",
+"Start update" => "アップデートを開始",
"This ownCloud instance is currently being updated, which may take a while." => "この ownCloud インスタンスは現在アップデート中のため、しばらく時間がかかります。",
"Please reload this page after a short time to continue using ownCloud." => "ownCloud を続けて利用するには、しばらくした後でページをリロードしてください。"
);
diff --git a/core/l10n/ka_GE.php b/core/l10n/ka_GE.php
index c753ef4e1d5df68ca28955e48656c02ab994b24b..7091d86b53f42a8a77b06a3d7aef32308bb732ef 100644
--- a/core/l10n/ka_GE.php
+++ b/core/l10n/ka_GE.php
@@ -96,7 +96,6 @@ $TRANSLATIONS = array(
"Password" => "პაროლი",
"Data folder" => "მონაცემთა საქაღალდე",
"Configure the database" => "მონაცემთა ბაზის კონფიგურირება",
-"will be used" => "გამოყენებული იქნება",
"Database user" => "მონაცემთა ბაზის მომხმარებელი",
"Database password" => "მონაცემთა ბაზის პაროლი",
"Database name" => "მონაცემთა ბაზის სახელი",
diff --git a/core/l10n/km.php b/core/l10n/km.php
index 0be6738284b06263070c2f21f10333d968db36e8..0b55a81a72c3656109801a6df0b96f3e824dc68c 100644
--- a/core/l10n/km.php
+++ b/core/l10n/km.php
@@ -101,7 +101,6 @@ $TRANSLATIONS = array(
"Storage & database" => "ឃ្លាំងផ្ទុក & មូលដ្ឋានទិន្នន័យ",
"Data folder" => "ថតទិន្នន័យ",
"Configure the database" => "កំណត់សណ្ឋានមូលដ្ឋានទិន្នន័យ",
-"will be used" => "នឹងត្រូវបានប្រើ",
"Database user" => "អ្នកប្រើមូលដ្ឋានទិន្នន័យ",
"Database password" => "ពាក្យសម្ងាត់មូលដ្ឋានទិន្នន័យ",
"Database name" => "ឈ្មោះមូលដ្ឋានទិន្នន័យ",
diff --git a/core/l10n/ko.php b/core/l10n/ko.php
index 7fd17d465be04a0823dc994c304773a9dc31a7b5..3137ec9ed2acd666fb2efc67aa7addacbd2241d3 100644
--- a/core/l10n/ko.php
+++ b/core/l10n/ko.php
@@ -146,7 +146,6 @@ $TRANSLATIONS = array(
"Storage & database" => "스토리지 & 데이터베이스",
"Data folder" => "데이터 폴더",
"Configure the database" => "데이터베이스 설정",
-"will be used" => "사용될 예정",
"Database user" => "데이터베이스 사용자",
"Database password" => "데이터베이스 암호",
"Database name" => "데이터베이스 이름",
diff --git a/core/l10n/lb.php b/core/l10n/lb.php
index 16b9ab5fe91751cc86e7c9b14e5fb526b6d1a22c..88891bf4571183f5fa4961f78ab90e2ee480dbed 100644
--- a/core/l10n/lb.php
+++ b/core/l10n/lb.php
@@ -120,7 +120,6 @@ $TRANSLATIONS = array(
"Password" => "Passwuert",
"Data folder" => "Daten-Dossier",
"Configure the database" => "D'Datebank konfiguréieren",
-"will be used" => "wärt benotzt ginn",
"Database user" => "Datebank-Benotzer",
"Database password" => "Datebank-Passwuert",
"Database name" => "Datebank Numm",
diff --git a/core/l10n/lt_LT.php b/core/l10n/lt_LT.php
index bde6285969ffe317059d913c763c51b9576e25db..81ff611ecf1452f41eb4b06f2e8d682e02ee38af 100644
--- a/core/l10n/lt_LT.php
+++ b/core/l10n/lt_LT.php
@@ -140,7 +140,6 @@ $TRANSLATIONS = array(
"Password" => "Slaptažodis",
"Data folder" => "Duomenų katalogas",
"Configure the database" => "Nustatyti duomenų bazę",
-"will be used" => "bus naudojama",
"Database user" => "Duomenų bazės vartotojas",
"Database password" => "Duomenų bazės slaptažodis",
"Database name" => "Duomenų bazės pavadinimas",
diff --git a/core/l10n/lv.php b/core/l10n/lv.php
index d395a8c91388cd5eb7159a793672d442b753700a..3b038b355fee5ab78fbac3254a388b0fc9283a79 100644
--- a/core/l10n/lv.php
+++ b/core/l10n/lv.php
@@ -104,7 +104,6 @@ $TRANSLATIONS = array(
"Password" => "Parole",
"Data folder" => "Datu mape",
"Configure the database" => "Konfigurēt datubāzi",
-"will be used" => "tiks izmantots",
"Database user" => "Datubāzes lietotājs",
"Database password" => "Datubāzes parole",
"Database name" => "Datubāzes nosaukums",
diff --git a/core/l10n/mk.php b/core/l10n/mk.php
index a32b4e792368ccd91e49e880ab3e5891cf7f8f4e..d12ff0203b34b98671eb3efb2c3498184d5d7d77 100644
--- a/core/l10n/mk.php
+++ b/core/l10n/mk.php
@@ -122,7 +122,6 @@ $TRANSLATIONS = array(
"Password" => "Лозинка",
"Data folder" => "Фолдер со податоци",
"Configure the database" => "Конфигурирај ја базата",
-"will be used" => "ќе биде користено",
"Database user" => "Корисник на база",
"Database password" => "Лозинка на база",
"Database name" => "Име на база",
diff --git a/core/l10n/ms_MY.php b/core/l10n/ms_MY.php
index b32888238c1bec2397d4d8c68a25b834c1b83a12..745e63402e9932cc45dab767802b358caecd4d1b 100644
--- a/core/l10n/ms_MY.php
+++ b/core/l10n/ms_MY.php
@@ -54,7 +54,6 @@ $TRANSLATIONS = array(
"Password" => "Kata laluan",
"Data folder" => "Fail data",
"Configure the database" => "Konfigurasi pangkalan data",
-"will be used" => "akan digunakan",
"Database user" => "Nama pengguna pangkalan data",
"Database password" => "Kata laluan pangkalan data",
"Database name" => "Nama pangkalan data",
diff --git a/core/l10n/nb_NO.php b/core/l10n/nb_NO.php
index 3bed1b550a913197c902eb9d79c4d2fe2371f2dc..b714b739ce4e0089928260e9423edbc594a5a3e8 100644
--- a/core/l10n/nb_NO.php
+++ b/core/l10n/nb_NO.php
@@ -158,7 +158,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Lagring og database",
"Data folder" => "Datamappe",
"Configure the database" => "Konfigurer databasen",
-"will be used" => "vil bli brukt",
"Database user" => "Databasebruker",
"Database password" => "Databasepassord",
"Database name" => "Databasenavn",
diff --git a/core/l10n/nl.php b/core/l10n/nl.php
index 90b5a53817ac857a0aa713a1a11fdf62ee1d64f3..1a5ee85a14ece2418b2049b695e83fd36547c000 100644
--- a/core/l10n/nl.php
+++ b/core/l10n/nl.php
@@ -158,7 +158,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Opslag & database",
"Data folder" => "Gegevensmap",
"Configure the database" => "Configureer de database",
-"will be used" => "zal gebruikt worden",
"Database user" => "Gebruiker database",
"Database password" => "Wachtwoord database",
"Database name" => "Naam database",
diff --git a/core/l10n/nn_NO.php b/core/l10n/nn_NO.php
index 042c3cebd08d217c28cd6b144b65803ee2cf62cd..cc61caf3a38baa94041019477e834a30641ffd7a 100644
--- a/core/l10n/nn_NO.php
+++ b/core/l10n/nn_NO.php
@@ -121,7 +121,6 @@ $TRANSLATIONS = array(
"Password" => "Passord",
"Data folder" => "Datamappe",
"Configure the database" => "Set opp databasen",
-"will be used" => "vil verta nytta",
"Database user" => "Databasebrukar",
"Database password" => "Databasepassord",
"Database name" => "Databasenamn",
diff --git a/core/l10n/oc.php b/core/l10n/oc.php
index f4dc0a01263db47b4575743d8c2d8549b0586e96..4ef1442012d1896763d46b8d85f44cb56135bd36 100644
--- a/core/l10n/oc.php
+++ b/core/l10n/oc.php
@@ -80,7 +80,6 @@ $TRANSLATIONS = array(
"Password" => "Senhal",
"Data folder" => "Dorsièr de donadas",
"Configure the database" => "Configura la basa de donadas",
-"will be used" => "serà utilizat",
"Database user" => "Usancièr de la basa de donadas",
"Database password" => "Senhal de la basa de donadas",
"Database name" => "Nom de la basa de donadas",
diff --git a/core/l10n/pl.php b/core/l10n/pl.php
index fd67d8dc7c6b21b190d1dad8d0f7759f708a1fc5..028c82008d2fbdcaec99d320fbef6d3a05869844 100644
--- a/core/l10n/pl.php
+++ b/core/l10n/pl.php
@@ -5,6 +5,7 @@ $TRANSLATIONS = array(
"Turned on maintenance mode" => "Włączony tryb konserwacji",
"Turned off maintenance mode" => "Wyłączony tryb konserwacji",
"Updated database" => "Zaktualizuj bazę",
+"Disabled incompatible apps: %s" => "Wyłączone niekompatybilne aplikacja: %s",
"No image or file provided" => "Brak obrazu lub pliku dostarczonego",
"Unknown filetype" => "Nieznany typ pliku",
"Invalid image" => "Nieprawidłowe zdjęcie",
@@ -108,7 +109,9 @@ $TRANSLATIONS = array(
"Edit tags" => "Edytuj tagi",
"Error loading dialog template: {error}" => "Błąd podczas ładowania szablonu dialogu: {error}",
"No tags selected for deletion." => "Nie zaznaczono tagów do usunięcia.",
+"Updating {productName} to version {version}, this may take a while." => "Aktualizuję {productName} do wersji {version}, to może chwilę potrwać.",
"Please reload the page." => "Proszę przeładować stronę",
+"The update was unsuccessful." => "Aktualizacja nie powiodła się.",
"The update was successful. Redirecting you to ownCloud now." => "Aktualizacji zakończyła się powodzeniem. Przekierowuję do ownCloud.",
"%s password reset" => "%s reset hasła",
"A problem has occurred whilst sending the email, please contact your administrator." => "Pojawił się problem podczas wysyłania wiadomości email, skontaktuj się z administratorem",
@@ -155,7 +158,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Zasoby dysku & baza danych",
"Data folder" => "Katalog danych",
"Configure the database" => "Skonfiguruj bazę danych",
-"will be used" => "zostanie użyte",
"Database user" => "Użytkownik bazy danych",
"Database password" => "Hasło do bazy danych",
"Database name" => "Nazwa bazy danych",
@@ -180,6 +182,11 @@ $TRANSLATIONS = array(
"This means only administrators can use the instance." => "To oznacza, że tylko administratorzy mogą w tej chwili używać aplikacji.",
"Contact your system administrator if this message persists or appeared unexpectedly." => "Skontaktuj się z administratorem, jeśli ten komunikat pojawił się nieoczekiwanie lub wyświetla się ciągle.",
"Thank you for your patience." => "Dziękuję za cierpliwość.",
+"%s will be updated to version %s." => "%s zostanie zaktualizowane do wersji %s.",
+"The following apps will be disabled:" => "Następujące aplikacje zostaną zablokowane:",
+"The theme %s has been disabled." => "Motyw %s został wyłączony.",
+"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." => "Proszę się upewnić, że baza danych, folder konfiguracji oraz folder danych zostały zarchiwizowane przed przejściem dalej.",
+"Start update" => "Rozpocznij aktualizację",
"This ownCloud instance is currently being updated, which may take a while." => "Ta instalacja ownCloud jest w tej chwili aktualizowana, co może chwilę potrwać",
"Please reload this page after a short time to continue using ownCloud." => "Proszę przeładować tę stronę za chwilę, aby kontynuować pracę w ownCloud"
);
diff --git a/core/l10n/pt_BR.php b/core/l10n/pt_BR.php
index 2ef3ce47299a4b48a4ea442962a1eaace0bd258b..a139b22d9e4689e6e134223a08c89a3ddfd84330 100644
--- a/core/l10n/pt_BR.php
+++ b/core/l10n/pt_BR.php
@@ -158,7 +158,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Armazenamento & banco de dados",
"Data folder" => "Pasta de dados",
"Configure the database" => "Configurar o banco de dados",
-"will be used" => "será usado",
"Database user" => "Usuário do banco de dados",
"Database password" => "Senha do banco de dados",
"Database name" => "Nome do banco de dados",
diff --git a/core/l10n/pt_PT.php b/core/l10n/pt_PT.php
index 82b25620e17e1532d99c08fb89b7423fb1270d63..e78bfe1617f1bfe802f36126589452ad783740b6 100644
--- a/core/l10n/pt_PT.php
+++ b/core/l10n/pt_PT.php
@@ -155,7 +155,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Armazenamento e base de dados",
"Data folder" => "Pasta de dados",
"Configure the database" => "Configure a base de dados",
-"will be used" => "vai ser usada",
"Database user" => "Utilizador da base de dados",
"Database password" => "Password da base de dados",
"Database name" => "Nome da base de dados",
diff --git a/core/l10n/ro.php b/core/l10n/ro.php
index e8d6fac33381fc87f76011eeb1db9875e50acaac..3816625772cf75afa29fa7d1a3925885412590f4 100644
--- a/core/l10n/ro.php
+++ b/core/l10n/ro.php
@@ -111,7 +111,6 @@ $TRANSLATIONS = array(
"Password" => "Parolă",
"Data folder" => "Director date",
"Configure the database" => "Configurează baza de date",
-"will be used" => "vor fi folosite",
"Database user" => "Utilizatorul bazei de date",
"Database password" => "Parola bazei de date",
"Database name" => "Numele bazei de date",
diff --git a/core/l10n/ru.php b/core/l10n/ru.php
index 83242d63841fbd1815f4eaf5c0c4a4dba51e4f8d..4fcdaeec1850c0dd2c9f9ee508a421410a9c4dc8 100644
--- a/core/l10n/ru.php
+++ b/core/l10n/ru.php
@@ -155,7 +155,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Система хранения данных & база данных",
"Data folder" => "Директория с данными",
"Configure the database" => "Настройка базы данных",
-"will be used" => "будет использовано",
"Database user" => "Пользователь базы данных",
"Database password" => "Пароль базы данных",
"Database name" => "Название базы данных",
@@ -180,6 +179,7 @@ $TRANSLATIONS = array(
"This means only administrators can use the instance." => "Это значит, что только администраторы могут использовать эту установку.",
"Contact your system administrator if this message persists or appeared unexpectedly." => "Обратитесь к вашему системному администратору если это сообщение не исчезает или появляется неожиданно.",
"Thank you for your patience." => "Спасибо за терпение.",
+"Start update" => "Запустить обновление",
"This ownCloud instance is currently being updated, which may take a while." => "Производится обновление ownCloud, это может занять некоторое время.",
"Please reload this page after a short time to continue using ownCloud." => "Перезагрузите эту страницу через некоторое время чтобы продолжить использовать ownCloud."
);
diff --git a/core/l10n/si_LK.php b/core/l10n/si_LK.php
index 1ce41214e91f8486af1247fc0a183e6c64efde50..cd9d1011487773c46c53545acada65c7f801c8ab 100644
--- a/core/l10n/si_LK.php
+++ b/core/l10n/si_LK.php
@@ -75,7 +75,6 @@ $TRANSLATIONS = array(
"Password" => "මුර පදය",
"Data folder" => "දත්ත ෆෝල්ඩරය",
"Configure the database" => "දත්ත සමුදාය හැඩගැසීම",
-"will be used" => "භාවිතා වනු ඇත",
"Database user" => "දත්තගබඩා භාවිතාකරු",
"Database password" => "දත්තගබඩාවේ මුරපදය",
"Database name" => "දත්තගබඩාවේ නම",
diff --git a/core/l10n/sk_SK.php b/core/l10n/sk_SK.php
index 9abcce3d3ae7d6b5d0740c932836225ac2779aed..68fd163e8716ae361614060736970737d8e18d9e 100644
--- a/core/l10n/sk_SK.php
+++ b/core/l10n/sk_SK.php
@@ -152,7 +152,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Úložislo & databáza",
"Data folder" => "Priečinok dát",
"Configure the database" => "Nastaviť databázu",
-"will be used" => "bude použité",
"Database user" => "Používateľ databázy",
"Database password" => "Heslo databázy",
"Database name" => "Meno databázy",
diff --git a/core/l10n/sl.php b/core/l10n/sl.php
index 02ed13077a808fb88849270fb571d6c63829d971..f0b09ca3a17bedc3c00f011ab2bf2b50b1611ec4 100644
--- a/core/l10n/sl.php
+++ b/core/l10n/sl.php
@@ -152,7 +152,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Shramba in podatkovna zbirka",
"Data folder" => "Podatkovna mapa",
"Configure the database" => "Nastavi podatkovno zbirko",
-"will be used" => "bo uporabljen",
"Database user" => "Uporabnik podatkovne zbirke",
"Database password" => "Geslo podatkovne zbirke",
"Database name" => "Ime podatkovne zbirke",
diff --git a/core/l10n/sq.php b/core/l10n/sq.php
index 9891f36c7aa77100851d8ec803813dd4e00fd873..3fce8e9d84af9ce9ec28cc1dcb137d60026b4d55 100644
--- a/core/l10n/sq.php
+++ b/core/l10n/sq.php
@@ -105,7 +105,6 @@ $TRANSLATIONS = array(
"Password" => "Kodi",
"Data folder" => "Emri i dosjes",
"Configure the database" => "Konfiguro database-in",
-"will be used" => "do të përdoret",
"Database user" => "Përdoruesi i database-it",
"Database password" => "Kodi i database-it",
"Database name" => "Emri i database-it",
diff --git a/core/l10n/sr.php b/core/l10n/sr.php
index 0030be353aaccdc3695418abaf48a23aa5d185d7..e41bd5ae7178ce609d7262bb1ba270fb1c207d69 100644
--- a/core/l10n/sr.php
+++ b/core/l10n/sr.php
@@ -90,7 +90,6 @@ $TRANSLATIONS = array(
"Password" => "Лозинка",
"Data folder" => "Фацикла података",
"Configure the database" => "Подешавање базе",
-"will be used" => "ће бити коришћен",
"Database user" => "Корисник базе",
"Database password" => "Лозинка базе",
"Database name" => "Име базе",
diff --git a/core/l10n/sr@latin.php b/core/l10n/sr@latin.php
index 32e9479fb3f4733b30a7cc5efcfbc06cd6f25712..40c37b5b0796ae758990d63df641a3213e6c7f27 100644
--- a/core/l10n/sr@latin.php
+++ b/core/l10n/sr@latin.php
@@ -92,7 +92,6 @@ $TRANSLATIONS = array(
"Password" => "Lozinka",
"Data folder" => "Fascikla podataka",
"Configure the database" => "Podešavanje baze",
-"will be used" => "će biti korišćen",
"Database user" => "Korisnik baze",
"Database password" => "Lozinka baze",
"Database name" => "Ime baze",
diff --git a/core/l10n/sv.php b/core/l10n/sv.php
index 22348aeda3d1708c4ae221e438acac62f796050e..d965a5618c0641b1193543a1591f7368ed6803be 100644
--- a/core/l10n/sv.php
+++ b/core/l10n/sv.php
@@ -158,7 +158,6 @@ $TRANSLATIONS = array(
"Storage & database" => "Lagring & databas",
"Data folder" => "Datamapp",
"Configure the database" => "Konfigurera databasen",
-"will be used" => "kommer att användas",
"Database user" => "Databasanvändare",
"Database password" => "Lösenord till databasen",
"Database name" => "Databasnamn",
diff --git a/core/l10n/ta_LK.php b/core/l10n/ta_LK.php
index 53c8cb1333375c93192504a774a0ce7f777053d7..2e0db9e973d85884526378923b36fc40db397c48 100644
--- a/core/l10n/ta_LK.php
+++ b/core/l10n/ta_LK.php
@@ -87,7 +87,6 @@ $TRANSLATIONS = array(
"Password" => "கடவுச்சொல்",
"Data folder" => "தரவு கோப்புறை",
"Configure the database" => "தரவுத்தளத்தை தகவமைக்க",
-"will be used" => "பயன்படுத்தப்படும்",
"Database user" => "தரவுத்தள பயனாளர்",
"Database password" => "தரவுத்தள கடவுச்சொல்",
"Database name" => "தரவுத்தள பெயர்",
diff --git a/core/l10n/th_TH.php b/core/l10n/th_TH.php
index 21bc6a7067e6da0bb4b6474100d35328eee542b1..7b7396b7ab24c774dc498c08a46f81d25508efc4 100644
--- a/core/l10n/th_TH.php
+++ b/core/l10n/th_TH.php
@@ -94,7 +94,6 @@ $TRANSLATIONS = array(
"Password" => "รหัสผ่าน",
"Data folder" => "โฟลเดอร์เก็บข้อมูล",
"Configure the database" => "กำหนดค่าฐานข้อมูล",
-"will be used" => "จะถูกใช้",
"Database user" => "ชื่อผู้ใช้งานฐานข้อมูล",
"Database password" => "รหัสผ่านฐานข้อมูล",
"Database name" => "ชื่อฐานข้อมูล",
diff --git a/core/l10n/tr.php b/core/l10n/tr.php
index 0ccc009ef71bbd805224d9883aa2f351c88f3383..cf94b52dec065d15beb2753c1626099f16bfefa2 100644
--- a/core/l10n/tr.php
+++ b/core/l10n/tr.php
@@ -158,12 +158,13 @@ $TRANSLATIONS = array(
"Storage & database" => "Depolama ve veritabanı",
"Data folder" => "Veri klasörü",
"Configure the database" => "Veritabanını yapılandır",
-"will be used" => "kullanılacak",
+"Only %s is available." => "Sadece %s kullanılabilir.",
"Database user" => "Veritabanı kullanıcı adı",
"Database password" => "Veritabanı parolası",
"Database name" => "Veritabanı adı",
"Database tablespace" => "Veritabanı tablo alanı",
"Database host" => "Veritabanı sunucusu",
+"SQLite will be used as database. For larger installations we recommend to change this." => "Veritabanı olarak SQLite kullanılacak. Daha büyük kurulumlar için bunu değiştirmenizi öneririz.",
"Finish setup" => "Kurulumu tamamla",
"Finishing …" => "Tamamlanıyor ...",
"This application requires JavaScript to be enabled for correct operation. Please enable JavaScript and re-load this interface." => "Uygulama, doğru çalışabilmesi için JavaScript'in etkinleştirilmesini gerektiriyor. Lütfen JavaScript'i etkinleştirin ve bu arayüzü yeniden yükleyin.",
diff --git a/core/l10n/uk.php b/core/l10n/uk.php
index 490140940cf272ea7b35d929aa6b2108a048bc55..d3017f35a2da460707a4078f254c0b9695671a29 100644
--- a/core/l10n/uk.php
+++ b/core/l10n/uk.php
@@ -147,7 +147,6 @@ $TRANSLATIONS = array(
"Password" => "Пароль",
"Data folder" => "Каталог даних",
"Configure the database" => "Налаштування бази даних",
-"will be used" => "буде використано",
"Database user" => "Користувач бази даних",
"Database password" => "Пароль для бази даних",
"Database name" => "Назва бази даних",
diff --git a/core/l10n/ur_PK.php b/core/l10n/ur_PK.php
index cdec1ace28868d6b569e1c3837cfb70a0aada101..25b80daf777d056705f5a632a1ede51d3eec287b 100644
--- a/core/l10n/ur_PK.php
+++ b/core/l10n/ur_PK.php
@@ -132,7 +132,6 @@ $TRANSLATIONS = array(
"Storage & database" => "ذخیرہ اور ڈیٹا بیس",
"Data folder" => "ڈیٹا فولڈر",
"Configure the database" => "ڈیٹا بیس کونفگر کریں",
-"will be used" => "استعمال ہو گا",
"Database user" => "ڈیٹابیس یوزر",
"Database password" => "ڈیٹابیس پاسورڈ",
"Database name" => "ڈیٹابیس کا نام",
diff --git a/core/l10n/vi.php b/core/l10n/vi.php
index fc00a5573e43413ba8b08809483d63006189d4b9..7aca8549fad3906cfed59b661e45637f99531792 100644
--- a/core/l10n/vi.php
+++ b/core/l10n/vi.php
@@ -139,7 +139,6 @@ $TRANSLATIONS = array(
"Password" => "Mật khẩu",
"Data folder" => "Thư mục dữ liệu",
"Configure the database" => "Cấu hình cơ sở dữ liệu",
-"will be used" => "được sử dụng",
"Database user" => "Người dùng cơ sở dữ liệu",
"Database password" => "Mật khẩu cơ sở dữ liệu",
"Database name" => "Tên cơ sở dữ liệu",
diff --git a/core/l10n/zh_CN.php b/core/l10n/zh_CN.php
index f7ea54359cff4bb08a6d3c980de813e9909ee3bc..d30dc0f0fbd56132fd0c3fbdec3d54e97fbd998a 100644
--- a/core/l10n/zh_CN.php
+++ b/core/l10n/zh_CN.php
@@ -155,7 +155,6 @@ $TRANSLATIONS = array(
"Storage & database" => "存储 & 数据库",
"Data folder" => "数据目录",
"Configure the database" => "配置数据库",
-"will be used" => "将被使用",
"Database user" => "数据库用户",
"Database password" => "数据库密码",
"Database name" => "数据库名",
diff --git a/core/l10n/zh_HK.php b/core/l10n/zh_HK.php
index e47d3a8d4008c6ca0b2ffc332c8c857eefa5ee55..8b210e68851690bd9a5ec596eb1a964d9886a04d 100644
--- a/core/l10n/zh_HK.php
+++ b/core/l10n/zh_HK.php
@@ -73,7 +73,6 @@ $TRANSLATIONS = array(
"Create an admin account " => "建立管理員帳戶",
"Password" => "密碼",
"Configure the database" => "設定資料庫",
-"will be used" => "將被使用",
"Database user" => "資料庫帳戶",
"Database password" => "資料庫密碼",
"Database name" => "資料庫名稱",
diff --git a/core/l10n/zh_TW.php b/core/l10n/zh_TW.php
index 833c295679aece37e6ab0bc7e71f1fe62362b2d0..38503f2a09c9dfb547022e45bbc76da270f512bc 100644
--- a/core/l10n/zh_TW.php
+++ b/core/l10n/zh_TW.php
@@ -143,7 +143,6 @@ $TRANSLATIONS = array(
"Password" => "密碼",
"Data folder" => "資料儲存位置",
"Configure the database" => "設定資料庫",
-"will be used" => "將會使用",
"Database user" => "資料庫使用者",
"Database password" => "資料庫密碼",
"Database name" => "資料庫名稱",
diff --git a/core/lostpassword/templates/lostpassword.php b/core/lostpassword/templates/lostpassword.php
index d0fed38ee27de672207f5fb9623615f642d30510..fdfa32344ec4eb61a9b2defb1cd2af974e953739 100644
--- a/core/lostpassword/templates/lostpassword.php
+++ b/core/lostpassword/templates/lostpassword.php
@@ -16,8 +16,10 @@ OCP\Util::addStyle('lostpassword', 'lostpassword');
t('You will receive a link to reset your password via Email.')); ?>
-
-
+
+
t( 'Username' )); ?>
diff --git a/core/lostpassword/templates/resetpassword.php b/core/lostpassword/templates/resetpassword.php
index 881455f5a9dd535741f385e7d5b057a8128549b6..11dce9f112bd15d9b5ad183a270114aa42f59c97 100644
--- a/core/lostpassword/templates/resetpassword.php
+++ b/core/lostpassword/templates/resetpassword.php
@@ -4,9 +4,11 @@
t('Your password was reset')); ?>
t('To login page')); ?>
-
+
t('New password')); ?>
-
+
diff --git a/core/templates/installation.php b/core/templates/installation.php
index 709207e79772491edcdbee50bae31ae2a4439abb..f934e3a86c26d63c74359708185ac57232fbb513 100644
--- a/core/templates/installation.php
+++ b/core/templates/installation.php
@@ -46,15 +46,17 @@
t( 'Create an admin account ' )); ?>
-
-
+
t( 'Username' )); ?>
-
-
+
t( 'Password' )); ?>
@@ -91,7 +93,7 @@
$label): ?>
-
t( 'will be used' )); ?>.
+
t( 'Only %s is available.', array($label) )); ?>.
-
+
t( 'Database user' )); ?>
-
-
-
+
t( 'Database password' )); ?>
-
+
t( 'Database name' )); ?>
-
-
+
t( 'Database tablespace' )); ?>
-
-
+
t( 'Database host' )); ?>
-
@@ -147,5 +154,7 @@
+
t('SQLite will be used as database. For larger installations we recommend to change this.'));?>
+
diff --git a/core/templates/layout.base.php b/core/templates/layout.base.php
index c519388fa3b20ee767dc5b8257803318871d227e..b99f603fe0bc99f9ebf74151ac671d217f747edd 100644
--- a/core/templates/layout.base.php
+++ b/core/templates/layout.base.php
@@ -1,10 +1,10 @@
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/core/templates/layout.guest.php b/core/templates/layout.guest.php
index d38dc24d9ce034c53f4a6a784a8e4106b16ad186..c4b69a950a0e983839a0412db417803b490f9b43 100644
--- a/core/templates/layout.guest.php
+++ b/core/templates/layout.guest.php
@@ -1,10 +1,10 @@
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php
index b0ae8637accaa97df3d66b4634bceb3fdcffb56b..e39bb94ed98750463c12eaf7e526e46bb5057eda 100644
--- a/core/templates/layout.user.php
+++ b/core/templates/layout.user.php
@@ -1,10 +1,10 @@
-
-
-
-
-
-
+
+
+
+
+
+
@@ -46,7 +46,13 @@