merge master into filecache_mtime
This commit is contained in:
commit
2ed850e05b
|
@ -74,8 +74,9 @@ table th#headerDate, table td.date { min-width:11em; padding:0 .1em 0 1em; text-
|
||||||
|
|
||||||
/* Multiselect bar */
|
/* Multiselect bar */
|
||||||
table.multiselect { top:63px; }
|
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 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.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 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; }
|
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 .nametext { overflow:hidden; text-overflow:ellipsis; }
|
||||||
table td.filename .uploadtext { font-weight:normal; margin-left:.5em; }
|
table td.filename .uploadtext { font-weight:normal; margin-left:.5em; }
|
||||||
table td.filename form { font-size:.85em; margin-left:3em; margin-right:3em; }
|
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"]: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; }
|
#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 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 {
|
#fileList tr td.filename {
|
||||||
position:relative; width:100%;
|
position:relative; width:100%;
|
||||||
-webkit-transition:background-image 500ms; -moz-transition:background-image 500ms; -o-transition:background-image 500ms; transition:background-image 500ms;
|
-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);
|
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
|
// NOTE: Temporary fix to prevent rename action in root of Shared directory
|
||||||
if (name === 'Rename' && $('#dir').val() === '/Shared') {
|
if (name === 'Rename' && $('#dir').val() === '/Shared') {
|
||||||
return true;
|
return true;
|
||||||
|
@ -105,7 +105,16 @@ var FileActions = {
|
||||||
parent.find('a.name>span.fileactions').append(element);
|
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']) {
|
if (actions['Delete']) {
|
||||||
var img = FileActions.icons['Delete'];
|
var img = FileActions.icons['Delete'];
|
||||||
|
|
|
@ -685,9 +685,10 @@ $(document).ready(function() {
|
||||||
breadcrumbsWidth += $(breadcrumb).get(0).offsetWidth;
|
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) {
|
function resizeBreadcrumbs(firstRun) {
|
||||||
var width = $(this).width();
|
var width = $(this).width();
|
||||||
|
|
|
@ -19,12 +19,11 @@
|
||||||
|
|
||||||
$(/blur$/.test(eventName) ? window : document).on(eventName, function (event) {
|
$(/blur$/.test(eventName) ? window : document).on(eventName, function (event) {
|
||||||
var type = event.type,
|
var type = event.type,
|
||||||
originalEvent = event.originalEvent,
|
originalEvent = event.originalEvent;
|
||||||
toElement = originalEvent.toElement;
|
|
||||||
// If it’s a `{focusin,focusout}` event (IE), `fromElement` and `toElement` should both be `null` or `undefined`;
|
// 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.
|
// 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.
|
// In IE9, we need to check the `relatedTarget` property instead.
|
||||||
if (!/^focus./.test(type) || (toElement == undefined && originalEvent.fromElement == undefined && originalEvent.relatedTarget == undefined)) {
|
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');
|
$event.trigger((property && document[property] || /^(?:blur|focusout)$/.test(type) ? 'hide' : 'show') + '.visibility');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,22 +1,32 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
"Missing a temporary folder" => "Липсва временна папка",
|
"Missing a temporary folder" => "Липсва временна папка",
|
||||||
|
"Failed to write to disk" => "Възникна проблем при запис в диска",
|
||||||
|
"Invalid directory." => "Невалидна директория.",
|
||||||
"Files" => "Файлове",
|
"Files" => "Файлове",
|
||||||
"Delete" => "Изтриване",
|
"Delete" => "Изтриване",
|
||||||
"Rename" => "Преименуване",
|
"Rename" => "Преименуване",
|
||||||
|
"Pending" => "Чакащо",
|
||||||
"replace" => "препокриване",
|
"replace" => "препокриване",
|
||||||
"cancel" => "отказ",
|
"cancel" => "отказ",
|
||||||
"undo" => "възтановяване",
|
"undo" => "възтановяване",
|
||||||
|
"Upload Error" => "Възникна грешка при качването",
|
||||||
"Close" => "Затвори",
|
"Close" => "Затвори",
|
||||||
"Upload cancelled." => "Качването е спряно.",
|
"Upload cancelled." => "Качването е спряно.",
|
||||||
"Name" => "Име",
|
"Name" => "Име",
|
||||||
"Size" => "Размер",
|
"Size" => "Размер",
|
||||||
"Modified" => "Променено",
|
"Modified" => "Променено",
|
||||||
|
"1 folder" => "1 папка",
|
||||||
|
"{count} folders" => "{count} папки",
|
||||||
|
"1 file" => "1 файл",
|
||||||
|
"{count} files" => "{count} файла",
|
||||||
"Upload" => "Качване",
|
"Upload" => "Качване",
|
||||||
"Maximum upload size" => "Максимален размер за качване",
|
"Maximum upload size" => "Максимален размер за качване",
|
||||||
"0 is unlimited" => "Ползвайте 0 за без ограничения",
|
"0 is unlimited" => "Ползвайте 0 за без ограничения",
|
||||||
"Save" => "Запис",
|
"Save" => "Запис",
|
||||||
"New" => "Ново",
|
"New" => "Ново",
|
||||||
|
"Text file" => "Текстов файл",
|
||||||
"Folder" => "Папка",
|
"Folder" => "Папка",
|
||||||
|
"Cancel upload" => "Спри качването",
|
||||||
"Nothing in here. Upload something!" => "Няма нищо тук. Качете нещо.",
|
"Nothing in here. Upload something!" => "Няма нищо тук. Качете нещо.",
|
||||||
"Download" => "Изтегляне",
|
"Download" => "Изтегляне",
|
||||||
"Upload too large" => "Файлът който сте избрали за качване е прекалено голям"
|
"Upload too large" => "Файлът който сте избрали за качване е прекалено голям"
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
"Not enough storage available" => "Der er ikke nok plads til rådlighed",
|
"Not enough storage available" => "Der er ikke nok plads til rådlighed",
|
||||||
"Invalid directory." => "Ugyldig mappe.",
|
"Invalid directory." => "Ugyldig mappe.",
|
||||||
"Files" => "Filer",
|
"Files" => "Filer",
|
||||||
|
"Delete permanently" => "Slet permanent",
|
||||||
"Delete" => "Slet",
|
"Delete" => "Slet",
|
||||||
"Rename" => "Omdøb",
|
"Rename" => "Omdøb",
|
||||||
"Pending" => "Afventer",
|
"Pending" => "Afventer",
|
||||||
|
@ -23,6 +24,7 @@
|
||||||
"replaced {new_name}" => "erstattede {new_name}",
|
"replaced {new_name}" => "erstattede {new_name}",
|
||||||
"undo" => "fortryd",
|
"undo" => "fortryd",
|
||||||
"replaced {new_name} with {old_name}" => "erstattede {new_name} med {old_name}",
|
"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.",
|
"'.' is an invalid file name." => "'.' er et ugyldigt filnavn.",
|
||||||
"File name cannot be empty." => "Filnavnet kan ikke stå tomt.",
|
"File name cannot be empty." => "Filnavnet kan ikke stå tomt.",
|
||||||
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ugyldigt navn, '\\', '/', '<', '>', ':' | '?', '\"', '', og '*' er ikke tilladt.",
|
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ugyldigt navn, '\\', '/', '<', '>', ':' | '?', '\"', '', og '*' er ikke tilladt.",
|
||||||
|
@ -65,5 +67,6 @@
|
||||||
"Upload too large" => "Upload for stor",
|
"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.",
|
"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.",
|
"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",
|
"Not enough storage available" => "Nicht genug Speicherplatz verfügbar",
|
||||||
"Invalid directory." => "Ungültiges Verzeichnis.",
|
"Invalid directory." => "Ungültiges Verzeichnis.",
|
||||||
"Files" => "Dateien",
|
"Files" => "Dateien",
|
||||||
|
"Delete permanently" => "Permanent löschen",
|
||||||
"Delete" => "Löschen",
|
"Delete" => "Löschen",
|
||||||
"Rename" => "Umbenennen",
|
"Rename" => "Umbenennen",
|
||||||
"Pending" => "Ausstehend",
|
"Pending" => "Ausstehend",
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
"No file was uploaded" => "No se ha subido ningún archivo",
|
"No file was uploaded" => "No se ha subido ningún archivo",
|
||||||
"Missing a temporary folder" => "Falta un directorio temporal",
|
"Missing a temporary folder" => "Falta un directorio temporal",
|
||||||
"Failed to write to disk" => "La escritura en disco ha fallado",
|
"Failed to write to disk" => "La escritura en disco ha fallado",
|
||||||
|
"Not enough storage available" => "No hay suficiente espacio disponible",
|
||||||
"Invalid directory." => "Directorio invalido.",
|
"Invalid directory." => "Directorio invalido.",
|
||||||
"Files" => "Archivos",
|
"Files" => "Archivos",
|
||||||
"Delete permanently" => "Eliminar permanentemente",
|
"Delete permanently" => "Eliminar permanentemente",
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
"Not enough storage available" => "No hay suficiente capacidad de almacenamiento",
|
"Not enough storage available" => "No hay suficiente capacidad de almacenamiento",
|
||||||
"Invalid directory." => "Directorio invalido.",
|
"Invalid directory." => "Directorio invalido.",
|
||||||
"Files" => "Archivos",
|
"Files" => "Archivos",
|
||||||
|
"Delete permanently" => "Borrar de manera permanente",
|
||||||
"Delete" => "Borrar",
|
"Delete" => "Borrar",
|
||||||
"Rename" => "Cambiar nombre",
|
"Rename" => "Cambiar nombre",
|
||||||
"Pending" => "Pendiente",
|
"Pending" => "Pendiente",
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?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",
|
"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",
|
"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",
|
"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",
|
"No file was uploaded" => "Ühtegi faili ei laetud üles",
|
||||||
"Missing a temporary folder" => "Ajutiste failide kaust puudub",
|
"Missing a temporary folder" => "Ajutiste failide kaust puudub",
|
||||||
"Failed to write to disk" => "Kettale kirjutamine ebaõnnestus",
|
"Failed to write to disk" => "Kettale kirjutamine ebaõnnestus",
|
||||||
|
"Not enough storage available" => "Saadaval pole piisavalt ruumi",
|
||||||
|
"Invalid directory." => "Vigane kaust.",
|
||||||
"Files" => "Failid",
|
"Files" => "Failid",
|
||||||
|
"Delete permanently" => "Kustuta jäädavalt",
|
||||||
"Delete" => "Kustuta",
|
"Delete" => "Kustuta",
|
||||||
"Rename" => "ümber",
|
"Rename" => "ümber",
|
||||||
"Pending" => "Ootel",
|
"Pending" => "Ootel",
|
||||||
|
@ -17,6 +22,8 @@
|
||||||
"replaced {new_name}" => "asendatud nimega {new_name}",
|
"replaced {new_name}" => "asendatud nimega {new_name}",
|
||||||
"undo" => "tagasi",
|
"undo" => "tagasi",
|
||||||
"replaced {new_name} with {old_name}" => "asendas nime {old_name} nimega {new_name}",
|
"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.",
|
"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",
|
"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",
|
"Upload Error" => "Üleslaadimise viga",
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
"Not enough storage available" => "Ez dago behar aina leku erabilgarri,",
|
"Not enough storage available" => "Ez dago behar aina leku erabilgarri,",
|
||||||
"Invalid directory." => "Baliogabeko karpeta.",
|
"Invalid directory." => "Baliogabeko karpeta.",
|
||||||
"Files" => "Fitxategiak",
|
"Files" => "Fitxategiak",
|
||||||
|
"Delete permanently" => "Ezabatu betirako",
|
||||||
"Delete" => "Ezabatu",
|
"Delete" => "Ezabatu",
|
||||||
"Rename" => "Berrizendatu",
|
"Rename" => "Berrizendatu",
|
||||||
"Pending" => "Zain",
|
"Pending" => "Zain",
|
||||||
|
@ -23,6 +24,7 @@
|
||||||
"replaced {new_name}" => "ordezkatua {new_name}",
|
"replaced {new_name}" => "ordezkatua {new_name}",
|
||||||
"undo" => "desegin",
|
"undo" => "desegin",
|
||||||
"replaced {new_name} with {old_name}" => " {new_name}-k {old_name} ordezkatu du",
|
"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.",
|
"'.' is an invalid file name." => "'.' ez da fitxategi izen baliogarria.",
|
||||||
"File name cannot be empty." => "Fitxategi izena ezin da hutsa izan.",
|
"File name cannot be empty." => "Fitxategi izena ezin da hutsa izan.",
|
||||||
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "IZen aliogabea, '\\', '/', '<', '>', ':', '\"', '|', '?' eta '*' ez daude baimenduta.",
|
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "IZen aliogabea, '\\', '/', '<', '>', ':', '\"', '|', '?' eta '*' ez daude baimenduta.",
|
||||||
|
@ -65,5 +67,6 @@
|
||||||
"Upload too large" => "Igotakoa handiegia da",
|
"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.",
|
"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.",
|
"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ä",
|
"Not enough storage available" => "Tallennustilaa ei ole riittävästi käytettävissä",
|
||||||
"Invalid directory." => "Virheellinen kansio.",
|
"Invalid directory." => "Virheellinen kansio.",
|
||||||
"Files" => "Tiedostot",
|
"Files" => "Tiedostot",
|
||||||
|
"Delete permanently" => "Poista pysyvästi",
|
||||||
"Delete" => "Poista",
|
"Delete" => "Poista",
|
||||||
"Rename" => "Nimeä uudelleen",
|
"Rename" => "Nimeä uudelleen",
|
||||||
"Pending" => "Odottaa",
|
"Pending" => "Odottaa",
|
||||||
|
|
|
@ -1,19 +1,21 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?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 - 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",
|
"Could not move %s" => "Non foi posíbel mover %s",
|
||||||
"Unable to rename file" => "Non se pode renomear o ficheiro",
|
"Unable to rename file" => "Non é posíbel renomear o ficheiro",
|
||||||
"No file was uploaded. Unknown error" => "Non se subiu ningún ficheiro. Erro descoñecido.",
|
"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 hai erros. O ficheiro enviouse correctamente",
|
"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 subido excede a directiva indicada polo tamaño_máximo_de_subida de php.ini",
|
"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 supera a directiva MAX_FILE_SIZE que foi indicada no formulario HTML",
|
"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",
|
"The uploaded file was only partially uploaded" => "O ficheiro enviado foi só parcialmente enviado",
|
||||||
"No file was uploaded" => "Non se enviou ningún ficheiro",
|
"No file was uploaded" => "Non se enviou ningún ficheiro",
|
||||||
"Missing a temporary folder" => "Falta un cartafol temporal",
|
"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.",
|
"Invalid directory." => "O directorio é incorrecto.",
|
||||||
"Files" => "Ficheiros",
|
"Files" => "Ficheiros",
|
||||||
|
"Delete permanently" => "Eliminar permanentemente",
|
||||||
"Delete" => "Eliminar",
|
"Delete" => "Eliminar",
|
||||||
"Rename" => "Mudar o nome",
|
"Rename" => "Renomear",
|
||||||
"Pending" => "Pendentes",
|
"Pending" => "Pendentes",
|
||||||
"{new_name} already exists" => "xa existe un {new_name}",
|
"{new_name} already exists" => "xa existe un {new_name}",
|
||||||
"replace" => "substituír",
|
"replace" => "substituír",
|
||||||
|
@ -21,19 +23,23 @@
|
||||||
"cancel" => "cancelar",
|
"cancel" => "cancelar",
|
||||||
"replaced {new_name}" => "substituír {new_name}",
|
"replaced {new_name}" => "substituír {new_name}",
|
||||||
"undo" => "desfacer",
|
"undo" => "desfacer",
|
||||||
"replaced {new_name} with {old_name}" => "substituír {new_name} polo {old_name}",
|
"replaced {new_name} with {old_name}" => "substituír {new_name} por {old_name}",
|
||||||
"'.' is an invalid file name." => "'.' é un nonme de ficheiro non válido",
|
"perform delete operation" => "realizar a operación de eliminación",
|
||||||
"File name cannot be empty." => "O nome de ficheiro non pode estar baldeiro",
|
"'.' is an invalid file name." => "«.» é un nome de ficheiro incorrecto",
|
||||||
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome non válido, '\\', '/', '<', '>', ':', '\"', '|', '?' e '*' non se permiten.",
|
"File name cannot be empty." => "O nome de ficheiro non pode estar baleiro",
|
||||||
"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",
|
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nome incorrecto, non se permite «\\», «/», «<», «>», «:», «\"», «|», «?» e «*».",
|
||||||
"Upload Error" => "Erro na subida",
|
"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",
|
"Close" => "Pechar",
|
||||||
"1 file uploading" => "1 ficheiro subíndose",
|
"1 file uploading" => "Enviándose 1 ficheiro",
|
||||||
"{count} files uploading" => "{count} ficheiros subíndose",
|
"{count} files uploading" => "Enviandose {count} ficheiros",
|
||||||
"Upload cancelled." => "Subida cancelada.",
|
"Upload cancelled." => "Envío cancelado.",
|
||||||
"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.",
|
"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." => "URL non pode quedar baleiro.",
|
"URL cannot be empty." => "O 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",
|
"Invalid folder name. Usage of 'Shared' is reserved by Owncloud" => "Nome de cartafol incorrecto. O uso de «Shared» está reservado por Owncloud",
|
||||||
"Name" => "Nome",
|
"Name" => "Nome",
|
||||||
"Size" => "Tamaño",
|
"Size" => "Tamaño",
|
||||||
"Modified" => "Modificado",
|
"Modified" => "Modificado",
|
||||||
|
@ -43,23 +49,24 @@
|
||||||
"{count} files" => "{count} ficheiros",
|
"{count} files" => "{count} ficheiros",
|
||||||
"Upload" => "Enviar",
|
"Upload" => "Enviar",
|
||||||
"File handling" => "Manexo de ficheiro",
|
"File handling" => "Manexo de ficheiro",
|
||||||
"Maximum upload size" => "Tamaño máximo de envío",
|
"Maximum upload size" => "Tamaño máximo do envío",
|
||||||
"max. possible: " => "máx. posible: ",
|
"max. possible: " => "máx. posíbel: ",
|
||||||
"Needed for multi-file and folder downloads." => "Precísase para a descarga de varios ficheiros e cartafoles.",
|
"Needed for multi-file and folder downloads." => "Precísase para a descarga de varios ficheiros e cartafoles.",
|
||||||
"Enable ZIP-download" => "Habilitar a descarga-ZIP",
|
"Enable ZIP-download" => "Habilitar a descarga-ZIP",
|
||||||
"0 is unlimited" => "0 significa ilimitado",
|
"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",
|
"Save" => "Gardar",
|
||||||
"New" => "Novo",
|
"New" => "Novo",
|
||||||
"Text file" => "Ficheiro de texto",
|
"Text file" => "Ficheiro de texto",
|
||||||
"Folder" => "Cartafol",
|
"Folder" => "Cartafol",
|
||||||
"From link" => "Dende a ligazón",
|
"From link" => "Desde a ligazón",
|
||||||
"Cancel upload" => "Cancelar a subida",
|
"Cancel upload" => "Cancelar o envío",
|
||||||
"Nothing in here. Upload something!" => "Nada por aquí. Envía algo.",
|
"Nothing in here. Upload something!" => "Aquí non hai nada por aquí. Envíe algo.",
|
||||||
"Download" => "Descargar",
|
"Download" => "Descargar",
|
||||||
"Unshare" => "Deixar de compartir",
|
"Unshare" => "Deixar de compartir",
|
||||||
"Upload too large" => "Envío demasiado grande",
|
"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",
|
"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. Agarda.",
|
"Files are being scanned, please wait." => "Estanse analizando os ficheiros. Agarde.",
|
||||||
"Current scanning" => "Análise actual"
|
"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.",
|
"Not enough storage available" => "Nincs elég szabad hely.",
|
||||||
"Invalid directory." => "Érvénytelen mappa.",
|
"Invalid directory." => "Érvénytelen mappa.",
|
||||||
"Files" => "Fájlok",
|
"Files" => "Fájlok",
|
||||||
|
"Delete permanently" => "Végleges törlés",
|
||||||
"Delete" => "Törlés",
|
"Delete" => "Törlés",
|
||||||
"Rename" => "Átnevezés",
|
"Rename" => "Átnevezés",
|
||||||
"Pending" => "Folyamatban",
|
"Pending" => "Folyamatban",
|
||||||
|
@ -23,6 +24,7 @@
|
||||||
"replaced {new_name}" => "a(z) {new_name} állományt kicseréltük",
|
"replaced {new_name}" => "a(z) {new_name} állományt kicseréltük",
|
||||||
"undo" => "visszavonás",
|
"undo" => "visszavonás",
|
||||||
"replaced {new_name} with {old_name}" => "{new_name} fájlt kicseréltük ezzel: {old_name}",
|
"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.",
|
"'.' is an invalid file name." => "'.' fájlnév érvénytelen.",
|
||||||
"File name cannot be empty." => "A fájlnév nem lehet semmi.",
|
"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 '*'",
|
"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",
|
"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.",
|
"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!",
|
"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(
|
<?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",
|
"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",
|
"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ē:",
|
"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",
|
"No file was uploaded" => "Neviena datne netika augšupielādēta",
|
||||||
"Missing a temporary folder" => "Trūkst pagaidu mapes",
|
"Missing a temporary folder" => "Trūkst pagaidu mapes",
|
||||||
"Failed to write to disk" => "Neizdevās saglabāt diskā",
|
"Failed to write to disk" => "Neizdevās saglabāt diskā",
|
||||||
|
"Not enough storage available" => "Nav pietiekami daudz vietas",
|
||||||
"Invalid directory." => "Nederīga direktorija.",
|
"Invalid directory." => "Nederīga direktorija.",
|
||||||
"Files" => "Datnes",
|
"Files" => "Datnes",
|
||||||
"Delete permanently" => "Dzēst pavisam",
|
"Delete permanently" => "Dzēst pavisam",
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
"No file was uploaded" => "Geen bestand geüpload",
|
"No file was uploaded" => "Geen bestand geüpload",
|
||||||
"Missing a temporary folder" => "Een tijdelijke map mist",
|
"Missing a temporary folder" => "Een tijdelijke map mist",
|
||||||
"Failed to write to disk" => "Schrijven naar schijf mislukt",
|
"Failed to write to disk" => "Schrijven naar schijf mislukt",
|
||||||
|
"Not enough storage available" => "Niet genoeg opslagruimte beschikbaar",
|
||||||
"Invalid directory." => "Ongeldige directory.",
|
"Invalid directory." => "Ongeldige directory.",
|
||||||
"Files" => "Bestanden",
|
"Files" => "Bestanden",
|
||||||
"Delete permanently" => "Verwijder definitief",
|
"Delete permanently" => "Verwijder definitief",
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
"Not enough storage available" => "Espaço de armazenamento insuficiente",
|
"Not enough storage available" => "Espaço de armazenamento insuficiente",
|
||||||
"Invalid directory." => "Diretório inválido.",
|
"Invalid directory." => "Diretório inválido.",
|
||||||
"Files" => "Arquivos",
|
"Files" => "Arquivos",
|
||||||
|
"Delete permanently" => "Excluir permanentemente",
|
||||||
"Delete" => "Excluir",
|
"Delete" => "Excluir",
|
||||||
"Rename" => "Renomear",
|
"Rename" => "Renomear",
|
||||||
"Pending" => "Pendente",
|
"Pending" => "Pendente",
|
||||||
|
@ -23,9 +24,12 @@
|
||||||
"replaced {new_name}" => "substituído {new_name}",
|
"replaced {new_name}" => "substituído {new_name}",
|
||||||
"undo" => "desfazer",
|
"undo" => "desfazer",
|
||||||
"replaced {new_name} with {old_name}" => "Substituído {old_name} por {new_name} ",
|
"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.",
|
"'.' 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.",
|
"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.",
|
"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.",
|
"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.",
|
"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",
|
"Upload Error" => "Erro de envio",
|
||||||
|
@ -63,5 +67,6 @@
|
||||||
"Upload too large" => "Arquivo muito grande",
|
"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.",
|
"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.",
|
"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(
|
<?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" => "Файл не был загружен. Неизвестная ошибка",
|
"No file was uploaded. Unknown error" => "Файл не был загружен. Неизвестная ошибка",
|
||||||
"There is no error, the file uploaded with success" => "Ошибка отсутствует, файл загружен успешно.",
|
"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:",
|
"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" => "Файл не был загружен",
|
"No file was uploaded" => "Файл не был загружен",
|
||||||
"Missing a temporary folder" => "Отсутствует временная папка",
|
"Missing a temporary folder" => "Отсутствует временная папка",
|
||||||
"Failed to write to disk" => "Не удалось записать на диск",
|
"Failed to write to disk" => "Не удалось записать на диск",
|
||||||
|
"Not enough storage available" => "Недостаточно места в хранилище",
|
||||||
"Invalid directory." => "Неверный каталог.",
|
"Invalid directory." => "Неверный каталог.",
|
||||||
"Files" => "Файлы",
|
"Files" => "Файлы",
|
||||||
"Delete permanently" => "Удалить навсегда",
|
"Delete permanently" => "Удалить навсегда",
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
"Missing a temporary folder" => "Chýbajúci dočasný priečinok",
|
"Missing a temporary folder" => "Chýbajúci dočasný priečinok",
|
||||||
"Failed to write to disk" => "Zápis na disk sa nepodaril",
|
"Failed to write to disk" => "Zápis na disk sa nepodaril",
|
||||||
"Not enough storage available" => "Nedostatok dostupného úložného priestoru",
|
"Not enough storage available" => "Nedostatok dostupného úložného priestoru",
|
||||||
"Invalid directory." => "Neplatný adresár",
|
"Invalid directory." => "Neplatný priečinok",
|
||||||
"Files" => "Súbory",
|
"Files" => "Súbory",
|
||||||
"Delete permanently" => "Zmazať trvalo",
|
"Delete permanently" => "Zmazať trvalo",
|
||||||
"Delete" => "Odstrániť",
|
"Delete" => "Odstrániť",
|
||||||
|
@ -39,7 +39,7 @@
|
||||||
"Upload cancelled." => "Odosielanie zrušené",
|
"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.",
|
"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",
|
"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",
|
"Name" => "Meno",
|
||||||
"Size" => "Veľkosť",
|
"Size" => "Veľkosť",
|
||||||
"Modified" => "Upravené",
|
"Modified" => "Upravené",
|
||||||
|
@ -48,10 +48,10 @@
|
||||||
"1 file" => "1 súbor",
|
"1 file" => "1 súbor",
|
||||||
"{count} files" => "{count} súborov",
|
"{count} files" => "{count} súborov",
|
||||||
"Upload" => "Odoslať",
|
"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",
|
"Maximum upload size" => "Maximálna veľkosť odosielaného súboru",
|
||||||
"max. possible: " => "najväčšie možné:",
|
"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",
|
"Enable ZIP-download" => "Povoliť sťahovanie ZIP súborov",
|
||||||
"0 is unlimited" => "0 znamená neobmedzené",
|
"0 is unlimited" => "0 znamená neobmedzené",
|
||||||
"Maximum input size for ZIP files" => "Najväčšia veľkosť ZIP súborov",
|
"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ý",
|
"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.",
|
"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é.",
|
"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..."
|
"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",
|
"Not enough storage available" => "Inte tillräckligt med lagringsutrymme tillgängligt",
|
||||||
"Invalid directory." => "Felaktig mapp.",
|
"Invalid directory." => "Felaktig mapp.",
|
||||||
"Files" => "Filer",
|
"Files" => "Filer",
|
||||||
|
"Delete permanently" => "Radera permanent",
|
||||||
"Delete" => "Radera",
|
"Delete" => "Radera",
|
||||||
"Rename" => "Byt namn",
|
"Rename" => "Byt namn",
|
||||||
"Pending" => "Väntar",
|
"Pending" => "Väntar",
|
||||||
|
|
|
@ -10,8 +10,10 @@
|
||||||
"No file was uploaded" => "無已上傳檔案",
|
"No file was uploaded" => "無已上傳檔案",
|
||||||
"Missing a temporary folder" => "遺失暫存資料夾",
|
"Missing a temporary folder" => "遺失暫存資料夾",
|
||||||
"Failed to write to disk" => "寫入硬碟失敗",
|
"Failed to write to disk" => "寫入硬碟失敗",
|
||||||
|
"Not enough storage available" => "儲存空間不足",
|
||||||
"Invalid directory." => "無效的資料夾。",
|
"Invalid directory." => "無效的資料夾。",
|
||||||
"Files" => "檔案",
|
"Files" => "檔案",
|
||||||
|
"Delete permanently" => "永久刪除",
|
||||||
"Delete" => "刪除",
|
"Delete" => "刪除",
|
||||||
"Rename" => "重新命名",
|
"Rename" => "重新命名",
|
||||||
"Pending" => "等候中",
|
"Pending" => "等候中",
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
</div>
|
</div>
|
||||||
<?php if ($_['trash'] ): ?>
|
<?php if ($_['trash'] ): ?>
|
||||||
<div id="trash" class="button">
|
<div id="trash" class="button">
|
||||||
<a><?php echo $l->t('Trash bin');?></a>
|
<a><?php echo $l->t('Deleted files');?></a>
|
||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<div id="uploadprogresswrapper">
|
<div id="uploadprogresswrapper">
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php if(count($_["breadcrumb"])):?>
|
<?php if(count($_["breadcrumb"])):?>
|
||||||
<div class="crumb">
|
<div class="crumb">
|
||||||
<a href="<?php echo $_['baseURL']; ?>">
|
<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>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<?php endif;?>
|
<?php endif;?>
|
||||||
|
|
|
@ -40,7 +40,7 @@ class Hooks {
|
||||||
|
|
||||||
// Manually initialise Filesystem{} singleton with correct
|
// Manually initialise Filesystem{} singleton with correct
|
||||||
// fake root path, in order to avoid fatal webdav errors
|
// 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( '/' );
|
$view = new \OC_FilesystemView( '/' );
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
"Encryption" => "Kryptering",
|
"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"
|
"None" => "Ingen"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
"Encryption" => "Verschlüsselung",
|
"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"
|
"None" => "Keine"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
"Encryption" => "Encriptación",
|
"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"
|
"None" => "Ninguno"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
"Encryption" => "Krüpteerimine",
|
"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"
|
"None" => "Pole"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
"Encryption" => "Enkriptazioa",
|
"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"
|
"None" => "Bat ere ez"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
"Encryption" => "Salaus",
|
"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"
|
"None" => "Ei mitään"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
"Encryption" => "Cifrado",
|
"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(
|
<?php $TRANSLATIONS = array(
|
||||||
"Encryption" => "Titkosítás",
|
"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"
|
"None" => "Egyik sem"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
"Encryption" => "Szyfrowanie",
|
"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"
|
"None" => "Brak"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
"Encryption" => "Criptografia",
|
"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"
|
"None" => "Nenhuma"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
"Encryption" => "Encriptação",
|
"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"
|
"None" => "Nenhum"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
"Encryption" => "Šifrovanie",
|
"Encryption" => "Šifrovanie",
|
||||||
"File encryption is enabled." => "Kryptovanie súborov nastavené.",
|
"File encryption is enabled." => "Šifrovanie súborov nastavené.",
|
||||||
"The following file types will not be encrypted:" => "Uvedené typy súborov nebudú kryptované:",
|
"The following file types will not be encrypted:" => "Uvedené typy súborov nebudú šifrované:",
|
||||||
"Exclude the following file types from encryption:" => "Nekryptovať uvedené typy súborov",
|
"Exclude the following file types from encryption:" => "Nešifrovať uvedené typy súborov",
|
||||||
"None" => "Žiadne"
|
"None" => "Žiadne"
|
||||||
);
|
);
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
phpseclib Lead Developer: TerraFrost (Jim Wigginton)
|
||||||
|
|
||||||
|
phpseclib Developers: monnerat (Patrick Monnerat)
|
|
@ -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.
|
|
@ -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)
|
|
@ -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/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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:
|
File diff suppressed because it is too large
Load Diff
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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:
|
File diff suppressed because it is too large
Load Diff
|
@ -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);
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -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>';
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,6 @@
|
||||||
|
# minimalist openssl.cnf file for use with phpseclib
|
||||||
|
|
||||||
|
HOME = .
|
||||||
|
RANDFILE = $ENV::HOME/.rnd
|
||||||
|
|
||||||
|
[ v3_ca ]
|
|
@ -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
|
<?php
|
||||||
|
|
||||||
OCP\JSON::checkAppEnabled('files_external');
|
OCP\JSON::checkAppEnabled('files_external');
|
||||||
|
OCP\JSON::callCheck();
|
||||||
|
|
||||||
if ( ! ($filename = $_FILES['rootcert_import']['name']) ) {
|
if ( ! ($filename = $_FILES['rootcert_import']['name']) ) {
|
||||||
header("Location: settings/personal.php");
|
header("Location: settings/personal.php");
|
||||||
|
|
|
@ -4,6 +4,8 @@ require_once 'Dropbox/autoload.php';
|
||||||
|
|
||||||
OCP\JSON::checkAppEnabled('files_external');
|
OCP\JSON::checkAppEnabled('files_external');
|
||||||
OCP\JSON::checkLoggedIn();
|
OCP\JSON::checkLoggedIn();
|
||||||
|
OCP\JSON::callCheck();
|
||||||
|
|
||||||
if (isset($_POST['app_key']) && isset($_POST['app_secret'])) {
|
if (isset($_POST['app_key']) && isset($_POST['app_secret'])) {
|
||||||
$oauth = new Dropbox_OAuth_Curl($_POST['app_key'], $_POST['app_secret']);
|
$oauth = new Dropbox_OAuth_Curl($_POST['app_key'], $_POST['app_secret']);
|
||||||
if (isset($_POST['step'])) {
|
if (isset($_POST['step'])) {
|
||||||
|
|
|
@ -4,6 +4,8 @@ require_once 'Google/common.inc.php';
|
||||||
|
|
||||||
OCP\JSON::checkAppEnabled('files_external');
|
OCP\JSON::checkAppEnabled('files_external');
|
||||||
OCP\JSON::checkLoggedIn();
|
OCP\JSON::checkLoggedIn();
|
||||||
|
OCP\JSON::callCheck();
|
||||||
|
|
||||||
$consumer = new OAuthConsumer('anonymous', 'anonymous');
|
$consumer = new OAuthConsumer('anonymous', 'anonymous');
|
||||||
$sigMethod = new OAuthSignatureMethod_HMAC_SHA1();
|
$sigMethod = new OAuthSignatureMethod_HMAC_SHA1();
|
||||||
if (isset($_POST['step'])) {
|
if (isset($_POST['step'])) {
|
||||||
|
|
|
@ -3,6 +3,15 @@
|
||||||
OCP\JSON::checkAppEnabled('files_external');
|
OCP\JSON::checkAppEnabled('files_external');
|
||||||
OCP\JSON::callCheck();
|
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') {
|
if ($_POST['isPersonal'] == 'true') {
|
||||||
OCP\JSON::checkLoggedIn();
|
OCP\JSON::checkLoggedIn();
|
||||||
$isPersonal = true;
|
$isPersonal = true;
|
||||||
|
@ -10,4 +19,5 @@ if ($_POST['isPersonal'] == 'true') {
|
||||||
OCP\JSON::checkAdminUser();
|
OCP\JSON::checkAdminUser();
|
||||||
$isPersonal = false;
|
$isPersonal = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
OC_Mount_Config::removeMountPoint($_POST['mountPoint'], $_POST['mountType'], $_POST['applicable'], $isPersonal);
|
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\SMB']='apps/files_external/lib/smb.php';
|
||||||
OC::$CLASSPATH['OC\Files\Storage\AmazonS3']='apps/files_external/lib/amazons3.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\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';
|
OC::$CLASSPATH['OC_Mount_Config']='apps/files_external/lib/config.php';
|
||||||
|
|
||||||
OCP\App::registerAdmin('files_external', 'settings');
|
OCP\App::registerAdmin('files_external', 'settings');
|
||||||
|
|
|
@ -47,7 +47,7 @@ OC.MountConfig={
|
||||||
oldUsers.splice($.inArray(applicable, oldUsers), 1);
|
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';
|
var mountType = 'group';
|
||||||
$.each(oldGroups, function(index, applicable) {
|
$.each(oldGroups, function(index, applicable) {
|
||||||
|
@ -61,7 +61,7 @@ OC.MountConfig={
|
||||||
var isPersonal = true;
|
var isPersonal = true;
|
||||||
var mountType = 'user';
|
var mountType = 'user';
|
||||||
var applicable = OC.currentUser;
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
"Error configuring Dropbox storage" => "Virhe Dropbox levyn asetuksia tehtäessä",
|
"Error configuring Dropbox storage" => "Virhe Dropbox levyn asetuksia tehtäessä",
|
||||||
"Grant access" => "Salli pääsy",
|
"Grant access" => "Salli pääsy",
|
||||||
"Fill out all required fields" => "Täytä kaikki vaaditut kentät",
|
"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ä",
|
"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> \"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.",
|
"<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.",
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
<?php $TRANSLATIONS = array(
|
||||||
|
"Users" => "उपयोगकर्ता"
|
||||||
|
);
|
|
@ -15,12 +15,12 @@
|
||||||
"Applicable" => "Aplikovateľné",
|
"Applicable" => "Aplikovateľné",
|
||||||
"Add mount point" => "Pridať prípojný bod",
|
"Add mount point" => "Pridať prípojný bod",
|
||||||
"None set" => "Žiadne nastavené",
|
"None set" => "Žiadne nastavené",
|
||||||
"All Users" => "Všetci užívatelia",
|
"All Users" => "Všetci používatelia",
|
||||||
"Groups" => "Skupiny",
|
"Groups" => "Skupiny",
|
||||||
"Users" => "Užívatelia",
|
"Users" => "Používatelia",
|
||||||
"Delete" => "Odstrániť",
|
"Delete" => "Odstrániť",
|
||||||
"Enable User External Storage" => "Povoliť externé úložisko",
|
"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",
|
"SSL root certificates" => "Koreňové SSL certifikáty",
|
||||||
"Import Root Certificate" => "Importovať koreňový certifikát"
|
"Import Root Certificate" => "Importovať koreňový certifikát"
|
||||||
);
|
);
|
||||||
|
|
|
@ -105,6 +105,14 @@ class OC_Mount_Config {
|
||||||
'root' => '&Root',
|
'root' => '&Root',
|
||||||
'secure' => '!Secure https://'));
|
'secure' => '!Secure https://'));
|
||||||
|
|
||||||
|
$backends['\OC\Files\Storage\SFTP']=array(
|
||||||
|
'backend' => 'SFTP',
|
||||||
|
'configuration' => array(
|
||||||
|
'host' => 'URL',
|
||||||
|
'user' => 'Username',
|
||||||
|
'password' => '*Password',
|
||||||
|
'root' => '&Root'));
|
||||||
|
|
||||||
return($backends);
|
return($backends);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -45,7 +45,10 @@ class SMB extends \OC\Files\Storage\StreamWrapper{
|
||||||
if (substr($path, -1)=='/') {
|
if (substr($path, -1)=='/') {
|
||||||
$path=substr($path, 0, -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) {
|
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
|
* check if a file or folder has been updated since $time
|
||||||
* @param string $path
|
* @param string $path
|
||||||
|
|
|
@ -83,7 +83,7 @@
|
||||||
<select class="chzn-select"
|
<select class="chzn-select"
|
||||||
multiple style="width:20em;"
|
multiple style="width:20em;"
|
||||||
data-placeholder="<?php echo $l->t('None set'); ?>">
|
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'); ?>">
|
<optgroup label="<?php echo $l->t('Groups'); ?>">
|
||||||
<?php foreach ($_['groups'] as $group): ?>
|
<?php foreach ($_['groups'] as $group): ?>
|
||||||
<option value="<?php echo $group; ?>(group)"
|
<option value="<?php echo $group; ?>(group)"
|
||||||
|
|
|
@ -51,5 +51,12 @@ return array(
|
||||||
'app_secret' => '',
|
'app_secret' => '',
|
||||||
'token' => '',
|
'token' => '',
|
||||||
'token_secret' => ''
|
'token_secret' => ''
|
||||||
|
),
|
||||||
|
'sftp' => array (
|
||||||
|
'run'=>false,
|
||||||
|
'host'=>'localhost',
|
||||||
|
'user'=>'test',
|
||||||
|
'password'=>'test',
|
||||||
|
'root'=>'/test'
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
|
@ -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;
|
background:#eee;
|
||||||
border-bottom:1px solid #f8f8f8;
|
border-bottom:1px solid #f8f8f8;
|
||||||
min-height:30em;
|
min-height:30em;
|
||||||
padding-top:2em;
|
|
||||||
text-align:center;
|
text-align:center;
|
||||||
margin:50px auto;
|
margin:45px auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
#noPreview {
|
#noPreview {
|
||||||
|
@ -60,6 +59,7 @@ p.info a {
|
||||||
#imgframe {
|
#imgframe {
|
||||||
height:75%;
|
height:75%;
|
||||||
padding-bottom:2em;
|
padding-bottom:2em;
|
||||||
|
padding-top:2em;
|
||||||
width:80%;
|
width:80%;
|
||||||
margin:0 auto;
|
margin:0 auto;
|
||||||
}
|
}
|
||||||
|
@ -68,3 +68,7 @@ p.info a {
|
||||||
max-height:100%;
|
max-height:100%;
|
||||||
max-width:100%;
|
max-width:100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
thead{
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|
|
@ -390,7 +390,7 @@ class Shared extends \OC\Files\Storage\Common {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function setup($options) {
|
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'];
|
$user_dir = $options['user_dir'];
|
||||||
\OC\Files\Filesystem::mount('\OC\Files\Storage\Shared', array('sharedFolder' => '/Shared'), $user_dir.'/Shared/');
|
\OC\Files\Filesystem::mount('\OC\Files\Storage\Shared', array('sharedFolder' => '/Shared'), $user_dir.'/Shared/');
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,67 +1,18 @@
|
||||||
<?php
|
<?php
|
||||||
|
$RUNTIME_NOSETUPFS = true;
|
||||||
// Load other apps for file previews
|
// Load other apps for file previews
|
||||||
OC_App::loadApps();
|
OC_App::loadApps();
|
||||||
|
|
||||||
// Compatibility with shared-by-link items from ownCloud 4.0
|
function fileCmp($a, $b) {
|
||||||
// requires old Sharing table !
|
if ($a['type'] == 'dir' and $b['type'] != 'dir') {
|
||||||
// support will be removed in OC 5.0,a
|
return -1;
|
||||||
if (isset($_GET['token'])) {
|
} elseif ($a['type'] != 'dir' and $b['type'] == 'dir') {
|
||||||
unset($_GET['file']);
|
return 1;
|
||||||
$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 {
|
} else {
|
||||||
$_GET['file'] = $filepath;
|
return strnatcasecmp($a['name'], $b['name']);
|
||||||
}
|
|
||||||
\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'];
|
|
||||||
} else {
|
|
||||||
$rootView = new \OC\Files\View('');
|
|
||||||
$meta = $rootView->getFileInfo($path);
|
|
||||||
$fileSource = $meta['fileid'];
|
|
||||||
}
|
|
||||||
|
|
||||||
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'])) {
|
if (isset($_GET['t'])) {
|
||||||
$token = $_GET['t'];
|
$token = $_GET['t'];
|
||||||
$linkItem = OCP\Share::getShareByToken($token);
|
$linkItem = OCP\Share::getShareByToken($token);
|
||||||
|
@ -70,61 +21,30 @@ if (isset($_GET['t'])) {
|
||||||
$type = $linkItem['item_type'];
|
$type = $linkItem['item_type'];
|
||||||
$fileSource = $linkItem['file_source'];
|
$fileSource = $linkItem['file_source'];
|
||||||
$shareOwner = $linkItem['uid_owner'];
|
$shareOwner = $linkItem['uid_owner'];
|
||||||
|
$fileOwner = null;
|
||||||
if (OCP\User::userExists($shareOwner) && $fileSource != -1 ) {
|
$path = null;
|
||||||
|
if (isset($linkItem['parent'])) {
|
||||||
$pathAndUser = getPathAndUser($linkItem['file_source']);
|
$parent = $linkItem['parent'];
|
||||||
$fileOwner = $pathAndUser['user'];
|
while (isset($parent)) {
|
||||||
|
$query = \OC_DB::prepare('SELECT `parent`, `uid_owner` FROM `*PREFIX*share` WHERE `id` = ?', 1);
|
||||||
//if this is a reshare check the file owner also exists
|
$item = $query->execute(array($parent))->fetchRow();
|
||||||
if ($shareOwner != $fileOwner && ! OCP\User::userExists($fileOwner)) {
|
if (isset($item['parent'])) {
|
||||||
OCP\Util::writeLog('share', 'original file owner '.$fileOwner
|
$parent = $item['parent'];
|
||||||
.' does not exist for share '.$linkItem['id'], \OCP\Util::ERROR);
|
} else {
|
||||||
header('HTTP/1.0 404 Not Found');
|
$fileOwner = $item['uid_owner'];
|
||||||
$tmpl = new OCP\Template('', '404', 'guest');
|
break;
|
||||||
$tmpl->printPage();
|
|
||||||
exit();
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
//mount filesystem of file owner
|
} else {
|
||||||
|
$fileOwner = $shareOwner;
|
||||||
|
}
|
||||||
|
if (isset($fileOwner)) {
|
||||||
OC_Util::setupFS($fileOwner);
|
OC_Util::setupFS($fileOwner);
|
||||||
}
|
$path = \OC\Files\Filesystem::getPath($linkItem['file_source']);
|
||||||
}
|
|
||||||
} 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$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($path)) {
|
||||||
|
|
||||||
if ($linkItem) {
|
|
||||||
if (!isset($linkItem['item_type'])) {
|
if (!isset($linkItem['item_type'])) {
|
||||||
OCP\Util::writeLog('share', 'No item type set for share id: ' . $linkItem['id'], \OCP\Util::ERROR);
|
OCP\Util::writeLog('share', 'No item type set for share id: ' . $linkItem['id'], \OCP\Util::ERROR);
|
||||||
header('HTTP/1.0 404 Not Found');
|
header('HTTP/1.0 404 Not Found');
|
||||||
|
@ -181,36 +101,23 @@ if ($linkItem) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$basePath = substr($pathAndUser['path'], strlen('/' . $fileOwner . '/files'));
|
$basePath = $path;
|
||||||
$path = $basePath;
|
if (isset($_GET['path']) && \OC\Files\Filesystem::isReadable($basePath . $_GET['path'])) {
|
||||||
if (isset($_GET['path'])) {
|
$getPath = \OC\Files\Filesystem::normalizePath($_GET['path']);
|
||||||
$path .= $_GET['path'];
|
$path .= $getPath;
|
||||||
}
|
} else {
|
||||||
if (!$path || !\OC\Files\Filesystem::isValidPath($path) || !\OC\Files\Filesystem::file_exists($path)) {
|
$getPath = '';
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
$dir = dirname($path);
|
$dir = dirname($path);
|
||||||
$file = basename($path);
|
$file = basename($path);
|
||||||
// Download the file
|
// Download the file
|
||||||
if (isset($_GET['download'])) {
|
if (isset($_GET['download'])) {
|
||||||
if (isset($_GET['path']) && $_GET['path'] !== '') {
|
|
||||||
if (isset($_GET['files'])) { // download selected files
|
if (isset($_GET['files'])) { // download selected files
|
||||||
OC_Files::get($path, $_GET['files'], $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
OC_Files::get($path, $_GET['files'], $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
||||||
} else {
|
} 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);
|
OC_Files::get($dir, $file, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
||||||
}
|
}
|
||||||
}
|
exit();
|
||||||
} else { // download a single shared file
|
|
||||||
OC_Files::get($dir, $file, $_SERVER['REQUEST_METHOD'] == 'HEAD' ? true : false);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
OCP\Util::addStyle('files_sharing', 'public');
|
OCP\Util::addStyle('files_sharing', 'public');
|
||||||
OCP\Util::addScript('files_sharing', 'public');
|
OCP\Util::addScript('files_sharing', 'public');
|
||||||
|
@ -218,183 +125,48 @@ if ($linkItem) {
|
||||||
$tmpl = new OCP\Template('files_sharing', 'public', 'base');
|
$tmpl = new OCP\Template('files_sharing', 'public', 'base');
|
||||||
$tmpl->assign('uidOwner', $shareOwner);
|
$tmpl->assign('uidOwner', $shareOwner);
|
||||||
$tmpl->assign('displayName', \OCP\User::getDisplayName($shareOwner));
|
$tmpl->assign('displayName', \OCP\User::getDisplayName($shareOwner));
|
||||||
$tmpl->assign('dir', $dir);
|
|
||||||
$tmpl->assign('filename', $file);
|
$tmpl->assign('filename', $file);
|
||||||
$tmpl->assign('mimetype', \OC\Files\Filesystem::getMimeType($path));
|
$tmpl->assign('mimetype', \OC\Files\Filesystem::getMimeType($path));
|
||||||
if (isset($_GET['path'])) {
|
$tmpl->assign('fileTarget', basename($linkItem['file_target']));
|
||||||
$getPath = $_GET['path'];
|
|
||||||
} else {
|
|
||||||
$getPath = '';
|
|
||||||
}
|
|
||||||
//
|
|
||||||
$urlLinkIdentifiers= (isset($token)?'&t='.$token:'')
|
$urlLinkIdentifiers= (isset($token)?'&t='.$token:'')
|
||||||
.(isset($_GET['dir'])?'&dir='.$_GET['dir']:'')
|
.(isset($_GET['dir'])?'&dir='.$_GET['dir']:'')
|
||||||
.(isset($_GET['file'])?'&file='.$_GET['file']:'');
|
.(isset($_GET['file'])?'&file='.$_GET['file']:'');
|
||||||
// Show file list
|
// Show file list
|
||||||
if (\OC\Files\Filesystem::is_dir($path)) {
|
if (\OC\Files\Filesystem::is_dir($path)) {
|
||||||
|
$tmpl->assign('dir', $getPath);
|
||||||
|
|
||||||
OCP\Util::addStyle('files', 'files');
|
OCP\Util::addStyle('files', 'files');
|
||||||
OCP\Util::addScript('files', 'files');
|
OCP\Util::addScript('files', 'files');
|
||||||
OCP\Util::addScript('files', 'filelist');
|
OCP\Util::addScript('files', 'filelist');
|
||||||
OCP\Util::addscript('files', 'keyboardshortcuts');
|
OCP\Util::addscript('files', 'keyboardshortcuts');
|
||||||
$files = array();
|
$files = array();
|
||||||
$rootLength = strlen($basePath) + 1;
|
$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']);
|
$i['date'] = OCP\Util::formatDate($i['mtime']);
|
||||||
if ($i['type'] == 'file') {
|
if ($i['type'] == 'file') {
|
||||||
$fileinfo = pathinfo($i['name']);
|
$fileinfo = pathinfo($i['name']);
|
||||||
$i['basename'] = $fileinfo['filename'];
|
$i['basename'] = $fileinfo['filename'];
|
||||||
$i['extension'] = isset($fileinfo['extension']) ? ('.' . $fileinfo['extension']) : '';
|
if (!empty($fileinfo['extension'])) {
|
||||||
|
$i['extension'] = '.' . $fileinfo['extension'];
|
||||||
|
} else {
|
||||||
|
$i['extension'] = '';
|
||||||
}
|
}
|
||||||
$i['directory'] = '/' . substr($i['directory'], $rootLength);
|
|
||||||
if ($i['directory'] == '/') {
|
|
||||||
$i['directory'] = '';
|
|
||||||
}
|
}
|
||||||
|
$i['directory'] = $getPath;
|
||||||
$i['permissions'] = OCP\PERMISSION_READ;
|
$i['permissions'] = OCP\PERMISSION_READ;
|
||||||
$files[] = $i;
|
$files[] = $i;
|
||||||
}
|
}
|
||||||
|
usort($files, "fileCmp");
|
||||||
|
|
||||||
// Make breadcrumb
|
// Make breadcrumb
|
||||||
$breadcrumb = array();
|
$breadcrumb = array();
|
||||||
$pathtohere = '';
|
$pathtohere = '';
|
||||||
|
foreach (explode('/', $getPath) as $i) {
|
||||||
//add base breadcrumb
|
|
||||||
$breadcrumb[] = array('dir' => '/', 'name' => basename($basePath));
|
|
||||||
|
|
||||||
//add subdir breadcrumbs
|
|
||||||
foreach (explode('/', urldecode($getPath)) as $i) {
|
|
||||||
if ($i != '') {
|
if ($i != '') {
|
||||||
$pathtohere .= '/' . $i;
|
$pathtohere .= '/' . $i;
|
||||||
$breadcrumb[] = array('dir' => $pathtohere, 'name' => $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 = new OCP\Template('files', 'part.list', '');
|
||||||
$list->assign('files', $files, false);
|
$list->assign('files', $files, false);
|
||||||
$list->assign('disableSharing', true);
|
$list->assign('disableSharing', true);
|
||||||
|
@ -406,22 +178,34 @@ if ($linkItem) {
|
||||||
$folder = new OCP\Template('files', 'index', '');
|
$folder = new OCP\Template('files', 'index', '');
|
||||||
$folder->assign('fileList', $list->fetchPage(), false);
|
$folder->assign('fileList', $list->fetchPage(), false);
|
||||||
$folder->assign('breadcrumb', $breadcrumbNav->fetchPage(), false);
|
$folder->assign('breadcrumb', $breadcrumbNav->fetchPage(), false);
|
||||||
$folder->assign('dir', basename($dir));
|
$folder->assign('dir', $getPath);
|
||||||
$folder->assign('isCreatable', false);
|
$folder->assign('isCreatable', false);
|
||||||
$folder->assign('permissions', 0);
|
$folder->assign('permissions', 0);
|
||||||
$folder->assign('files', $files);
|
$folder->assign('files', $files);
|
||||||
$folder->assign('uploadMaxFilesize', 0);
|
$folder->assign('uploadMaxFilesize', 0);
|
||||||
$folder->assign('uploadMaxHumanFilesize', 0);
|
$folder->assign('uploadMaxHumanFilesize', 0);
|
||||||
$folder->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
|
$folder->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
|
||||||
|
$folder->assign('usedSpacePercent', 0);
|
||||||
$tmpl->assign('folder', $folder->fetchPage(), false);
|
$tmpl->assign('folder', $folder->fetchPage(), false);
|
||||||
$tmpl->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
|
$tmpl->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
|
||||||
|
$tmpl->assign('downloadURL', OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&download&path=' . urlencode($getPath));
|
||||||
|
} else {
|
||||||
|
$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')
|
$tmpl->assign('downloadURL', OCP\Util::linkToPublic('files')
|
||||||
.$urlLinkIdentifiers.'&download&path='.urlencode($getPath));
|
.$urlLinkIdentifiers.'&download&path='.urlencode($getPath));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$tmpl->printPage();
|
||||||
|
}
|
||||||
|
exit();
|
||||||
} else {
|
} else {
|
||||||
OCP\Util::writeLog('share', 'could not resolve linkItem', \OCP\Util::DEBUG);
|
OCP\Util::writeLog('share', 'could not resolve linkItem', \OCP\Util::DEBUG);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
header('HTTP/1.0 404 Not Found');
|
header('HTTP/1.0 404 Not Found');
|
||||||
$tmpl = new OCP\Template('', '404', 'guest');
|
$tmpl = new OCP\Template('', '404', 'guest');
|
||||||
$tmpl->printPage();
|
$tmpl->printPage();
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
<form action="<?php echo $_['URL']; ?>" method="post">
|
<form action="<?php echo $_['URL']; ?>" method="post">
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<p>
|
<p class="infield">
|
||||||
<label for="password" class="infield"><?php echo $l->t('Password'); ?></label>
|
<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'); ?>" />
|
<input type="submit" value="<?php echo $l->t('Submit'); ?>" />
|
||||||
</p>
|
</p>
|
||||||
</fieldset>
|
</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>
|
<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">
|
<div class="header-right">
|
||||||
<?php if (isset($_['folder'])): ?>
|
<?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: ?>
|
<?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 endif; ?>
|
||||||
<?php if (!isset($_['folder']) || $_['allowZipDownload']): ?>
|
<?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>
|
<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; ?>
|
<?php endif; ?>
|
||||||
<ul id="noPreview">
|
<ul id="noPreview">
|
||||||
<li class="error">
|
<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>
|
<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>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<info>
|
<info>
|
||||||
<id>files_trashbin</id>
|
<id>files_trashbin</id>
|
||||||
<name>Trash</name>
|
<name>Trash bin</name>
|
||||||
<description>Trash bin</description>
|
<description>Keep a copy of deleted files so that they can be restored if needed</description>
|
||||||
<licence>AGPL</licence>
|
<licence>AGPL</licence>
|
||||||
<author>Bjoern Schiessle</author>
|
<author>Bjoern Schiessle</author>
|
||||||
<shipped>true</shipped>
|
<shipped>true</shipped>
|
||||||
|
|
|
@ -1,4 +1,14 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
|
"Couldn't delete %s permanently" => "Невъзможно изтриване на %s завинаги",
|
||||||
|
"Couldn't restore %s" => "Невъзможно възтановяване на %s",
|
||||||
|
"perform restore operation" => "извършване на действие по възтановяване",
|
||||||
|
"delete file permanently" => "изтриване на файла завинаги",
|
||||||
"Name" => "Име",
|
"Name" => "Име",
|
||||||
|
"Deleted" => "Изтрито",
|
||||||
|
"1 folder" => "1 папка",
|
||||||
|
"{count} folders" => "{count} папки",
|
||||||
|
"1 file" => "1 файл",
|
||||||
|
"{count} files" => "{count} файла",
|
||||||
|
"Nothing in here. Your trash bin is empty!" => "Няма нищо. Кофата е празна!",
|
||||||
"Restore" => "Възтановяване"
|
"Restore" => "Възтановяване"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,8 +1,14 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?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",
|
"Name" => "Navn",
|
||||||
|
"Deleted" => "Slettet",
|
||||||
"1 folder" => "1 mappe",
|
"1 folder" => "1 mappe",
|
||||||
"{count} folders" => "{count} mapper",
|
"{count} folders" => "{count} mapper",
|
||||||
"1 file" => "1 fil",
|
"1 file" => "1 fil",
|
||||||
"{count} files" => "{count} filer",
|
"{count} files" => "{count} filer",
|
||||||
|
"Nothing in here. Your trash bin is empty!" => "Intet at se her. Din papirkurv er tom!",
|
||||||
"Restore" => "Gendan"
|
"Restore" => "Gendan"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?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",
|
"perform restore operation" => "Wiederherstellung ausführen",
|
||||||
|
"delete file permanently" => "Datei permanent löschen",
|
||||||
"Name" => "Name",
|
"Name" => "Name",
|
||||||
"Deleted" => "gelöscht",
|
"Deleted" => "gelöscht",
|
||||||
"1 folder" => "1 Ordner",
|
"1 folder" => "1 Ordner",
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?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",
|
"perform restore operation" => "Führe die Wiederherstellung aus",
|
||||||
"delete file permanently" => "Datei entgültig löschen",
|
"delete file permanently" => "Datei entgültig löschen",
|
||||||
"Name" => "Name",
|
"Name" => "Name",
|
||||||
|
|
|
@ -1,8 +1,14 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?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",
|
"Name" => "Nombre",
|
||||||
|
"Deleted" => "Borrado",
|
||||||
"1 folder" => "1 directorio",
|
"1 folder" => "1 directorio",
|
||||||
"{count} folders" => "{count} directorios",
|
"{count} folders" => "{count} directorios",
|
||||||
"1 file" => "1 archivo",
|
"1 file" => "1 archivo",
|
||||||
"{count} files" => "{count} archivos",
|
"{count} files" => "{count} archivos",
|
||||||
|
"Nothing in here. Your trash bin is empty!" => "No hay nada acá. ¡La papelera está vacía!",
|
||||||
"Restore" => "Recuperar"
|
"Restore" => "Recuperar"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,7 +1,14 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?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",
|
"Name" => "Nimi",
|
||||||
|
"Deleted" => "Kustutatud",
|
||||||
"1 folder" => "1 kaust",
|
"1 folder" => "1 kaust",
|
||||||
"{count} folders" => "{count} kausta",
|
"{count} folders" => "{count} kausta",
|
||||||
"1 file" => "1 fail",
|
"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(
|
<?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",
|
"Name" => "Izena",
|
||||||
|
"Deleted" => "Ezabatuta",
|
||||||
"1 folder" => "karpeta bat",
|
"1 folder" => "karpeta bat",
|
||||||
"{count} folders" => "{count} karpeta",
|
"{count} folders" => "{count} karpeta",
|
||||||
"1 file" => "fitxategi bat",
|
"1 file" => "fitxategi bat",
|
||||||
"{count} files" => "{count} fitxategi",
|
"{count} files" => "{count} fitxategi",
|
||||||
|
"Nothing in here. Your trash bin is empty!" => "Ez dago ezer ez. Zure zakarrontzia hutsik dago!",
|
||||||
"Restore" => "Berrezarri"
|
"Restore" => "Berrezarri"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?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",
|
"perform restore operation" => "suorita palautustoiminto",
|
||||||
|
"delete file permanently" => "poista tiedosto pysyvästi",
|
||||||
"Name" => "Nimi",
|
"Name" => "Nimi",
|
||||||
"Deleted" => "Poistettu",
|
"Deleted" => "Poistettu",
|
||||||
"1 folder" => "1 kansio",
|
"1 folder" => "1 kansio",
|
||||||
|
|
|
@ -1,8 +1,14 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?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",
|
"Name" => "Nome",
|
||||||
|
"Deleted" => "Eliminado",
|
||||||
"1 folder" => "1 cartafol",
|
"1 folder" => "1 cartafol",
|
||||||
"{count} folders" => "{count} cartafoles",
|
"{count} folders" => "{count} cartafoles",
|
||||||
"1 file" => "1 ficheiro",
|
"1 file" => "1 ficheiro",
|
||||||
"{count} files" => "{count} ficheiros",
|
"{count} files" => "{count} ficheiros",
|
||||||
|
"Nothing in here. Your trash bin is empty!" => "Aquí non hai nada. O cesto do lixo está baleiro!",
|
||||||
"Restore" => "Restablecer"
|
"Restore" => "Restablecer"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,8 +1,14 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?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",
|
"Name" => "Név",
|
||||||
|
"Deleted" => "Törölve",
|
||||||
"1 folder" => "1 mappa",
|
"1 folder" => "1 mappa",
|
||||||
"{count} folders" => "{count} mappa",
|
"{count} folders" => "{count} mappa",
|
||||||
"1 file" => "1 fájl",
|
"1 file" => "1 fájl",
|
||||||
"{count} files" => "{count} 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"
|
"Restore" => "Visszaállítás"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?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",
|
"perform restore operation" => "uitvoeren restore operatie",
|
||||||
"delete file permanently" => "verwijder bestanden definitief",
|
"delete file permanently" => "verwijder bestanden definitief",
|
||||||
"Name" => "Naam",
|
"Name" => "Naam",
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?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",
|
"perform restore operation" => "realizar operação de restauração",
|
||||||
|
"delete file permanently" => "excluir arquivo permanentemente",
|
||||||
"Name" => "Nome",
|
"Name" => "Nome",
|
||||||
"Deleted" => "Excluído",
|
"Deleted" => "Excluído",
|
||||||
"1 folder" => "1 pasta",
|
"1 folder" => "1 pasta",
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?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",
|
"perform restore operation" => "Restaurar",
|
||||||
|
"delete file permanently" => "Eliminar permanentemente o(s) ficheiro(s)",
|
||||||
"Name" => "Nome",
|
"Name" => "Nome",
|
||||||
"Deleted" => "Apagado",
|
"Deleted" => "Apagado",
|
||||||
"1 folder" => "1 pasta",
|
"1 folder" => "1 pasta",
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
|
"Couldn't delete %s permanently" => "Nemožno zmazať %s navždy",
|
||||||
"Couldn't restore %s" => "Nemožno obnoviť %s",
|
"Couldn't restore %s" => "Nemožno obnoviť %s",
|
||||||
"perform restore operation" => "vykonať obnovu",
|
"perform restore operation" => "vykonať obnovu",
|
||||||
"delete file permanently" => "trvalo zmazať súbor",
|
"delete file permanently" => "trvalo zmazať súbor",
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
|
"Couldn't delete %s permanently" => "Kunde inte radera %s permanent",
|
||||||
|
"Couldn't restore %s" => "Kunde inte återställa %s",
|
||||||
"perform restore operation" => "utför återställning",
|
"perform restore operation" => "utför återställning",
|
||||||
|
"delete file permanently" => "radera filen permanent",
|
||||||
"Name" => "Namn",
|
"Name" => "Namn",
|
||||||
"Deleted" => "Raderad",
|
"Deleted" => "Raderad",
|
||||||
"1 folder" => "1 mapp",
|
"1 folder" => "1 mapp",
|
||||||
|
|
|
@ -25,6 +25,8 @@ namespace OCA\Files_Trashbin;
|
||||||
class Trashbin {
|
class Trashbin {
|
||||||
|
|
||||||
const DEFAULT_RETENTION_OBLIGATION=180; // how long do we keep files in the trash bin if no other value is defined in the config file (unit: days)
|
const DEFAULT_RETENTION_OBLIGATION=180; // how long do we keep files in the trash bin if no other value is defined in the config file (unit: days)
|
||||||
|
const DEFAULTMAXSIZE=50; // unit: percentage; 50% of available disk space/quota
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* move file to the trash bin
|
* move file to the trash bin
|
||||||
*
|
*
|
||||||
|
@ -51,7 +53,11 @@ class Trashbin {
|
||||||
$type = 'file';
|
$type = 'file';
|
||||||
}
|
}
|
||||||
|
|
||||||
self::copy_recursive($file_path, 'files_trashbin/'.$deleted.'.d'.$timestamp, $view);
|
if ( ($trashbinSize = \OCP\Config::getAppValue('files_trashbin', 'size')) === null ) {
|
||||||
|
$trashbinSize = self::calculateSize(new \OC_FilesystemView('/'. $user.'/files_trashbin'));
|
||||||
|
$trashbinSize += self::calculateSize(new \OC_FilesystemView('/'. $user.'/versions_trashbin'));
|
||||||
|
}
|
||||||
|
$trashbinSize += self::copy_recursive($file_path, 'files_trashbin/'.$deleted.'.d'.$timestamp, $view);
|
||||||
|
|
||||||
if ( $view->file_exists('files_trashbin/'.$deleted.'.d'.$timestamp) ) {
|
if ( $view->file_exists('files_trashbin/'.$deleted.'.d'.$timestamp) ) {
|
||||||
$query = \OC_DB::prepare("INSERT INTO *PREFIX*files_trash (id,timestamp,location,type,mime,user) VALUES (?,?,?,?,?,?)");
|
$query = \OC_DB::prepare("INSERT INTO *PREFIX*files_trash (id,timestamp,location,type,mime,user) VALUES (?,?,?,?,?,?)");
|
||||||
|
@ -64,9 +70,11 @@ class Trashbin {
|
||||||
|
|
||||||
if ( \OCP\App::isEnabled('files_versions') ) {
|
if ( \OCP\App::isEnabled('files_versions') ) {
|
||||||
if ( $view->is_dir('files_versions'.$file_path) ) {
|
if ( $view->is_dir('files_versions'.$file_path) ) {
|
||||||
|
$trashbinSize += self::calculateSize(new \OC_FilesystemView('/'. $user.'/files_versions/'.$file_path));
|
||||||
$view->rename('files_versions'.$file_path, 'versions_trashbin/'. $deleted.'.d'.$timestamp);
|
$view->rename('files_versions'.$file_path, 'versions_trashbin/'. $deleted.'.d'.$timestamp);
|
||||||
} else if ( $versions = \OCA\Files_Versions\Storage::getVersions($file_path) ) {
|
} else if ( $versions = \OCA\Files_Versions\Storage::getVersions($file_path) ) {
|
||||||
foreach ($versions as $v) {
|
foreach ($versions as $v) {
|
||||||
|
$trashbinSize += $view->filesize('files_versions'.$v['path'].'.v'.$v['version']);
|
||||||
$view->rename('files_versions'.$v['path'].'.v'.$v['version'], 'versions_trashbin/'. $deleted.'.v'.$v['version'].'.d'.$timestamp);
|
$view->rename('files_versions'.$v['path'].'.v'.$v['version'], 'versions_trashbin/'. $deleted.'.v'.$v['version'].'.d'.$timestamp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -75,7 +83,26 @@ class Trashbin {
|
||||||
\OC_Log::write('files_trashbin', 'Couldn\'t move '.$file_path.' to the trash bin', \OC_log::ERROR);
|
\OC_Log::write('files_trashbin', 'Couldn\'t move '.$file_path.' to the trash bin', \OC_log::ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
self::expire();
|
// get available disk space for user
|
||||||
|
$quota = \OCP\Util::computerFileSize(\OC_Preferences::getValue($user, 'files', 'quota'));
|
||||||
|
if ( $quota == null ) {
|
||||||
|
$quota = \OCP\Util::computerFileSize(\OC_Appconfig::getValue('files', 'default_quota'));
|
||||||
|
}
|
||||||
|
if ( $quota == null ) {
|
||||||
|
$quota = \OC\Files\Filesystem::free_space('/');
|
||||||
|
}
|
||||||
|
|
||||||
|
// calculate available space for trash bin
|
||||||
|
$rootInfo = $view->getFileInfo('/files');
|
||||||
|
$free = $quota-$rootInfo['size']; // remaining free space for user
|
||||||
|
if ( $free > 0 ) {
|
||||||
|
$availableSpace = ($free * self::DEFAULTMAXSIZE / 100) - $trashbinSize; // how much space can be used for versions
|
||||||
|
} else {
|
||||||
|
$availableSpace = $free-$trashbinSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
$trashbinSize -= self::expire($availableSpace);
|
||||||
|
\OCP\Config::setAppValue('files_trashbin', 'size', $trashbinSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -86,10 +113,13 @@ class Trashbin {
|
||||||
* @param $timestamp time when the file was deleted
|
* @param $timestamp time when the file was deleted
|
||||||
*/
|
*/
|
||||||
public static function restore($file, $filename, $timestamp) {
|
public static function restore($file, $filename, $timestamp) {
|
||||||
|
|
||||||
$user = \OCP\User::getUser();
|
$user = \OCP\User::getUser();
|
||||||
$view = new \OC_FilesystemView('/'.$user);
|
$view = new \OC_FilesystemView('/'.$user);
|
||||||
|
|
||||||
|
if ( ($trashbinSize = \OCP\Config::getAppValue('files_trashbin', 'size')) === null ) {
|
||||||
|
$trashbinSize = self::calculateSize(new \OC_FilesystemView('/'. $user.'/files_trashbin'));
|
||||||
|
$trashbinSize += self::calculateSize(new \OC_FilesystemView('/'. $user.'/versions_trashbin'));
|
||||||
|
}
|
||||||
if ( $timestamp ) {
|
if ( $timestamp ) {
|
||||||
$query = \OC_DB::prepare('SELECT location,type FROM *PREFIX*files_trash WHERE user=? AND id=? AND timestamp=?');
|
$query = \OC_DB::prepare('SELECT location,type FROM *PREFIX*files_trash WHERE user=? AND id=? AND timestamp=?');
|
||||||
$result = $query->execute(array($user,$filename,$timestamp))->fetchAll();
|
$result = $query->execute(array($user,$filename,$timestamp))->fetchAll();
|
||||||
|
@ -122,16 +152,29 @@ class Trashbin {
|
||||||
$mtime = $view->filemtime($source);
|
$mtime = $view->filemtime($source);
|
||||||
if( $view->rename($source, $target.$ext) ) {
|
if( $view->rename($source, $target.$ext) ) {
|
||||||
$view->touch($target.$ext, $mtime);
|
$view->touch($target.$ext, $mtime);
|
||||||
|
if ($view->is_dir($target.$ext)) {
|
||||||
|
$trashbinSize -= self::calculateSize(new \OC_FilesystemView('/'.$user.'/'.$target.$ext));
|
||||||
|
} else {
|
||||||
|
$trashbinSize -= $view->filesize($target.$ext);
|
||||||
|
}
|
||||||
// if versioning app is enabled, copy versions from the trash bin back to the original location
|
// if versioning app is enabled, copy versions from the trash bin back to the original location
|
||||||
if ( \OCP\App::isEnabled('files_versions') ) {
|
if ( \OCP\App::isEnabled('files_versions') ) {
|
||||||
|
if ($timestamp ) {
|
||||||
|
$versionedFile = $filename;
|
||||||
|
} else {
|
||||||
|
$versionedFile = $file;
|
||||||
|
}
|
||||||
if ( $result[0]['type'] == 'dir' ) {
|
if ( $result[0]['type'] == 'dir' ) {
|
||||||
|
$trashbinSize -= self::calculateSize(new \OC_FilesystemView('/'.$user.'/'.'versions_trashbin/'. $file));
|
||||||
$view->rename(\OC_Filesystem::normalizePath('versions_trashbin/'. $file), \OC_Filesystem::normalizePath('files_versions/'.$location.'/'.$filename.$ext));
|
$view->rename(\OC_Filesystem::normalizePath('versions_trashbin/'. $file), \OC_Filesystem::normalizePath('files_versions/'.$location.'/'.$filename.$ext));
|
||||||
} else if ( $versions = self::getVersionsFromTrash($file, $timestamp) ) {
|
} else if ( $versions = self::getVersionsFromTrash($versionedFile, $timestamp) ) {
|
||||||
foreach ($versions as $v) {
|
foreach ($versions as $v) {
|
||||||
if ($timestamp ) {
|
if ($timestamp ) {
|
||||||
$view->rename('versions_trashbin/'.$filename.'.v'.$v.'.d'.$timestamp, 'files_versions/'.$location.'/'.$filename.$ext.'.v'.$v);
|
$trashbinSize -= $view->filesize('versions_trashbin/'.$versionedFile.'.v'.$v.'.d'.$timestamp);
|
||||||
|
$view->rename('versions_trashbin/'.$versionedFile.'.v'.$v.'.d'.$timestamp, 'files_versions/'.$location.'/'.$filename.$ext.'.v'.$v);
|
||||||
} else {
|
} else {
|
||||||
$view->rename('versions_trashbin/'.$file.'.v'.$v, 'files_versions/'.$location.'/'.$filename.$ext.'.v'.$v);
|
$trashbinSize -= $view->filesize('versions_trashbin/'.$versionedFile.'.v'.$v);
|
||||||
|
$view->rename('versions_trashbin/'.$versionedFile.'.v'.$v, 'files_versions/'.$location.'/'.$filename.$ext.'.v'.$v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -142,6 +185,7 @@ class Trashbin {
|
||||||
$query->execute(array($user,$filename,$timestamp));
|
$query->execute(array($user,$filename,$timestamp));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
\OCP\Config::setAppValue('files_trashbin', 'size', $trashbinSize);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
\OC_Log::write('files_trashbin', 'Couldn\'t restore file from trash bin, '.$filename, \OC_log::ERROR);
|
\OC_Log::write('files_trashbin', 'Couldn\'t restore file from trash bin, '.$filename, \OC_log::ERROR);
|
||||||
|
@ -154,12 +198,17 @@ class Trashbin {
|
||||||
* delete file from trash bin permanently
|
* delete file from trash bin permanently
|
||||||
* @param $filename path to the file
|
* @param $filename path to the file
|
||||||
* @param $timestamp of deletion time
|
* @param $timestamp of deletion time
|
||||||
* @return true/false
|
* @return size of deleted files
|
||||||
*/
|
*/
|
||||||
public static function delete($filename, $timestamp=null) {
|
public static function delete($filename, $timestamp=null) {
|
||||||
|
|
||||||
$user = \OCP\User::getUser();
|
$user = \OCP\User::getUser();
|
||||||
$view = new \OC_FilesystemView('/'.$user);
|
$view = new \OC_FilesystemView('/'.$user);
|
||||||
|
$size = 0;
|
||||||
|
|
||||||
|
if ( ($trashbinSize = \OCP\Config::getAppValue('files_trashbin', 'size')) === null ) {
|
||||||
|
$trashbinSize = self::calculateSize(new \OC_FilesystemView('/'. $user.'/files_trashbin'));
|
||||||
|
$trashbinSize += self::calculateSize(new \OC_FilesystemView('/'. $user.'/versions_trashbin'));
|
||||||
|
}
|
||||||
|
|
||||||
if ( $timestamp ) {
|
if ( $timestamp ) {
|
||||||
$query = \OC_DB::prepare('DELETE FROM *PREFIX*files_trash WHERE user=? AND id=? AND timestamp=?');
|
$query = \OC_DB::prepare('DELETE FROM *PREFIX*files_trash WHERE user=? AND id=? AND timestamp=?');
|
||||||
|
@ -171,31 +220,43 @@ class Trashbin {
|
||||||
|
|
||||||
if ( \OCP\App::isEnabled('files_versions') ) {
|
if ( \OCP\App::isEnabled('files_versions') ) {
|
||||||
if ($view->is_dir('versions_trashbin/'.$file)) {
|
if ($view->is_dir('versions_trashbin/'.$file)) {
|
||||||
|
$size += self::calculateSize(new \OC_Filesystemview('/'.$user.'/versions_trashbin/'.$file));
|
||||||
$view->unlink('versions_trashbin/'.$file);
|
$view->unlink('versions_trashbin/'.$file);
|
||||||
} else if ( $versions = self::getVersionsFromTrash($file, $timestamp) ) {
|
} else if ( $versions = self::getVersionsFromTrash($filename, $timestamp) ) {
|
||||||
foreach ($versions as $v) {
|
foreach ($versions as $v) {
|
||||||
if ($timestamp ) {
|
if ($timestamp ) {
|
||||||
$view->unlink('versions_trashbin/'.$filename.'.v'.$v.'.d'.$timestamp);
|
$size += $view->filesize('/versions_trashbin/'.$filename.'.v'.$v.'.d'.$timestamp);
|
||||||
|
$view->unlink('/versions_trashbin/'.$filename.'.v'.$v.'.d'.$timestamp);
|
||||||
} else {
|
} else {
|
||||||
$view->unlink('versions_trashbin/'.$file.'.v'.$v);
|
$size += $view->filesize('/versions_trashbin/'.$filename.'.v'.$v);
|
||||||
|
$view->unlink('/versions_trashbin/'.$filename.'.v'.$v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($view->is_dir('/files_trashbin/'.$file)) {
|
||||||
|
$size += self::calculateSize(new \OC_Filesystemview('/'.$user.'/files_trashbin/'.$file));
|
||||||
|
} else {
|
||||||
|
$size += $view->filesize('/files_trashbin/'.$file);
|
||||||
|
}
|
||||||
$view->unlink('/files_trashbin/'.$file);
|
$view->unlink('/files_trashbin/'.$file);
|
||||||
|
$trashbinSize -= $size;
|
||||||
|
\OCP\Config::setAppValue('files_trashbin', 'size', $trashbinSize);
|
||||||
|
|
||||||
return true;
|
return $size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* clean up the trash bin
|
* clean up the trash bin
|
||||||
|
* @param max. available disk space for trashbin
|
||||||
*/
|
*/
|
||||||
private static function expire() {
|
private static function expire($availableSpace) {
|
||||||
|
|
||||||
$view = new \OC_FilesystemView('/'.\OCP\User::getUser());
|
|
||||||
$user = \OCP\User::getUser();
|
$user = \OCP\User::getUser();
|
||||||
|
$view = new \OC_FilesystemView('/'.$user);
|
||||||
|
$size = 0;
|
||||||
|
|
||||||
$query = \OC_DB::prepare('SELECT location,type,id,timestamp FROM *PREFIX*files_trash WHERE user=?');
|
$query = \OC_DB::prepare('SELECT location,type,id,timestamp FROM *PREFIX*files_trash WHERE user=?');
|
||||||
$result = $query->execute(array($user))->fetchAll();
|
$result = $query->execute(array($user))->fetchAll();
|
||||||
|
@ -208,11 +269,18 @@ class Trashbin {
|
||||||
$timestamp = $r['timestamp'];
|
$timestamp = $r['timestamp'];
|
||||||
$filename = $r['id'];
|
$filename = $r['id'];
|
||||||
if ( $r['timestamp'] < $limit ) {
|
if ( $r['timestamp'] < $limit ) {
|
||||||
|
if ($view->is_dir('files_trashbin/'.$filename.'.d'.$timestamp)) {
|
||||||
|
$size += self::calculateSize(new \OC_FilesystemView('/'.$user.'/files_trashbin/'.$filename.'.d'.$timestamp));
|
||||||
|
} else {
|
||||||
|
$size += $view->filesize('files_trashbin/'.$filename.'.d'.$timestamp);
|
||||||
|
}
|
||||||
$view->unlink('files_trashbin/'.$filename.'.d'.$timestamp);
|
$view->unlink('files_trashbin/'.$filename.'.d'.$timestamp);
|
||||||
if ($r['type'] == 'dir') {
|
if ($r['type'] == 'dir') {
|
||||||
|
$size += self::calculateSize(new \OC_FilesystemView('/'.$user.'/versions_trashbin/'.$filename.'.d'.$timestamp));
|
||||||
$view->unlink('versions_trashbin/'.$filename.'.d'.$timestamp);
|
$view->unlink('versions_trashbin/'.$filename.'.d'.$timestamp);
|
||||||
} else if ( $versions = self::getVersionsFromTrash($filename, $timestamp) ) {
|
} else if ( $versions = self::getVersionsFromTrash($filename, $timestamp) ) {
|
||||||
foreach ($versions as $v) {
|
foreach ($versions as $v) {
|
||||||
|
$size += $view->filesize('versions_trashbin/'.$filename.'.v'.$v.'.d'.$timestamp);
|
||||||
$view->unlink('versions_trashbin/'.$filename.'.v'.$v.'.d'.$timestamp);
|
$view->unlink('versions_trashbin/'.$filename.'.v'.$v.'.d'.$timestamp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -221,6 +289,24 @@ class Trashbin {
|
||||||
|
|
||||||
$query = \OC_DB::prepare('DELETE FROM *PREFIX*files_trash WHERE user=? AND timestamp<?');
|
$query = \OC_DB::prepare('DELETE FROM *PREFIX*files_trash WHERE user=? AND timestamp<?');
|
||||||
$query->execute(array($user,$limit));
|
$query->execute(array($user,$limit));
|
||||||
|
|
||||||
|
$availableSpace = $availableSpace + $size;
|
||||||
|
// if size limit for trash bin reached, delete oldest files in trash bin
|
||||||
|
if ($availableSpace < 0) {
|
||||||
|
$query = \OC_DB::prepare('SELECT location,type,id,timestamp FROM *PREFIX*files_trash WHERE user=? ORDER BY timestamp ASC');
|
||||||
|
$result = $query->execute(array($user))->fetchAll();
|
||||||
|
$length = count($result);
|
||||||
|
$i = 0;
|
||||||
|
while ( $i < $length && $availableSpace < 0 ) {
|
||||||
|
$tmp = self::delete($result[$i]['id'], $result[$i]['timestamp']);
|
||||||
|
$availableSpace += $tmp;
|
||||||
|
$size += $tmp;
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return $size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -231,22 +317,26 @@ class Trashbin {
|
||||||
* @param $view file view for the users root directory
|
* @param $view file view for the users root directory
|
||||||
*/
|
*/
|
||||||
private static function copy_recursive( $source, $destination, $view ) {
|
private static function copy_recursive( $source, $destination, $view ) {
|
||||||
|
$size = 0;
|
||||||
if ( $view->is_dir( 'files'.$source ) ) {
|
if ( $view->is_dir( 'files'.$source ) ) {
|
||||||
$view->mkdir( $destination );
|
$view->mkdir( $destination );
|
||||||
$view->touch($destination, $view->filemtime('files'.$source));
|
$view->touch($destination, $view->filemtime('files'.$source));
|
||||||
foreach ( \OC_Files::getDirectoryContent($source) as $i ) {
|
foreach ( \OC_Files::getDirectoryContent($source) as $i ) {
|
||||||
$pathDir = $source.'/'.$i['name'];
|
$pathDir = $source.'/'.$i['name'];
|
||||||
if ( $view->is_dir('files'.$pathDir) ) {
|
if ( $view->is_dir('files'.$pathDir) ) {
|
||||||
self::copy_recursive($pathDir, $destination.'/'.$i['name'], $view);
|
$size += self::copy_recursive($pathDir, $destination.'/'.$i['name'], $view);
|
||||||
} else {
|
} else {
|
||||||
|
$size += $view->filesize('files'.$pathDir);
|
||||||
$view->copy( 'files'.$pathDir, $destination . '/' . $i['name'] );
|
$view->copy( 'files'.$pathDir, $destination . '/' . $i['name'] );
|
||||||
$view->touch($destination . '/' . $i['name'], $view->filemtime('files'.$pathDir));
|
$view->touch($destination . '/' . $i['name'], $view->filemtime('files'.$pathDir));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
$size += $view->filesize('files'.$source);
|
||||||
$view->copy( 'files'.$source, $destination );
|
$view->copy( 'files'.$source, $destination );
|
||||||
$view->touch($destination, $view->filemtime('files'.$source));
|
$view->touch($destination, $view->filemtime('files'.$source));
|
||||||
}
|
}
|
||||||
|
return $size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -258,7 +348,6 @@ class Trashbin {
|
||||||
$view = new \OC_FilesystemView('/'.\OCP\User::getUser().'/versions_trashbin');
|
$view = new \OC_FilesystemView('/'.\OCP\User::getUser().'/versions_trashbin');
|
||||||
$versionsName = \OCP\Config::getSystemValue('datadirectory').$view->getAbsolutePath($filename);
|
$versionsName = \OCP\Config::getSystemValue('datadirectory').$view->getAbsolutePath($filename);
|
||||||
$versions = array();
|
$versions = array();
|
||||||
|
|
||||||
if ($timestamp ) {
|
if ($timestamp ) {
|
||||||
// fetch for old versions
|
// fetch for old versions
|
||||||
$matches = glob( $versionsName.'.v*.d'.$timestamp );
|
$matches = glob( $versionsName.'.v*.d'.$timestamp );
|
||||||
|
@ -300,4 +389,23 @@ class Trashbin {
|
||||||
return $ext;
|
return $ext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief get the size from a given root folder
|
||||||
|
* @param $view file view on the root folder
|
||||||
|
* @return size of the folder
|
||||||
|
*/
|
||||||
|
private static function calculateSize($view) {
|
||||||
|
$root = \OCP\Config::getSystemValue('datadirectory').$view->getAbsolutePath('');
|
||||||
|
$iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($root), \RecursiveIteratorIterator::CHILD_FIRST);
|
||||||
|
$size = 0;
|
||||||
|
|
||||||
|
foreach ($iterator as $path) {
|
||||||
|
$relpath = substr($path, strlen($root)-1);
|
||||||
|
if ( !$view->is_dir($relpath) ) {
|
||||||
|
$size += $view->filesize($relpath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $size;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,13 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
|
"Could not revert: %s" => "Kunne ikke genskabe: %s",
|
||||||
|
"success" => "success",
|
||||||
|
"File %s was reverted to version %s" => "Filen %s blev genskabt til version: %s",
|
||||||
|
"failure" => "fejl",
|
||||||
|
"File %s could not be reverted to version %s" => "Filen %s blev genskabt til version: %s",
|
||||||
|
"No old versions available" => "Ingen gamle version tilgængelige",
|
||||||
|
"No path specified" => "Ingen sti specificeret",
|
||||||
"History" => "Historik",
|
"History" => "Historik",
|
||||||
|
"Revert a file to a previous version by clicking on its revert button" => "Genskab en fil til en tidligere version ved at klikke på denne genskab knap.",
|
||||||
"Files Versioning" => "Versionering af filer",
|
"Files Versioning" => "Versionering af filer",
|
||||||
"Enable" => "Aktiver"
|
"Enable" => "Aktiver"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,5 +1,13 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
|
"Could not revert: %s" => "Konnte %s nicht zurücksetzen",
|
||||||
|
"success" => "Erfolgreich",
|
||||||
|
"File %s was reverted to version %s" => "Datei %s wurde auf Version %s zurückgesetzt",
|
||||||
|
"failure" => "Fehlgeschlagen",
|
||||||
|
"File %s could not be reverted to version %s" => "Datei %s konnte nicht auf Version %s zurückgesetzt werden",
|
||||||
|
"No old versions available" => "Keine älteren Versionen verfügbar",
|
||||||
|
"No path specified" => "Kein Pfad angegeben",
|
||||||
"History" => "Historie",
|
"History" => "Historie",
|
||||||
|
"Revert a file to a previous version by clicking on its revert button" => "Setzen Sie eine Datei durch klicken auf den Zurücksetzen Button zurück",
|
||||||
"Files Versioning" => "Dateiversionierung",
|
"Files Versioning" => "Dateiversionierung",
|
||||||
"Enable" => "Aktivieren"
|
"Enable" => "Aktivieren"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
|
"Could not revert: %s" => "Konnte %s nicht zurücksetzen",
|
||||||
"success" => "Erfolgreich",
|
"success" => "Erfolgreich",
|
||||||
|
"File %s was reverted to version %s" => "Die Datei %s wurde zur Version %s zurückgesetzt",
|
||||||
"failure" => "Fehlgeschlagen",
|
"failure" => "Fehlgeschlagen",
|
||||||
|
"File %s could not be reverted to version %s" => "Die Datei %s konnte nicht zur Version %s zurückgesetzt werden",
|
||||||
"No old versions available" => "keine älteren Versionen verfügbar",
|
"No old versions available" => "keine älteren Versionen verfügbar",
|
||||||
"No path specified" => "Kein Pfad angegeben",
|
"No path specified" => "Kein Pfad angegeben",
|
||||||
"History" => "Historie",
|
"History" => "Historie",
|
||||||
|
"Revert a file to a previous version by clicking on its revert button" => "Setze eine Datei durch Klicken, auf den Zurücksetzen-Button, auf einer frühere Version zurück",
|
||||||
"Files Versioning" => "Dateiversionierung",
|
"Files Versioning" => "Dateiversionierung",
|
||||||
"Enable" => "Aktivieren"
|
"Enable" => "Aktivieren"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,5 +1,13 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
|
"Could not revert: %s" => "No se pudo revertir: %s ",
|
||||||
|
"success" => "Éxito",
|
||||||
|
"File %s was reverted to version %s" => "El archivo %s fue revertido a la versión %s",
|
||||||
|
"failure" => "error",
|
||||||
|
"File %s could not be reverted to version %s" => "El archivo %s no pudo ser revertido a la versión %s",
|
||||||
|
"No old versions available" => "No hay versiones antiguas disponibles",
|
||||||
|
"No path specified" => "Ruta de acceso no especificada",
|
||||||
"History" => "Historia",
|
"History" => "Historia",
|
||||||
|
"Revert a file to a previous version by clicking on its revert button" => "Revertí un archivo a una versión anterior haciendo click en su botón de \"revertir\"",
|
||||||
"Files Versioning" => "Versionado de archivos",
|
"Files Versioning" => "Versionado de archivos",
|
||||||
"Enable" => "Activar"
|
"Enable" => "Activar"
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
|
"success" => "korras",
|
||||||
|
"failure" => "ebaõnnestus",
|
||||||
|
"No old versions available" => "Vanu versioone pole saadaval",
|
||||||
|
"No path specified" => "Asukohta pole määratud",
|
||||||
"History" => "Ajalugu",
|
"History" => "Ajalugu",
|
||||||
"Files Versioning" => "Failide versioonihaldus",
|
"Files Versioning" => "Failide versioonihaldus",
|
||||||
"Enable" => "Luba"
|
"Enable" => "Luba"
|
||||||
|
|
|
@ -1,5 +1,13 @@
|
||||||
<?php $TRANSLATIONS = array(
|
<?php $TRANSLATIONS = array(
|
||||||
|
"Could not revert: %s" => "Ezin izan da leheneratu: %s",
|
||||||
|
"success" => "arrakasta",
|
||||||
|
"File %s was reverted to version %s" => "%s fitxategia %s bertsiora leheneratu da",
|
||||||
|
"failure" => "errorea",
|
||||||
|
"File %s could not be reverted to version %s" => "%s fitxategia ezin da %s bertsiora leheneratu",
|
||||||
|
"No old versions available" => "Ez dago bertsio zaharrik eskuragarri",
|
||||||
|
"No path specified" => "Ez da bidea zehaztu",
|
||||||
"History" => "Historia",
|
"History" => "Historia",
|
||||||
|
"Revert a file to a previous version by clicking on its revert button" => "Itzuli fitxategi bat aurreko bertsio batera leheneratu bere leheneratu botoia sakatuz",
|
||||||
"Files Versioning" => "Fitxategien Bertsioak",
|
"Files Versioning" => "Fitxategien Bertsioak",
|
||||||
"Enable" => "Gaitu"
|
"Enable" => "Gaitu"
|
||||||
);
|
);
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue