merge master into filecache_mtime
This commit is contained in:
commit
2ed850e05b
764 changed files with 58955 additions and 14085 deletions
|
@ -25,7 +25,7 @@
|
|||
|
||||
#trash { height:17px; margin: 0 1em; z-index:1010; float: right; }
|
||||
|
||||
#upload {
|
||||
#upload {
|
||||
height:27px; padding:0; margin-left:0.2em; overflow:hidden;
|
||||
}
|
||||
#upload a {
|
||||
|
@ -74,8 +74,9 @@ table th#headerDate, table td.date { min-width:11em; padding:0 .1em 0 1em; text-
|
|||
|
||||
/* Multiselect bar */
|
||||
table.multiselect { top:63px; }
|
||||
table.multiselect thead { position:fixed; top:82px; z-index:1; }
|
||||
table.multiselect thead { position:fixed; top:82px; z-index:1; -moz-box-sizing: border-box; box-sizing: border-box; left: 0; padding-left: 64px; width:100%; }
|
||||
table.multiselect thead th { background:rgba(230,230,230,.8); color:#000; font-weight:bold; border-bottom:0; }
|
||||
table.multiselect #headerName { width: 100%; }
|
||||
table td.selection, table th.selection, table td.fileaction { width:2em; text-align:center; }
|
||||
table td.filename a.name { display:block; height:1.5em; vertical-align:middle; margin-left:3em; }
|
||||
table tr[data-type="dir"] td.filename a.name span.nametext {font-weight:bold; }
|
||||
|
@ -86,9 +87,14 @@ table td.filename .nametext, .uploadtext, .modified { float:left; padding:.3em 0
|
|||
table td.filename .nametext { overflow:hidden; text-overflow:ellipsis; }
|
||||
table td.filename .uploadtext { font-weight:normal; margin-left:.5em; }
|
||||
table td.filename form { font-size:.85em; margin-left:3em; margin-right:3em; }
|
||||
|
||||
/* File checkboxes */
|
||||
#fileList tr td.filename>input[type="checkbox"]:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; float:left; margin:.7em 0 0 1em; /* bigger clickable area doesn’t work in FF width:2.8em; height:2.4em;*/ -webkit-transition:opacity 200ms; -moz-transition:opacity 200ms; -o-transition:opacity 200ms; transition:opacity 200ms; }
|
||||
#fileList tr td.filename>input[type="checkbox"]:hover:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; filter:alpha(opacity=80); opacity:.8; }
|
||||
/* Always show checkbox when selected */
|
||||
#fileList tr td.filename>input[type="checkbox"]:checked:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; }
|
||||
#fileList tr.selected td.filename>input[type="checkbox"]:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; }
|
||||
|
||||
#fileList tr td.filename {
|
||||
position:relative; width:100%;
|
||||
-webkit-transition:background-image 500ms; -moz-transition:background-image 500ms; -o-transition:background-image 500ms; transition:background-image 500ms;
|
||||
|
|
|
@ -81,7 +81,7 @@ var FileActions = {
|
|||
event.data.actionFunc(file);
|
||||
};
|
||||
|
||||
$.each(actions, function (name, action) {
|
||||
var addAction = function (name, action) {
|
||||
// NOTE: Temporary fix to prevent rename action in root of Shared directory
|
||||
if (name === 'Rename' && $('#dir').val() === '/Shared') {
|
||||
return true;
|
||||
|
@ -92,7 +92,7 @@ var FileActions = {
|
|||
if (img.call) {
|
||||
img = img(file);
|
||||
}
|
||||
var html = '<a href="#" class="action" data-action="'+name+'">';
|
||||
var html = '<a href="#" class="action" data-action="' + name + '">';
|
||||
if (img) {
|
||||
html += '<img class ="svg" src="' + img + '" /> ';
|
||||
}
|
||||
|
@ -101,18 +101,27 @@ var FileActions = {
|
|||
var element = $(html);
|
||||
element.data('action', name);
|
||||
//alert(element);
|
||||
element.on('click',{a:null, elem:parent, actionFunc:actions[name]},actionHandler);
|
||||
element.on('click', {a: null, elem: parent, actionFunc: actions[name]}, actionHandler);
|
||||
parent.find('a.name>span.fileactions').append(element);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
$.each(actions, function (name, action) {
|
||||
if (name !== 'Share') {
|
||||
addAction(name, action);
|
||||
}
|
||||
});
|
||||
if(actions.Share){
|
||||
addAction('Share', actions.Share);
|
||||
}
|
||||
|
||||
if (actions['Delete']) {
|
||||
var img = FileActions.icons['Delete'];
|
||||
if (img.call) {
|
||||
img = img(file);
|
||||
}
|
||||
if (typeof trashBinApp !== 'undefined' && trashBinApp) {
|
||||
if (typeof trashBinApp !== 'undefined' && trashBinApp) {
|
||||
var html = '<a href="#" original-title="' + t('files', 'Delete permanently') + '" class="action delete" />';
|
||||
} else {
|
||||
var html = '<a href="#" original-title="' + t('files', 'Delete') + '" class="action delete" />';
|
||||
|
@ -122,7 +131,7 @@ var FileActions = {
|
|||
element.append($('<img class ="svg" src="' + img + '"/>'));
|
||||
}
|
||||
element.data('action', actions['Delete']);
|
||||
element.on('click',{a:null, elem:parent, actionFunc:actions['Delete']},actionHandler);
|
||||
element.on('click', {a: null, elem: parent, actionFunc: actions['Delete']}, actionHandler);
|
||||
parent.parent().children().last().append(element);
|
||||
}
|
||||
},
|
||||
|
@ -146,7 +155,7 @@ $(document).ready(function () {
|
|||
} else {
|
||||
var downloadScope = 'file';
|
||||
}
|
||||
|
||||
|
||||
if (typeof disableDownloadActions == 'undefined' || !disableDownloadActions) {
|
||||
FileActions.register(downloadScope, 'Download', OC.PERMISSION_READ, function () {
|
||||
return OC.imagePath('core', 'actions/download');
|
||||
|
@ -154,11 +163,11 @@ $(document).ready(function () {
|
|||
window.location = OC.filePath('files', 'ajax', 'download.php') + '?files=' + encodeURIComponent(filename) + '&dir=' + encodeURIComponent($('#dir').val());
|
||||
});
|
||||
}
|
||||
|
||||
$('#fileList tr').each(function(){
|
||||
|
||||
$('#fileList tr').each(function () {
|
||||
FileActions.display($(this).children('td.filename'));
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
FileActions.register('all', 'Delete', OC.PERMISSION_DELETE, function () {
|
||||
|
|
|
@ -685,9 +685,10 @@ $(document).ready(function() {
|
|||
breadcrumbsWidth += $(breadcrumb).get(0).offsetWidth;
|
||||
});
|
||||
|
||||
if ($('#controls .actions').length > 0) {
|
||||
breadcrumbsWidth += $('#controls .actions').get(0).offsetWidth;
|
||||
}
|
||||
|
||||
$.each($('#controls .actions>div'), function(index, action) {
|
||||
breadcrumbsWidth += $(action).get(0).offsetWidth;
|
||||
});
|
||||
|
||||
function resizeBreadcrumbs(firstRun) {
|
||||
var width = $(this).width();
|
||||
|
|
13
apps/files/js/jquery-visibility.js
vendored
13
apps/files/js/jquery-visibility.js
vendored
|
@ -3,7 +3,7 @@
|
|||
|
||||
var prefix,
|
||||
property,
|
||||
// In Opera, `'onfocusin' in document == true`, hence the extra `hasFocus` check to detect IE-like behavior
|
||||
// In Opera, `'onfocusin' in document == true`, hence the extra `hasFocus` check to detect IE-like behavior
|
||||
eventName = 'onfocusin' in document && 'hasFocus' in document ? 'focusin focusout' : 'focus blur',
|
||||
prefixes = ['', 'moz', 'ms', 'o', 'webkit'],
|
||||
$support = $.support,
|
||||
|
@ -19,12 +19,11 @@
|
|||
|
||||
$(/blur$/.test(eventName) ? window : document).on(eventName, function (event) {
|
||||
var type = event.type,
|
||||
originalEvent = event.originalEvent,
|
||||
toElement = originalEvent.toElement;
|
||||
// If it’s a `{focusin,focusout}` event (IE), `fromElement` and `toElement` should both be `null` or `undefined`;
|
||||
// else, the page visibility hasn’t changed, but the user just clicked somewhere in the doc.
|
||||
// In IE9, we need to check the `relatedTarget` property instead.
|
||||
if (!/^focus./.test(type) || (toElement == undefined && originalEvent.fromElement == undefined && originalEvent.relatedTarget == undefined)) {
|
||||
originalEvent = event.originalEvent;
|
||||
// If it’s a `{focusin,focusout}` event (IE), `fromElement` and `toElement` should both be `null` or `undefined`;
|
||||
// else, the page visibility hasn’t changed, but the user just clicked somewhere in the doc.
|
||||
// In IE9, we need to check the `relatedTarget` property instead.
|
||||
if (!/^focus./.test(type) || originalEvent == undefined || (originalEvent.toElement == undefined && originalEvent.fromElement == undefined && originalEvent.relatedTarget == undefined)) {
|
||||
$event.trigger((property && document[property] || /^(?:blur|focusout)$/.test(type) ? 'hide' : 'show') + '.visibility');
|
||||
}
|
||||
});
|
||||
|
|
|
@ -1,22 +1,32 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Missing a temporary folder" => "Липсва временна папка",
|
||||
"Failed to write to disk" => "Възникна проблем при запис в диска",
|
||||
"Invalid directory." => "Невалидна директория.",
|
||||
"Files" => "Файлове",
|
||||
"Delete" => "Изтриване",
|
||||
"Rename" => "Преименуване",
|
||||
"Pending" => "Чакащо",
|
||||
"replace" => "препокриване",
|
||||
"cancel" => "отказ",
|
||||
"undo" => "възтановяване",
|
||||
"Upload Error" => "Възникна грешка при качването",
|
||||
"Close" => "Затвори",
|
||||
"Upload cancelled." => "Качването е спряно.",
|
||||
"Name" => "Име",
|
||||
"Size" => "Размер",
|
||||
"Modified" => "Променено",
|
||||
"1 folder" => "1 папка",
|
||||
"{count} folders" => "{count} папки",
|
||||
"1 file" => "1 файл",
|
||||
"{count} files" => "{count} файла",
|
||||
"Upload" => "Качване",
|
||||
"Maximum upload size" => "Максимален размер за качване",
|
||||
"0 is unlimited" => "Ползвайте 0 за без ограничения",
|
||||
"Save" => "Запис",
|
||||
"New" => "Ново",
|
||||
"Text file" => "Текстов файл",
|
||||
"Folder" => "Папка",
|
||||
"Cancel upload" => "Спри качването",
|
||||
"Nothing in here. Upload something!" => "Няма нищо тук. Качете нещо.",
|
||||
"Download" => "Изтегляне",
|
||||
"Upload too large" => "Файлът който сте избрали за качване е прекалено голям"
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
"Not enough storage available" => "Der er ikke nok plads til rådlighed",
|
||||
"Invalid directory." => "Ugyldig mappe.",
|
||||
"Files" => "Filer",
|
||||
"Delete permanently" => "Slet permanent",
|
||||
"Delete" => "Slet",
|
||||
"Rename" => "Omdøb",
|
||||
"Pending" => "Afventer",
|
||||
|
@ -23,6 +24,7 @@
|
|||
"replaced {new_name}" => "erstattede {new_name}",
|
||||
"undo" => "fortryd",
|
||||
"replaced {new_name} with {old_name}" => "erstattede {new_name} med {old_name}",
|
||||
"perform delete operation" => "udfør slet operation",
|
||||
"'.' is an invalid file name." => "'.' er et ugyldigt filnavn.",
|
||||
"File name cannot be empty." => "Filnavnet kan ikke stå tomt.",
|
||||
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ugyldigt navn, '\\', '/', '<', '>', ':' | '?', '\"', '', og '*' er ikke tilladt.",
|
||||
|
@ -65,5 +67,6 @@
|
|||
"Upload too large" => "Upload 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.",
|
||||
"Current scanning" => "Indlæser"
|
||||
"Current scanning" => "Indlæser",
|
||||
"Upgrading filesystem cache..." => "Opgraderer filsystems cachen..."
|
||||
);
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
"Not enough storage available" => "Nicht genug Speicherplatz verfügbar",
|
||||
"Invalid directory." => "Ungültiges Verzeichnis.",
|
||||
"Files" => "Dateien",
|
||||
"Delete permanently" => "Permanent löschen",
|
||||
"Delete" => "Löschen",
|
||||
"Rename" => "Umbenennen",
|
||||
"Pending" => "Ausstehend",
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
"No file was uploaded" => "No se ha subido ningún archivo",
|
||||
"Missing a temporary folder" => "Falta un directorio temporal",
|
||||
"Failed to write to disk" => "La escritura en disco ha fallado",
|
||||
"Not enough storage available" => "No hay suficiente espacio disponible",
|
||||
"Invalid directory." => "Directorio invalido.",
|
||||
"Files" => "Archivos",
|
||||
"Delete permanently" => "Eliminar permanentemente",
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
"Not enough storage available" => "No hay suficiente capacidad de almacenamiento",
|
||||
"Invalid directory." => "Directorio invalido.",
|
||||
"Files" => "Archivos",
|
||||
"Delete permanently" => "Borrar de manera permanente",
|
||||
"Delete" => "Borrar",
|
||||
"Rename" => "Cambiar nombre",
|
||||
"Pending" => "Pendiente",
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Could not move %s" => "%s liigutamine ebaõnnestus",
|
||||
"Unable to rename file" => "Faili ümbernimetamine ebaõnnestus",
|
||||
"No file was uploaded. Unknown error" => "Ühtegi faili ei laetud üles. Tundmatu viga",
|
||||
"There is no error, the file uploaded with success" => "Ühtegi viga pole, fail on üles laetud",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Üles laetud faili suurus ületab HTML vormis määratud upload_max_filesize suuruse",
|
||||
|
@ -6,7 +8,10 @@
|
|||
"No file was uploaded" => "Ühtegi faili ei laetud üles",
|
||||
"Missing a temporary folder" => "Ajutiste failide kaust puudub",
|
||||
"Failed to write to disk" => "Kettale kirjutamine ebaõnnestus",
|
||||
"Not enough storage available" => "Saadaval pole piisavalt ruumi",
|
||||
"Invalid directory." => "Vigane kaust.",
|
||||
"Files" => "Failid",
|
||||
"Delete permanently" => "Kustuta jäädavalt",
|
||||
"Delete" => "Kustuta",
|
||||
"Rename" => "ümber",
|
||||
"Pending" => "Ootel",
|
||||
|
@ -17,6 +22,8 @@
|
|||
"replaced {new_name}" => "asendatud nimega {new_name}",
|
||||
"undo" => "tagasi",
|
||||
"replaced {new_name} with {old_name}" => "asendas nime {old_name} nimega {new_name}",
|
||||
"'.' is an invalid file name." => "'.' on vigane failinimi.",
|
||||
"File name cannot be empty." => "Faili nimi ei saa olla tühi.",
|
||||
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Vigane nimi, '\\', '/', '<', '>', ':', '\"', '|', '?' ja '*' pole lubatud.",
|
||||
"Unable to upload your file as it is a directory or has 0 bytes" => "Sinu faili üleslaadimine ebaõnnestus, kuna see on kaust või selle suurus on 0 baiti",
|
||||
"Upload Error" => "Üleslaadimise viga",
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
"Not enough storage available" => "Ez dago behar aina leku erabilgarri,",
|
||||
"Invalid directory." => "Baliogabeko karpeta.",
|
||||
"Files" => "Fitxategiak",
|
||||
"Delete permanently" => "Ezabatu betirako",
|
||||
"Delete" => "Ezabatu",
|
||||
"Rename" => "Berrizendatu",
|
||||
"Pending" => "Zain",
|
||||
|
@ -23,6 +24,7 @@
|
|||
"replaced {new_name}" => "ordezkatua {new_name}",
|
||||
"undo" => "desegin",
|
||||
"replaced {new_name} with {old_name}" => " {new_name}-k {old_name} ordezkatu du",
|
||||
"perform delete operation" => "Ezabatu",
|
||||
"'.' is an invalid file name." => "'.' ez da fitxategi izen baliogarria.",
|
||||
"File name cannot be empty." => "Fitxategi izena ezin da hutsa izan.",
|
||||
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "IZen aliogabea, '\\', '/', '<', '>', ':', '\"', '|', '?' eta '*' ez daude baimenduta.",
|
||||
|
@ -65,5 +67,6 @@
|
|||
"Upload too large" => "Igotakoa 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.",
|
||||
"Current scanning" => "Orain eskaneatzen ari da"
|
||||
"Current scanning" => "Orain eskaneatzen ari da",
|
||||
"Upgrading filesystem cache..." => "Fitxategi sistemaren katxea eguneratzen..."
|
||||
);
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
"Not enough storage available" => "Tallennustilaa ei ole riittävästi käytettävissä",
|
||||
"Invalid directory." => "Virheellinen kansio.",
|
||||
"Files" => "Tiedostot",
|
||||
"Delete permanently" => "Poista pysyvästi",
|
||||
"Delete" => "Poista",
|
||||
"Rename" => "Nimeä uudelleen",
|
||||
"Pending" => "Odottaa",
|
||||
|
|
|
@ -1,19 +1,21 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Could not move %s - File with this name already exists" => "Non se moveu %s - Xa existe un ficheiro con ese nome.",
|
||||
"Could not move %s" => "Non se puido mover %s",
|
||||
"Unable to rename file" => "Non se pode renomear o ficheiro",
|
||||
"No file was uploaded. Unknown error" => "Non se subiu ningún ficheiro. Erro descoñecido.",
|
||||
"There is no error, the file uploaded with success" => "Non hai erros. O ficheiro enviouse correctamente",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "O ficheiro subido excede a directiva indicada polo tamaño_máximo_de_subida de php.ini",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "O ficheiro enviado supera a directiva MAX_FILE_SIZE que foi indicada no formulario HTML",
|
||||
"Could not move %s" => "Non foi posíbel mover %s",
|
||||
"Unable to rename file" => "Non é posíbel renomear o ficheiro",
|
||||
"No file was uploaded. Unknown error" => "Non foi enviado ningún ficheiro. Produciuse un erro descoñecido.",
|
||||
"There is no error, the file uploaded with success" => "Non se produciu ningún erro. O ficheiro enviouse correctamente",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "O ficheiro enviado excede a directiva indicada por upload_max_filesize de php.ini:",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "O ficheiro enviado excede a directiva MAX_FILE_SIZE que foi indicada no formulario HTML",
|
||||
"The uploaded file was only partially uploaded" => "O ficheiro enviado foi só parcialmente enviado",
|
||||
"No file was uploaded" => "Non se enviou ningún ficheiro",
|
||||
"Missing a temporary folder" => "Falta un cartafol temporal",
|
||||
"Failed to write to disk" => "Erro ao escribir no disco",
|
||||
"Failed to write to disk" => "Produciuse un erro ao escribir no disco",
|
||||
"Not enough storage available" => "Non hai espazo de almacenamento abondo",
|
||||
"Invalid directory." => "O directorio é incorrecto.",
|
||||
"Files" => "Ficheiros",
|
||||
"Delete permanently" => "Eliminar permanentemente",
|
||||
"Delete" => "Eliminar",
|
||||
"Rename" => "Mudar o nome",
|
||||
"Rename" => "Renomear",
|
||||
"Pending" => "Pendentes",
|
||||
"{new_name} already exists" => "xa existe un {new_name}",
|
||||
"replace" => "substituír",
|
||||
|
@ -21,19 +23,23 @@
|
|||
"cancel" => "cancelar",
|
||||
"replaced {new_name}" => "substituír {new_name}",
|
||||
"undo" => "desfacer",
|
||||
"replaced {new_name} with {old_name}" => "substituír {new_name} polo {old_name}",
|
||||
"'.' is an invalid file name." => "'.' é un nonme de ficheiro non válido",
|
||||
"File name cannot be empty." => "O nome de ficheiro non pode estar baldeiro",
|
||||
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome non válido, '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' non se permiten.",
|
||||
"Unable to upload your file as it is a directory or has 0 bytes" => "Non se puido subir o ficheiro pois ou é un directorio ou ten 0 bytes",
|
||||
"Upload Error" => "Erro na subida",
|
||||
"replaced {new_name} with {old_name}" => "substituír {new_name} por {old_name}",
|
||||
"perform delete operation" => "realizar a operación de eliminación",
|
||||
"'.' is an invalid file name." => "«.» é un nome de ficheiro incorrecto",
|
||||
"File name cannot be empty." => "O nome de ficheiro non pode estar baleiro",
|
||||
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome incorrecto, non se permite «\\», «/», «<», «>», «:», «\"», «|», «?» e «*».",
|
||||
"Your storage is full, files can not be updated or synced anymore!" => "O seu espazo de almacenamento está cheo, non é posíbel actualizar ou sincronizar máis os ficheiros!",
|
||||
"Your storage is almost full ({usedSpacePercent}%)" => "O seu espazo de almacenamento está case cheo ({usedSpacePercent}%)",
|
||||
"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.",
|
||||
"Unable to upload your file as it is a directory or has 0 bytes" => "Non foi posíbel enviar o ficheiro pois ou é un directorio ou ten 0 bytes",
|
||||
"Upload Error" => "Produciuse un erro no envío",
|
||||
"Close" => "Pechar",
|
||||
"1 file uploading" => "1 ficheiro subíndose",
|
||||
"{count} files uploading" => "{count} ficheiros subíndose",
|
||||
"Upload cancelled." => "Subida cancelada.",
|
||||
"File upload is in progress. Leaving the page now will cancel the upload." => "A subida do ficheiro está en curso. Saír agora da páxina cancelará a subida.",
|
||||
"URL cannot be empty." => "URL non pode quedar baleiro.",
|
||||
"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Nome de cartafol non válido. O uso de 'Shared' está reservado por Owncloud",
|
||||
"1 file uploading" => "Enviándose 1 ficheiro",
|
||||
"{count} files uploading" => "Enviandose {count} ficheiros",
|
||||
"Upload cancelled." => "Envío cancelado.",
|
||||
"File upload is in progress. Leaving the page now will cancel the upload." => "O envío do ficheiro está en proceso. Saír agora da páxina cancelará o envío.",
|
||||
"URL cannot be empty." => "O URL non pode quedar baleiro.",
|
||||
"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Nome de cartafol incorrecto. O uso de «Shared» está reservado por Owncloud",
|
||||
"Name" => "Nome",
|
||||
"Size" => "Tamaño",
|
||||
"Modified" => "Modificado",
|
||||
|
@ -43,23 +49,24 @@
|
|||
"{count} files" => "{count} ficheiros",
|
||||
"Upload" => "Enviar",
|
||||
"File handling" => "Manexo de ficheiro",
|
||||
"Maximum upload size" => "Tamaño máximo de envío",
|
||||
"max. possible: " => "máx. posible: ",
|
||||
"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" => "Habilitar a descarga-ZIP",
|
||||
"0 is unlimited" => "0 significa ilimitado",
|
||||
"Maximum input size for ZIP files" => "Tamaño máximo de descarga para os ZIP",
|
||||
"Maximum input size for ZIP files" => "Tamaño máximo de descarga para os ficheiros ZIP",
|
||||
"Save" => "Gardar",
|
||||
"New" => "Novo",
|
||||
"Text file" => "Ficheiro de texto",
|
||||
"Folder" => "Cartafol",
|
||||
"From link" => "Dende a ligazón",
|
||||
"Cancel upload" => "Cancelar a subida",
|
||||
"Nothing in here. Upload something!" => "Nada por aquí. Envía algo.",
|
||||
"From link" => "Desde a ligazón",
|
||||
"Cancel upload" => "Cancelar o envío",
|
||||
"Nothing in here. Upload something!" => "Aquí non hai nada por aquí. Envíe algo.",
|
||||
"Download" => "Descargar",
|
||||
"Unshare" => "Deixar de compartir",
|
||||
"Upload too large" => "Envío demasiado grande",
|
||||
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os ficheiros que trata de subir superan o tamaño máximo permitido neste servidor",
|
||||
"Files are being scanned, please wait." => "Estanse analizando os ficheiros. Agarda.",
|
||||
"Current scanning" => "Análise actual"
|
||||
"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.",
|
||||
"Current scanning" => "Análise actual",
|
||||
"Upgrading filesystem cache..." => "Anovando a caché do sistema de ficheiros..."
|
||||
);
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
"Not enough storage available" => "Nincs elég szabad hely.",
|
||||
"Invalid directory." => "Érvénytelen mappa.",
|
||||
"Files" => "Fájlok",
|
||||
"Delete permanently" => "Végleges törlés",
|
||||
"Delete" => "Törlés",
|
||||
"Rename" => "Átnevezés",
|
||||
"Pending" => "Folyamatban",
|
||||
|
@ -23,6 +24,7 @@
|
|||
"replaced {new_name}" => "a(z) {new_name} állományt kicseréltük",
|
||||
"undo" => "visszavonás",
|
||||
"replaced {new_name} with {old_name}" => "{new_name} fájlt kicseréltük ezzel: {old_name}",
|
||||
"perform delete operation" => "a törlés végrehajtása",
|
||||
"'.' is an invalid file name." => "'.' fájlnév érvénytelen.",
|
||||
"File name cannot be empty." => "A fájlnév nem lehet semmi.",
|
||||
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Érvénytelen elnevezés. Ezek a karakterek nem használhatók: '\\', '/', '<', '>', ':', '\"', '|', '?' és '*'",
|
||||
|
@ -65,5 +67,6 @@
|
|||
"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!",
|
||||
"Current scanning" => "Ellenőrzés alatt"
|
||||
"Current scanning" => "Ellenőrzés alatt",
|
||||
"Upgrading filesystem cache..." => "A fájlrendszer gyorsítótárának frissítése zajlik..."
|
||||
);
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Could not move %s - File with this name already exists" => "Nevarēja pārvietot %s — jau eksistē datne ar tādu nosaukumu",
|
||||
"Could not move %s" => "Nevarēja pārvietot %s",
|
||||
"Unable to rename file" => "Nevarēja pārsaukt datni",
|
||||
"No file was uploaded. Unknown error" => "Netika augšupielādēta neviena datne. Nezināma kļūda",
|
||||
"There is no error, the file uploaded with success" => "Augšupielāde pabeigta bez kļūdām",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Augšupielādētā datne pārsniedz upload_max_filesize norādījumu php.ini datnē:",
|
||||
|
@ -7,6 +10,7 @@
|
|||
"No file was uploaded" => "Neviena datne netika augšupielādēta",
|
||||
"Missing a temporary folder" => "Trūkst pagaidu mapes",
|
||||
"Failed to write to disk" => "Neizdevās saglabāt diskā",
|
||||
"Not enough storage available" => "Nav pietiekami daudz vietas",
|
||||
"Invalid directory." => "Nederīga direktorija.",
|
||||
"Files" => "Datnes",
|
||||
"Delete permanently" => "Dzēst pavisam",
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
"No file was uploaded" => "Geen bestand geüpload",
|
||||
"Missing a temporary folder" => "Een tijdelijke map mist",
|
||||
"Failed to write to disk" => "Schrijven naar schijf mislukt",
|
||||
"Not enough storage available" => "Niet genoeg opslagruimte beschikbaar",
|
||||
"Invalid directory." => "Ongeldige directory.",
|
||||
"Files" => "Bestanden",
|
||||
"Delete permanently" => "Verwijder definitief",
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
"Not enough storage available" => "Espaço de armazenamento insuficiente",
|
||||
"Invalid directory." => "Diretório inválido.",
|
||||
"Files" => "Arquivos",
|
||||
"Delete permanently" => "Excluir permanentemente",
|
||||
"Delete" => "Excluir",
|
||||
"Rename" => "Renomear",
|
||||
"Pending" => "Pendente",
|
||||
|
@ -23,9 +24,12 @@
|
|||
"replaced {new_name}" => "substituído {new_name}",
|
||||
"undo" => "desfazer",
|
||||
"replaced {new_name} with {old_name}" => "Substituído {old_name} por {new_name} ",
|
||||
"perform delete operation" => "realizar operação de exclusão",
|
||||
"'.' is an invalid file name." => "'.' é um nome de arquivo inválido.",
|
||||
"File name cannot be empty." => "O nome do arquivo não pode estar vazio.",
|
||||
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome inválido, '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' não são permitidos.",
|
||||
"Your storage is full, files can not be updated or synced anymore!" => "Seu armazenamento está cheio, arquivos não serão mais atualizados nem sincronizados!",
|
||||
"Your storage is almost full ({usedSpacePercent}%)" => "Seu armazenamento está quase cheio ({usedSpacePercent}%)",
|
||||
"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.",
|
||||
"Unable to upload your file as it is a directory or has 0 bytes" => "Impossível enviar seus arquivo como diretório ou ele tem 0 bytes.",
|
||||
"Upload Error" => "Erro de envio",
|
||||
|
@ -63,5 +67,6 @@
|
|||
"Upload too large" => "Arquivo 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.",
|
||||
"Current scanning" => "Scanning atual"
|
||||
"Current scanning" => "Scanning atual",
|
||||
"Upgrading filesystem cache..." => "Aprimorando cache do sistema de arquivos..."
|
||||
);
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Could not move %s - File with this name already exists" => "Неполучается перенести %s - Файл с таким именем уже существует",
|
||||
"Could not move %s" => "Неполучается перенести %s ",
|
||||
"Unable to rename file" => "Невозможно переименовать файл",
|
||||
"No file was uploaded. Unknown error" => "Файл не был загружен. Неизвестная ошибка",
|
||||
"There is no error, the file uploaded with success" => "Ошибка отсутствует, файл загружен успешно.",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "Размер загружаемого файла превышает upload_max_filesize директиву в php.ini:",
|
||||
|
@ -7,6 +10,7 @@
|
|||
"No file was uploaded" => "Файл не был загружен",
|
||||
"Missing a temporary folder" => "Отсутствует временная папка",
|
||||
"Failed to write to disk" => "Не удалось записать на диск",
|
||||
"Not enough storage available" => "Недостаточно места в хранилище",
|
||||
"Invalid directory." => "Неверный каталог.",
|
||||
"Files" => "Файлы",
|
||||
"Delete permanently" => "Удалить навсегда",
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
"Missing a temporary folder" => "Chýbajúci dočasný priečinok",
|
||||
"Failed to write to disk" => "Zápis na disk sa nepodaril",
|
||||
"Not enough storage available" => "Nedostatok dostupného úložného priestoru",
|
||||
"Invalid directory." => "Neplatný adresár",
|
||||
"Invalid directory." => "Neplatný priečinok",
|
||||
"Files" => "Súbory",
|
||||
"Delete permanently" => "Zmazať trvalo",
|
||||
"Delete" => "Odstrániť",
|
||||
|
@ -39,7 +39,7 @@
|
|||
"Upload cancelled." => "Odosielanie zrušené",
|
||||
"File upload is in progress. Leaving the page now will cancel the upload." => "Opustenie stránky zruší práve prebiehajúce odosielanie súboru.",
|
||||
"URL cannot be empty." => "URL nemôže byť prázdne",
|
||||
"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Neplatné meno adresára. Používanie mena 'Shared' je vyhradené len pre Owncloud",
|
||||
"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Neplatné meno priečinka. Používanie mena 'Shared' je vyhradené len pre Owncloud",
|
||||
"Name" => "Meno",
|
||||
"Size" => "Veľkosť",
|
||||
"Modified" => "Upravené",
|
||||
|
@ -48,10 +48,10 @@
|
|||
"1 file" => "1 súbor",
|
||||
"{count} files" => "{count} súborov",
|
||||
"Upload" => "Odoslať",
|
||||
"File handling" => "Nastavenie správanie k súborom",
|
||||
"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 adresárov.",
|
||||
"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",
|
||||
|
@ -67,6 +67,6 @@
|
|||
"Upload too large" => "Odosielaný súbor 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é.",
|
||||
"Current scanning" => "Práve prehliadané",
|
||||
"Current scanning" => "Práve prezerané",
|
||||
"Upgrading filesystem cache..." => "Aktualizujem medzipamäť súborového systému..."
|
||||
);
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
"Not enough storage available" => "Inte tillräckligt med lagringsutrymme tillgängligt",
|
||||
"Invalid directory." => "Felaktig mapp.",
|
||||
"Files" => "Filer",
|
||||
"Delete permanently" => "Radera permanent",
|
||||
"Delete" => "Radera",
|
||||
"Rename" => "Byt namn",
|
||||
"Pending" => "Väntar",
|
||||
|
|
|
@ -10,8 +10,10 @@
|
|||
"No file was uploaded" => "無已上傳檔案",
|
||||
"Missing a temporary folder" => "遺失暫存資料夾",
|
||||
"Failed to write to disk" => "寫入硬碟失敗",
|
||||
"Not enough storage available" => "儲存空間不足",
|
||||
"Invalid directory." => "無效的資料夾。",
|
||||
"Files" => "檔案",
|
||||
"Delete permanently" => "永久刪除",
|
||||
"Delete" => "刪除",
|
||||
"Rename" => "重新命名",
|
||||
"Pending" => "等候中",
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
</div>
|
||||
<?php if ($_['trash'] ): ?>
|
||||
<div id="trash" class="button">
|
||||
<a><?php echo $l->t('Trash bin');?></a>
|
||||
<a><?php echo $l->t('Deleted files');?></a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div id="uploadprogresswrapper">
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php if(count($_["breadcrumb"])):?>
|
||||
<div class="crumb">
|
||||
<a href="<?php echo $_['baseURL']; ?>">
|
||||
<img src="<?php echo OCP\image_path('core','places/home.svg');?>" />
|
||||
<img src="<?php echo OCP\image_path('core', 'places/home.svg');?>" class="svg" />
|
||||
</a>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
|
|
|
@ -12,7 +12,7 @@ OC_FileProxy::register( new OCA\Encryption\Proxy() );
|
|||
|
||||
// User-related hooks
|
||||
OCP\Util::connectHook( 'OC_User', 'post_login', 'OCA\Encryption\Hooks', 'login' );
|
||||
OCP\Util::connectHook( 'OC_User', 'pre_setPassword','OCA\Encryption\Hooks', 'setPassphrase' );
|
||||
OCP\Util::connectHook( 'OC_User', 'pre_setPassword', 'OCA\Encryption\Hooks', 'setPassphrase' );
|
||||
|
||||
// Sharing-related hooks
|
||||
OCP\Util::connectHook( 'OCP\Share', 'post_shared', 'OCA\Encryption\Hooks', 'postShared' );
|
||||
|
|
|
@ -40,7 +40,7 @@ class Hooks {
|
|||
|
||||
// Manually initialise Filesystem{} singleton with correct
|
||||
// fake root path, in order to avoid fatal webdav errors
|
||||
\OC\Files\Filesystem::init( $params['uid'] . '/' . 'files' . '/' );
|
||||
\OC\Files\Filesystem::init( $params['uid'], $params['uid'] . '/' . 'files' . '/' );
|
||||
|
||||
$view = new \OC_FilesystemView( '/' );
|
||||
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Encryption" => "Kryptering",
|
||||
"File encryption is enabled." => "Fil kryptering aktiveret.",
|
||||
"The following file types will not be encrypted:" => "De følgende filtyper vil ikke blive krypteret:",
|
||||
"Exclude the following file types from encryption:" => "Ekskluder de følgende fil typer fra kryptering:",
|
||||
"None" => "Ingen"
|
||||
);
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Encryption" => "Verschlüsselung",
|
||||
"File encryption is enabled." => "Dateiverschlüsselung ist aktiviert",
|
||||
"The following file types will not be encrypted:" => "Die folgenden Dateitypen werden nicht verschlüsselt:",
|
||||
"Exclude the following file types from encryption:" => "Schließe die folgenden Dateitypen von der Verschlüsselung aus:",
|
||||
"None" => "Keine"
|
||||
);
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Encryption" => "Encriptación",
|
||||
"File encryption is enabled." => "La encriptación de archivos no está habilitada",
|
||||
"The following file types will not be encrypted:" => "Los siguientes tipos de archivos no serán encriptados",
|
||||
"Exclude the following file types from encryption:" => "Excluir los siguientes tipos de archivos de encriptación:",
|
||||
"None" => "Ninguno"
|
||||
);
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Encryption" => "Krüpteerimine",
|
||||
"File encryption is enabled." => "Faili krüpteerimine on sisse lülitatud.",
|
||||
"The following file types will not be encrypted:" => "Järgnevaid failitüüpe ei krüpteerita:",
|
||||
"Exclude the following file types from encryption:" => "Järgnevaid failitüüpe ei krüpteerita:",
|
||||
"None" => "Pole"
|
||||
);
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Encryption" => "Enkriptazioa",
|
||||
"File encryption is enabled." => "Fitxategien enkriptazioa gaituta dago.",
|
||||
"The following file types will not be encrypted:" => "Hurrengo fitxategi motak ez dira enkriptatuko:",
|
||||
"Exclude the following file types from encryption:" => "Baztertu hurrengo fitxategi motak enkriptatzetik:",
|
||||
"None" => "Bat ere ez"
|
||||
);
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Encryption" => "Salaus",
|
||||
"File encryption is enabled." => "Tiedostojen salaus on käytössä.",
|
||||
"The following file types will not be encrypted:" => "Seuraavia tiedostotyyppejä ei salata:",
|
||||
"Exclude the following file types from encryption:" => "Älä salaa seuravia tiedostotyyppejä:",
|
||||
"None" => "Ei mitään"
|
||||
);
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Encryption" => "Cifrado",
|
||||
"None" => "Nada"
|
||||
"File encryption is enabled." => "O cifrado de ficheiros está activado",
|
||||
"The following file types will not be encrypted:" => "Os seguintes tipos de ficheiros non van seren cifrados:",
|
||||
"Exclude the following file types from encryption:" => "Excluír os seguintes tipos de ficheiros do cifrado:",
|
||||
"None" => "Ningún"
|
||||
);
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Encryption" => "Titkosítás",
|
||||
"File encryption is enabled." => "Az állományok titkosítása be van kapcsolva.",
|
||||
"The following file types will not be encrypted:" => "A következő fájltípusok nem kerülnek titkosításra:",
|
||||
"Exclude the following file types from encryption:" => "Zárjuk ki a titkosításból a következő fájltípusokat:",
|
||||
"None" => "Egyik sem"
|
||||
);
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Encryption" => "Szyfrowanie",
|
||||
"File encryption is enabled." => "Szyfrowanie plików jest włączone",
|
||||
"The following file types will not be encrypted:" => "Poniższe typy plików nie będą szyfrowane:",
|
||||
"Exclude the following file types from encryption:" => "Wyłącz poniższe typy plików z szyfrowania:",
|
||||
"None" => "Brak"
|
||||
);
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Encryption" => "Criptografia",
|
||||
"File encryption is enabled." => "A criptografia de arquivos está ativada.",
|
||||
"The following file types will not be encrypted:" => "Os seguintes tipos de arquivo não serão criptografados:",
|
||||
"Exclude the following file types from encryption:" => "Excluir os seguintes tipos de arquivo da criptografia:",
|
||||
"None" => "Nenhuma"
|
||||
);
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Encryption" => "Encriptação",
|
||||
"File encryption is enabled." => "A encriptação de ficheiros está ligada",
|
||||
"The following file types will not be encrypted:" => "Os seguintes ficheiros não serão encriptados:",
|
||||
"Exclude the following file types from encryption:" => "Excluir da encriptação os seguintes tipos de ficheiro:",
|
||||
"None" => "Nenhum"
|
||||
);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Encryption" => "Šifrovanie",
|
||||
"File encryption is enabled." => "Kryptovanie súborov nastavené.",
|
||||
"The following file types will not be encrypted:" => "Uvedené typy súborov nebudú kryptované:",
|
||||
"Exclude the following file types from encryption:" => "Nekryptovať uvedené typy súborov",
|
||||
"File encryption is enabled." => "Šifrovanie súborov nastavené.",
|
||||
"The following file types will not be encrypted:" => "Uvedené typy súborov nebudú šifrované:",
|
||||
"Exclude the following file types from encryption:" => "Nešifrovať uvedené typy súborov",
|
||||
"None" => "Žiadne"
|
||||
);
|
||||
|
|
|
@ -692,4 +692,4 @@ class Crypt {
|
|||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
3
apps/files_external/3rdparty/phpseclib/AUTHORS
vendored
Normal file
3
apps/files_external/3rdparty/phpseclib/AUTHORS
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
phpseclib Lead Developer: TerraFrost (Jim Wigginton)
|
||||
|
||||
phpseclib Developers: monnerat (Patrick Monnerat)
|
21
apps/files_external/3rdparty/phpseclib/LICENSE
vendored
Normal file
21
apps/files_external/3rdparty/phpseclib/LICENSE
vendored
Normal file
|
@ -0,0 +1,21 @@
|
|||
Copyright 2007-2012 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.
|
16
apps/files_external/3rdparty/phpseclib/README.md
vendored
Normal file
16
apps/files_external/3rdparty/phpseclib/README.md
vendored
Normal file
|
@ -0,0 +1,16 @@
|
|||
# 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, SSH-1, SSH-2, SFTP, and X.509
|
||||
|
||||
* [Download (0.3.1)](http://sourceforge.net/projects/phpseclib/files/phpseclib0.3.1.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/latest/)
|
||||
|
||||
<img src="http://phpseclib.sourceforge.net/pear-icon.png" alt="PEAR Channel" width="16" height="16">
|
||||
PEAR Channel: [phpseclib.sourceforge.net](http://phpseclib.sourceforge.net/pear.htm)
|
48
apps/files_external/3rdparty/phpseclib/composer.json
vendored
Normal file
48
apps/files_external/3rdparty/phpseclib/composer.json
vendored
Normal file
|
@ -0,0 +1,48 @@
|
|||
{
|
||||
"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",
|
||||
"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": "Developer"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.0.0"
|
||||
},
|
||||
"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/"
|
||||
}
|
||||
}
|
||||
}
|
946
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/AES.php
vendored
Normal file
946
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/AES.php
vendored
Normal file
|
@ -0,0 +1,946 @@
|
|||
<?php
|
||||
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
||||
|
||||
/**
|
||||
* Pure-PHP implementation of AES.
|
||||
*
|
||||
* Uses mcrypt, if available, and an internal implementation, otherwise.
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
*
|
||||
* If {@link Crypt_AES::setKeyLength() setKeyLength()} isn't called, it'll be calculated from
|
||||
* {@link Crypt_AES::setKey() setKey()}. ie. if the key is 128-bits, the key length will be 128-bits. If it's 136-bits
|
||||
* it'll be null-padded to 160-bits and 160 bits will be the key length until {@link Crypt_Rijndael::setKey() setKey()}
|
||||
* is called, again, at which point, it'll be recalculated.
|
||||
*
|
||||
* Since Crypt_AES extends Crypt_Rijndael, some functions are available to be called that, in the context of AES, don't
|
||||
* make a whole lot of sense. {@link Crypt_AES::setBlockLength() setBlockLength()}, for instance. Calling that function,
|
||||
* however possible, won't do anything (AES has a fixed block length whereas Rijndael has a variable one).
|
||||
*
|
||||
* Here's a short example of how to use this library:
|
||||
* <code>
|
||||
* <?php
|
||||
* include('Crypt/AES.php');
|
||||
*
|
||||
* $aes = new Crypt_AES();
|
||||
*
|
||||
* $aes->setKey('abcdefghijklmnop');
|
||||
*
|
||||
* $size = 10 * 1024;
|
||||
* $plaintext = '';
|
||||
* for ($i = 0; $i < $size; $i++) {
|
||||
* $plaintext.= 'a';
|
||||
* }
|
||||
*
|
||||
* echo $aes->decrypt($aes->encrypt($plaintext));
|
||||
* ?>
|
||||
* </code>
|
||||
*
|
||||
* 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 <terrafrost@php.net>
|
||||
* @copyright MMVIII Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @version $Id: AES.php,v 1.7 2010/02/09 06:10:25 terrafrost Exp $
|
||||
* @link http://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
/**
|
||||
* Include Crypt_Rijndael
|
||||
*/
|
||||
if (!class_exists('Crypt_Rijndael')) {
|
||||
require_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', -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_AES_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_AES_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_AES_MODE_CFB', 3);
|
||||
/**
|
||||
* 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', 4);
|
||||
/**#@-*/
|
||||
|
||||
/**#@+
|
||||
* @access private
|
||||
* @see Crypt_AES::Crypt_AES()
|
||||
*/
|
||||
/**
|
||||
* Toggles the internal implementation
|
||||
*/
|
||||
define('CRYPT_AES_MODE_INTERNAL', 1);
|
||||
/**
|
||||
* Toggles the mcrypt implementation
|
||||
*/
|
||||
define('CRYPT_AES_MODE_MCRYPT', 2);
|
||||
/**#@-*/
|
||||
|
||||
/**
|
||||
* Pure-PHP implementation of AES.
|
||||
*
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @version 0.1.0
|
||||
* @access public
|
||||
* @package Crypt_AES
|
||||
*/
|
||||
class Crypt_AES extends Crypt_Rijndael {
|
||||
/**
|
||||
* 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_AES::encrypt()
|
||||
* @var String
|
||||
* @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_AES::decrypt()
|
||||
* @var String
|
||||
* @access private
|
||||
*/
|
||||
var $demcrypt;
|
||||
|
||||
/**
|
||||
* mcrypt resource for CFB mode
|
||||
*
|
||||
* @see Crypt_AES::encrypt()
|
||||
* @see Crypt_AES::decrypt()
|
||||
* @var String
|
||||
* @access private
|
||||
*/
|
||||
var $ecb;
|
||||
|
||||
/**
|
||||
* The SubByte S-Box
|
||||
*
|
||||
* @see Crypt_AES::_encryptBlock()
|
||||
* @var Array
|
||||
* @access intern
|
||||
*/
|
||||
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_AES::_decryptBlock()
|
||||
* @var Array
|
||||
* @access intern
|
||||
*/
|
||||
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 should only, at present, be
|
||||
* CRYPT_AES_MODE_ECB or CRYPT_AES_MODE_CBC. If not explictly set, CRYPT_AES_MODE_CBC will be used.
|
||||
*
|
||||
* @param optional Integer $mode
|
||||
* @return Crypt_AES
|
||||
* @access public
|
||||
*/
|
||||
function Crypt_AES($mode = CRYPT_AES_MODE_CBC)
|
||||
{
|
||||
if ( !defined('CRYPT_AES_MODE') ) {
|
||||
switch (true) {
|
||||
case extension_loaded('mcrypt') && in_array('rijndael-128', mcrypt_list_algorithms()):
|
||||
define('CRYPT_AES_MODE', CRYPT_AES_MODE_MCRYPT);
|
||||
break;
|
||||
default:
|
||||
define('CRYPT_AES_MODE', CRYPT_AES_MODE_INTERNAL);
|
||||
}
|
||||
}
|
||||
|
||||
switch ( CRYPT_AES_MODE ) {
|
||||
case CRYPT_AES_MODE_MCRYPT:
|
||||
switch ($mode) {
|
||||
case CRYPT_AES_MODE_ECB:
|
||||
$this->paddable = true;
|
||||
$this->mode = MCRYPT_MODE_ECB;
|
||||
break;
|
||||
case CRYPT_AES_MODE_CTR:
|
||||
// ctr doesn't have a constant associated with it even though it appears to be fairly widely
|
||||
// supported. in lieu of knowing just how widely supported it is, i've, for now, opted not to
|
||||
// include a compatibility layer. the layer has been implemented but, for now, is commented out.
|
||||
$this->mode = 'ctr';
|
||||
//$this->mode = in_array('ctr', mcrypt_list_modes()) ? 'ctr' : CRYPT_AES_MODE_CTR;
|
||||
break;
|
||||
case CRYPT_AES_MODE_CFB:
|
||||
$this->mode = 'ncfb';
|
||||
break;
|
||||
case CRYPT_AES_MODE_OFB:
|
||||
$this->mode = MCRYPT_MODE_NOFB;
|
||||
break;
|
||||
case CRYPT_AES_MODE_CBC:
|
||||
default:
|
||||
$this->paddable = true;
|
||||
$this->mode = MCRYPT_MODE_CBC;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
switch ($mode) {
|
||||
case CRYPT_AES_MODE_ECB:
|
||||
$this->paddable = true;
|
||||
$this->mode = CRYPT_RIJNDAEL_MODE_ECB;
|
||||
break;
|
||||
case CRYPT_AES_MODE_CTR:
|
||||
$this->mode = CRYPT_RIJNDAEL_MODE_CTR;
|
||||
break;
|
||||
case CRYPT_AES_MODE_CFB:
|
||||
$this->mode = CRYPT_RIJNDAEL_MODE_CFB;
|
||||
break;
|
||||
case CRYPT_AES_MODE_OFB:
|
||||
$this->mode = CRYPT_RIJNDAEL_MODE_OFB;
|
||||
break;
|
||||
case CRYPT_AES_MODE_CBC:
|
||||
default:
|
||||
$this->paddable = true;
|
||||
$this->mode = CRYPT_RIJNDAEL_MODE_CBC;
|
||||
}
|
||||
}
|
||||
|
||||
if (CRYPT_AES_MODE == CRYPT_AES_MODE_INTERNAL) {
|
||||
parent::Crypt_Rijndael($this->mode);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Extended Crypt_Rijndael::_setup()
|
||||
*
|
||||
* Optimizing the key schedule arrays ($w, $dw) for _encryptBlock() and _decryptBlock() after Crypt_Rijndael::_setup()
|
||||
*
|
||||
* @see Crypt_Rijndael::_setup()
|
||||
* @access private
|
||||
*/
|
||||
function _setup()
|
||||
{
|
||||
if (!$this->changed) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->w = $this->dw = array();
|
||||
parent::_setup();
|
||||
|
||||
$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;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dummy function
|
||||
*
|
||||
* Since Crypt_AES extends Crypt_Rijndael, this function is, technically, available, but it doesn't do anything.
|
||||
*
|
||||
* @access public
|
||||
* @param Integer $length
|
||||
*/
|
||||
function setBlockLength($length)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the initialization vector. (optional)
|
||||
*
|
||||
* SetIV is not required when CRYPT_RIJNDAEL_MODE_ECB is being used. If not explictly set, it'll be assumed
|
||||
* to be all zero's.
|
||||
*
|
||||
* @access public
|
||||
* @param String $iv
|
||||
*/
|
||||
function setIV($iv)
|
||||
{
|
||||
parent::setIV($iv);
|
||||
if ( CRYPT_AES_MODE == CRYPT_AES_MODE_MCRYPT ) {
|
||||
$this->changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Encrypts a message.
|
||||
*
|
||||
* $plaintext will be padded with up to 16 additional bytes. Other AES 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 16, however, arbitrary values can be added to make it that
|
||||
* length.
|
||||
*
|
||||
* @see Crypt_AES::decrypt()
|
||||
* @access public
|
||||
* @param String $plaintext
|
||||
*/
|
||||
function encrypt($plaintext)
|
||||
{
|
||||
if ( CRYPT_AES_MODE == CRYPT_AES_MODE_MCRYPT ) {
|
||||
$this->_mcryptSetup();
|
||||
|
||||
// re: 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 == 'ncfb' && $this->continuousBuffer) {
|
||||
$iv = &$this->encryptIV;
|
||||
$pos = &$this->enbuffer['pos'];
|
||||
$len = strlen($plaintext);
|
||||
$ciphertext = '';
|
||||
$i = 0;
|
||||
if ($pos) {
|
||||
$orig_pos = $pos;
|
||||
$max = 16 - $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 >= 16) {
|
||||
if ($this->enbuffer['enmcrypt_init'] === false || $len > 280) {
|
||||
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 % 16));
|
||||
$iv = substr($ciphertext, -16);
|
||||
$len%= 16;
|
||||
} else {
|
||||
while ($len >= 16) {
|
||||
$iv = mcrypt_generic($this->ecb, $iv) ^ substr($plaintext, $i, 16);
|
||||
$ciphertext.= $iv;
|
||||
$len-= 16;
|
||||
$i+= 16;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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->iv);
|
||||
}
|
||||
|
||||
return $ciphertext;
|
||||
}
|
||||
|
||||
return parent::encrypt($plaintext);
|
||||
}
|
||||
|
||||
/**
|
||||
* Decrypts a message.
|
||||
*
|
||||
* If strlen($ciphertext) is not a multiple of 16, null bytes will be added to the end of the string until it is.
|
||||
*
|
||||
* @see Crypt_AES::encrypt()
|
||||
* @access public
|
||||
* @param String $ciphertext
|
||||
*/
|
||||
function decrypt($ciphertext)
|
||||
{
|
||||
if ( CRYPT_AES_MODE == CRYPT_AES_MODE_MCRYPT ) {
|
||||
$this->_mcryptSetup();
|
||||
|
||||
if ($this->mode == 'ncfb' && $this->continuousBuffer) {
|
||||
$iv = &$this->decryptIV;
|
||||
$pos = &$this->debuffer['pos'];
|
||||
$len = strlen($ciphertext);
|
||||
$plaintext = '';
|
||||
$i = 0;
|
||||
if ($pos) {
|
||||
$orig_pos = $pos;
|
||||
$max = 16 - $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 >= 16) {
|
||||
$cb = substr($ciphertext, $i, $len - $len % 16);
|
||||
$plaintext.= mcrypt_generic($this->ecb, $iv . $cb) ^ $cb;
|
||||
$iv = substr($cb, -16);
|
||||
$len%= 16;
|
||||
}
|
||||
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 http://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) + 15) & 0xFFFFFFF0, chr(0));
|
||||
}
|
||||
|
||||
$plaintext = mdecrypt_generic($this->demcrypt, $ciphertext);
|
||||
|
||||
if (!$this->continuousBuffer) {
|
||||
mcrypt_generic_init($this->demcrypt, $this->key, $this->iv);
|
||||
}
|
||||
|
||||
return $this->paddable ? $this->_unpad($plaintext) : $plaintext;
|
||||
}
|
||||
|
||||
return parent::decrypt($ciphertext);
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup mcrypt
|
||||
*
|
||||
* Validates all the variables.
|
||||
*
|
||||
* @access private
|
||||
*/
|
||||
function _mcryptSetup()
|
||||
{
|
||||
if (!$this->changed) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$this->explicit_key_length) {
|
||||
// this just copied from Crypt_Rijndael::_setup()
|
||||
$length = strlen($this->key) >> 2;
|
||||
if ($length > 8) {
|
||||
$length = 8;
|
||||
} else if ($length < 4) {
|
||||
$length = 4;
|
||||
}
|
||||
$this->Nk = $length;
|
||||
$this->key_size = $length << 2;
|
||||
}
|
||||
|
||||
switch ($this->Nk) {
|
||||
case 4: // 128
|
||||
$this->key_size = 16;
|
||||
break;
|
||||
case 5: // 160
|
||||
case 6: // 192
|
||||
$this->key_size = 24;
|
||||
break;
|
||||
case 7: // 224
|
||||
case 8: // 256
|
||||
$this->key_size = 32;
|
||||
}
|
||||
|
||||
$this->key = str_pad(substr($this->key, 0, $this->key_size), $this->key_size, chr(0));
|
||||
$this->encryptIV = $this->decryptIV = $this->iv = str_pad(substr($this->iv, 0, 16), 16, chr(0));
|
||||
|
||||
if (!isset($this->enmcrypt)) {
|
||||
$mode = $this->mode;
|
||||
//$mode = $this->mode == CRYPT_AES_MODE_CTR ? MCRYPT_MODE_ECB : $this->mode;
|
||||
|
||||
$this->demcrypt = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', $mode, '');
|
||||
$this->enmcrypt = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', $mode, '');
|
||||
|
||||
if ($mode == 'ncfb') {
|
||||
$this->ecb = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
|
||||
}
|
||||
|
||||
} // else should mcrypt_generic_deinit be called?
|
||||
|
||||
mcrypt_generic_init($this->demcrypt, $this->key, $this->iv);
|
||||
mcrypt_generic_init($this->enmcrypt, $this->key, $this->iv);
|
||||
|
||||
if ($this->mode == 'ncfb') {
|
||||
mcrypt_generic_init($this->ecb, $this->key, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
|
||||
}
|
||||
|
||||
$this->changed = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Encrypts a block
|
||||
*
|
||||
* Optimized over Crypt_Rijndael's implementation by means of loop unrolling.
|
||||
*
|
||||
* @see Crypt_Rijndael::_encryptBlock()
|
||||
* @access private
|
||||
* @param String $in
|
||||
* @return String
|
||||
*/
|
||||
function _encryptBlock($in)
|
||||
{
|
||||
$state = unpack('N*', $in);
|
||||
|
||||
$sbox = $this->sbox;
|
||||
$w = $this->w;
|
||||
$t0 = $this->t0;
|
||||
$t1 = $this->t1;
|
||||
$t2 = $this->t2;
|
||||
$t3 = $this->t3;
|
||||
|
||||
// addRoundKey
|
||||
$s0 = $state[1] ^ $w[4];
|
||||
$s1 = $state[2] ^ $w[5];
|
||||
$s2 = $state[3] ^ $w[6];
|
||||
$s3 = $state[4] ^ $w[7];
|
||||
|
||||
// shiftRows + subWord + mixColumns + addRoundKey
|
||||
$e0 = $t0[($s0 >> 24) & 0xff] ^ $t1[($s1 >> 16) & 0xff] ^ $t2[($s2 >> 8) & 0xff] ^ $t3[$s3 & 0xff] ^ $w[8];
|
||||
$e1 = $t0[($s1 >> 24) & 0xff] ^ $t1[($s2 >> 16) & 0xff] ^ $t2[($s3 >> 8) & 0xff] ^ $t3[$s0 & 0xff] ^ $w[9];
|
||||
$e2 = $t0[($s2 >> 24) & 0xff] ^ $t1[($s3 >> 16) & 0xff] ^ $t2[($s0 >> 8) & 0xff] ^ $t3[$s1 & 0xff] ^ $w[10];
|
||||
$e3 = $t0[($s3 >> 24) & 0xff] ^ $t1[($s0 >> 16) & 0xff] ^ $t2[($s1 >> 8) & 0xff] ^ $t3[$s2 & 0xff] ^ $w[11];
|
||||
|
||||
$s0 = $t0[($e0 >> 24) & 0xff] ^ $t1[($e1 >> 16) & 0xff] ^ $t2[($e2 >> 8) & 0xff] ^ $t3[$e3 & 0xff] ^ $w[12];
|
||||
$s1 = $t0[($e1 >> 24) & 0xff] ^ $t1[($e2 >> 16) & 0xff] ^ $t2[($e3 >> 8) & 0xff] ^ $t3[$e0 & 0xff] ^ $w[13];
|
||||
$s2 = $t0[($e2 >> 24) & 0xff] ^ $t1[($e3 >> 16) & 0xff] ^ $t2[($e0 >> 8) & 0xff] ^ $t3[$e1 & 0xff] ^ $w[14];
|
||||
$s3 = $t0[($e3 >> 24) & 0xff] ^ $t1[($e0 >> 16) & 0xff] ^ $t2[($e1 >> 8) & 0xff] ^ $t3[$e2 & 0xff] ^ $w[15];
|
||||
|
||||
$e0 = $t0[($s0 >> 24) & 0xff] ^ $t1[($s1 >> 16) & 0xff] ^ $t2[($s2 >> 8) & 0xff] ^ $t3[$s3 & 0xff] ^ $w[16];
|
||||
$e1 = $t0[($s1 >> 24) & 0xff] ^ $t1[($s2 >> 16) & 0xff] ^ $t2[($s3 >> 8) & 0xff] ^ $t3[$s0 & 0xff] ^ $w[17];
|
||||
$e2 = $t0[($s2 >> 24) & 0xff] ^ $t1[($s3 >> 16) & 0xff] ^ $t2[($s0 >> 8) & 0xff] ^ $t3[$s1 & 0xff] ^ $w[18];
|
||||
$e3 = $t0[($s3 >> 24) & 0xff] ^ $t1[($s0 >> 16) & 0xff] ^ $t2[($s1 >> 8) & 0xff] ^ $t3[$s2 & 0xff] ^ $w[19];
|
||||
|
||||
$s0 = $t0[($e0 >> 24) & 0xff] ^ $t1[($e1 >> 16) & 0xff] ^ $t2[($e2 >> 8) & 0xff] ^ $t3[$e3 & 0xff] ^ $w[20];
|
||||
$s1 = $t0[($e1 >> 24) & 0xff] ^ $t1[($e2 >> 16) & 0xff] ^ $t2[($e3 >> 8) & 0xff] ^ $t3[$e0 & 0xff] ^ $w[21];
|
||||
$s2 = $t0[($e2 >> 24) & 0xff] ^ $t1[($e3 >> 16) & 0xff] ^ $t2[($e0 >> 8) & 0xff] ^ $t3[$e1 & 0xff] ^ $w[22];
|
||||
$s3 = $t0[($e3 >> 24) & 0xff] ^ $t1[($e0 >> 16) & 0xff] ^ $t2[($e1 >> 8) & 0xff] ^ $t3[$e2 & 0xff] ^ $w[23];
|
||||
|
||||
$e0 = $t0[($s0 >> 24) & 0xff] ^ $t1[($s1 >> 16) & 0xff] ^ $t2[($s2 >> 8) & 0xff] ^ $t3[$s3 & 0xff] ^ $w[24];
|
||||
$e1 = $t0[($s1 >> 24) & 0xff] ^ $t1[($s2 >> 16) & 0xff] ^ $t2[($s3 >> 8) & 0xff] ^ $t3[$s0 & 0xff] ^ $w[25];
|
||||
$e2 = $t0[($s2 >> 24) & 0xff] ^ $t1[($s3 >> 16) & 0xff] ^ $t2[($s0 >> 8) & 0xff] ^ $t3[$s1 & 0xff] ^ $w[26];
|
||||
$e3 = $t0[($s3 >> 24) & 0xff] ^ $t1[($s0 >> 16) & 0xff] ^ $t2[($s1 >> 8) & 0xff] ^ $t3[$s2 & 0xff] ^ $w[27];
|
||||
|
||||
$s0 = $t0[($e0 >> 24) & 0xff] ^ $t1[($e1 >> 16) & 0xff] ^ $t2[($e2 >> 8) & 0xff] ^ $t3[$e3 & 0xff] ^ $w[28];
|
||||
$s1 = $t0[($e1 >> 24) & 0xff] ^ $t1[($e2 >> 16) & 0xff] ^ $t2[($e3 >> 8) & 0xff] ^ $t3[$e0 & 0xff] ^ $w[29];
|
||||
$s2 = $t0[($e2 >> 24) & 0xff] ^ $t1[($e3 >> 16) & 0xff] ^ $t2[($e0 >> 8) & 0xff] ^ $t3[$e1 & 0xff] ^ $w[30];
|
||||
$s3 = $t0[($e3 >> 24) & 0xff] ^ $t1[($e0 >> 16) & 0xff] ^ $t2[($e1 >> 8) & 0xff] ^ $t3[$e2 & 0xff] ^ $w[31];
|
||||
|
||||
$e0 = $t0[($s0 >> 24) & 0xff] ^ $t1[($s1 >> 16) & 0xff] ^ $t2[($s2 >> 8) & 0xff] ^ $t3[$s3 & 0xff] ^ $w[32];
|
||||
$e1 = $t0[($s1 >> 24) & 0xff] ^ $t1[($s2 >> 16) & 0xff] ^ $t2[($s3 >> 8) & 0xff] ^ $t3[$s0 & 0xff] ^ $w[33];
|
||||
$e2 = $t0[($s2 >> 24) & 0xff] ^ $t1[($s3 >> 16) & 0xff] ^ $t2[($s0 >> 8) & 0xff] ^ $t3[$s1 & 0xff] ^ $w[34];
|
||||
$e3 = $t0[($s3 >> 24) & 0xff] ^ $t1[($s0 >> 16) & 0xff] ^ $t2[($s1 >> 8) & 0xff] ^ $t3[$s2 & 0xff] ^ $w[35];
|
||||
|
||||
$s0 = $t0[($e0 >> 24) & 0xff] ^ $t1[($e1 >> 16) & 0xff] ^ $t2[($e2 >> 8) & 0xff] ^ $t3[$e3 & 0xff] ^ $w[36];
|
||||
$s1 = $t0[($e1 >> 24) & 0xff] ^ $t1[($e2 >> 16) & 0xff] ^ $t2[($e3 >> 8) & 0xff] ^ $t3[$e0 & 0xff] ^ $w[37];
|
||||
$s2 = $t0[($e2 >> 24) & 0xff] ^ $t1[($e3 >> 16) & 0xff] ^ $t2[($e0 >> 8) & 0xff] ^ $t3[$e1 & 0xff] ^ $w[38];
|
||||
$s3 = $t0[($e3 >> 24) & 0xff] ^ $t1[($e0 >> 16) & 0xff] ^ $t2[($e1 >> 8) & 0xff] ^ $t3[$e2 & 0xff] ^ $w[39];
|
||||
|
||||
$e0 = $t0[($s0 >> 24) & 0xff] ^ $t1[($s1 >> 16) & 0xff] ^ $t2[($s2 >> 8) & 0xff] ^ $t3[$s3 & 0xff] ^ $w[40];
|
||||
$e1 = $t0[($s1 >> 24) & 0xff] ^ $t1[($s2 >> 16) & 0xff] ^ $t2[($s3 >> 8) & 0xff] ^ $t3[$s0 & 0xff] ^ $w[41];
|
||||
$e2 = $t0[($s2 >> 24) & 0xff] ^ $t1[($s3 >> 16) & 0xff] ^ $t2[($s0 >> 8) & 0xff] ^ $t3[$s1 & 0xff] ^ $w[42];
|
||||
$e3 = $t0[($s3 >> 24) & 0xff] ^ $t1[($s0 >> 16) & 0xff] ^ $t2[($s1 >> 8) & 0xff] ^ $t3[$s2 & 0xff] ^ $w[43];
|
||||
|
||||
switch ($this->Nr) {
|
||||
case 10:
|
||||
break;
|
||||
|
||||
case 14:
|
||||
$s0 = $t0[($e0 >> 24) & 0xff] ^ $t1[($e1 >> 16) & 0xff] ^ $t2[($e2 >> 8) & 0xff] ^ $t3[$e3 & 0xff] ^ $w[44];
|
||||
$s1 = $t0[($e1 >> 24) & 0xff] ^ $t1[($e2 >> 16) & 0xff] ^ $t2[($e3 >> 8) & 0xff] ^ $t3[$e0 & 0xff] ^ $w[45];
|
||||
$s2 = $t0[($e2 >> 24) & 0xff] ^ $t1[($e3 >> 16) & 0xff] ^ $t2[($e0 >> 8) & 0xff] ^ $t3[$e1 & 0xff] ^ $w[46];
|
||||
$s3 = $t0[($e3 >> 24) & 0xff] ^ $t1[($e0 >> 16) & 0xff] ^ $t2[($e1 >> 8) & 0xff] ^ $t3[$e2 & 0xff] ^ $w[47];
|
||||
|
||||
$e0 = $t0[($s0 >> 24) & 0xff] ^ $t1[($s1 >> 16) & 0xff] ^ $t2[($s2 >> 8) & 0xff] ^ $t3[$s3 & 0xff] ^ $w[48];
|
||||
$e1 = $t0[($s1 >> 24) & 0xff] ^ $t1[($s2 >> 16) & 0xff] ^ $t2[($s3 >> 8) & 0xff] ^ $t3[$s0 & 0xff] ^ $w[49];
|
||||
$e2 = $t0[($s2 >> 24) & 0xff] ^ $t1[($s3 >> 16) & 0xff] ^ $t2[($s0 >> 8) & 0xff] ^ $t3[$s1 & 0xff] ^ $w[50];
|
||||
$e3 = $t0[($s3 >> 24) & 0xff] ^ $t1[($s0 >> 16) & 0xff] ^ $t2[($s1 >> 8) & 0xff] ^ $t3[$s2 & 0xff] ^ $w[51];
|
||||
|
||||
$s0 = $t0[($e0 >> 24) & 0xff] ^ $t1[($e1 >> 16) & 0xff] ^ $t2[($e2 >> 8) & 0xff] ^ $t3[$e3 & 0xff] ^ $w[52];
|
||||
$s1 = $t0[($e1 >> 24) & 0xff] ^ $t1[($e2 >> 16) & 0xff] ^ $t2[($e3 >> 8) & 0xff] ^ $t3[$e0 & 0xff] ^ $w[53];
|
||||
$s2 = $t0[($e2 >> 24) & 0xff] ^ $t1[($e3 >> 16) & 0xff] ^ $t2[($e0 >> 8) & 0xff] ^ $t3[$e1 & 0xff] ^ $w[54];
|
||||
$s3 = $t0[($e3 >> 24) & 0xff] ^ $t1[($e0 >> 16) & 0xff] ^ $t2[($e1 >> 8) & 0xff] ^ $t3[$e2 & 0xff] ^ $w[55];
|
||||
|
||||
$e0 = $t0[($s0 >> 24) & 0xff] ^ $t1[($s1 >> 16) & 0xff] ^ $t2[($s2 >> 8) & 0xff] ^ $t3[$s3 & 0xff] ^ $w[56];
|
||||
$e1 = $t0[($s1 >> 24) & 0xff] ^ $t1[($s2 >> 16) & 0xff] ^ $t2[($s3 >> 8) & 0xff] ^ $t3[$s0 & 0xff] ^ $w[57];
|
||||
$e2 = $t0[($s2 >> 24) & 0xff] ^ $t1[($s3 >> 16) & 0xff] ^ $t2[($s0 >> 8) & 0xff] ^ $t3[$s1 & 0xff] ^ $w[58];
|
||||
$e3 = $t0[($s3 >> 24) & 0xff] ^ $t1[($s0 >> 16) & 0xff] ^ $t2[($s1 >> 8) & 0xff] ^ $t3[$s2 & 0xff] ^ $w[59];
|
||||
break;
|
||||
|
||||
case 12:
|
||||
$s0 = $t0[($e0 >> 24) & 0xff] ^ $t1[($e1 >> 16) & 0xff] ^ $t2[($e2 >> 8) & 0xff] ^ $t3[$e3 & 0xff] ^ $w[44];
|
||||
$s1 = $t0[($e1 >> 24) & 0xff] ^ $t1[($e2 >> 16) & 0xff] ^ $t2[($e3 >> 8) & 0xff] ^ $t3[$e0 & 0xff] ^ $w[45];
|
||||
$s2 = $t0[($e2 >> 24) & 0xff] ^ $t1[($e3 >> 16) & 0xff] ^ $t2[($e0 >> 8) & 0xff] ^ $t3[$e1 & 0xff] ^ $w[46];
|
||||
$s3 = $t0[($e3 >> 24) & 0xff] ^ $t1[($e0 >> 16) & 0xff] ^ $t2[($e1 >> 8) & 0xff] ^ $t3[$e2 & 0xff] ^ $w[47];
|
||||
|
||||
$e0 = $t0[($s0 >> 24) & 0xff] ^ $t1[($s1 >> 16) & 0xff] ^ $t2[($s2 >> 8) & 0xff] ^ $t3[$s3 & 0xff] ^ $w[48];
|
||||
$e1 = $t0[($s1 >> 24) & 0xff] ^ $t1[($s2 >> 16) & 0xff] ^ $t2[($s3 >> 8) & 0xff] ^ $t3[$s0 & 0xff] ^ $w[49];
|
||||
$e2 = $t0[($s2 >> 24) & 0xff] ^ $t1[($s3 >> 16) & 0xff] ^ $t2[($s0 >> 8) & 0xff] ^ $t3[$s1 & 0xff] ^ $w[50];
|
||||
$e3 = $t0[($s3 >> 24) & 0xff] ^ $t1[($s0 >> 16) & 0xff] ^ $t2[($s1 >> 8) & 0xff] ^ $t3[$s2 & 0xff] ^ $w[51];
|
||||
break;
|
||||
|
||||
case 13:
|
||||
$s0 = $t0[($e0 >> 24) & 0xff] ^ $t1[($e1 >> 16) & 0xff] ^ $t2[($e2 >> 8) & 0xff] ^ $t3[$e3 & 0xff] ^ $w[44];
|
||||
$s1 = $t0[($e1 >> 24) & 0xff] ^ $t1[($e2 >> 16) & 0xff] ^ $t2[($e3 >> 8) & 0xff] ^ $t3[$e0 & 0xff] ^ $w[45];
|
||||
$s2 = $t0[($e2 >> 24) & 0xff] ^ $t1[($e3 >> 16) & 0xff] ^ $t2[($e0 >> 8) & 0xff] ^ $t3[$e1 & 0xff] ^ $w[46];
|
||||
$s3 = $t0[($e3 >> 24) & 0xff] ^ $t1[($e0 >> 16) & 0xff] ^ $t2[($e1 >> 8) & 0xff] ^ $t3[$e2 & 0xff] ^ $w[47];
|
||||
|
||||
$e0 = $t0[($s0 >> 24) & 0xff] ^ $t1[($s1 >> 16) & 0xff] ^ $t2[($s2 >> 8) & 0xff] ^ $t3[$s3 & 0xff] ^ $w[48];
|
||||
$e1 = $t0[($s1 >> 24) & 0xff] ^ $t1[($s2 >> 16) & 0xff] ^ $t2[($s3 >> 8) & 0xff] ^ $t3[$s0 & 0xff] ^ $w[49];
|
||||
$e2 = $t0[($s2 >> 24) & 0xff] ^ $t1[($s3 >> 16) & 0xff] ^ $t2[($s0 >> 8) & 0xff] ^ $t3[$s1 & 0xff] ^ $w[50];
|
||||
$e3 = $t0[($s3 >> 24) & 0xff] ^ $t1[($s0 >> 16) & 0xff] ^ $t2[($s1 >> 8) & 0xff] ^ $t3[$s2 & 0xff] ^ $w[51];
|
||||
|
||||
$s0 = $t0[($e0 >> 24) & 0xff] ^ $t1[($e1 >> 16) & 0xff] ^ $t2[($e2 >> 8) & 0xff] ^ $t3[$e3 & 0xff] ^ $w[52];
|
||||
$s1 = $t0[($e1 >> 24) & 0xff] ^ $t1[($e2 >> 16) & 0xff] ^ $t2[($e3 >> 8) & 0xff] ^ $t3[$e0 & 0xff] ^ $w[53];
|
||||
$s2 = $t0[($e2 >> 24) & 0xff] ^ $t1[($e3 >> 16) & 0xff] ^ $t2[($e0 >> 8) & 0xff] ^ $t3[$e1 & 0xff] ^ $w[54];
|
||||
$e3 = $t0[($e3 >> 24) & 0xff] ^ $t1[($e0 >> 16) & 0xff] ^ $t2[($e1 >> 8) & 0xff] ^ $t3[$e2 & 0xff] ^ $w[55];
|
||||
// Note: Here we skip $s3 but using $e3
|
||||
|
||||
$e0 = $s0;
|
||||
$e1 = $s1;
|
||||
$e2 = $s2;
|
||||
// $e3 = $s3;
|
||||
break;
|
||||
|
||||
default: // 11
|
||||
$s0 = $t0[($e0 >> 24) & 0xff] ^ $t1[($e1 >> 16) & 0xff] ^ $t2[($e2 >> 8) & 0xff] ^ $t3[$e3 & 0xff] ^ $w[44];
|
||||
$s1 = $t0[($e1 >> 24) & 0xff] ^ $t1[($e2 >> 16) & 0xff] ^ $t2[($e3 >> 8) & 0xff] ^ $t3[$e0 & 0xff] ^ $w[45];
|
||||
$s2 = $t0[($e2 >> 24) & 0xff] ^ $t1[($e3 >> 16) & 0xff] ^ $t2[($e0 >> 8) & 0xff] ^ $t3[$e1 & 0xff] ^ $w[46];
|
||||
$e3 = $t0[($e3 >> 24) & 0xff] ^ $t1[($e0 >> 16) & 0xff] ^ $t2[($e1 >> 8) & 0xff] ^ $t3[$e2 & 0xff] ^ $w[47];
|
||||
// Note: Here we skip $s3 but using $e3
|
||||
|
||||
$e0 = $s0;
|
||||
$e1 = $s1;
|
||||
$e2 = $s2;
|
||||
// $e3 = $s3;
|
||||
}
|
||||
|
||||
// subWord
|
||||
$e0 = $sbox[$e0 & 0xff] | ($sbox[($e0 >> 8) & 0xff] << 8) | ($sbox[($e0 >> 16) & 0xff] << 16) | ($sbox[($e0 >> 24) & 0xff] << 24);
|
||||
$e1 = $sbox[$e1 & 0xff] | ($sbox[($e1 >> 8) & 0xff] << 8) | ($sbox[($e1 >> 16) & 0xff] << 16) | ($sbox[($e1 >> 24) & 0xff] << 24);
|
||||
$e2 = $sbox[$e2 & 0xff] | ($sbox[($e2 >> 8) & 0xff] << 8) | ($sbox[($e2 >> 16) & 0xff] << 16) | ($sbox[($e2 >> 24) & 0xff] << 24);
|
||||
$e3 = $sbox[$e3 & 0xff] | ($sbox[($e3 >> 8) & 0xff] << 8) | ($sbox[($e3 >> 16) & 0xff] << 16) | ($sbox[($e3 >> 24) & 0xff] << 24);
|
||||
|
||||
// shiftRows + addRoundKey
|
||||
return pack('N*',
|
||||
($e0 & 0xFF000000) ^ ($e1 & 0x00FF0000) ^ ($e2 & 0x0000FF00) ^ ($e3 & 0x000000FF) ^ $w[0],
|
||||
($e1 & 0xFF000000) ^ ($e2 & 0x00FF0000) ^ ($e3 & 0x0000FF00) ^ ($e0 & 0x000000FF) ^ $w[1],
|
||||
($e2 & 0xFF000000) ^ ($e3 & 0x00FF0000) ^ ($e0 & 0x0000FF00) ^ ($e1 & 0x000000FF) ^ $w[2],
|
||||
($e3 & 0xFF000000) ^ ($e0 & 0x00FF0000) ^ ($e1 & 0x0000FF00) ^ ($e2 & 0x000000FF) ^ $w[3]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Decrypts a block
|
||||
*
|
||||
* Optimized over Crypt_Rijndael's implementation by means of loop unrolling.
|
||||
*
|
||||
* @see Crypt_Rijndael::_decryptBlock()
|
||||
* @access private
|
||||
* @param String $in
|
||||
* @return String
|
||||
*/
|
||||
function _decryptBlock($in)
|
||||
{
|
||||
$state = unpack('N*', $in);
|
||||
|
||||
$sbox = $this->isbox;
|
||||
$dw = $this->dw;
|
||||
$dt0 = $this->dt0;
|
||||
$dt1 = $this->dt1;
|
||||
$dt2 = $this->dt2;
|
||||
$dt3 = $this->dt3;
|
||||
|
||||
// addRoundKey
|
||||
$s0 = $state[1] ^ $dw[4];
|
||||
$s1 = $state[2] ^ $dw[5];
|
||||
$s2 = $state[3] ^ $dw[6];
|
||||
$s3 = $state[4] ^ $dw[7];
|
||||
|
||||
// invShiftRows + invSubBytes + invMixColumns + addRoundKey
|
||||
$e0 = $dt0[($s0 >> 24) & 0xff] ^ $dt1[($s3 >> 16) & 0xff] ^ $dt2[($s2 >> 8) & 0xff] ^ $dt3[$s1 & 0xff] ^ $dw[8];
|
||||
$e1 = $dt0[($s1 >> 24) & 0xff] ^ $dt1[($s0 >> 16) & 0xff] ^ $dt2[($s3 >> 8) & 0xff] ^ $dt3[$s2 & 0xff] ^ $dw[9];
|
||||
$e2 = $dt0[($s2 >> 24) & 0xff] ^ $dt1[($s1 >> 16) & 0xff] ^ $dt2[($s0 >> 8) & 0xff] ^ $dt3[$s3 & 0xff] ^ $dw[10];
|
||||
$e3 = $dt0[($s3 >> 24) & 0xff] ^ $dt1[($s2 >> 16) & 0xff] ^ $dt2[($s1 >> 8) & 0xff] ^ $dt3[$s0 & 0xff] ^ $dw[11];
|
||||
|
||||
$s0 = $dt0[($e0 >> 24) & 0xff] ^ $dt1[($e3 >> 16) & 0xff] ^ $dt2[($e2 >> 8) & 0xff] ^ $dt3[$e1 & 0xff] ^ $dw[12];
|
||||
$s1 = $dt0[($e1 >> 24) & 0xff] ^ $dt1[($e0 >> 16) & 0xff] ^ $dt2[($e3 >> 8) & 0xff] ^ $dt3[$e2 & 0xff] ^ $dw[13];
|
||||
$s2 = $dt0[($e2 >> 24) & 0xff] ^ $dt1[($e1 >> 16) & 0xff] ^ $dt2[($e0 >> 8) & 0xff] ^ $dt3[$e3 & 0xff] ^ $dw[14];
|
||||
$s3 = $dt0[($e3 >> 24) & 0xff] ^ $dt1[($e2 >> 16) & 0xff] ^ $dt2[($e1 >> 8) & 0xff] ^ $dt3[$e0 & 0xff] ^ $dw[15];
|
||||
|
||||
$e0 = $dt0[($s0 >> 24) & 0xff] ^ $dt1[($s3 >> 16) & 0xff] ^ $dt2[($s2 >> 8) & 0xff] ^ $dt3[$s1 & 0xff] ^ $dw[16];
|
||||
$e1 = $dt0[($s1 >> 24) & 0xff] ^ $dt1[($s0 >> 16) & 0xff] ^ $dt2[($s3 >> 8) & 0xff] ^ $dt3[$s2 & 0xff] ^ $dw[17];
|
||||
$e2 = $dt0[($s2 >> 24) & 0xff] ^ $dt1[($s1 >> 16) & 0xff] ^ $dt2[($s0 >> 8) & 0xff] ^ $dt3[$s3 & 0xff] ^ $dw[18];
|
||||
$e3 = $dt0[($s3 >> 24) & 0xff] ^ $dt1[($s2 >> 16) & 0xff] ^ $dt2[($s1 >> 8) & 0xff] ^ $dt3[$s0 & 0xff] ^ $dw[19];
|
||||
|
||||
$s0 = $dt0[($e0 >> 24) & 0xff] ^ $dt1[($e3 >> 16) & 0xff] ^ $dt2[($e2 >> 8) & 0xff] ^ $dt3[$e1 & 0xff] ^ $dw[20];
|
||||
$s1 = $dt0[($e1 >> 24) & 0xff] ^ $dt1[($e0 >> 16) & 0xff] ^ $dt2[($e3 >> 8) & 0xff] ^ $dt3[$e2 & 0xff] ^ $dw[21];
|
||||
$s2 = $dt0[($e2 >> 24) & 0xff] ^ $dt1[($e1 >> 16) & 0xff] ^ $dt2[($e0 >> 8) & 0xff] ^ $dt3[$e3 & 0xff] ^ $dw[22];
|
||||
$s3 = $dt0[($e3 >> 24) & 0xff] ^ $dt1[($e2 >> 16) & 0xff] ^ $dt2[($e1 >> 8) & 0xff] ^ $dt3[$e0 & 0xff] ^ $dw[23];
|
||||
|
||||
$e0 = $dt0[($s0 >> 24) & 0xff] ^ $dt1[($s3 >> 16) & 0xff] ^ $dt2[($s2 >> 8) & 0xff] ^ $dt3[$s1 & 0xff] ^ $dw[24];
|
||||
$e1 = $dt0[($s1 >> 24) & 0xff] ^ $dt1[($s0 >> 16) & 0xff] ^ $dt2[($s3 >> 8) & 0xff] ^ $dt3[$s2 & 0xff] ^ $dw[25];
|
||||
$e2 = $dt0[($s2 >> 24) & 0xff] ^ $dt1[($s1 >> 16) & 0xff] ^ $dt2[($s0 >> 8) & 0xff] ^ $dt3[$s3 & 0xff] ^ $dw[26];
|
||||
$e3 = $dt0[($s3 >> 24) & 0xff] ^ $dt1[($s2 >> 16) & 0xff] ^ $dt2[($s1 >> 8) & 0xff] ^ $dt3[$s0 & 0xff] ^ $dw[27];
|
||||
|
||||
$s0 = $dt0[($e0 >> 24) & 0xff] ^ $dt1[($e3 >> 16) & 0xff] ^ $dt2[($e2 >> 8) & 0xff] ^ $dt3[$e1 & 0xff] ^ $dw[28];
|
||||
$s1 = $dt0[($e1 >> 24) & 0xff] ^ $dt1[($e0 >> 16) & 0xff] ^ $dt2[($e3 >> 8) & 0xff] ^ $dt3[$e2 & 0xff] ^ $dw[29];
|
||||
$s2 = $dt0[($e2 >> 24) & 0xff] ^ $dt1[($e1 >> 16) & 0xff] ^ $dt2[($e0 >> 8) & 0xff] ^ $dt3[$e3 & 0xff] ^ $dw[30];
|
||||
$s3 = $dt0[($e3 >> 24) & 0xff] ^ $dt1[($e2 >> 16) & 0xff] ^ $dt2[($e1 >> 8) & 0xff] ^ $dt3[$e0 & 0xff] ^ $dw[31];
|
||||
|
||||
$e0 = $dt0[($s0 >> 24) & 0xff] ^ $dt1[($s3 >> 16) & 0xff] ^ $dt2[($s2 >> 8) & 0xff] ^ $dt3[$s1 & 0xff] ^ $dw[32];
|
||||
$e1 = $dt0[($s1 >> 24) & 0xff] ^ $dt1[($s0 >> 16) & 0xff] ^ $dt2[($s3 >> 8) & 0xff] ^ $dt3[$s2 & 0xff] ^ $dw[33];
|
||||
$e2 = $dt0[($s2 >> 24) & 0xff] ^ $dt1[($s1 >> 16) & 0xff] ^ $dt2[($s0 >> 8) & 0xff] ^ $dt3[$s3 & 0xff] ^ $dw[34];
|
||||
$e3 = $dt0[($s3 >> 24) & 0xff] ^ $dt1[($s2 >> 16) & 0xff] ^ $dt2[($s1 >> 8) & 0xff] ^ $dt3[$s0 & 0xff] ^ $dw[35];
|
||||
|
||||
$s0 = $dt0[($e0 >> 24) & 0xff] ^ $dt1[($e3 >> 16) & 0xff] ^ $dt2[($e2 >> 8) & 0xff] ^ $dt3[$e1 & 0xff] ^ $dw[36];
|
||||
$s1 = $dt0[($e1 >> 24) & 0xff] ^ $dt1[($e0 >> 16) & 0xff] ^ $dt2[($e3 >> 8) & 0xff] ^ $dt3[$e2 & 0xff] ^ $dw[37];
|
||||
$s2 = $dt0[($e2 >> 24) & 0xff] ^ $dt1[($e1 >> 16) & 0xff] ^ $dt2[($e0 >> 8) & 0xff] ^ $dt3[$e3 & 0xff] ^ $dw[38];
|
||||
$s3 = $dt0[($e3 >> 24) & 0xff] ^ $dt1[($e2 >> 16) & 0xff] ^ $dt2[($e1 >> 8) & 0xff] ^ $dt3[$e0 & 0xff] ^ $dw[39];
|
||||
|
||||
$e0 = $dt0[($s0 >> 24) & 0xff] ^ $dt1[($s3 >> 16) & 0xff] ^ $dt2[($s2 >> 8) & 0xff] ^ $dt3[$s1 & 0xff] ^ $dw[40];
|
||||
$e1 = $dt0[($s1 >> 24) & 0xff] ^ $dt1[($s0 >> 16) & 0xff] ^ $dt2[($s3 >> 8) & 0xff] ^ $dt3[$s2 & 0xff] ^ $dw[41];
|
||||
$e2 = $dt0[($s2 >> 24) & 0xff] ^ $dt1[($s1 >> 16) & 0xff] ^ $dt2[($s0 >> 8) & 0xff] ^ $dt3[$s3 & 0xff] ^ $dw[42];
|
||||
$e3 = $dt0[($s3 >> 24) & 0xff] ^ $dt1[($s2 >> 16) & 0xff] ^ $dt2[($s1 >> 8) & 0xff] ^ $dt3[$s0 & 0xff] ^ $dw[43];
|
||||
|
||||
switch ($this->Nr) {
|
||||
case 10:
|
||||
break;
|
||||
|
||||
case 14:
|
||||
$s0 = $dt0[($e0 >> 24) & 0xff] ^ $dt1[($e3 >> 16) & 0xff] ^ $dt2[($e2 >> 8) & 0xff] ^ $dt3[$e1 & 0xff] ^ $dw[44];
|
||||
$s1 = $dt0[($e1 >> 24) & 0xff] ^ $dt1[($e0 >> 16) & 0xff] ^ $dt2[($e3 >> 8) & 0xff] ^ $dt3[$e2 & 0xff] ^ $dw[45];
|
||||
$s2 = $dt0[($e2 >> 24) & 0xff] ^ $dt1[($e1 >> 16) & 0xff] ^ $dt2[($e0 >> 8) & 0xff] ^ $dt3[$e3 & 0xff] ^ $dw[46];
|
||||
$s3 = $dt0[($e3 >> 24) & 0xff] ^ $dt1[($e2 >> 16) & 0xff] ^ $dt2[($e1 >> 8) & 0xff] ^ $dt3[$e0 & 0xff] ^ $dw[47];
|
||||
|
||||
$e0 = $dt0[($s0 >> 24) & 0xff] ^ $dt1[($s3 >> 16) & 0xff] ^ $dt2[($s2 >> 8) & 0xff] ^ $dt3[$s1 & 0xff] ^ $dw[48];
|
||||
$e1 = $dt0[($s1 >> 24) & 0xff] ^ $dt1[($s0 >> 16) & 0xff] ^ $dt2[($s3 >> 8) & 0xff] ^ $dt3[$s2 & 0xff] ^ $dw[49];
|
||||
$e2 = $dt0[($s2 >> 24) & 0xff] ^ $dt1[($s1 >> 16) & 0xff] ^ $dt2[($s0 >> 8) & 0xff] ^ $dt3[$s3 & 0xff] ^ $dw[50];
|
||||
$e3 = $dt0[($s3 >> 24) & 0xff] ^ $dt1[($s2 >> 16) & 0xff] ^ $dt2[($s1 >> 8) & 0xff] ^ $dt3[$s0 & 0xff] ^ $dw[51];
|
||||
|
||||
$s0 = $dt0[($e0 >> 24) & 0xff] ^ $dt1[($e3 >> 16) & 0xff] ^ $dt2[($e2 >> 8) & 0xff] ^ $dt3[$e1 & 0xff] ^ $dw[52];
|
||||
$s1 = $dt0[($e1 >> 24) & 0xff] ^ $dt1[($e0 >> 16) & 0xff] ^ $dt2[($e3 >> 8) & 0xff] ^ $dt3[$e2 & 0xff] ^ $dw[53];
|
||||
$s2 = $dt0[($e2 >> 24) & 0xff] ^ $dt1[($e1 >> 16) & 0xff] ^ $dt2[($e0 >> 8) & 0xff] ^ $dt3[$e3 & 0xff] ^ $dw[54];
|
||||
$s3 = $dt0[($e3 >> 24) & 0xff] ^ $dt1[($e2 >> 16) & 0xff] ^ $dt2[($e1 >> 8) & 0xff] ^ $dt3[$e0 & 0xff] ^ $dw[55];
|
||||
|
||||
$e0 = $dt0[($s0 >> 24) & 0xff] ^ $dt1[($s3 >> 16) & 0xff] ^ $dt2[($s2 >> 8) & 0xff] ^ $dt3[$s1 & 0xff] ^ $dw[56];
|
||||
$e1 = $dt0[($s1 >> 24) & 0xff] ^ $dt1[($s0 >> 16) & 0xff] ^ $dt2[($s3 >> 8) & 0xff] ^ $dt3[$s2 & 0xff] ^ $dw[57];
|
||||
$e2 = $dt0[($s2 >> 24) & 0xff] ^ $dt1[($s1 >> 16) & 0xff] ^ $dt2[($s0 >> 8) & 0xff] ^ $dt3[$s3 & 0xff] ^ $dw[58];
|
||||
$e3 = $dt0[($s3 >> 24) & 0xff] ^ $dt1[($s2 >> 16) & 0xff] ^ $dt2[($s1 >> 8) & 0xff] ^ $dt3[$s0 & 0xff] ^ $dw[59];
|
||||
break;
|
||||
|
||||
case 12:
|
||||
$s0 = $dt0[($e0 >> 24) & 0xff] ^ $dt1[($e3 >> 16) & 0xff] ^ $dt2[($e2 >> 8) & 0xff] ^ $dt3[$e1 & 0xff] ^ $dw[44];
|
||||
$s1 = $dt0[($e1 >> 24) & 0xff] ^ $dt1[($e0 >> 16) & 0xff] ^ $dt2[($e3 >> 8) & 0xff] ^ $dt3[$e2 & 0xff] ^ $dw[45];
|
||||
$s2 = $dt0[($e2 >> 24) & 0xff] ^ $dt1[($e1 >> 16) & 0xff] ^ $dt2[($e0 >> 8) & 0xff] ^ $dt3[$e3 & 0xff] ^ $dw[46];
|
||||
$s3 = $dt0[($e3 >> 24) & 0xff] ^ $dt1[($e2 >> 16) & 0xff] ^ $dt2[($e1 >> 8) & 0xff] ^ $dt3[$e0 & 0xff] ^ $dw[47];
|
||||
|
||||
$e0 = $dt0[($s0 >> 24) & 0xff] ^ $dt1[($s3 >> 16) & 0xff] ^ $dt2[($s2 >> 8) & 0xff] ^ $dt3[$s1 & 0xff] ^ $dw[48];
|
||||
$e1 = $dt0[($s1 >> 24) & 0xff] ^ $dt1[($s0 >> 16) & 0xff] ^ $dt2[($s3 >> 8) & 0xff] ^ $dt3[$s2 & 0xff] ^ $dw[49];
|
||||
$e2 = $dt0[($s2 >> 24) & 0xff] ^ $dt1[($s1 >> 16) & 0xff] ^ $dt2[($s0 >> 8) & 0xff] ^ $dt3[$s3 & 0xff] ^ $dw[50];
|
||||
$e3 = $dt0[($s3 >> 24) & 0xff] ^ $dt1[($s2 >> 16) & 0xff] ^ $dt2[($s1 >> 8) & 0xff] ^ $dt3[$s0 & 0xff] ^ $dw[51];
|
||||
break;
|
||||
|
||||
case 13:
|
||||
$s0 = $dt0[($e0 >> 24) & 0xff] ^ $dt1[($e3 >> 16) & 0xff] ^ $dt2[($e2 >> 8) & 0xff] ^ $dt3[$e1 & 0xff] ^ $dw[44];
|
||||
$s1 = $dt0[($e1 >> 24) & 0xff] ^ $dt1[($e0 >> 16) & 0xff] ^ $dt2[($e3 >> 8) & 0xff] ^ $dt3[$e2 & 0xff] ^ $dw[45];
|
||||
$s2 = $dt0[($e2 >> 24) & 0xff] ^ $dt1[($e1 >> 16) & 0xff] ^ $dt2[($e0 >> 8) & 0xff] ^ $dt3[$e3 & 0xff] ^ $dw[46];
|
||||
$s3 = $dt0[($e3 >> 24) & 0xff] ^ $dt1[($e2 >> 16) & 0xff] ^ $dt2[($e1 >> 8) & 0xff] ^ $dt3[$e0 & 0xff] ^ $dw[47];
|
||||
|
||||
$e0 = $dt0[($s0 >> 24) & 0xff] ^ $dt1[($s3 >> 16) & 0xff] ^ $dt2[($s2 >> 8) & 0xff] ^ $dt3[$s1 & 0xff] ^ $dw[48];
|
||||
$e1 = $dt0[($s1 >> 24) & 0xff] ^ $dt1[($s0 >> 16) & 0xff] ^ $dt2[($s3 >> 8) & 0xff] ^ $dt3[$s2 & 0xff] ^ $dw[49];
|
||||
$e2 = $dt0[($s2 >> 24) & 0xff] ^ $dt1[($s1 >> 16) & 0xff] ^ $dt2[($s0 >> 8) & 0xff] ^ $dt3[$s3 & 0xff] ^ $dw[50];
|
||||
$e3 = $dt0[($s3 >> 24) & 0xff] ^ $dt1[($s2 >> 16) & 0xff] ^ $dt2[($s1 >> 8) & 0xff] ^ $dt3[$s0 & 0xff] ^ $dw[51];
|
||||
|
||||
$s0 = $dt0[($e0 >> 24) & 0xff] ^ $dt1[($e3 >> 16) & 0xff] ^ $dt2[($e2 >> 8) & 0xff] ^ $dt3[$e1 & 0xff] ^ $dw[52];
|
||||
$s1 = $dt0[($e1 >> 24) & 0xff] ^ $dt1[($e0 >> 16) & 0xff] ^ $dt2[($e3 >> 8) & 0xff] ^ $dt3[$e2 & 0xff] ^ $dw[53];
|
||||
$s2 = $dt0[($e2 >> 24) & 0xff] ^ $dt1[($e1 >> 16) & 0xff] ^ $dt2[($e0 >> 8) & 0xff] ^ $dt3[$e3 & 0xff] ^ $dw[54];
|
||||
$e3 = $dt0[($e3 >> 24) & 0xff] ^ $dt1[($e2 >> 16) & 0xff] ^ $dt2[($e1 >> 8) & 0xff] ^ $dt3[$e0 & 0xff] ^ $dw[55];
|
||||
// Note: Here we skip $s3 but using $e3
|
||||
|
||||
$e0 = $s0;
|
||||
$e1 = $s1;
|
||||
$e2 = $s2;
|
||||
// $e3 = $s3;
|
||||
break;
|
||||
|
||||
default: // 11
|
||||
$s0 = $dt0[($e0 >> 24) & 0xff] ^ $dt1[($e3 >> 16) & 0xff] ^ $dt2[($e2 >> 8) & 0xff] ^ $dt3[$e1 & 0xff] ^ $dw[44];
|
||||
$s1 = $dt0[($e1 >> 24) & 0xff] ^ $dt1[($e0 >> 16) & 0xff] ^ $dt2[($e3 >> 8) & 0xff] ^ $dt3[$e2 & 0xff] ^ $dw[45];
|
||||
$s2 = $dt0[($e2 >> 24) & 0xff] ^ $dt1[($e1 >> 16) & 0xff] ^ $dt2[($e0 >> 8) & 0xff] ^ $dt3[$e3 & 0xff] ^ $dw[46];
|
||||
$e3 = $dt0[($e3 >> 24) & 0xff] ^ $dt1[($e2 >> 16) & 0xff] ^ $dt2[($e1 >> 8) & 0xff] ^ $dt3[$e0 & 0xff] ^ $dw[47];
|
||||
// Note: Here we skip $s3 but using $e3
|
||||
|
||||
$e0 = $s0;
|
||||
$e1 = $s1;
|
||||
$e2 = $s2;
|
||||
// $e3 = $s3;
|
||||
}
|
||||
|
||||
// invSubWord
|
||||
$e0 = $sbox[$e0 & 0xff] | ($sbox[($e0 >> 8) & 0xff] << 8) | ($sbox[($e0 >> 16) & 0xff] << 16) | ($sbox[($e0 >> 24) & 0xff] << 24);
|
||||
$e1 = $sbox[$e1 & 0xff] | ($sbox[($e1 >> 8) & 0xff] << 8) | ($sbox[($e1 >> 16) & 0xff] << 16) | ($sbox[($e1 >> 24) & 0xff] << 24);
|
||||
$e2 = $sbox[$e2 & 0xff] | ($sbox[($e2 >> 8) & 0xff] << 8) | ($sbox[($e2 >> 16) & 0xff] << 16) | ($sbox[($e2 >> 24) & 0xff] << 24);
|
||||
$e3 = $sbox[$e3 & 0xff] | ($sbox[($e3 >> 8) & 0xff] << 8) | ($sbox[($e3 >> 16) & 0xff] << 16) | ($sbox[($e3 >> 24) & 0xff] << 24);
|
||||
|
||||
// invShiftRows + addRoundKey
|
||||
return pack('N*',
|
||||
($e0 & 0xFF000000) ^ ($e3 & 0x00FF0000) ^ ($e2 & 0x0000FF00) ^ ($e1 & 0x000000FF) ^ $dw[0],
|
||||
($e1 & 0xFF000000) ^ ($e0 & 0x00FF0000) ^ ($e3 & 0x0000FF00) ^ ($e2 & 0x000000FF) ^ $dw[1],
|
||||
($e2 & 0xFF000000) ^ ($e1 & 0x00FF0000) ^ ($e0 & 0x0000FF00) ^ ($e3 & 0x000000FF) ^ $dw[2],
|
||||
($e3 & 0xFF000000) ^ ($e2 & 0x00FF0000) ^ ($e1 & 0x0000FF00) ^ ($e0 & 0x000000FF) ^ $dw[3]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Treat consecutive "packets" as if they are a continuous buffer.
|
||||
*
|
||||
* The default behavior.
|
||||
*
|
||||
* @see Crypt_Rijndael::disableContinuousBuffer()
|
||||
* @access public
|
||||
*/
|
||||
function enableContinuousBuffer()
|
||||
{
|
||||
parent::enableContinuousBuffer();
|
||||
|
||||
if (CRYPT_AES_MODE == CRYPT_AES_MODE_MCRYPT) {
|
||||
$this->enbuffer['enmcrypt_init'] = true;
|
||||
$this->debuffer['demcrypt_init'] = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Treat consecutive packets as if they are a discontinuous buffer.
|
||||
*
|
||||
* The default behavior.
|
||||
*
|
||||
* @see Crypt_Rijndael::enableContinuousBuffer()
|
||||
* @access public
|
||||
*/
|
||||
function disableContinuousBuffer()
|
||||
{
|
||||
parent::disableContinuousBuffer();
|
||||
|
||||
if (CRYPT_AES_MODE == CRYPT_AES_MODE_MCRYPT) {
|
||||
mcrypt_generic_init($this->enmcrypt, $this->key, $this->iv);
|
||||
mcrypt_generic_init($this->demcrypt, $this->key, $this->iv);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// vim: ts=4:sw=4:et:
|
||||
// vim6: fdl=1:
|
1334
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/DES.php
vendored
Normal file
1334
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/DES.php
vendored
Normal file
File diff suppressed because it is too large
Load diff
825
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Hash.php
vendored
Normal file
825
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Hash.php
vendored
Normal file
|
@ -0,0 +1,825 @@
|
|||
<?php
|
||||
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
||||
|
||||
/**
|
||||
* Pure-PHP implementations of keyed-hash message authentication codes (HMACs) and various cryptographic hashing functions.
|
||||
*
|
||||
* Uses hash() or mhash() if available and an internal implementation, otherwise. Currently supports the following:
|
||||
*
|
||||
* md2, md5, md5-96, sha1, sha1-96, sha256, sha384, and sha512
|
||||
*
|
||||
* If {@link Crypt_Hash::setKey() setKey()} is called, {@link Crypt_Hash::hash() hash()} will return the HMAC as opposed to
|
||||
* the hash. If no valid algorithm is provided, sha1 will be used.
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
*
|
||||
* {@internal The variable names are the same as those in
|
||||
* {@link http://tools.ietf.org/html/rfc2104#section-2 RFC2104}.}}
|
||||
*
|
||||
* Here's a short example of how to use this library:
|
||||
* <code>
|
||||
* <?php
|
||||
* include('Crypt/Hash.php');
|
||||
*
|
||||
* $hash = new Crypt_Hash('sha1');
|
||||
*
|
||||
* $hash->setKey('abcdefg');
|
||||
*
|
||||
* echo base64_encode($hash->hash('abcdefg'));
|
||||
* ?>
|
||||
* </code>
|
||||
*
|
||||
* 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 <terrafrost@php.net>
|
||||
* @copyright MMVII Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @version $Id: Hash.php,v 1.6 2009/11/23 23:37:07 terrafrost Exp $
|
||||
* @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.
|
||||
*
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @version 0.1.0
|
||||
* @access public
|
||||
* @package Crypt_Hash
|
||||
*/
|
||||
class Crypt_Hash {
|
||||
/**
|
||||
* 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 String $key
|
||||
*/
|
||||
function setKey($key = false)
|
||||
{
|
||||
$this->key = $key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the hash function.
|
||||
*
|
||||
* @access public
|
||||
* @param String $hash
|
||||
*/
|
||||
function setHash($hash)
|
||||
{
|
||||
$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 $text
|
||||
*/
|
||||
function _md5($m)
|
||||
{
|
||||
return pack('H*', md5($m));
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper for SHA1
|
||||
*
|
||||
* @access private
|
||||
* @param String $text
|
||||
*/
|
||||
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 $text
|
||||
*/
|
||||
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 <http://www.rfc-editor.org/errata_search.php?rfc=1319>, 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 $text
|
||||
*/
|
||||
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 $text
|
||||
*/
|
||||
function _sha512($m)
|
||||
{
|
||||
if (!class_exists('Math_BigInteger')) {
|
||||
require_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 String $string
|
||||
* @param optional Integer $index
|
||||
* @return String
|
||||
* @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;
|
||||
}
|
||||
}
|
519
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/RC4.php
vendored
Normal file
519
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/RC4.php
vendored
Normal file
|
@ -0,0 +1,519 @@
|
|||
<?php
|
||||
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
||||
|
||||
/**
|
||||
* Pure-PHP implementation of RC4.
|
||||
*
|
||||
* Uses mcrypt, if available, and an internal implementation, otherwise.
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
*
|
||||
* Useful resources are as follows:
|
||||
*
|
||||
* - {@link http://www.mozilla.org/projects/security/pki/nss/draft-kaukonen-cipher-arcfour-03.txt ARCFOUR Algorithm}
|
||||
* - {@link http://en.wikipedia.org/wiki/RC4 - Wikipedia: RC4}
|
||||
*
|
||||
* RC4 is also known as ARCFOUR or ARC4. The reason is elaborated upon at Wikipedia. This class is named RC4 and not
|
||||
* ARCFOUR or ARC4 because RC4 is how it is refered to in the SSH1 specification.
|
||||
*
|
||||
* Here's a short example of how to use this library:
|
||||
* <code>
|
||||
* <?php
|
||||
* include('Crypt/RC4.php');
|
||||
*
|
||||
* $rc4 = new Crypt_RC4();
|
||||
*
|
||||
* $rc4->setKey('abcdefgh');
|
||||
*
|
||||
* $size = 10 * 1024;
|
||||
* $plaintext = '';
|
||||
* for ($i = 0; $i < $size; $i++) {
|
||||
* $plaintext.= 'a';
|
||||
* }
|
||||
*
|
||||
* echo $rc4->decrypt($rc4->encrypt($plaintext));
|
||||
* ?>
|
||||
* </code>
|
||||
*
|
||||
* 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 <terrafrost@php.net>
|
||||
* @copyright MMVII Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @version $Id: RC4.php,v 1.8 2009/06/09 04:00:38 terrafrost Exp $
|
||||
* @link http://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
/**#@+
|
||||
* @access private
|
||||
* @see Crypt_RC4::Crypt_RC4()
|
||||
*/
|
||||
/**
|
||||
* Toggles the internal implementation
|
||||
*/
|
||||
define('CRYPT_RC4_MODE_INTERNAL', 1);
|
||||
/**
|
||||
* Toggles the mcrypt implementation
|
||||
*/
|
||||
define('CRYPT_RC4_MODE_MCRYPT', 2);
|
||||
/**#@-*/
|
||||
|
||||
/**#@+
|
||||
* @access private
|
||||
* @see Crypt_RC4::_crypt()
|
||||
*/
|
||||
define('CRYPT_RC4_ENCRYPT', 0);
|
||||
define('CRYPT_RC4_DECRYPT', 1);
|
||||
/**#@-*/
|
||||
|
||||
/**
|
||||
* Pure-PHP implementation of RC4.
|
||||
*
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @version 0.1.0
|
||||
* @access public
|
||||
* @package Crypt_RC4
|
||||
*/
|
||||
class Crypt_RC4 {
|
||||
/**
|
||||
* The Key
|
||||
*
|
||||
* @see Crypt_RC4::setKey()
|
||||
* @var String
|
||||
* @access private
|
||||
*/
|
||||
var $key = "\0";
|
||||
|
||||
/**
|
||||
* The Key Stream for encryption
|
||||
*
|
||||
* If CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT, this will be equal to the mcrypt object
|
||||
*
|
||||
* @see Crypt_RC4::setKey()
|
||||
* @var Array
|
||||
* @access private
|
||||
*/
|
||||
var $encryptStream = false;
|
||||
|
||||
/**
|
||||
* The Key Stream for decryption
|
||||
*
|
||||
* If CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT, this will be equal to the mcrypt object
|
||||
*
|
||||
* @see Crypt_RC4::setKey()
|
||||
* @var Array
|
||||
* @access private
|
||||
*/
|
||||
var $decryptStream = false;
|
||||
|
||||
/**
|
||||
* The $i and $j indexes for encryption
|
||||
*
|
||||
* @see Crypt_RC4::_crypt()
|
||||
* @var Integer
|
||||
* @access private
|
||||
*/
|
||||
var $encryptIndex = 0;
|
||||
|
||||
/**
|
||||
* The $i and $j indexes for decryption
|
||||
*
|
||||
* @see Crypt_RC4::_crypt()
|
||||
* @var Integer
|
||||
* @access private
|
||||
*/
|
||||
var $decryptIndex = 0;
|
||||
|
||||
/**
|
||||
* The Encryption Algorithm
|
||||
*
|
||||
* Only used if CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT. Only possible values are MCRYPT_RC4 or MCRYPT_ARCFOUR.
|
||||
*
|
||||
* @see Crypt_RC4::Crypt_RC4()
|
||||
* @var Integer
|
||||
* @access private
|
||||
*/
|
||||
var $mode;
|
||||
|
||||
/**
|
||||
* Continuous Buffer status
|
||||
*
|
||||
* @see Crypt_RC4::enableContinuousBuffer()
|
||||
* @var Boolean
|
||||
* @access private
|
||||
*/
|
||||
var $continuousBuffer = false;
|
||||
|
||||
/**
|
||||
* Default Constructor.
|
||||
*
|
||||
* Determines whether or not the mcrypt extension should be used.
|
||||
*
|
||||
* @return Crypt_RC4
|
||||
* @access public
|
||||
*/
|
||||
function Crypt_RC4()
|
||||
{
|
||||
if ( !defined('CRYPT_RC4_MODE') ) {
|
||||
switch (true) {
|
||||
case extension_loaded('mcrypt') && (defined('MCRYPT_ARCFOUR') || defined('MCRYPT_RC4')) && in_array('arcfour', mcrypt_list_algorithms()):
|
||||
define('CRYPT_RC4_MODE', CRYPT_RC4_MODE_MCRYPT);
|
||||
break;
|
||||
default:
|
||||
define('CRYPT_RC4_MODE', CRYPT_RC4_MODE_INTERNAL);
|
||||
}
|
||||
}
|
||||
|
||||
switch ( CRYPT_RC4_MODE ) {
|
||||
case CRYPT_RC4_MODE_MCRYPT:
|
||||
switch (true) {
|
||||
case defined('MCRYPT_ARCFOUR'):
|
||||
$this->mode = MCRYPT_ARCFOUR;
|
||||
break;
|
||||
case defined('MCRYPT_RC4');
|
||||
$this->mode = MCRYPT_RC4;
|
||||
}
|
||||
$this->encryptStream = mcrypt_module_open($this->mode, '', MCRYPT_MODE_STREAM, '');
|
||||
$this->decryptStream = mcrypt_module_open($this->mode, '', MCRYPT_MODE_STREAM, '');
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
* @param String $key
|
||||
*/
|
||||
function setKey($key)
|
||||
{
|
||||
$this->key = $key;
|
||||
|
||||
if ( CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT ) {
|
||||
mcrypt_generic_init($this->encryptStream, $this->key, '');
|
||||
mcrypt_generic_init($this->decryptStream, $this->key, '');
|
||||
return;
|
||||
}
|
||||
|
||||
$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->encryptIndex = $this->decryptIndex = array(0, 0);
|
||||
$this->encryptStream = $this->decryptStream = $keyStream;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
*
|
||||
* @param String $password
|
||||
* @param optional String $method
|
||||
* @access public
|
||||
*/
|
||||
function setPassword($password, $method = 'pbkdf2')
|
||||
{
|
||||
$key = '';
|
||||
|
||||
switch ($method) {
|
||||
default: // 'pbkdf2'
|
||||
list(, , $hash, $salt, $count) = func_get_args();
|
||||
if (!isset($hash)) {
|
||||
$hash = 'sha1';
|
||||
}
|
||||
// WPA and WPA2 use the SSID as the salt
|
||||
if (!isset($salt)) {
|
||||
$salt = 'phpseclib/salt';
|
||||
}
|
||||
// RFC2898#section-4.2 uses 1,000 iterations by default
|
||||
// WPA and WPA2 use 4,096.
|
||||
if (!isset($count)) {
|
||||
$count = 1000;
|
||||
}
|
||||
if (!isset($dkLen)) {
|
||||
$dkLen = 128;
|
||||
}
|
||||
|
||||
if (!class_exists('Crypt_Hash')) {
|
||||
require_once('Crypt/Hash.php');
|
||||
}
|
||||
|
||||
$i = 1;
|
||||
while (strlen($key) < $dkLen) {
|
||||
//$dk.= $this->_pbkdf($password, $salt, $count, $i++);
|
||||
$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;
|
||||
}
|
||||
}
|
||||
|
||||
$this->setKey(substr($key, 0, $dkLen));
|
||||
}
|
||||
|
||||
/**
|
||||
* 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)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Encrypts a message.
|
||||
*
|
||||
* @see Crypt_RC4::_crypt()
|
||||
* @access public
|
||||
* @param String $plaintext
|
||||
*/
|
||||
function 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_RC4::_crypt()
|
||||
* @access public
|
||||
* @param String $ciphertext
|
||||
*/
|
||||
function decrypt($ciphertext)
|
||||
{
|
||||
return $this->_crypt($ciphertext, CRYPT_RC4_DECRYPT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encrypts or decrypts a message.
|
||||
*
|
||||
* @see Crypt_RC4::encrypt()
|
||||
* @see Crypt_RC4::decrypt()
|
||||
* @access private
|
||||
* @param String $text
|
||||
* @param Integer $mode
|
||||
*/
|
||||
function _crypt($text, $mode)
|
||||
{
|
||||
if ( CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT ) {
|
||||
$keyStream = $mode == CRYPT_RC4_ENCRYPT ? 'encryptStream' : 'decryptStream';
|
||||
|
||||
if (!$this->continuousBuffer) {
|
||||
mcrypt_generic_init($this->$keyStream, $this->key, '');
|
||||
}
|
||||
|
||||
return mcrypt_generic($this->$keyStream, $text);
|
||||
}
|
||||
|
||||
if ($this->encryptStream === false) {
|
||||
$this->setKey($this->key);
|
||||
}
|
||||
|
||||
switch ($mode) {
|
||||
case CRYPT_RC4_ENCRYPT:
|
||||
$keyStream = $this->encryptStream;
|
||||
list($i, $j) = $this->encryptIndex;
|
||||
break;
|
||||
case CRYPT_RC4_DECRYPT:
|
||||
$keyStream = $this->decryptStream;
|
||||
list($i, $j) = $this->decryptIndex;
|
||||
}
|
||||
|
||||
$newText = '';
|
||||
for ($k = 0; $k < strlen($text); $k++) {
|
||||
$i = ($i + 1) & 255;
|
||||
$j = ($j + $keyStream[$i]) & 255;
|
||||
$temp = $keyStream[$i];
|
||||
$keyStream[$i] = $keyStream[$j];
|
||||
$keyStream[$j] = $temp;
|
||||
$temp = $keyStream[($keyStream[$i] + $keyStream[$j]) & 255];
|
||||
$newText.= chr(ord($text[$k]) ^ $temp);
|
||||
}
|
||||
|
||||
if ($this->continuousBuffer) {
|
||||
switch ($mode) {
|
||||
case CRYPT_RC4_ENCRYPT:
|
||||
$this->encryptStream = $keyStream;
|
||||
$this->encryptIndex = array($i, $j);
|
||||
break;
|
||||
case CRYPT_RC4_DECRYPT:
|
||||
$this->decryptStream = $keyStream;
|
||||
$this->decryptIndex = array($i, $j);
|
||||
}
|
||||
}
|
||||
|
||||
return $newText;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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:
|
||||
*
|
||||
* <code>
|
||||
* echo $rc4->encrypt(substr($plaintext, 0, 8));
|
||||
* echo $rc4->encrypt(substr($plaintext, 8, 8));
|
||||
* </code>
|
||||
* <code>
|
||||
* echo $rc4->encrypt($plaintext);
|
||||
* </code>
|
||||
*
|
||||
* The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates
|
||||
* another, as demonstrated with the following:
|
||||
*
|
||||
* <code>
|
||||
* $rc4->encrypt(substr($plaintext, 0, 8));
|
||||
* echo $rc4->decrypt($des->encrypt(substr($plaintext, 8, 8)));
|
||||
* </code>
|
||||
* <code>
|
||||
* echo $rc4->decrypt($des->encrypt(substr($plaintext, 8, 8)));
|
||||
* </code>
|
||||
*
|
||||
* 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_RC4::disableContinuousBuffer()
|
||||
* @access public
|
||||
*/
|
||||
function enableContinuousBuffer()
|
||||
{
|
||||
if ( CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT ) {
|
||||
mcrypt_generic_init($this->encryptStream, $this->key, '');
|
||||
mcrypt_generic_init($this->decryptStream, $this->key, '');
|
||||
}
|
||||
|
||||
$this->continuousBuffer = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Treat consecutive packets as if they are a discontinuous buffer.
|
||||
*
|
||||
* The default behavior.
|
||||
*
|
||||
* @see Crypt_RC4::enableContinuousBuffer()
|
||||
* @access public
|
||||
*/
|
||||
function disableContinuousBuffer()
|
||||
{
|
||||
if ( CRYPT_RC4_MODE == CRYPT_RC4_MODE_INTERNAL ) {
|
||||
$this->encryptIndex = $this->decryptIndex = array(0, 0);
|
||||
$this->encryptStream = $this->decryptStream = false;
|
||||
}
|
||||
|
||||
$this->continuousBuffer = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dummy function.
|
||||
*
|
||||
* Since RC4 is a stream cipher and not a block cipher, no padding is necessary. The only reason this function is
|
||||
* included is so that you can switch between a block cipher and a stream cipher transparently.
|
||||
*
|
||||
* @see Crypt_RC4::disablePadding()
|
||||
* @access public
|
||||
*/
|
||||
function enablePadding()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Dummy function.
|
||||
*
|
||||
* @see Crypt_RC4::enablePadding()
|
||||
* @access public
|
||||
*/
|
||||
function disablePadding()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Class destructor.
|
||||
*
|
||||
* Will be called, automatically, if you're using PHP5. If you're using PHP4, call it yourself. Only really
|
||||
* needs to be called if mcrypt is being used.
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
function __destruct()
|
||||
{
|
||||
if ( CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT ) {
|
||||
$this->_closeMCrypt();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Properly close the MCrypt objects.
|
||||
*
|
||||
* @access prviate
|
||||
*/
|
||||
function _closeMCrypt()
|
||||
{
|
||||
mcrypt_module_close($this->encryptStream);
|
||||
mcrypt_module_close($this->decryptStream);
|
||||
}
|
||||
}
|
||||
|
||||
// vim: ts=4:sw=4:et:
|
||||
// vim6: fdl=1:
|
2646
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/RSA.php
vendored
Normal file
2646
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/RSA.php
vendored
Normal file
File diff suppressed because it is too large
Load diff
243
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Random.php
vendored
Normal file
243
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Random.php
vendored
Normal file
|
@ -0,0 +1,243 @@
|
|||
<?php
|
||||
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
||||
|
||||
/**
|
||||
* Random Number Generator
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
*
|
||||
* Here's a short example of how to use this library:
|
||||
* <code>
|
||||
* <?php
|
||||
* include('Crypt/Random.php');
|
||||
*
|
||||
* echo bin2hex(crypt_random_string(8));
|
||||
* ?>
|
||||
* </code>
|
||||
*
|
||||
* 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 <terrafrost@php.net>
|
||||
* @copyright MMVII Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @version $Id: Random.php,v 1.9 2010/04/24 06:40:48 terrafrost Exp $
|
||||
* @link http://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
/**
|
||||
* 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) {
|
||||
// PHP_OS & "\xDF\xDF\xDF" == strtoupper(substr(PHP_OS, 0, 3)), but a lot faster
|
||||
if ((PHP_OS & "\xDF\xDF\xDF") === 'WIN') {
|
||||
// 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 <http://php.net/ChangeLog-5.php#5.3.4>, "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();
|
||||
if (isset($_SESSION)) {
|
||||
$_OLD_SESSION = $_SESSION;
|
||||
}
|
||||
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($_GLOBAL) .
|
||||
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 (isset($_OLD_SESSION)) {
|
||||
$_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);
|
||||
}
|
1525
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Rijndael.php
vendored
Normal file
1525
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Rijndael.php
vendored
Normal file
File diff suppressed because it is too large
Load diff
1080
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/TripleDES.php
vendored
Normal file
1080
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/TripleDES.php
vendored
Normal file
File diff suppressed because it is too large
Load diff
540
apps/files_external/3rdparty/phpseclib/phpseclib/File/ANSI.php
vendored
Normal file
540
apps/files_external/3rdparty/phpseclib/phpseclib/File/ANSI.php
vendored
Normal file
|
@ -0,0 +1,540 @@
|
|||
<?php
|
||||
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
||||
|
||||
/**
|
||||
* Pure-PHP ANSI Decoder
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
*
|
||||
* If you call read() in Net_SSH2 you may get {@link http://en.wikipedia.org/wiki/ANSI_escape_code ANSI escape codes} back.
|
||||
* They'd look like chr(0x1B) . '[00m' or whatever (0x1B = ESC). They tell a
|
||||
* {@link http://en.wikipedia.org/wiki/Terminal_emulator terminal emulator} how to format the characters, what
|
||||
* color to display them in, etc. File_ANSI is a {@link http://en.wikipedia.org/wiki/VT100 VT100} terminal emulator.
|
||||
*
|
||||
* 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 File
|
||||
* @package File_ANSI
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @copyright MMXII Jim Wigginton
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @version $Id$
|
||||
* @link htp://phpseclib.sourceforge.net
|
||||
*/
|
||||
|
||||
/**
|
||||
* Pure-PHP ANSI Decoder
|
||||
*
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @version 0.3.0
|
||||
* @access public
|
||||
* @package File_ANSI
|
||||
*/
|
||||
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":
|
||||
$this->old_x = $this->x;
|
||||
$this->old_y = $this->y;
|
||||
$this->x = $this->y = 0;
|
||||
break;
|
||||
case "\x1B[J":
|
||||
$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":
|
||||
$this->screen[$this->y] = substr($this->screen[$this->y], 0, $this->x);
|
||||
|
||||
array_splice($this->attrs[$this->y], $this->x + 1);
|
||||
break;
|
||||
case "\x1B[?1h": // set cursor key to application
|
||||
break;
|
||||
default:
|
||||
switch (true) {
|
||||
case preg_match('#\x1B\[(\d+);(\d+)H#', $this->ansi, $match):
|
||||
$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):
|
||||
$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):
|
||||
$mods = explode(';', $match[1]);
|
||||
foreach ($mods as $mod) {
|
||||
switch ($mod) {
|
||||
case 0:
|
||||
$this->attrs[$this->y][$this->x] = '';
|
||||
|
||||
if ($this->bold) $this->attrs[$this->y][$this->x].= '</b>';
|
||||
if ($this->underline) $this->attrs[$this->y][$this->x].= '</underline>';
|
||||
if ($this->blink) $this->attrs[$this->y][$this->x].= '</blink>';
|
||||
if ($this->color) $this->attrs[$this->y][$this->x].= '</span>';
|
||||
|
||||
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:
|
||||
if (!$this->bold) {
|
||||
$this->attrs[$this->y][$this->x] = '<b>';
|
||||
$this->bold = true;
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if (!$this->underline) {
|
||||
$this->attrs[$this->y][$this->x] = '<u>';
|
||||
$this->underline = true;
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
if (!$this->blink) {
|
||||
$this->attrs[$this->y][$this->x] = '<blink>';
|
||||
$this->blink = true;
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
$this->reverse = !$this->reverse;
|
||||
$temp = $this->background;
|
||||
$this->background = $this->foreground;
|
||||
$this->foreground = $temp;
|
||||
$this->attrs[$this->y][$this->x] = '<span style="color: ' . $this->foreground . '; background: ' . $this->background . '">';
|
||||
if ($this->color) {
|
||||
$this->attrs[$this->y][$this->x] = '</span>' . $this->attrs[$this->y][$this->x];
|
||||
}
|
||||
$this->color = true;
|
||||
break;
|
||||
default:
|
||||
//$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] = '<span style="color: ' . $this->foreground . '; background: ' . $this->background . '">';
|
||||
if ($this->color) {
|
||||
$this->attrs[$this->y][$this->x] = '</span>' . $this->attrs[$this->y][$this->x];
|
||||
}
|
||||
$this->color = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
echo "{$this->ansi} unsupported\r\n";
|
||||
}
|
||||
}
|
||||
$this->ansi = '';
|
||||
continue;
|
||||
}
|
||||
|
||||
switch ($source[$i]) {
|
||||
case "\r":
|
||||
$this->x = 0;
|
||||
break;
|
||||
case "\n":
|
||||
//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++;
|
||||
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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 '<pre style="color: white; background: black" width="' . ($this->max_x + 1) . '">' . $this->_getScreen() . '</pre>';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 '<pre style="color: white; background: black" width="' . ($this->max_x + 1) . '">' . $scrollback . '</pre>';
|
||||
}
|
||||
}
|
1277
apps/files_external/3rdparty/phpseclib/phpseclib/File/ASN1.php
vendored
Normal file
1277
apps/files_external/3rdparty/phpseclib/phpseclib/File/ASN1.php
vendored
Normal file
File diff suppressed because it is too large
Load diff
4323
apps/files_external/3rdparty/phpseclib/phpseclib/File/X509.php
vendored
Normal file
4323
apps/files_external/3rdparty/phpseclib/phpseclib/File/X509.php
vendored
Normal file
File diff suppressed because it is too large
Load diff
3633
apps/files_external/3rdparty/phpseclib/phpseclib/Math/BigInteger.php
vendored
Normal file
3633
apps/files_external/3rdparty/phpseclib/phpseclib/Math/BigInteger.php
vendored
Normal file
File diff suppressed because it is too large
Load diff
2029
apps/files_external/3rdparty/phpseclib/phpseclib/Net/SFTP.php
vendored
Normal file
2029
apps/files_external/3rdparty/phpseclib/phpseclib/Net/SFTP.php
vendored
Normal file
File diff suppressed because it is too large
Load diff
1577
apps/files_external/3rdparty/phpseclib/phpseclib/Net/SSH1.php
vendored
Normal file
1577
apps/files_external/3rdparty/phpseclib/phpseclib/Net/SSH1.php
vendored
Normal file
File diff suppressed because it is too large
Load diff
3009
apps/files_external/3rdparty/phpseclib/phpseclib/Net/SSH2.php
vendored
Normal file
3009
apps/files_external/3rdparty/phpseclib/phpseclib/Net/SSH2.php
vendored
Normal file
File diff suppressed because it is too large
Load diff
6
apps/files_external/3rdparty/phpseclib/phpseclib/openssl.cnf
vendored
Normal file
6
apps/files_external/3rdparty/phpseclib/phpseclib/openssl.cnf
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
# minimalist openssl.cnf file for use with phpseclib
|
||||
|
||||
HOME = .
|
||||
RANDFILE = $ENV::HOME/.rnd
|
||||
|
||||
[ v3_ca ]
|
18
apps/files_external/3rdparty/phpseclib/phpunit.xml.dist
vendored
Normal file
18
apps/files_external/3rdparty/phpseclib/phpunit.xml.dist
vendored
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<phpunit bootstrap="tests/bootstrap.php"
|
||||
colors="true"
|
||||
>
|
||||
<testsuites>
|
||||
<testsuite name="phpseclib Test Suite">
|
||||
<directory>./tests/</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
|
||||
<!-- Code Coverage -->
|
||||
<filter>
|
||||
<whitelist>
|
||||
<directory>./phpseclib/</directory>
|
||||
</whitelist>
|
||||
</filter>
|
||||
</phpunit>
|
|
@ -1,6 +1,7 @@
|
|||
<?php
|
||||
|
||||
OCP\JSON::checkAppEnabled('files_external');
|
||||
OCP\JSON::callCheck();
|
||||
|
||||
if ( ! ($filename = $_FILES['rootcert_import']['name']) ) {
|
||||
header("Location: settings/personal.php");
|
||||
|
@ -13,7 +14,7 @@ fclose($fh);
|
|||
$filename = $_FILES['rootcert_import']['name'];
|
||||
|
||||
$view = new \OC\Files\View('/'.\OCP\User::getUser().'/files_external/uploads');
|
||||
if (!$view->file_exists('')){
|
||||
if (!$view->file_exists('')) {
|
||||
$view->mkdir('');
|
||||
}
|
||||
|
||||
|
|
|
@ -4,6 +4,8 @@ require_once 'Dropbox/autoload.php';
|
|||
|
||||
OCP\JSON::checkAppEnabled('files_external');
|
||||
OCP\JSON::checkLoggedIn();
|
||||
OCP\JSON::callCheck();
|
||||
|
||||
if (isset($_POST['app_key']) && isset($_POST['app_secret'])) {
|
||||
$oauth = new Dropbox_OAuth_Curl($_POST['app_key'], $_POST['app_secret']);
|
||||
if (isset($_POST['step'])) {
|
||||
|
|
|
@ -4,6 +4,8 @@ require_once 'Google/common.inc.php';
|
|||
|
||||
OCP\JSON::checkAppEnabled('files_external');
|
||||
OCP\JSON::checkLoggedIn();
|
||||
OCP\JSON::callCheck();
|
||||
|
||||
$consumer = new OAuthConsumer('anonymous', 'anonymous');
|
||||
$sigMethod = new OAuthSignatureMethod_HMAC_SHA1();
|
||||
if (isset($_POST['step'])) {
|
||||
|
|
|
@ -3,6 +3,15 @@
|
|||
OCP\JSON::checkAppEnabled('files_external');
|
||||
OCP\JSON::callCheck();
|
||||
|
||||
if (!isset($_POST['isPersonal']))
|
||||
return;
|
||||
if (!isset($_POST['mountPoint']))
|
||||
return;
|
||||
if (!isset($_POST['mountType']))
|
||||
return;
|
||||
if (!isset($_POST['applicable']))
|
||||
return;
|
||||
|
||||
if ($_POST['isPersonal'] == 'true') {
|
||||
OCP\JSON::checkLoggedIn();
|
||||
$isPersonal = true;
|
||||
|
@ -10,4 +19,5 @@ if ($_POST['isPersonal'] == 'true') {
|
|||
OCP\JSON::checkAdminUser();
|
||||
$isPersonal = false;
|
||||
}
|
||||
|
||||
OC_Mount_Config::removeMountPoint($_POST['mountPoint'], $_POST['mountType'], $_POST['applicable'], $isPersonal);
|
||||
|
|
|
@ -14,6 +14,7 @@ OC::$CLASSPATH['OC\Files\Storage\SWIFT']='apps/files_external/lib/swift.php';
|
|||
OC::$CLASSPATH['OC\Files\Storage\SMB']='apps/files_external/lib/smb.php';
|
||||
OC::$CLASSPATH['OC\Files\Storage\AmazonS3']='apps/files_external/lib/amazons3.php';
|
||||
OC::$CLASSPATH['OC\Files\Storage\Dropbox']='apps/files_external/lib/dropbox.php';
|
||||
OC::$CLASSPATH['OC\Files\Storage\SFTP']='apps/files_external/lib/sftp.php';
|
||||
OC::$CLASSPATH['OC_Mount_Config']='apps/files_external/lib/config.php';
|
||||
|
||||
OCP\App::registerAdmin('files_external', 'settings');
|
||||
|
|
|
@ -47,7 +47,7 @@ OC.MountConfig={
|
|||
oldUsers.splice($.inArray(applicable, oldUsers), 1);
|
||||
}
|
||||
}
|
||||
$.post(OC.filePath('files_external', 'ajax', 'addMountPoint.php'), { mountPoint: mountPoint, class: backendClass, classOptions: classOptions, mountType: mountType, applicable: applicable, isPersonal: isPersonal });
|
||||
$.post(OC.filePath('files_external', 'ajax', 'addMountPoint.php'), { mountPoint: mountPoint, 'class': backendClass, classOptions: classOptions, mountType: mountType, applicable: applicable, isPersonal: isPersonal });
|
||||
});
|
||||
var mountType = 'group';
|
||||
$.each(oldGroups, function(index, applicable) {
|
||||
|
@ -61,7 +61,7 @@ OC.MountConfig={
|
|||
var isPersonal = true;
|
||||
var mountType = 'user';
|
||||
var applicable = OC.currentUser;
|
||||
$.post(OC.filePath('files_external', 'ajax', 'addMountPoint.php'), { mountPoint: mountPoint, class: backendClass, classOptions: classOptions, mountType: mountType, applicable: applicable, isPersonal: isPersonal });
|
||||
$.post(OC.filePath('files_external', 'ajax', 'addMountPoint.php'), { mountPoint: mountPoint, 'class': backendClass, classOptions: classOptions, mountType: mountType, applicable: applicable, isPersonal: isPersonal });
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
"Error configuring Dropbox storage" => "Virhe Dropbox levyn asetuksia tehtäessä",
|
||||
"Grant access" => "Salli pääsy",
|
||||
"Fill out all required fields" => "Täytä kaikki vaaditut kentät",
|
||||
"Please provide a valid Dropbox app key and secret." => "Anna kelvollinen Dropbox-sovellusavain ja salainen vastaus.",
|
||||
"Error configuring Google Drive storage" => "Virhe Google Drive levyn asetuksia tehtäessä",
|
||||
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Varoitus:</b> \"smbclient\" ei ole asennettuna. CIFS-/SMB-jakojen liittäminen ei ole mahdollista. Pyydä järjestelmän ylläpitäjää asentamaan smbclient.",
|
||||
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Varoitus:</b> PHP:n FTP-tuki ei ole käytössä tai sitä ei ole asennettu. FTP-jakojen liittäminen ei ole mahdollista. Pyydä järjestelmän ylläpitäjää ottamaan FTP-tuki käyttöön.",
|
||||
|
|
3
apps/files_external/l10n/hi.php
Normal file
3
apps/files_external/l10n/hi.php
Normal file
|
@ -0,0 +1,3 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Users" => "उपयोगकर्ता"
|
||||
);
|
|
@ -15,12 +15,12 @@
|
|||
"Applicable" => "Aplikovateľné",
|
||||
"Add mount point" => "Pridať prípojný bod",
|
||||
"None set" => "Žiadne nastavené",
|
||||
"All Users" => "Všetci užívatelia",
|
||||
"All Users" => "Všetci používatelia",
|
||||
"Groups" => "Skupiny",
|
||||
"Users" => "Užívatelia",
|
||||
"Users" => "Používatelia",
|
||||
"Delete" => "Odstrániť",
|
||||
"Enable User External Storage" => "Povoliť externé úložisko",
|
||||
"Allow users to mount their own external storage" => "Povoliť užívateľom pripojiť ich vlastné externé úložisko",
|
||||
"Allow users to mount their own external storage" => "Povoliť používateľom pripojiť ich vlastné externé úložisko",
|
||||
"SSL root certificates" => "Koreňové SSL certifikáty",
|
||||
"Import Root Certificate" => "Importovať koreňový certifikát"
|
||||
);
|
||||
|
|
|
@ -104,6 +104,14 @@ class OC_Mount_Config {
|
|||
'password' => '*Password',
|
||||
'root' => '&Root',
|
||||
'secure' => '!Secure https://'));
|
||||
|
||||
$backends['\OC\Files\Storage\SFTP']=array(
|
||||
'backend' => 'SFTP',
|
||||
'configuration' => array(
|
||||
'host' => 'URL',
|
||||
'user' => 'Username',
|
||||
'password' => '*Password',
|
||||
'root' => '&Root'));
|
||||
|
||||
return($backends);
|
||||
}
|
||||
|
@ -302,7 +310,7 @@ class OC_Mount_Config {
|
|||
foreach ($data[self::MOUNT_TYPE_GROUP] as $group => $mounts) {
|
||||
$content .= "\t\t'".$group."' => array (\n";
|
||||
foreach ($mounts as $mountPoint => $mount) {
|
||||
$content .= "\t\t\t'".addcslashes($mountPoint,"'")."' => ".str_replace("\n", '', var_export($mount, true)).", \n";
|
||||
$content .= "\t\t\t'".addcslashes($mountPoint, "'")."' => ".str_replace("\n", '', var_export($mount, true)).", \n";
|
||||
|
||||
}
|
||||
$content .= "\t\t),\n";
|
||||
|
@ -314,7 +322,7 @@ class OC_Mount_Config {
|
|||
foreach ($data[self::MOUNT_TYPE_USER] as $user => $mounts) {
|
||||
$content .= "\t\t'".$user."' => array (\n";
|
||||
foreach ($mounts as $mountPoint => $mount) {
|
||||
$content .= "\t\t\t'".addcslashes($mountPoint,"'")."' => ".str_replace("\n", '', var_export($mount, true)).",\n";
|
||||
$content .= "\t\t\t'".addcslashes($mountPoint, "'")."' => ".str_replace("\n", '', var_export($mount, true)).",\n";
|
||||
}
|
||||
$content .= "\t\t),\n";
|
||||
}
|
||||
|
@ -386,7 +394,7 @@ class OC_Mount_Config {
|
|||
}
|
||||
|
||||
/**
|
||||
* check if php-ftp is installed
|
||||
* check if php-ftp is installed
|
||||
*/
|
||||
public static function checkphpftp() {
|
||||
if(function_exists('ftp_login')) {
|
||||
|
|
|
@ -68,7 +68,7 @@ class FTP extends \OC\Files\Storage\StreamWrapper{
|
|||
case 'ab':
|
||||
//these are supported by the wrapper
|
||||
$context = stream_context_create(array('ftp' => array('overwrite' => true)));
|
||||
return fopen($this->constructUrl($path),$mode, false,$context);
|
||||
return fopen($this->constructUrl($path), $mode, false, $context);
|
||||
case 'r+':
|
||||
case 'w+':
|
||||
case 'wb+':
|
||||
|
@ -89,7 +89,7 @@ class FTP extends \OC\Files\Storage\StreamWrapper{
|
|||
$this->getFile($path, $tmpFile);
|
||||
}
|
||||
self::$tempFiles[$tmpFile]=$path;
|
||||
return fopen('close://'.$tmpFile,$mode);
|
||||
return fopen('close://'.$tmpFile, $mode);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
291
apps/files_external/lib/sftp.php
Normal file
291
apps/files_external/lib/sftp.php
Normal file
|
@ -0,0 +1,291 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2012 Henrik Kjölhede <hkjolhede@gmail.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
namespace OC\Files\Storage;
|
||||
|
||||
set_include_path(get_include_path() . PATH_SEPARATOR . \OC_App::getAppPath('files_external') . '/3rdparty/phpseclib/phpseclib');
|
||||
require('Net/SFTP.php');
|
||||
|
||||
class SFTP extends \OC\Files\Storage\Common {
|
||||
private $host;
|
||||
private $user;
|
||||
private $password;
|
||||
private $root;
|
||||
|
||||
private $client;
|
||||
|
||||
private static $tempFiles = array();
|
||||
|
||||
public function __construct($params) {
|
||||
$this->host = $params['host'];
|
||||
$proto = strpos($this->host, '://');
|
||||
if ($proto != false) {
|
||||
$this->host = substr($this->host, $proto+3);
|
||||
}
|
||||
$this->user = $params['user'];
|
||||
$this->password = $params['password'];
|
||||
$this->root = isset($params['root']) ? $this->cleanPath($params['root']) : '/';
|
||||
if ($this->root[0] != '/') $this->root = '/' . $this->root;
|
||||
if (substr($this->root, -1, 1) != '/') $this->root .= '/';
|
||||
|
||||
$host_keys = $this->read_host_keys();
|
||||
|
||||
$this->client = new \Net_SFTP($this->host);
|
||||
if (!$this->client->login($this->user, $this->password)) {
|
||||
throw new \Exception('Login failed');
|
||||
}
|
||||
|
||||
$current_host_key = $this->client->getServerPublicHostKey();
|
||||
|
||||
if (array_key_exists($this->host, $host_keys)) {
|
||||
if ($host_keys[$this->host] != $current_host_key) {
|
||||
throw new \Exception('Host public key does not match known key');
|
||||
}
|
||||
} else {
|
||||
$host_keys[$this->host] = $current_host_key;
|
||||
$this->write_host_keys($host_keys);
|
||||
}
|
||||
|
||||
if(!$this->file_exists('')){
|
||||
$this->mkdir('');
|
||||
}
|
||||
}
|
||||
|
||||
public function test() {
|
||||
if (!isset($params['host']) || !isset($params['user']) || !isset($params['password'])) {
|
||||
throw new \Exception("Required parameters not set");
|
||||
}
|
||||
}
|
||||
|
||||
public function getId(){
|
||||
return 'sftp::' . $this->user . '@' . $this->host . '/' . $this->root;
|
||||
}
|
||||
|
||||
private function abs_path($path) {
|
||||
return $this->root . $this->cleanPath($path);
|
||||
}
|
||||
|
||||
private function host_keys_path() {
|
||||
try {
|
||||
$storage_view = \OCP\Files::getStorage('files_external');
|
||||
if ($storage_view) {
|
||||
return \OCP\Config::getSystemValue('datadirectory') .
|
||||
$storage_view->getAbsolutePath('') .
|
||||
'ssh_host_keys';
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private function write_host_keys($keys) {
|
||||
try {
|
||||
$key_path = $this->host_keys_path();
|
||||
$fp = fopen($key_path, 'w');
|
||||
foreach ($keys as $host => $key) {
|
||||
fwrite($fp, $host . '::' . $key . "\n");
|
||||
}
|
||||
fclose($fp);
|
||||
return true;
|
||||
} catch (\Exception $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private function read_host_keys() {
|
||||
try {
|
||||
$key_path = $this->host_keys_path();
|
||||
if (file_exists($key_path)) {
|
||||
$hosts = array();
|
||||
$keys = array();
|
||||
$lines = file($key_path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
||||
if ($lines) {
|
||||
foreach ($lines as $line) {
|
||||
$host_key_arr = explode("::", $line, 2);
|
||||
if (count($host_key_arr) == 2) {
|
||||
$hosts[] = $host_key_arr[0];
|
||||
$keys[] = $host_key_arr[1];
|
||||
}
|
||||
}
|
||||
return array_combine($hosts, $keys);
|
||||
}
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
}
|
||||
return array();
|
||||
}
|
||||
|
||||
public function mkdir($path) {
|
||||
try {
|
||||
return $this->client->mkdir($this->abs_path($path));
|
||||
} catch (\Exception $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function rmdir($path) {
|
||||
try {
|
||||
return $this->client->delete($this->abs_path($path), true);
|
||||
} catch (\Exception $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function opendir($path) {
|
||||
try {
|
||||
$list = $this->client->nlist($this->abs_path($path));
|
||||
|
||||
$id = md5('sftp:' . $path);
|
||||
$dir_stream = array();
|
||||
foreach($list as $file) {
|
||||
if ($file != '.' && $file != '..') {
|
||||
$dir_stream[] = $file;
|
||||
}
|
||||
}
|
||||
\OC\Files\Stream\Dir::register($id, $dir_stream);
|
||||
return opendir('fakedir://' . $id);
|
||||
} catch(\Exception $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function filetype($path) {
|
||||
try {
|
||||
$stat = $this->client->stat($this->abs_path($path));
|
||||
if ($stat['type'] == NET_SFTP_TYPE_REGULAR) return 'file';
|
||||
if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) return 'dir';
|
||||
} catch (\Exeption $e) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public function isReadable($path) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function isUpdatable($path) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function file_exists($path) {
|
||||
try {
|
||||
return $this->client->stat($this->abs_path($path)) === false ? false : true;
|
||||
} catch (\Exception $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function unlink($path) {
|
||||
try {
|
||||
return $this->client->delete($this->abs_path($path), true);
|
||||
} catch (\Exception $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function fopen($path, $mode) {
|
||||
try {
|
||||
$abs_path = $this->abs_path($path);
|
||||
switch($mode) {
|
||||
case 'r':
|
||||
case 'rb':
|
||||
if ( !$this->file_exists($path)) return false;
|
||||
if (strrpos($path, '.')!==false) {
|
||||
$ext=substr($path, strrpos($path, '.'));
|
||||
} else {
|
||||
$ext='';
|
||||
}
|
||||
$tmp = \OC_Helper::tmpFile($ext);
|
||||
$this->getFile($abs_path, $tmp);
|
||||
return fopen($tmp, $mode);
|
||||
|
||||
case 'w':
|
||||
case 'wb':
|
||||
case 'a':
|
||||
case 'ab':
|
||||
case 'r+':
|
||||
case 'w+':
|
||||
case 'wb+':
|
||||
case 'a+':
|
||||
case 'x':
|
||||
case 'x+':
|
||||
case 'c':
|
||||
case 'c+':
|
||||
if (strrpos($path, '.')!==false) {
|
||||
$ext=substr($path, strrpos($path, '.'));
|
||||
} else {
|
||||
$ext='';
|
||||
}
|
||||
$tmpFile=\OC_Helper::tmpFile($ext);
|
||||
\OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
|
||||
if ($this->file_exists($path)) {
|
||||
$this->getFile($abs_path, $tmpFile);
|
||||
}
|
||||
self::$tempFiles[$tmpFile]=$abs_path;
|
||||
return fopen('close://'.$tmpFile, $mode);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public function writeBack($tmpFile) {
|
||||
if (array_key_exists($tmpFile, self::$tempFiles)) {
|
||||
$this->uploadFile($tmpFile, self::$tempFiles[$tmpFile]);
|
||||
unlink($tmpFile);
|
||||
unset(self::$tempFiles[$tmpFile]);
|
||||
}
|
||||
}
|
||||
|
||||
public function free_space($path) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
public function touch($path, $mtime=null) {
|
||||
try {
|
||||
if (!is_null($mtime)) return false;
|
||||
if (!$this->file_exists($path)) {
|
||||
$this->client->put($this->abs_path($path), '');
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public function getFile($path, $target) {
|
||||
$this->client->get($path, $target);
|
||||
}
|
||||
|
||||
public function uploadFile($path, $target) {
|
||||
$this->client->put($target, $path, NET_SFTP_LOCAL_FILE);
|
||||
}
|
||||
|
||||
public function rename($source, $target) {
|
||||
try {
|
||||
return $this->client->rename($this->abs_path($source), $this->abs_path($target));
|
||||
} catch (\Exception $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function stat($path) {
|
||||
try {
|
||||
$stat = $this->client->stat($this->abs_path($path));
|
||||
|
||||
$mtime = $stat ? $stat['mtime'] : -1;
|
||||
$size = $stat ? $stat['size'] : 0;
|
||||
|
||||
return array('mtime' => $mtime, 'size' => $size, 'ctime' => -1);
|
||||
} catch (\Exception $e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -33,7 +33,7 @@ class SMB extends \OC\Files\Storage\StreamWrapper{
|
|||
$this->share='/'.$this->share;
|
||||
}
|
||||
if(substr($this->share, -1, 1)=='/') {
|
||||
$this->share = substr($this->share,0,-1);
|
||||
$this->share = substr($this->share, 0, -1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -45,7 +45,10 @@ class SMB extends \OC\Files\Storage\StreamWrapper{
|
|||
if (substr($path, -1)=='/') {
|
||||
$path=substr($path, 0, -1);
|
||||
}
|
||||
return 'smb://'.$this->user.':'.$this->password.'@'.$this->host.$this->share.$this->root.$path;
|
||||
$path = urlencode($path);
|
||||
$user = urlencode($this->user);
|
||||
$pass = urlencode($this->password);
|
||||
return 'smb://'.$user.':'.$pass.'@'.$this->host.$this->share.$this->root.$path;
|
||||
}
|
||||
|
||||
public function stat($path) {
|
||||
|
@ -59,11 +62,6 @@ class SMB extends \OC\Files\Storage\StreamWrapper{
|
|||
}
|
||||
}
|
||||
|
||||
public function filetype($path) {
|
||||
// using opendir causes the same amount of requests and caches the content of the folder in one go
|
||||
return (bool)@$this->opendir($path) ? 'dir' : 'file';
|
||||
}
|
||||
|
||||
/**
|
||||
* check if a file or folder has been updated since $time
|
||||
* @param string $path
|
||||
|
|
|
@ -12,7 +12,7 @@ abstract class StreamWrapper extends \OC\Files\Storage\Common{
|
|||
private $ready = false;
|
||||
|
||||
protected function init(){
|
||||
if($this->ready){
|
||||
if($this->ready) {
|
||||
return;
|
||||
}
|
||||
$this->ready = true;
|
||||
|
@ -71,39 +71,39 @@ abstract class StreamWrapper extends \OC\Files\Storage\Common{
|
|||
return $succes;
|
||||
}
|
||||
|
||||
public function fopen($path,$mode) {
|
||||
public function fopen($path, $mode) {
|
||||
$this->init();
|
||||
return fopen($this->constructUrl($path),$mode);
|
||||
return fopen($this->constructUrl($path), $mode);
|
||||
}
|
||||
|
||||
public function free_space($path) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public function touch($path,$mtime=null) {
|
||||
public function touch($path, $mtime=null) {
|
||||
$this->init();
|
||||
if(is_null($mtime)) {
|
||||
$fh = $this->fopen($path,'a');
|
||||
fwrite($fh,'');
|
||||
$fh = $this->fopen($path, 'a');
|
||||
fwrite($fh, '');
|
||||
fclose($fh);
|
||||
} else {
|
||||
return false;//not supported
|
||||
}
|
||||
}
|
||||
|
||||
public function getFile($path,$target) {
|
||||
public function getFile($path, $target) {
|
||||
$this->init();
|
||||
return copy($this->constructUrl($path),$target);
|
||||
return copy($this->constructUrl($path), $target);
|
||||
}
|
||||
|
||||
public function uploadFile($path,$target) {
|
||||
public function uploadFile($path, $target) {
|
||||
$this->init();
|
||||
return copy($path,$this->constructUrl($target));
|
||||
return copy($path, $this->constructUrl($target));
|
||||
}
|
||||
|
||||
public function rename($path1,$path2) {
|
||||
public function rename($path1, $path2) {
|
||||
$this->init();
|
||||
return rename($this->constructUrl($path1),$this->constructUrl($path2));
|
||||
return rename($this->constructUrl($path1), $this->constructUrl($path2));
|
||||
}
|
||||
|
||||
public function stat($path) {
|
||||
|
|
|
@ -210,7 +210,7 @@ class SWIFT extends \OC\Files\Storage\Common{
|
|||
return false;
|
||||
} else {
|
||||
$fh=fopen($tmpFile, 'a');
|
||||
fwrite($fh,$name . "\n");
|
||||
fwrite($fh, $name . "\n");
|
||||
}
|
||||
} catch(\Exception $e) {
|
||||
file_put_contents($tmpFile, $name . "\n");
|
||||
|
@ -290,7 +290,7 @@ class SWIFT extends \OC\Files\Storage\Common{
|
|||
}
|
||||
|
||||
private function init(){
|
||||
if($this->ready){
|
||||
if($this->ready) {
|
||||
return;
|
||||
}
|
||||
$this->ready = true;
|
||||
|
|
|
@ -49,7 +49,7 @@ class DAV extends \OC\Files\Storage\Common{
|
|||
}
|
||||
|
||||
private function init(){
|
||||
if($this->ready){
|
||||
if($this->ready) {
|
||||
return;
|
||||
}
|
||||
$this->ready = true;
|
||||
|
@ -153,10 +153,10 @@ class DAV extends \OC\Files\Storage\Common{
|
|||
|
||||
public function unlink($path) {
|
||||
$this->init();
|
||||
return $this->simpleResponse('DELETE', $path, null ,204);
|
||||
return $this->simpleResponse('DELETE', $path, null, 204);
|
||||
}
|
||||
|
||||
public function fopen($path,$mode) {
|
||||
public function fopen($path, $mode) {
|
||||
$this->init();
|
||||
$path=$this->cleanPath($path);
|
||||
switch($mode) {
|
||||
|
@ -235,13 +235,13 @@ class DAV extends \OC\Files\Storage\Common{
|
|||
$this->client->proppatch($path, array('{DAV:}lastmodified' => $mtime));
|
||||
}
|
||||
|
||||
public function getFile($path,$target) {
|
||||
public function getFile($path, $target) {
|
||||
$this->init();
|
||||
$source=$this->fopen($path,'r');
|
||||
file_put_contents($target,$source);
|
||||
$source=$this->fopen($path, 'r');
|
||||
file_put_contents($target, $source);
|
||||
}
|
||||
|
||||
public function uploadFile($path,$target) {
|
||||
public function uploadFile($path, $target) {
|
||||
$this->init();
|
||||
$source=fopen($path, 'r');
|
||||
|
||||
|
@ -256,7 +256,7 @@ class DAV extends \OC\Files\Storage\Common{
|
|||
curl_close ($curl);
|
||||
}
|
||||
|
||||
public function rename($path1,$path2) {
|
||||
public function rename($path1, $path2) {
|
||||
$this->init();
|
||||
$path1=$this->cleanPath($path1);
|
||||
$path2=$this->root.$this->cleanPath($path2);
|
||||
|
@ -268,7 +268,7 @@ class DAV extends \OC\Files\Storage\Common{
|
|||
}
|
||||
}
|
||||
|
||||
public function copy($path1,$path2) {
|
||||
public function copy($path1, $path2) {
|
||||
$this->init();
|
||||
$path1=$this->cleanPath($path1);
|
||||
$path2=$this->root.$this->cleanPath($path2);
|
||||
|
@ -321,7 +321,7 @@ class DAV extends \OC\Files\Storage\Common{
|
|||
}
|
||||
}
|
||||
|
||||
private function simpleResponse($method,$path,$body,$expected) {
|
||||
private function simpleResponse($method, $path, $body, $expected) {
|
||||
$path=$this->cleanPath($path);
|
||||
try {
|
||||
$response=$this->client->request($method, $path, $body);
|
||||
|
|
|
@ -83,7 +83,7 @@
|
|||
<select class="chzn-select"
|
||||
multiple style="width:20em;"
|
||||
data-placeholder="<?php echo $l->t('None set'); ?>">
|
||||
<option value="all"><?php echo $l->t('All Users'); ?></option>
|
||||
<option value="all" <?php if (isset($mount['applicable']['users']) && in_array('all', $mount['applicable']['users'])) echo 'selected="selected"';?> ><?php echo $l->t('All Users'); ?></option>
|
||||
<optgroup label="<?php echo $l->t('Groups'); ?>">
|
||||
<?php foreach ($_['groups'] as $group): ?>
|
||||
<option value="<?php echo $group; ?>(group)"
|
||||
|
|
|
@ -51,5 +51,12 @@ return array(
|
|||
'app_secret' => '',
|
||||
'token' => '',
|
||||
'token_secret' => ''
|
||||
),
|
||||
'sftp' => array (
|
||||
'run'=>false,
|
||||
'host'=>'localhost',
|
||||
'user'=>'test',
|
||||
'password'=>'test',
|
||||
'root'=>'/test'
|
||||
)
|
||||
);
|
||||
|
|
43
apps/files_external/tests/sftp.php
Normal file
43
apps/files_external/tests/sftp.php
Normal file
|
@ -0,0 +1,43 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Henrik Kjölhede
|
||||
* @copyright 2013 Henrik Kjölhede hkjolhede@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace Test\Files\Storage;
|
||||
|
||||
class SFTP extends Storage {
|
||||
private $config;
|
||||
|
||||
public function setUp() {
|
||||
$id = uniqid();
|
||||
$this->config = include('files_external/tests/config.php');
|
||||
if ( ! is_array($this->config) or ! isset($this->config['sftp']) or ! $this->config['sftp']['run']) {
|
||||
$this->markTestSkipped('SFTP backend not configured');
|
||||
}
|
||||
$this->config['sftp']['root'] .= '/' . $id; //make sure we have an new empty folder to work in
|
||||
$this->instance = new \OC\Files\Storage\SFTP($this->config['sftp']);
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
if ($this->instance) {
|
||||
$this->instance->rmdir('/');
|
||||
}
|
||||
}
|
||||
}
|
|
@ -34,9 +34,8 @@ body {
|
|||
background:#eee;
|
||||
border-bottom:1px solid #f8f8f8;
|
||||
min-height:30em;
|
||||
padding-top:2em;
|
||||
text-align:center;
|
||||
margin:50px auto;
|
||||
margin:45px auto;
|
||||
}
|
||||
|
||||
#noPreview {
|
||||
|
@ -60,6 +59,7 @@ p.info a {
|
|||
#imgframe {
|
||||
height:75%;
|
||||
padding-bottom:2em;
|
||||
padding-top:2em;
|
||||
width:80%;
|
||||
margin:0 auto;
|
||||
}
|
||||
|
@ -67,4 +67,8 @@ p.info a {
|
|||
#imgframe img {
|
||||
max-height:100%;
|
||||
max-width:100%;
|
||||
}
|
||||
}
|
||||
|
||||
thead{
|
||||
background-color: white;
|
||||
}
|
||||
|
|
|
@ -390,7 +390,7 @@ class Shared extends \OC\Files\Storage\Common {
|
|||
}
|
||||
|
||||
public static function setup($options) {
|
||||
if (\OCP\Share::getItemsSharedWith('file')) {
|
||||
if (!\OCP\User::isLoggedIn() || \OCP\User::getUser() != $options['user'] || \OCP\Share::getItemsSharedWith('file')) {
|
||||
$user_dir = $options['user_dir'];
|
||||
\OC\Files\Filesystem::mount('\OC\Files\Storage\Shared', array('sharedFolder' => '/Shared'), $user_dir.'/Shared/');
|
||||
}
|
||||
|
|
|
@ -1,67 +1,18 @@
|
|||
<?php
|
||||
$RUNTIME_NOSETUPFS = true;
|
||||
// Load other apps for file previews
|
||||
OC_App::loadApps();
|
||||
|
||||
// Compatibility with shared-by-link items from ownCloud 4.0
|
||||
// requires old Sharing table !
|
||||
// support will be removed in OC 5.0,a
|
||||
if (isset($_GET['token'])) {
|
||||
unset($_GET['file']);
|
||||
$qry = \OC_DB::prepare('SELECT `source` FROM `*PREFIX*sharing` WHERE `target` = ?', 1);
|
||||
$filepath = $qry->execute(array($_GET['token']))->fetchOne();
|
||||
if (isset($filepath)) {
|
||||
$rootView = new \OC\Files\View('');
|
||||
$info = $rootView->getFileInfo($filepath, '');
|
||||
if (strtolower($info['mimetype']) == 'httpd/unix-directory') {
|
||||
$_GET['dir'] = $filepath;
|
||||
} else {
|
||||
$_GET['file'] = $filepath;
|
||||
}
|
||||
\OCP\Util::writeLog('files_sharing', 'You have files that are shared by link originating from ownCloud 4.0.'
|
||||
.' Redistribute the new links, because backwards compatibility will be removed in ownCloud 5.',
|
||||
\OCP\Util::WARN);
|
||||
}
|
||||
}
|
||||
|
||||
function getID($path) {
|
||||
// use the share table from the db to find the item source if the file was reshared because shared files
|
||||
//are not stored in the file cache.
|
||||
if (substr(\OC\Files\Filesystem::getMountPoint($path), -7, 6) == "Shared") {
|
||||
$path_parts = explode('/', $path, 5);
|
||||
$user = $path_parts[1];
|
||||
$intPath = '/'.$path_parts[4];
|
||||
$query = \OC_DB::prepare('SELECT `item_source`'
|
||||
.' FROM `*PREFIX*share`'
|
||||
.' WHERE `uid_owner` = ?'
|
||||
.' AND `file_target` = ? ');
|
||||
$result = $query->execute(array($user, $intPath));
|
||||
$row = $result->fetchRow();
|
||||
$fileSource = $row['item_source'];
|
||||
function fileCmp($a, $b) {
|
||||
if ($a['type'] == 'dir' and $b['type'] != 'dir') {
|
||||
return -1;
|
||||
} elseif ($a['type'] != 'dir' and $b['type'] == 'dir') {
|
||||
return 1;
|
||||
} else {
|
||||
$rootView = new \OC\Files\View('');
|
||||
$meta = $rootView->getFileInfo($path);
|
||||
$fileSource = $meta['fileid'];
|
||||
return strnatcasecmp($a['name'], $b['name']);
|
||||
}
|
||||
|
||||
return $fileSource;
|
||||
}
|
||||
|
||||
// Enf of backward compatibility
|
||||
|
||||
/**
|
||||
* lookup file path and owner by fetching it from the fscache
|
||||
* needed because OC_FileCache::getPath($id, $user) already requires the user
|
||||
* @param int $id
|
||||
* @return array
|
||||
*/
|
||||
function getPathAndUser($id) {
|
||||
$query = \OC_DB::prepare('SELECT `user`, `path` FROM `*PREFIX*fscache` WHERE `id` = ?');
|
||||
$result = $query->execute(array($id));
|
||||
$row = $result->fetchRow();
|
||||
return $row;
|
||||
}
|
||||
|
||||
|
||||
if (isset($_GET['t'])) {
|
||||
$token = $_GET['t'];
|
||||
$linkItem = OCP\Share::getShareByToken($token);
|
||||
|
@ -70,61 +21,30 @@ if (isset($_GET['t'])) {
|
|||
$type = $linkItem['item_type'];
|
||||
$fileSource = $linkItem['file_source'];
|
||||
$shareOwner = $linkItem['uid_owner'];
|
||||
|
||||
if (OCP\User::userExists($shareOwner) && $fileSource != -1 ) {
|
||||
|
||||
$pathAndUser = getPathAndUser($linkItem['file_source']);
|
||||
$fileOwner = $pathAndUser['user'];
|
||||
|
||||
//if this is a reshare check the file owner also exists
|
||||
if ($shareOwner != $fileOwner && ! OCP\User::userExists($fileOwner)) {
|
||||
OCP\Util::writeLog('share', 'original file owner '.$fileOwner
|
||||
.' does not exist for share '.$linkItem['id'], \OCP\Util::ERROR);
|
||||
header('HTTP/1.0 404 Not Found');
|
||||
$tmpl = new OCP\Template('', '404', 'guest');
|
||||
$tmpl->printPage();
|
||||
exit();
|
||||
$fileOwner = null;
|
||||
$path = null;
|
||||
if (isset($linkItem['parent'])) {
|
||||
$parent = $linkItem['parent'];
|
||||
while (isset($parent)) {
|
||||
$query = \OC_DB::prepare('SELECT `parent`, `uid_owner` FROM `*PREFIX*share` WHERE `id` = ?', 1);
|
||||
$item = $query->execute(array($parent))->fetchRow();
|
||||
if (isset($item['parent'])) {
|
||||
$parent = $item['parent'];
|
||||
} else {
|
||||
$fileOwner = $item['uid_owner'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//mount filesystem of file owner
|
||||
OC_Util::setupFS($fileOwner);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (isset($_GET['file']) || isset($_GET['dir'])) {
|
||||
OCP\Util::writeLog('share', 'Missing token, trying fallback file/dir links', \OCP\Util::DEBUG);
|
||||
if (isset($_GET['dir'])) {
|
||||
$type = 'folder';
|
||||
$path = $_GET['dir'];
|
||||
if (strlen($path) > 1 and substr($path, -1, 1) === '/') {
|
||||
$path = substr($path, 0, -1);
|
||||
}
|
||||
$baseDir = $path;
|
||||
$dir = $baseDir;
|
||||
} else {
|
||||
$type = 'file';
|
||||
$path = $_GET['file'];
|
||||
if (strlen($path) > 1 and substr($path, -1, 1) === '/') {
|
||||
$path = substr($path, 0, -1);
|
||||
}
|
||||
$fileOwner = $shareOwner;
|
||||
}
|
||||
$shareOwner = substr($path, 1, strpos($path, '/', 1) - 1);
|
||||
|
||||
if (OCP\User::userExists($shareOwner)) {
|
||||
OC_Util::setupFS($shareOwner);
|
||||
$fileSource = getId($path);
|
||||
if ($fileSource != -1) {
|
||||
$linkItem = OCP\Share::getItemSharedWithByLink($type, $fileSource, $shareOwner);
|
||||
$pathAndUser['path'] = $path;
|
||||
$path_parts = explode('/', $path, 5);
|
||||
$pathAndUser['user'] = $path_parts[1];
|
||||
$fileOwner = $path_parts[1];
|
||||
}
|
||||
if (isset($fileOwner)) {
|
||||
OC_Util::setupFS($fileOwner);
|
||||
$path = \OC\Files\Filesystem::getPath($linkItem['file_source']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($linkItem) {
|
||||
}
|
||||
if (isset($path)) {
|
||||
if (!isset($linkItem['item_type'])) {
|
||||
OCP\Util::writeLog('share', 'No item type set for share id: ' . $linkItem['id'], \OCP\Util::ERROR);
|
||||
header('HTTP/1.0 404 Not Found');
|
||||
|
@ -181,36 +101,23 @@ if ($linkItem) {
|
|||
}
|
||||
}
|
||||
}
|
||||
$basePath = substr($pathAndUser['path'], strlen('/' . $fileOwner . '/files'));
|
||||
$path = $basePath;
|
||||
if (isset($_GET['path'])) {
|
||||
$path .= $_GET['path'];
|
||||
}
|
||||
if (!$path || !\OC\Files\Filesystem::isValidPath($path) || !\OC\Files\Filesystem::file_exists($path)) {
|
||||
OCP\Util::writeLog('share', 'Invalid path ' . $path . ' for share id ' . $linkItem['id'], \OCP\Util::ERROR);
|
||||
header('HTTP/1.0 404 Not Found');
|
||||
$tmpl = new OCP\Template('', '404', 'guest');
|
||||
$tmpl->printPage();
|
||||
exit();
|
||||
$basePath = $path;
|
||||
if (isset($_GET['path']) && \OC\Files\Filesystem::isReadable($basePath . $_GET['path'])) {
|
||||
$getPath = \OC\Files\Filesystem::normalizePath($_GET['path']);
|
||||
$path .= $getPath;
|
||||
} else {
|
||||
$getPath = '';
|
||||
}
|
||||
$dir = dirname($path);
|
||||
$file = basename($path);
|
||||
// Download the file
|
||||
if (isset($_GET['download'])) {
|
||||
if (isset($_GET['path']) && $_GET['path'] !== '') {
|
||||
if (isset($_GET['files'])) { // download selected files
|
||||
OC_Files::get($path, $_GET['files'], $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
||||
} else {
|
||||
if (isset($_GET['path']) && $_GET['path'] != '') { // download a file from a shared directory
|
||||
OC_Files::get($dir, $file, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
||||
} else { // download the whole shared directory
|
||||
OC_Files::get($dir, $file, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
||||
}
|
||||
}
|
||||
} else { // download a single shared file
|
||||
if (isset($_GET['files'])) { // download selected files
|
||||
OC_Files::get($path, $_GET['files'], $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
||||
} else {
|
||||
OC_Files::get($dir, $file, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
||||
}
|
||||
|
||||
exit();
|
||||
} else {
|
||||
OCP\Util::addStyle('files_sharing', 'public');
|
||||
OCP\Util::addScript('files_sharing', 'public');
|
||||
|
@ -218,209 +125,86 @@ if ($linkItem) {
|
|||
$tmpl = new OCP\Template('files_sharing', 'public', 'base');
|
||||
$tmpl->assign('uidOwner', $shareOwner);
|
||||
$tmpl->assign('displayName', \OCP\User::getDisplayName($shareOwner));
|
||||
$tmpl->assign('dir', $dir);
|
||||
$tmpl->assign('filename', $file);
|
||||
$tmpl->assign('mimetype', \OC\Files\Filesystem::getMimeType($path));
|
||||
if (isset($_GET['path'])) {
|
||||
$getPath = $_GET['path'];
|
||||
} else {
|
||||
$getPath = '';
|
||||
}
|
||||
//
|
||||
$tmpl->assign('fileTarget', basename($linkItem['file_target']));
|
||||
$urlLinkIdentifiers= (isset($token)?'&t='.$token:'')
|
||||
.(isset($_GET['dir'])?'&dir='.$_GET['dir']:'')
|
||||
.(isset($_GET['file'])?'&file='.$_GET['file']:'');
|
||||
// Show file list
|
||||
if (\OC\Files\Filesystem::is_dir($path)) {
|
||||
$tmpl->assign('dir', $getPath);
|
||||
|
||||
OCP\Util::addStyle('files', 'files');
|
||||
OCP\Util::addScript('files', 'files');
|
||||
OCP\Util::addScript('files', 'filelist');
|
||||
OCP\Util::addscript('files', 'keyboardshortcuts');
|
||||
$files = array();
|
||||
$rootLength = strlen($basePath) + 1;
|
||||
foreach (OC_Files::getDirectoryContent($path) as $i) {
|
||||
foreach (\OC\Files\Filesystem::getDirectoryContent($path) as $i) {
|
||||
$i['date'] = OCP\Util::formatDate($i['mtime']);
|
||||
if ($i['type'] == 'file') {
|
||||
$fileinfo = pathinfo($i['name']);
|
||||
$i['basename'] = $fileinfo['filename'];
|
||||
$i['extension'] = isset($fileinfo['extension']) ? ('.' . $fileinfo['extension']) : '';
|
||||
}
|
||||
$i['directory'] = '/' . substr($i['directory'], $rootLength);
|
||||
if ($i['directory'] == '/') {
|
||||
$i['directory'] = '';
|
||||
if (!empty($fileinfo['extension'])) {
|
||||
$i['extension'] = '.' . $fileinfo['extension'];
|
||||
} else {
|
||||
$i['extension'] = '';
|
||||
}
|
||||
}
|
||||
$i['directory'] = $getPath;
|
||||
$i['permissions'] = OCP\PERMISSION_READ;
|
||||
$files[] = $i;
|
||||
}
|
||||
usort($files, "fileCmp");
|
||||
|
||||
// Make breadcrumb
|
||||
$breadcrumb = array();
|
||||
$pathtohere = '';
|
||||
|
||||
//add base breadcrumb
|
||||
$breadcrumb[] = array('dir' => '/', 'name' => basename($basePath));
|
||||
|
||||
//add subdir breadcrumbs
|
||||
foreach (explode('/', urldecode($getPath)) as $i) {
|
||||
foreach (explode('/', $getPath) as $i) {
|
||||
if ($i != '') {
|
||||
$pathtohere .= '/' . $i;
|
||||
$breadcrumb[] = array('dir' => $pathtohere, 'name' => $i);
|
||||
$path = $linkItem['path'];
|
||||
if (isset($_GET['path'])) {
|
||||
$path .= $_GET['path'];
|
||||
$dir .= $_GET['path'];
|
||||
if (!\OC\Files\Filesystem::file_exists($path)) {
|
||||
header('HTTP/1.0 404 Not Found');
|
||||
$tmpl = new OCP\Template('', '404', 'guest');
|
||||
$tmpl->printPage();
|
||||
exit();
|
||||
}
|
||||
}
|
||||
|
||||
$list = new OCP\Template('files', 'part.list', '');
|
||||
$list->assign('files', $files, false);
|
||||
$list->assign('publicListView', true);
|
||||
$list->assign('baseURL', OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&path=', false);
|
||||
$list->assign('downloadURL', OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&download&path=', false);
|
||||
$breadcrumbNav = new OCP\Template('files', 'part.breadcrumb', '');
|
||||
$breadcrumbNav->assign('breadcrumb', $breadcrumb, false);
|
||||
$breadcrumbNav->assign('baseURL', OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&path=', false);
|
||||
$folder = new OCP\Template('files', 'index', '');
|
||||
$folder->assign('fileList', $list->fetchPage(), false);
|
||||
$folder->assign('breadcrumb', $breadcrumbNav->fetchPage(), false);
|
||||
$folder->assign('isCreatable', false);
|
||||
$folder->assign('permissions', 0);
|
||||
$folder->assign('files', $files);
|
||||
$folder->assign('uploadMaxFilesize', 0);
|
||||
$folder->assign('uploadMaxHumanFilesize', 0);
|
||||
$folder->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
|
||||
$tmpl->assign('folder', $folder->fetchPage(), false);
|
||||
$tmpl->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
|
||||
$tmpl->assign('downloadURL', OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&download&path=' . urlencode($getPath));
|
||||
} else {
|
||||
// Show file preview if viewer is available
|
||||
if ($type == 'file') {
|
||||
$tmpl->assign('downloadURL', OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&download');
|
||||
} else {
|
||||
OCP\Util::addStyle('files_sharing', 'public');
|
||||
OCP\Util::addScript('files_sharing', 'public');
|
||||
OCP\Util::addScript('files', 'fileactions');
|
||||
$tmpl = new OCP\Template('files_sharing', 'public', 'base');
|
||||
$tmpl->assign('owner', $uidOwner);
|
||||
// Show file list
|
||||
if (\OC\Files\Filesystem::is_dir($path)) {
|
||||
OCP\Util::addStyle('files', 'files');
|
||||
OCP\Util::addScript('files', 'files');
|
||||
OCP\Util::addScript('files', 'filelist');
|
||||
$files = array();
|
||||
$rootLength = strlen($baseDir) + 1;
|
||||
foreach (OC_Files::getDirectoryContent($path) as $i) {
|
||||
$i['date'] = OCP\Util::formatDate($i['mtime']);
|
||||
if ($i['type'] == 'file') {
|
||||
$fileinfo = pathinfo($i['name']);
|
||||
$i['basename'] = $fileinfo['filename'];
|
||||
$i['extension'] = isset($fileinfo['extension']) ? ('.' . $fileinfo['extension']) : '';
|
||||
}
|
||||
$i['directory'] = '/' . substr('/' . $uidOwner . '/files' . $i['directory'], $rootLength);
|
||||
if ($i['directory'] == '/') {
|
||||
$i['directory'] = '';
|
||||
}
|
||||
$i['permissions'] = OCP\PERMISSION_READ;
|
||||
$files[] = $i;
|
||||
}
|
||||
// Make breadcrumb
|
||||
$breadcrumb = array();
|
||||
$pathtohere = '';
|
||||
$count = 1;
|
||||
foreach (explode('/', $dir) as $i) {
|
||||
if ($i != '') {
|
||||
if ($i != $baseDir) {
|
||||
$pathtohere .= '/' . $i;
|
||||
}
|
||||
if (strlen($pathtohere) < strlen($_GET['dir'])) {
|
||||
continue;
|
||||
}
|
||||
$breadcrumb[] = array('dir' => str_replace($_GET['dir'], "", $pathtohere, $count), 'name' => $i);
|
||||
}
|
||||
}
|
||||
$list = new OCP\Template('files', 'part.list', '');
|
||||
$list->assign('files', $files, false);
|
||||
$list->assign('publicListView', true);
|
||||
$list->assign('baseURL', OCP\Util::linkToPublic('files') . '&dir=' . urlencode($_GET['dir']) . '&path=', false);
|
||||
$list->assign('downloadURL', OCP\Util::linkToPublic('files') . '&download&dir=' . urlencode($_GET['dir']) . '&path=', false);
|
||||
$breadcrumbNav = new OCP\Template('files', 'part.breadcrumb', '');
|
||||
$breadcrumbNav->assign('breadcrumb', $breadcrumb, false);
|
||||
$breadcrumbNav->assign('baseURL', OCP\Util::linkToPublic('files') . '&dir=' . urlencode($_GET['dir']) . '&path=', false);
|
||||
$folder = new OCP\Template('files', 'index', '');
|
||||
$folder->assign('fileList', $list->fetchPage(), false);
|
||||
$folder->assign('breadcrumb', $breadcrumbNav->fetchPage(), false);
|
||||
$folder->assign('dir', basename($dir));
|
||||
$folder->assign('isCreatable', false);
|
||||
$folder->assign('permissions', 0);
|
||||
$folder->assign('files', $files);
|
||||
$folder->assign('uploadMaxFilesize', 0);
|
||||
$folder->assign('uploadMaxHumanFilesize', 0);
|
||||
$folder->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
|
||||
$tmpl->assign('folder', $folder->fetchPage(), false);
|
||||
$tmpl->assign('uidOwner', $uidOwner);
|
||||
$tmpl->assign('dir', basename($dir));
|
||||
$tmpl->assign('filename', basename($path));
|
||||
$tmpl->assign('mimetype', \OC\Files\Filesystem::getMimeType($path));
|
||||
$tmpl->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
|
||||
if (isset($_GET['path'])) {
|
||||
$getPath = $_GET['path'];
|
||||
} else {
|
||||
$getPath = '';
|
||||
}
|
||||
$tmpl->assign('downloadURL', OCP\Util::linkToPublic('files') . '&download&dir=' . urlencode($_GET['dir']) . '&path=' . urlencode($getPath), false);
|
||||
} else {
|
||||
// Show file preview if viewer is available
|
||||
$tmpl->assign('uidOwner', $uidOwner);
|
||||
$tmpl->assign('dir', dirname($path));
|
||||
$tmpl->assign('filename', basename($path));
|
||||
$tmpl->assign('mimetype', \OC\Files\Filesystem::getMimeType($path));
|
||||
if ($type == 'file') {
|
||||
$tmpl->assign('downloadURL', OCP\Util::linkToPublic('files') . '&file=' . urlencode($_GET['file']) . '&download', false);
|
||||
} else {
|
||||
if (isset($_GET['path'])) {
|
||||
$getPath = $_GET['path'];
|
||||
} else {
|
||||
$getPath = '';
|
||||
}
|
||||
$tmpl->assign('downloadURL', OCP\Util::linkToPublic('files') . '&download&dir=' . urlencode($_GET['dir']) . '&path=' . urlencode($getPath), false);
|
||||
}
|
||||
}
|
||||
$tmpl->printPage();
|
||||
}
|
||||
}
|
||||
$tmpl->printPage();
|
||||
}
|
||||
|
||||
$list = new OCP\Template('files', 'part.list', '');
|
||||
$list->assign('files', $files, false);
|
||||
$list->assign('disableSharing', true);
|
||||
$list->assign('baseURL', OCP\Util::linkToPublic('files').$urlLinkIdentifiers.'&path=', false);
|
||||
$list->assign('downloadURL', OCP\Util::linkToPublic('files').$urlLinkIdentifiers.'&download&path=', false);
|
||||
$breadcrumbNav = new OCP\Template('files', 'part.breadcrumb', '' );
|
||||
$list->assign('baseURL', OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&path=', false);
|
||||
$list->assign('downloadURL', OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&download&path=', false);
|
||||
$breadcrumbNav = new OCP\Template('files', 'part.breadcrumb', '');
|
||||
$breadcrumbNav->assign('breadcrumb', $breadcrumb, false);
|
||||
$breadcrumbNav->assign('baseURL', OCP\Util::linkToPublic('files').$urlLinkIdentifiers.'&path=', false);
|
||||
$breadcrumbNav->assign('baseURL', OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&path=', false);
|
||||
$folder = new OCP\Template('files', 'index', '');
|
||||
$folder->assign('fileList', $list->fetchPage(), false);
|
||||
$folder->assign('breadcrumb', $breadcrumbNav->fetchPage(), false);
|
||||
$folder->assign('dir', basename($dir));
|
||||
$folder->assign('dir', $getPath);
|
||||
$folder->assign('isCreatable', false);
|
||||
$folder->assign('permissions', 0);
|
||||
$folder->assign('files', $files);
|
||||
$folder->assign('uploadMaxFilesize', 0);
|
||||
$folder->assign('uploadMaxHumanFilesize', 0);
|
||||
$folder->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
|
||||
$folder->assign('usedSpacePercent', 0);
|
||||
$tmpl->assign('folder', $folder->fetchPage(), false);
|
||||
$tmpl->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
|
||||
$tmpl->assign('downloadURL', OCP\Util::linkToPublic('files')
|
||||
.$urlLinkIdentifiers.'&download&path='.urlencode($getPath));
|
||||
$tmpl->assign('downloadURL', OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&download&path=' . urlencode($getPath));
|
||||
} else {
|
||||
OCP\Util::writeLog('share', 'could not resolve linkItem', \OCP\Util::DEBUG);
|
||||
$tmpl->assign('dir', $dir);
|
||||
|
||||
// Show file preview if viewer is available
|
||||
if ($type == 'file') {
|
||||
$tmpl->assign('downloadURL', OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&download');
|
||||
} else {
|
||||
$tmpl->assign('downloadURL', OCP\Util::linkToPublic('files')
|
||||
.$urlLinkIdentifiers.'&download&path='.urlencode($getPath));
|
||||
}
|
||||
}
|
||||
$tmpl->printPage();
|
||||
}
|
||||
exit();
|
||||
} else {
|
||||
OCP\Util::writeLog('share', 'could not resolve linkItem', \OCP\Util::DEBUG);
|
||||
}
|
||||
header('HTTP/1.0 404 Not Found');
|
||||
$tmpl = new OCP\Template('', '404', 'guest');
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<form action="<?php echo $_['URL']; ?>" method="post">
|
||||
<fieldset>
|
||||
<p>
|
||||
<p class="infield">
|
||||
<label for="password" class="infield"><?php echo $l->t('Password'); ?></label>
|
||||
<input type="password" name="password" id="password" value="" />
|
||||
<input type="password" name="password" id="password" value="" autofocus />
|
||||
<input type="submit" value="<?php echo $l->t('Submit'); ?>" />
|
||||
</p>
|
||||
</fieldset>
|
||||
|
|
|
@ -6,9 +6,9 @@
|
|||
<a href="<?php echo link_to('', 'index.php'); ?>" title="" id="owncloud"><img class="svg" src="<?php echo image_path('', 'logo-wide.svg'); ?>" alt="ownCloud" /></a>
|
||||
<div class="header-right">
|
||||
<?php if (isset($_['folder'])): ?>
|
||||
<span id="details"><?php echo $l->t('%s shared the folder %s with you', array($_['displayName'], $_['filename'])) ?></span>
|
||||
<span id="details"><?php echo $l->t('%s shared the folder %s with you', array($_['displayName'], $_['fileTarget'])) ?></span>
|
||||
<?php else: ?>
|
||||
<span id="details"><?php echo $l->t('%s shared the file %s with you', array($_['displayName'], $_['filename'])) ?></span>
|
||||
<span id="details"><?php echo $l->t('%s shared the file %s with you', array($_['displayName'], $_['fileTarget'])) ?></span>
|
||||
<?php endif; ?>
|
||||
<?php if (!isset($_['folder']) || $_['allowZipDownload']): ?>
|
||||
<a href="<?php echo $_['downloadURL']; ?>" class="button" id="download"><img class="svg" alt="Download" src="<?php echo OCP\image_path("core", "actions/download.svg"); ?>" /><?php echo $l->t('Download')?></a>
|
||||
|
@ -26,7 +26,7 @@
|
|||
<?php endif; ?>
|
||||
<ul id="noPreview">
|
||||
<li class="error">
|
||||
<?php echo $l->t('No preview available for').' '.$_['filename']; ?><br />
|
||||
<?php echo $l->t('No preview available for').' '.$_['fileTarget']; ?><br />
|
||||
<a href="<?php echo $_['downloadURL']; ?>" id="download"><img class="svg" alt="Download" src="<?php echo OCP\image_path("core", "actions/download.svg"); ?>" /><?php echo $l->t('Download')?></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
|
|
@ -38,7 +38,7 @@ if ( $error ) {
|
|||
$filelist .= $e.', ';
|
||||
}
|
||||
$l = OC_L10N::get('files_trashbin');
|
||||
$message = $l->t("Couldn't restore %s", array(rtrim($filelist,', ')));
|
||||
$message = $l->t("Couldn't restore %s", array(rtrim($filelist, ', ')));
|
||||
OCP\JSON::error(array("data" => array("message" => $message,
|
||||
"success" => $success, "error" => $error)));
|
||||
} else {
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?xml version="1.0"?>
|
||||
<info>
|
||||
<id>files_trashbin</id>
|
||||
<name>Trash</name>
|
||||
<description>Trash bin</description>
|
||||
<name>Trash bin</name>
|
||||
<description>Keep a copy of deleted files so that they can be restored if needed</description>
|
||||
<licence>AGPL</licence>
|
||||
<author>Bjoern Schiessle</author>
|
||||
<shipped>true</shipped>
|
||||
|
|
|
@ -27,7 +27,7 @@ if ($dir) {
|
|||
$pos = strpos($dir.'/', '/', 1);
|
||||
$tmp = substr($dir, 0, $pos);
|
||||
$pos = strrpos($tmp, '.d');
|
||||
$timestamp = substr($tmp,$pos+2);
|
||||
$timestamp = substr($tmp, $pos+2);
|
||||
$result[] = array(
|
||||
'id' => $entryName,
|
||||
'timestamp' => $timestamp,
|
||||
|
|
|
@ -1,4 +1,14 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Couldn't delete %s permanently" => "Невъзможно изтриване на %s завинаги",
|
||||
"Couldn't restore %s" => "Невъзможно възтановяване на %s",
|
||||
"perform restore operation" => "извършване на действие по възтановяване",
|
||||
"delete file permanently" => "изтриване на файла завинаги",
|
||||
"Name" => "Име",
|
||||
"Deleted" => "Изтрито",
|
||||
"1 folder" => "1 папка",
|
||||
"{count} folders" => "{count} папки",
|
||||
"1 file" => "1 файл",
|
||||
"{count} files" => "{count} файла",
|
||||
"Nothing in here. Your trash bin is empty!" => "Няма нищо. Кофата е празна!",
|
||||
"Restore" => "Възтановяване"
|
||||
);
|
||||
|
|
|
@ -1,8 +1,14 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Couldn't delete %s permanently" => "Kunne ikke slette %s permanent",
|
||||
"Couldn't restore %s" => "Kunne ikke gendanne %s",
|
||||
"perform restore operation" => "udfør gendannelsesoperation",
|
||||
"delete file permanently" => "slet fil permanent",
|
||||
"Name" => "Navn",
|
||||
"Deleted" => "Slettet",
|
||||
"1 folder" => "1 mappe",
|
||||
"{count} folders" => "{count} mapper",
|
||||
"1 file" => "1 fil",
|
||||
"{count} files" => "{count} filer",
|
||||
"Nothing in here. Your trash bin is empty!" => "Intet at se her. Din papirkurv er tom!",
|
||||
"Restore" => "Gendan"
|
||||
);
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Couldn't delete %s permanently" => "Konnte %s nicht permanent löschen",
|
||||
"Couldn't restore %s" => "Konnte %s nicht wiederherstellen",
|
||||
"perform restore operation" => "Wiederherstellung ausführen",
|
||||
"delete file permanently" => "Datei permanent löschen",
|
||||
"Name" => "Name",
|
||||
"Deleted" => "gelöscht",
|
||||
"1 folder" => "1 Ordner",
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Couldn't delete %s permanently" => "Konnte %s nicht permanent löschen",
|
||||
"Couldn't restore %s" => "Konnte %s nicht wiederherstellen",
|
||||
"perform restore operation" => "Führe die Wiederherstellung aus",
|
||||
"delete file permanently" => "Datei entgültig löschen",
|
||||
"Name" => "Name",
|
||||
|
|
|
@ -1,8 +1,14 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Couldn't delete %s permanently" => "No fue posible borrar %s de manera permanente",
|
||||
"Couldn't restore %s" => "No se pudo restaurar %s",
|
||||
"perform restore operation" => "Restaurar",
|
||||
"delete file permanently" => "Borrar archivo de manera permanente",
|
||||
"Name" => "Nombre",
|
||||
"Deleted" => "Borrado",
|
||||
"1 folder" => "1 directorio",
|
||||
"{count} folders" => "{count} directorios",
|
||||
"1 file" => "1 archivo",
|
||||
"{count} files" => "{count} archivos",
|
||||
"Nothing in here. Your trash bin is empty!" => "No hay nada acá. ¡La papelera está vacía!",
|
||||
"Restore" => "Recuperar"
|
||||
);
|
||||
|
|
|
@ -1,7 +1,14 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Couldn't delete %s permanently" => "%s jäädavalt kustutamine ebaõnnestus",
|
||||
"Couldn't restore %s" => "%s ei saa taastada",
|
||||
"perform restore operation" => "soorita taastamine",
|
||||
"delete file permanently" => "kustuta fail jäädavalt",
|
||||
"Name" => "Nimi",
|
||||
"Deleted" => "Kustutatud",
|
||||
"1 folder" => "1 kaust",
|
||||
"{count} folders" => "{count} kausta",
|
||||
"1 file" => "1 fail",
|
||||
"{count} files" => "{count} faili"
|
||||
"{count} files" => "{count} faili",
|
||||
"Nothing in here. Your trash bin is empty!" => "Siin pole midagi. Sinu prügikast on tühi!",
|
||||
"Restore" => "Taasta"
|
||||
);
|
||||
|
|
|
@ -1,8 +1,14 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Couldn't delete %s permanently" => "Ezin izan da %s betirako ezabatu",
|
||||
"Couldn't restore %s" => "Ezin izan da %s berreskuratu",
|
||||
"perform restore operation" => "berreskuratu",
|
||||
"delete file permanently" => "ezabatu fitxategia betirako",
|
||||
"Name" => "Izena",
|
||||
"Deleted" => "Ezabatuta",
|
||||
"1 folder" => "karpeta bat",
|
||||
"{count} folders" => "{count} karpeta",
|
||||
"1 file" => "fitxategi bat",
|
||||
"{count} files" => "{count} fitxategi",
|
||||
"Nothing in here. Your trash bin is empty!" => "Ez dago ezer ez. Zure zakarrontzia hutsik dago!",
|
||||
"Restore" => "Berrezarri"
|
||||
);
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Couldn't delete %s permanently" => "Kohdetta %s ei voitu poistaa pysyvästi",
|
||||
"Couldn't restore %s" => "Kohteen %s palautus epäonnistui",
|
||||
"perform restore operation" => "suorita palautustoiminto",
|
||||
"delete file permanently" => "poista tiedosto pysyvästi",
|
||||
"Name" => "Nimi",
|
||||
"Deleted" => "Poistettu",
|
||||
"1 folder" => "1 kansio",
|
||||
|
|
|
@ -1,8 +1,14 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Couldn't delete %s permanently" => "Non foi posíbel eliminar %s permanente",
|
||||
"Couldn't restore %s" => "Non foi posíbel restaurar %s",
|
||||
"perform restore operation" => "realizar a operación de restauración",
|
||||
"delete file permanently" => "eliminar o ficheiro permanentemente",
|
||||
"Name" => "Nome",
|
||||
"Deleted" => "Eliminado",
|
||||
"1 folder" => "1 cartafol",
|
||||
"{count} folders" => "{count} cartafoles",
|
||||
"1 file" => "1 ficheiro",
|
||||
"{count} files" => "{count} ficheiros",
|
||||
"Nothing in here. Your trash bin is empty!" => "Aquí non hai nada. O cesto do lixo está baleiro!",
|
||||
"Restore" => "Restablecer"
|
||||
);
|
||||
|
|
|
@ -1,8 +1,14 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Couldn't delete %s permanently" => "Nem sikerült %s végleges törlése",
|
||||
"Couldn't restore %s" => "Nem sikerült %s visszaállítása",
|
||||
"perform restore operation" => "a visszaállítás végrehajtása",
|
||||
"delete file permanently" => "az állomány végleges törlése",
|
||||
"Name" => "Név",
|
||||
"Deleted" => "Törölve",
|
||||
"1 folder" => "1 mappa",
|
||||
"{count} folders" => "{count} mappa",
|
||||
"1 file" => "1 fájl",
|
||||
"{count} files" => "{count} fájl",
|
||||
"Nothing in here. Your trash bin is empty!" => "Itt nincs semmi. Az Ön szemetes mappája üres!",
|
||||
"Restore" => "Visszaállítás"
|
||||
);
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Couldn't delete %s permanently" => "Kon %s niet permanent verwijderen",
|
||||
"Couldn't restore %s" => "Kon %s niet herstellen",
|
||||
"perform restore operation" => "uitvoeren restore operatie",
|
||||
"delete file permanently" => "verwijder bestanden definitief",
|
||||
"Name" => "Naam",
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Couldn't delete %s permanently" => "Não foi possível excluir %s permanentemente",
|
||||
"Couldn't restore %s" => "Não foi possível restaurar %s",
|
||||
"perform restore operation" => "realizar operação de restauração",
|
||||
"delete file permanently" => "excluir arquivo permanentemente",
|
||||
"Name" => "Nome",
|
||||
"Deleted" => "Excluído",
|
||||
"1 folder" => "1 pasta",
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Couldn't delete %s permanently" => "Não foi possível eliminar %s de forma permanente",
|
||||
"Couldn't restore %s" => "Não foi possível restaurar %s",
|
||||
"perform restore operation" => "Restaurar",
|
||||
"delete file permanently" => "Eliminar permanentemente o(s) ficheiro(s)",
|
||||
"Name" => "Nome",
|
||||
"Deleted" => "Apagado",
|
||||
"1 folder" => "1 pasta",
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
<?php $TRANSLATIONS = array(
|
||||
"Couldn't delete %s permanently" => "Nemožno zmazať %s navždy",
|
||||
"Couldn't restore %s" => "Nemožno obnoviť %s",
|
||||
"perform restore operation" => "vykonať obnovu",
|
||||
"delete file permanently" => "trvalo zmazať súbor",
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue