Сборка REDL: панель на PHP 8, капча-тумблер, закрытые уязвимости, установщики в один клик
- панель работает на PHP 8.4 (оригинал под PHP 7.0): elFinder utf8_encode, apache_get_modules, warnings - капча выключена и управляется из админки (флаг captcha_enable + блок настроек) - закрыты две SQL-инъекции без авторизации (createAuthLog: пароль из POST и CF-Connecting-IP) - убрано хранение паролей в открытом виде в authlog, XSS в поле ref - установщики install-panel.sh и install-node.sh (оригинальный затирал sources.list репозиториями Debian 9) - современный Dockerfile (оригинальный на debian:stretch больше не собирается) - планировщик и автозапуск работают без systemd - брендинг REDL.IO, год 2026, ссылки на redl.io - документация на русском: ИЗМЕНЕНИЯ, БЕЗОПАСНОСТЬ, ИНСТРУКЦИЯ
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
var type = self.data.type,
|
||||
bin = self.data.bin,
|
||||
hashOpts = self.data.hashOpts;
|
||||
|
||||
self.res = {};
|
||||
if (type === 'md5') {
|
||||
let sp = new self.SparkMD5.ArrayBuffer();
|
||||
sp.append(bin);
|
||||
self.res.hash = sp.end();
|
||||
} else {
|
||||
let sha = new jsSHA('SHA' + (type.length === 5? type : ('-' + type)).toUpperCase(), 'ARRAYBUFFER'),
|
||||
opts = {};
|
||||
if (type === 'ke128') {
|
||||
opts.shakeLen = hashOpts.shake128len;
|
||||
} else if (type === 'ke256') {
|
||||
opts.shakeLen = hashOpts.shake256len;
|
||||
}
|
||||
sha.update(bin);
|
||||
self.res.hash = sha.getHash('HEX', opts);
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
var data = self.data;
|
||||
if (data.memory) {
|
||||
Tiff.initialize({ TOTAL_MEMORY: data.memory });
|
||||
}
|
||||
var tiff = new Tiff({buffer: data.data});
|
||||
var image = tiff.readRGBAImage();
|
||||
self.res = { image: image, width: tiff.width(), height: tiff.height() };
|
||||
@@ -0,0 +1,55 @@
|
||||
var type = self.data.type,
|
||||
bin = self.data.bin,
|
||||
unzipFiles = function() {
|
||||
/** @type {Array.<string>} */
|
||||
var filenameList = [];
|
||||
/** @type {number} */
|
||||
var i;
|
||||
/** @type {number} */
|
||||
var il;
|
||||
/** @type {Array.<Zlib.Unzip.FileHeader>} */
|
||||
var fileHeaderList;
|
||||
// need check this.Y when update cdns.zlibUnzip
|
||||
this.Y();
|
||||
fileHeaderList = this.i;
|
||||
for (i = 0, il = fileHeaderList.length; i < il; ++i) {
|
||||
// need check fileHeaderList[i].J when update cdns.zlibUnzip
|
||||
filenameList[i] = fileHeaderList[i].filename + (fileHeaderList[i].J? ' ({formatSize(' + fileHeaderList[i].J + ')})' : '');
|
||||
}
|
||||
return filenameList;
|
||||
},
|
||||
tarFiles = function(tar) {
|
||||
var filenames = [],
|
||||
tarlen = tar.length,
|
||||
offset = 0,
|
||||
toStr = function(arr) {
|
||||
return String.fromCharCode.apply(null, arr).replace(/\0+$/, '');
|
||||
},
|
||||
h, name, prefix, size, dbs;
|
||||
while (offset < tarlen && tar[offset] !== 0) {
|
||||
h = tar.subarray(offset, offset + 512);
|
||||
name = toStr(h.subarray(0, 100));
|
||||
if (prefix = toStr(h.subarray(345, 500))) {
|
||||
name = prefix + name;
|
||||
}
|
||||
size = parseInt(toStr(h.subarray(124, 136)), 8);
|
||||
dbs = Math.ceil(size / 512) * 512;
|
||||
if (name === '././@LongLink') {
|
||||
name = toStr(tar.subarray(offset + 512, offset + 512 + dbs));
|
||||
}
|
||||
(name !== 'pax_global_header') && filenames.push(name + (size? ' ({formatSize(' + size + ')})': ''));
|
||||
offset = offset + 512 + dbs;
|
||||
}
|
||||
return filenames;
|
||||
};
|
||||
|
||||
self.res = {};
|
||||
if (type === 'tar') {
|
||||
self.res.files = tarFiles(new Uint8Array(bin));
|
||||
} else if (type === 'zip') {
|
||||
self.res.files = unzipFiles.call(new Zlib.Unzip(new Uint8Array(bin)));
|
||||
} else if (type === 'gzip') {
|
||||
self.res.files = tarFiles((new Zlib.Gunzip(new Uint8Array(bin))).decompress());
|
||||
} else if (type === 'bzip2') {
|
||||
self.res.files = tarFiles(self.bzip2.simple(self.bzip2.array(new Uint8Array(bin))));
|
||||
}
|
||||
Reference in New Issue
Block a user