mirror of
https://github.com/lrsjng/h5ai.git
synced 2025-05-25 12:34:47 -04:00
Another partial commit.
This commit is contained in:
parent
abb9b7bd0e
commit
cb9341451b
15 changed files with 88 additions and 453 deletions
|
@ -58,12 +58,14 @@ To create an fresh zipball run
|
||||||
* adds drag'n'drop upload (PHP)
|
* adds drag'n'drop upload (PHP)
|
||||||
* adds file deletion (PHP)
|
* adds file deletion (PHP)
|
||||||
* cleans and improves PHP code
|
* cleans and improves PHP code
|
||||||
|
* PHP no longer respects htaccess restrictions (so be careful)
|
||||||
* PHP ignore patterns might include paths now
|
* PHP ignore patterns might include paths now
|
||||||
|
* improves separation between aai and php mode
|
||||||
* adds optional binary prefixes for file sizes
|
* adds optional binary prefixes for file sizes
|
||||||
* improves filter: autofocus on keypress, clear on `ESC`
|
* improves filter: autofocus on keypress, clear on `ESC`
|
||||||
* adds ctrl-click file selection
|
* adds ctrl-click file selection
|
||||||
* adds Piwik analytics support
|
* adds Piwik analytics support
|
||||||
* temp download packages are now stored in the `_h5ai/cache` and deleted as soon as possible
|
* temp download packages are now stored in the `cache`-folder and deleted as soon as possible
|
||||||
* localization now in separate files
|
* localization now in separate files
|
||||||
* updates translations
|
* updates translations
|
||||||
* adds `he` translation by [Tomer Cohen](https://github.com/tomer)
|
* adds `he` translation by [Tomer Cohen](https://github.com/tomer)
|
||||||
|
|
|
@ -1,125 +0,0 @@
|
||||||
|
|
||||||
modulejs.define('core/ajax', ['$', 'amplify', 'base64', 'core/resource'], function ($, amplify, base64, resource) {
|
|
||||||
|
|
||||||
var reContentType = /^text\/html;h5ai=/,
|
|
||||||
|
|
||||||
getStatus = function (href, withContent, callback) {
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
url: href,
|
|
||||||
type: withContent ? 'GET' : 'HEAD',
|
|
||||||
complete: function (xhr) {
|
|
||||||
|
|
||||||
var res = {
|
|
||||||
status: xhr.status,
|
|
||||||
content: xhr.responseText
|
|
||||||
};
|
|
||||||
|
|
||||||
if (xhr.status === 200 && reContentType.test(xhr.getResponseHeader('Content-Type'))) {
|
|
||||||
res.status = 'h5ai';
|
|
||||||
}
|
|
||||||
|
|
||||||
callback(res);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
getChecks = function (callback) {
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
url: resource.api(),
|
|
||||||
data: {
|
|
||||||
action: 'get',
|
|
||||||
checks: true
|
|
||||||
},
|
|
||||||
type: 'POST',
|
|
||||||
dataType: 'json',
|
|
||||||
success: function (json) {
|
|
||||||
|
|
||||||
callback(json.checks);
|
|
||||||
},
|
|
||||||
error: function () {
|
|
||||||
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
getEntries = function (href, what, callback) {
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
url: resource.api(),
|
|
||||||
data: {
|
|
||||||
action: 'get',
|
|
||||||
entries: true,
|
|
||||||
entriesHref: href,
|
|
||||||
entriesWhat: what
|
|
||||||
},
|
|
||||||
type: 'POST',
|
|
||||||
dataType: 'json',
|
|
||||||
success: function (json) {
|
|
||||||
|
|
||||||
callback(json.entries);
|
|
||||||
},
|
|
||||||
error: function () {
|
|
||||||
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
getArchive = function (data, callback) {
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
url: resource.api(),
|
|
||||||
data: {
|
|
||||||
action: 'archive',
|
|
||||||
execution: data.execution,
|
|
||||||
format: data.format,
|
|
||||||
hrefs: data.hrefs
|
|
||||||
},
|
|
||||||
type: 'POST',
|
|
||||||
dataType: 'json',
|
|
||||||
beforeSend: function (xhr) {
|
|
||||||
|
|
||||||
if (data.user) {
|
|
||||||
xhr.setRequestHeader('Authorization', 'Basic ' + base64.encode(data.user + ':' + data.password));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
success: function (json) {
|
|
||||||
|
|
||||||
callback(json);
|
|
||||||
},
|
|
||||||
error: function () {
|
|
||||||
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
getHtml = function (url, callback) {
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
url: url,
|
|
||||||
type: 'POST',
|
|
||||||
dataType: 'html',
|
|
||||||
success: function (html) {
|
|
||||||
|
|
||||||
callback(html);
|
|
||||||
},
|
|
||||||
error: function () {
|
|
||||||
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
return {
|
|
||||||
getStatus: getStatus,
|
|
||||||
getChecks: getChecks,
|
|
||||||
getEntries: getEntries,
|
|
||||||
getArchive: getArchive,
|
|
||||||
getHtml: getHtml
|
|
||||||
};
|
|
||||||
});
|
|
|
@ -1,12 +0,0 @@
|
||||||
|
|
||||||
modulejs.define('core/mode', [], function () {
|
|
||||||
|
|
||||||
var mode = {
|
|
||||||
// id: null,
|
|
||||||
// dataType: null,
|
|
||||||
// serverName: null,
|
|
||||||
// serverVersion: null
|
|
||||||
};
|
|
||||||
|
|
||||||
return mode;
|
|
||||||
});
|
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
modulejs.define('core/server', ['$', '_', 'config', 'base64'], function ($, _, config, base64) {
|
modulejs.define('core/server', ['$', '_', 'config'], function ($, _, config) {
|
||||||
|
|
||||||
var server = _.extend({}, config.server, {
|
var server = _.extend({}, config.server, {
|
||||||
|
|
||||||
|
@ -26,81 +26,20 @@ modulejs.define('core/server', ['$', '_', 'config', 'base64'], function ($, _, c
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
requestArchive: function (data, callback) {
|
requestThumbSmall: function (type, href, callback) {
|
||||||
|
|
||||||
if (!server.apiHref) {
|
server.request({action: 'getthumbsrc', type: type, href: href, mode: 'square', width: 16, height: 16}, function (json) {
|
||||||
callback();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
url: server.apiHref,
|
|
||||||
data: {
|
|
||||||
action: 'archive',
|
|
||||||
execution: data.execution,
|
|
||||||
format: data.format,
|
|
||||||
hrefs: data.hrefs
|
|
||||||
},
|
|
||||||
type: 'POST',
|
|
||||||
dataType: 'json',
|
|
||||||
beforeSend: function (xhr) {
|
|
||||||
|
|
||||||
if (data.user) {
|
|
||||||
xhr.setRequestHeader('Authorization', 'Basic ' + base64.encode(data.user + ':' + data.password));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
success: function (json) {
|
|
||||||
|
|
||||||
callback(json);
|
|
||||||
},
|
|
||||||
error: function () {
|
|
||||||
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
requestThumb: function (data, callback) {
|
|
||||||
|
|
||||||
server.request({
|
|
||||||
action: 'getthumbsrc',
|
|
||||||
type: data.type,
|
|
||||||
href: data.href,
|
|
||||||
mode: data.mode,
|
|
||||||
width: data.width,
|
|
||||||
height: data.height
|
|
||||||
}, function (json) {
|
|
||||||
|
|
||||||
callback(json && json.code === 0 ? json.absHref : null);
|
callback(json && json.code === 0 ? json.absHref : null);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
requestThumbSmall: function (type, href, callback) {
|
|
||||||
|
|
||||||
server.requestThumb(
|
|
||||||
{
|
|
||||||
type: type,
|
|
||||||
href: href,
|
|
||||||
mode: 'square',
|
|
||||||
width: 16,
|
|
||||||
height: 16
|
|
||||||
},
|
|
||||||
callback
|
|
||||||
);
|
|
||||||
},
|
|
||||||
|
|
||||||
requestThumbBig: function (type, href, callback) {
|
requestThumbBig: function (type, href, callback) {
|
||||||
|
|
||||||
server.requestThumb(
|
server.request({action: 'getthumbsrc', type: type, href: href, mode: 'rational', width: 100, height: 48}, function (json) {
|
||||||
{
|
|
||||||
type: type,
|
callback(json && json.code === 0 ? json.absHref : null);
|
||||||
href: href,
|
});
|
||||||
mode: 'rational',
|
|
||||||
width: 100,
|
|
||||||
height: 48
|
|
||||||
},
|
|
||||||
callback
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
modulejs.define('ext/custom', ['_', '$', 'core/settings', 'core/ajax'], function (_, $, allsettings, ajax) {
|
modulejs.define('ext/custom', ['_', '$', 'core/settings'], function (_, $, allsettings) {
|
||||||
|
|
||||||
var settings = _.extend({
|
var settings = _.extend({
|
||||||
enabled: false,
|
enabled: false,
|
||||||
|
@ -7,6 +7,23 @@ modulejs.define('ext/custom', ['_', '$', 'core/settings', 'core/ajax'], function
|
||||||
footer: '_h5ai.footer.html'
|
footer: '_h5ai.footer.html'
|
||||||
}, allsettings.custom),
|
}, allsettings.custom),
|
||||||
|
|
||||||
|
getHtml = function (url, callback) {
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: url,
|
||||||
|
type: 'POST',
|
||||||
|
dataType: 'html',
|
||||||
|
success: function (html) {
|
||||||
|
|
||||||
|
callback(html);
|
||||||
|
},
|
||||||
|
error: function () {
|
||||||
|
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
init = function () {
|
init = function () {
|
||||||
|
|
||||||
if (!settings.enabled) {
|
if (!settings.enabled) {
|
||||||
|
@ -14,7 +31,7 @@ modulejs.define('ext/custom', ['_', '$', 'core/settings', 'core/ajax'], function
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_.isString(settings.header)) {
|
if (_.isString(settings.header)) {
|
||||||
ajax.getHtml(settings.header, function (html) {
|
getHtml(settings.header, function (html) {
|
||||||
|
|
||||||
if (html) {
|
if (html) {
|
||||||
$('<div id="content-header">' + html + '</div>').prependTo('#content');
|
$('<div id="content-header">' + html + '</div>').prependTo('#content');
|
||||||
|
@ -23,7 +40,7 @@ modulejs.define('ext/custom', ['_', '$', 'core/settings', 'core/ajax'], function
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_.isString(settings.footer)) {
|
if (_.isString(settings.footer)) {
|
||||||
ajax.getHtml(settings.footer, function (html) {
|
getHtml(settings.footer, function (html) {
|
||||||
|
|
||||||
if (html) {
|
if (html) {
|
||||||
$('<div id="content-footer">' + html + '</div>').appendTo('#content');
|
$('<div id="content-footer">' + html + '</div>').appendTo('#content');
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
modulejs.define('ext/delete', ['_', '$', 'core/settings', 'core/entry', 'core/event', 'core/resource', 'core/refresh'], function (_, $, allsettings, entry, event, resource, refresh) {
|
modulejs.define('ext/delete', ['_', '$', 'core/settings', 'core/event', 'core/resource', 'core/refresh', 'core/server'], function (_, $, allsettings, event, resource, refresh, server) {
|
||||||
|
|
||||||
var settings = _.extend({
|
var settings = _.extend({
|
||||||
enabled: false
|
enabled: false
|
||||||
|
@ -8,16 +8,12 @@ modulejs.define('ext/delete', ['_', '$', 'core/settings', 'core/entry', 'core/ev
|
||||||
deleteBtnTemplate = '<li id="delete">' +
|
deleteBtnTemplate = '<li id="delete">' +
|
||||||
'<a href="#">' +
|
'<a href="#">' +
|
||||||
'<img src="' + resource.image('delete') + '" alt="delete"/>' +
|
'<img src="' + resource.image('delete') + '" alt="delete"/>' +
|
||||||
'<span class="l10n-delete">delete</span>' +
|
'<span class="l10n-delete"/>' +
|
||||||
'</a>' +
|
'</a>' +
|
||||||
'</li>',
|
'</li>',
|
||||||
authTemplate = '<div id="delete-auth">' +
|
|
||||||
'<input id="delete-auth-user" type="text" value="" placeholder="user"/>' +
|
|
||||||
'<input id="delete-auth-password" type="text" value="" placeholder="password"/>' +
|
|
||||||
'</div>',
|
|
||||||
|
|
||||||
selectedHrefsStr = '',
|
selectedHrefsStr = '',
|
||||||
$delete, $img, $deleteAuth, $deleteUser, $deletePassword,
|
$delete, $img,
|
||||||
|
|
||||||
failed = function () {
|
failed = function () {
|
||||||
|
|
||||||
|
@ -33,15 +29,6 @@ modulejs.define('ext/delete', ['_', '$', 'core/settings', 'core/entry', 'core/ev
|
||||||
$img.attr('src', resource.image('delete'));
|
$img.attr('src', resource.image('delete'));
|
||||||
|
|
||||||
if (!json || json.code) {
|
if (!json || json.code) {
|
||||||
if (json && json.code === 401) {
|
|
||||||
$deleteAuth
|
|
||||||
.css({
|
|
||||||
left: $delete.offset().left,
|
|
||||||
top: $delete.offset().top + $delete.outerHeight()
|
|
||||||
})
|
|
||||||
.show();
|
|
||||||
$deleteUser.focus();
|
|
||||||
}
|
|
||||||
failed();
|
failed();
|
||||||
}
|
}
|
||||||
refresh();
|
refresh();
|
||||||
|
@ -51,17 +38,7 @@ modulejs.define('ext/delete', ['_', '$', 'core/settings', 'core/entry', 'core/ev
|
||||||
|
|
||||||
$delete.addClass('current');
|
$delete.addClass('current');
|
||||||
$img.attr('src', resource.image('loading.gif', true));
|
$img.attr('src', resource.image('loading.gif', true));
|
||||||
$.ajax({
|
server.request({action: 'delete', hrefs: hrefsStr}, handleResponse);
|
||||||
url: resource.api(),
|
|
||||||
data: {
|
|
||||||
action: 'delete',
|
|
||||||
hrefs: hrefsStr,
|
|
||||||
user: $deleteUser.val(),
|
|
||||||
password: $deletePassword.val()
|
|
||||||
},
|
|
||||||
dataType: 'json',
|
|
||||||
success: handleResponse
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
onSelection = function (entries) {
|
onSelection = function (entries) {
|
||||||
|
@ -75,13 +52,12 @@ modulejs.define('ext/delete', ['_', '$', 'core/settings', 'core/entry', 'core/ev
|
||||||
$delete.appendTo('#navbar').show();
|
$delete.appendTo('#navbar').show();
|
||||||
} else {
|
} else {
|
||||||
$delete.hide();
|
$delete.hide();
|
||||||
$deleteAuth.hide();
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
init = function () {
|
init = function () {
|
||||||
|
|
||||||
if (!settings.enabled) {
|
if (!settings.enabled || !server.apiHref) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,16 +65,11 @@ modulejs.define('ext/delete', ['_', '$', 'core/settings', 'core/entry', 'core/ev
|
||||||
.find('a').on('click', function (event) {
|
.find('a').on('click', function (event) {
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
$deleteAuth.hide();
|
|
||||||
requestDeletion(selectedHrefsStr);
|
requestDeletion(selectedHrefsStr);
|
||||||
}).end()
|
}).end()
|
||||||
.appendTo('#navbar');
|
.appendTo('#navbar');
|
||||||
$img = $delete.find('img');
|
$img = $delete.find('img');
|
||||||
|
|
||||||
$deleteAuth = $(authTemplate).appendTo('body');
|
|
||||||
$deleteUser = $deleteAuth.find('#delete-auth-user');
|
|
||||||
$deletePassword = $deleteAuth.find('#delete-auth-password');
|
|
||||||
|
|
||||||
event.sub('selection', onSelection);
|
event.sub('selection', onSelection);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
modulejs.define('ext/download', ['_', '$', 'core/settings', 'core/resource', 'core/event', 'core/ajax'], function (_, $, allsettings, resource, event, ajax) {
|
modulejs.define('ext/download', ['_', '$', 'core/settings', 'core/resource', 'core/event', 'core/server'], function (_, $, allsettings, resource, event, server) {
|
||||||
|
|
||||||
var settings = _.extend({
|
var settings = _.extend({
|
||||||
enabled: false,
|
enabled: false,
|
||||||
|
@ -12,16 +12,12 @@ modulejs.define('ext/download', ['_', '$', 'core/settings', 'core/resource', 'co
|
||||||
downloadBtnTemplate = '<li id="download">' +
|
downloadBtnTemplate = '<li id="download">' +
|
||||||
'<a href="#">' +
|
'<a href="#">' +
|
||||||
'<img src="' + resource.image('download') + '" alt="download"/>' +
|
'<img src="' + resource.image('download') + '" alt="download"/>' +
|
||||||
'<span class="l10n-download">download</span>' +
|
'<span class="l10n-download"/>' +
|
||||||
'</a>' +
|
'</a>' +
|
||||||
'</li>',
|
'</li>',
|
||||||
authTemplate = '<div id="download-auth">' +
|
|
||||||
'<input id="download-auth-user" type="text" value="" placeholder="user"/>' +
|
|
||||||
'<input id="download-auth-password" type="text" value="" placeholder="password"/>' +
|
|
||||||
'</div>',
|
|
||||||
|
|
||||||
selectedHrefsStr = '',
|
selectedHrefsStr = '',
|
||||||
$download, $img, $downloadAuth, $downloadUser, $downloadPassword,
|
$download, $img,
|
||||||
|
|
||||||
failed = function () {
|
failed = function () {
|
||||||
|
|
||||||
|
@ -36,24 +32,11 @@ modulejs.define('ext/download', ['_', '$', 'core/settings', 'core/resource', 'co
|
||||||
$download.removeClass('current');
|
$download.removeClass('current');
|
||||||
$img.attr('src', resource.image('download'));
|
$img.attr('src', resource.image('download'));
|
||||||
|
|
||||||
if (json) {
|
if (json && json.code === 0) {
|
||||||
if (json.code === 0) {
|
setTimeout(function () { // wait here so the img above can be updated in time
|
||||||
setTimeout(function () { // wait here so the img above can be updated in time
|
|
||||||
|
|
||||||
window.location = resource.api() + '?action=getarchive&id=' + json.id + '&as=h5ai-selection.' + settings.format;
|
window.location = server.apiHref + '?action=getarchive&id=' + json.id + '&as=h5ai-selection.' + settings.format;
|
||||||
}, 200);
|
}, 200);
|
||||||
} else {
|
|
||||||
if (json.code === 401) {
|
|
||||||
$downloadAuth
|
|
||||||
.css({
|
|
||||||
left: $download.offset().left,
|
|
||||||
top: $download.offset().top + $download.outerHeight()
|
|
||||||
})
|
|
||||||
.show();
|
|
||||||
$downloadUser.focus();
|
|
||||||
}
|
|
||||||
failed();
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
failed();
|
failed();
|
||||||
}
|
}
|
||||||
|
@ -63,12 +46,12 @@ modulejs.define('ext/download', ['_', '$', 'core/settings', 'core/resource', 'co
|
||||||
|
|
||||||
$download.addClass('current');
|
$download.addClass('current');
|
||||||
$img.attr('src', resource.image('loading.gif', true));
|
$img.attr('src', resource.image('loading.gif', true));
|
||||||
ajax.getArchive({
|
|
||||||
|
server.request({
|
||||||
|
action: 'archive',
|
||||||
execution: settings.execution,
|
execution: settings.execution,
|
||||||
format: settings.format,
|
format: settings.format,
|
||||||
hrefs: hrefsStr,
|
hrefs: hrefsStr
|
||||||
user: $downloadUser.val(),
|
|
||||||
password: $downloadPassword.val()
|
|
||||||
}, handleResponse);
|
}, handleResponse);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -83,13 +66,12 @@ modulejs.define('ext/download', ['_', '$', 'core/settings', 'core/resource', 'co
|
||||||
$download.appendTo('#navbar').show();
|
$download.appendTo('#navbar').show();
|
||||||
} else {
|
} else {
|
||||||
$download.hide();
|
$download.hide();
|
||||||
$downloadAuth.hide();
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
init = function () {
|
init = function () {
|
||||||
|
|
||||||
if (!settings.enabled) {
|
if (!settings.enabled || !server.apiHref) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,16 +79,11 @@ modulejs.define('ext/download', ['_', '$', 'core/settings', 'core/resource', 'co
|
||||||
.find('a').on('click', function (event) {
|
.find('a').on('click', function (event) {
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
$downloadAuth.hide();
|
|
||||||
requestArchive(selectedHrefsStr);
|
requestArchive(selectedHrefsStr);
|
||||||
}).end()
|
}).end()
|
||||||
.appendTo('#navbar');
|
.appendTo('#navbar');
|
||||||
$img = $download.find('img');
|
$img = $download.find('img');
|
||||||
|
|
||||||
$downloadAuth = $(authTemplate).appendTo('body');
|
|
||||||
$downloadUser = $downloadAuth.find('#download-auth-user');
|
|
||||||
$downloadPassword = $downloadAuth.find('#download-auth-password');
|
|
||||||
|
|
||||||
event.sub('selection', onSelection);
|
event.sub('selection', onSelection);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
modulejs.define('model/entry', ['_', 'core/types', 'core/ajax', 'core/event', 'core/settings'], function (_, types, ajax, event, settings) {
|
modulejs.define('model/entry', ['$', '_', 'core/types', 'core/event', 'core/settings'], function ($, _, types, event, settings) {
|
||||||
|
|
||||||
var doc = document,
|
var doc = document,
|
||||||
domain = doc.domain,
|
domain = doc.domain,
|
||||||
|
@ -93,9 +93,30 @@ modulejs.define('model/entry', ['_', 'core/types', 'core/ajax', 'core/event', 'c
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
reContentType = /^text\/html;h5ai=/,
|
||||||
|
getStatus = function (href, withContent, callback) {
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: href,
|
||||||
|
type: withContent ? 'GET' : 'HEAD',
|
||||||
|
complete: function (xhr) {
|
||||||
|
|
||||||
|
var res = {
|
||||||
|
status: xhr.status,
|
||||||
|
content: xhr.responseText
|
||||||
|
};
|
||||||
|
|
||||||
|
if (xhr.status === 200 && reContentType.test(xhr.getResponseHeader('Content-Type'))) {
|
||||||
|
res.status = 'h5ai';
|
||||||
|
}
|
||||||
|
|
||||||
|
callback(res);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
ajaxRequest = function (self, parser, callback) {
|
ajaxRequest = function (self, parser, callback) {
|
||||||
|
|
||||||
ajax.getStatus(self.absHref, parser, function (response) {
|
getStatus(self.absHref, parser, function (response) {
|
||||||
|
|
||||||
self.status = response.status;
|
self.status = response.status;
|
||||||
if (parser && response.status === 'h5ai') {
|
if (parser && response.status === 'h5ai') {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
modulejs.define('parser/apache-autoindex', ['_', '$', 'core/mode', 'core/settings', 'core/format', 'model/entry'], function (_, $, mode, settings, format, Entry) {
|
modulejs.define('parser/apache-autoindex', ['_', '$', 'core/settings', 'core/format', 'model/entry'], function (_, $, settings, format, Entry) {
|
||||||
|
|
||||||
var parseTableRow = function (absHref, tr) {
|
var parseTableRow = function (absHref, tr) {
|
||||||
|
|
||||||
|
@ -35,11 +35,6 @@ modulejs.define('parser/apache-autoindex', ['_', '$', 'core/mode', 'core/setting
|
||||||
return parseTable(absHref, $id.find('table'));
|
return parseTable(absHref, $id.find('table'));
|
||||||
};
|
};
|
||||||
|
|
||||||
mode.id = 'aai';
|
|
||||||
mode.dataType = 'apache-autoindex';
|
|
||||||
mode.serverName = 'apache';
|
|
||||||
mode.serverVersion = null;
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
dataType: 'apache-autoindex',
|
dataType: 'apache-autoindex',
|
||||||
parse: parse
|
parse: parse
|
||||||
|
|
|
@ -1,12 +1,8 @@
|
||||||
|
|
||||||
modulejs.define('parser/generic-json', ['_', '$', 'core/mode', 'core/settings', 'model/entry'], function (_, $, mode, settings, Entry) {
|
modulejs.define('parser/generic-json', ['_', '$', 'core/settings', 'model/entry'], function (_, $, settings, Entry) {
|
||||||
|
|
||||||
var parseJson = function (absHref, json) {
|
var parseJson = function (absHref, json) {
|
||||||
|
|
||||||
mode.id = json.id;
|
|
||||||
mode.serverName = json.serverName;
|
|
||||||
mode.serverVersion = json.serverVersion;
|
|
||||||
|
|
||||||
if (!settings.custom) {
|
if (!settings.custom) {
|
||||||
settings.custom = {};
|
settings.custom = {};
|
||||||
}
|
}
|
||||||
|
@ -40,8 +36,6 @@ modulejs.define('parser/generic-json', ['_', '$', 'core/mode', 'core/settings',
|
||||||
return parseJsonStr(absHref, $id.text());
|
return parseJsonStr(absHref, $id.text());
|
||||||
};
|
};
|
||||||
|
|
||||||
mode.dataType = 'generic-json';
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
dataType: 'generic-json',
|
dataType: 'generic-json',
|
||||||
parse: parse
|
parse: parse
|
||||||
|
|
|
@ -1,137 +0,0 @@
|
||||||
|
|
||||||
/*
|
|
||||||
* taken from here:
|
|
||||||
* http://www.webtoolkit.info/javascript-base64.html
|
|
||||||
* with minor modifications
|
|
||||||
*/
|
|
||||||
var Base64 = {
|
|
||||||
|
|
||||||
// private property
|
|
||||||
_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
|
|
||||||
|
|
||||||
// public method for encoding
|
|
||||||
encode : function (input) {
|
|
||||||
var output = "";
|
|
||||||
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
|
|
||||||
var i = 0;
|
|
||||||
|
|
||||||
input = Base64._utf8_encode(input);
|
|
||||||
|
|
||||||
while (i < input.length) {
|
|
||||||
|
|
||||||
chr1 = input.charCodeAt(i++);
|
|
||||||
chr2 = input.charCodeAt(i++);
|
|
||||||
chr3 = input.charCodeAt(i++);
|
|
||||||
|
|
||||||
enc1 = chr1 >> 2;
|
|
||||||
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
|
|
||||||
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
|
|
||||||
enc4 = chr3 & 63;
|
|
||||||
|
|
||||||
if (isNaN(chr2)) {
|
|
||||||
enc3 = enc4 = 64;
|
|
||||||
} else if (isNaN(chr3)) {
|
|
||||||
enc4 = 64;
|
|
||||||
}
|
|
||||||
|
|
||||||
output = output +
|
|
||||||
this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
|
|
||||||
this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return output;
|
|
||||||
},
|
|
||||||
|
|
||||||
// public method for decoding
|
|
||||||
decode : function (input) {
|
|
||||||
var output = "";
|
|
||||||
var chr1, chr2, chr3;
|
|
||||||
var enc1, enc2, enc3, enc4;
|
|
||||||
var i = 0;
|
|
||||||
|
|
||||||
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
|
|
||||||
|
|
||||||
while (i < input.length) {
|
|
||||||
|
|
||||||
enc1 = this._keyStr.indexOf(input.charAt(i++));
|
|
||||||
enc2 = this._keyStr.indexOf(input.charAt(i++));
|
|
||||||
enc3 = this._keyStr.indexOf(input.charAt(i++));
|
|
||||||
enc4 = this._keyStr.indexOf(input.charAt(i++));
|
|
||||||
|
|
||||||
chr1 = (enc1 << 2) | (enc2 >> 4);
|
|
||||||
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
|
|
||||||
chr3 = ((enc3 & 3) << 6) | enc4;
|
|
||||||
|
|
||||||
output = output + String.fromCharCode(chr1);
|
|
||||||
|
|
||||||
if (enc3 != 64) {
|
|
||||||
output = output + String.fromCharCode(chr2);
|
|
||||||
}
|
|
||||||
if (enc4 != 64) {
|
|
||||||
output = output + String.fromCharCode(chr3);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return Base64._utf8_decode(output);
|
|
||||||
},
|
|
||||||
|
|
||||||
// private method for UTF-8 encoding
|
|
||||||
_utf8_encode : function (string) {
|
|
||||||
string = string.replace(/\r\n/g,"\n");
|
|
||||||
var utftext = "";
|
|
||||||
|
|
||||||
for (var n = 0; n < string.length; n++) {
|
|
||||||
|
|
||||||
var c = string.charCodeAt(n);
|
|
||||||
|
|
||||||
if (c < 128) {
|
|
||||||
utftext += String.fromCharCode(c);
|
|
||||||
}
|
|
||||||
else if((c > 127) && (c < 2048)) {
|
|
||||||
utftext += String.fromCharCode((c >> 6) | 192);
|
|
||||||
utftext += String.fromCharCode((c & 63) | 128);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
utftext += String.fromCharCode((c >> 12) | 224);
|
|
||||||
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
|
|
||||||
utftext += String.fromCharCode((c & 63) | 128);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return utftext;
|
|
||||||
},
|
|
||||||
|
|
||||||
// private method for UTF-8 decoding
|
|
||||||
_utf8_decode : function (utftext) {
|
|
||||||
var string = "";
|
|
||||||
var i = 0;
|
|
||||||
var c = c1 = c2 = 0;
|
|
||||||
|
|
||||||
while ( i < utftext.length ) {
|
|
||||||
|
|
||||||
c = utftext.charCodeAt(i);
|
|
||||||
|
|
||||||
if (c < 128) {
|
|
||||||
string += String.fromCharCode(c);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
else if((c > 191) && (c < 224)) {
|
|
||||||
c2 = utftext.charCodeAt(i+1);
|
|
||||||
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
|
|
||||||
i += 2;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
c2 = utftext.charCodeAt(i+1);
|
|
||||||
c3 = utftext.charCodeAt(i+2);
|
|
||||||
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
|
|
||||||
i += 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return string;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -12,7 +12,6 @@
|
||||||
// @include "lib/modulejs-*.js"
|
// @include "lib/modulejs-*.js"
|
||||||
// @include "lib/moment-*.js"
|
// @include "lib/moment-*.js"
|
||||||
// @include "lib/json2-*.js"
|
// @include "lib/json2-*.js"
|
||||||
// @include "lib/base64.js"
|
|
||||||
// @include "lib/spin-*.js"
|
// @include "lib/spin-*.js"
|
||||||
|
|
||||||
// app
|
// app
|
||||||
|
@ -46,7 +45,6 @@
|
||||||
// so they have to be wrapped to not be handled as constructors.
|
// so they have to be wrapped to not be handled as constructors.
|
||||||
modulejs.define('config', config);
|
modulejs.define('config', config);
|
||||||
modulejs.define('amplify', amplify);
|
modulejs.define('amplify', amplify);
|
||||||
modulejs.define('base64', Base64);
|
|
||||||
modulejs.define('$', function () { return jQuery; });
|
modulejs.define('$', function () { return jQuery; });
|
||||||
modulejs.define('modernizr', Modernizr);
|
modulejs.define('modernizr', Modernizr);
|
||||||
modulejs.define('moment', function () { return moment; });
|
modulejs.define('moment', function () { return moment; });
|
||||||
|
@ -72,19 +70,17 @@
|
||||||
loadCommentedJson(appHref + 'conf/types.json', function (types) {
|
loadCommentedJson(appHref + 'conf/types.json', function (types) {
|
||||||
loadCommentedJson(appHref + 'conf/langs.json', function (langs) {
|
loadCommentedJson(appHref + 'conf/langs.json', function (langs) {
|
||||||
|
|
||||||
var config = {
|
run({
|
||||||
options: options,
|
options: options,
|
||||||
types: types,
|
types: types,
|
||||||
langs: langs,
|
langs: langs,
|
||||||
server: {
|
server: {
|
||||||
backend: backend,
|
backend: backend,
|
||||||
apiHref: null,
|
apiHref: null,
|
||||||
name: 'apache',
|
name: 'apache',
|
||||||
version: null
|
version: null
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
run(config);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -146,7 +146,7 @@ else if ($action === "upload") {
|
||||||
$upload_dir = $APP->get_abs_path($href);
|
$upload_dir = $APP->get_abs_path($href);
|
||||||
$code = $APP->get_http_code($href);
|
$code = $APP->get_http_code($href);
|
||||||
|
|
||||||
json_fail(5, "upload dir no h5ai folder or ignored", $code !== "h5ai" || $APP->is_ignored($upload_dir));
|
json_fail(5, "upload dir no h5ai folder or ignored", $code !== App::$MAGIC_SEQUENCE || $APP->is_ignored($upload_dir));
|
||||||
|
|
||||||
$dest = $upload_dir . "/" . utf8_encode($userfile["name"]);
|
$dest = $upload_dir . "/" . utf8_encode($userfile["name"]);
|
||||||
|
|
||||||
|
@ -173,7 +173,7 @@ else if ($action === "delete") {
|
||||||
|
|
||||||
$code = $APP->get_http_code($d);
|
$code = $APP->get_http_code($d);
|
||||||
|
|
||||||
if ($code == "h5ai" && !$APP->is_ignored($n)) {
|
if ($code == App::$MAGIC_SEQUENCE && !$APP->is_ignored($n)) {
|
||||||
|
|
||||||
$abs_path = $APP->get_abs_path($href);
|
$abs_path = $APP->get_abs_path($href);
|
||||||
|
|
||||||
|
@ -183,7 +183,7 @@ else if ($action === "delete") {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($errors->size) {
|
if (count($errors)) {
|
||||||
json_fail(2, "deletion failed for some");
|
json_fail(2, "deletion failed for some");
|
||||||
} else {
|
} else {
|
||||||
json_exit();
|
json_exit();
|
||||||
|
@ -202,7 +202,7 @@ else if ($action === "rename") {
|
||||||
|
|
||||||
$code = $APP->get_http_code($d);
|
$code = $APP->get_http_code($d);
|
||||||
|
|
||||||
if ($code == "h5ai" && !$APP->is_ignored($n)) {
|
if ($code == App::$MAGIC_SEQUENCE && !$APP->is_ignored($n)) {
|
||||||
|
|
||||||
$abs_path = $APP->get_abs_path($href);
|
$abs_path = $APP->get_abs_path($href);
|
||||||
$folder = normalize_path(dirname($abs_path));
|
$folder = normalize_path(dirname($abs_path));
|
||||||
|
|
|
@ -169,9 +169,6 @@ class App {
|
||||||
$footer = $this->fileExists($footer ? $this->abs_path . "/" . $footer : null) ? $footer : null;
|
$footer = $this->fileExists($footer ? $this->abs_path . "/" . $footer : null) ? $footer : null;
|
||||||
|
|
||||||
$json = array(
|
$json = array(
|
||||||
"id" => "php",
|
|
||||||
"serverName" => strtolower(preg_replace("/\\/.*$/", "", getenv("SERVER_SOFTWARE"))),
|
|
||||||
"serverVersion" => strtolower(preg_replace("/^.*\\//", "", preg_replace("/\\s.*$/", "", getenv("SERVER_SOFTWARE")))),
|
|
||||||
"customHeader" => $header,
|
"customHeader" => $header,
|
||||||
"customFooter" => $footer,
|
"customFooter" => $footer,
|
||||||
"entries" => $entries
|
"entries" => $entries
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
function json_exit($obj) {
|
function json_exit($obj = array()) {
|
||||||
|
|
||||||
$obj["code"] = 0;
|
$obj["code"] = 0;
|
||||||
echo json_encode($obj);
|
echo json_encode($obj);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue