mirror of
https://github.com/futurepress/epub.js.git
synced 2025-10-03 14:59:18 +02:00
Added several usage examples, fixed bugs, turned off restore by default
This commit is contained in:
parent
0e08b734ec
commit
416f7ab6a0
112 changed files with 23903 additions and 3348 deletions
215
libs/annotator/lib/plugin/auth.js
Normal file
215
libs/annotator/lib/plugin/auth.js
Normal file
|
@ -0,0 +1,215 @@
|
|||
// Generated by CoffeeScript 1.6.3
|
||||
var base64Decode, base64UrlDecode, createDateFromISO8601, parseToken,
|
||||
__hasProp = {}.hasOwnProperty,
|
||||
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
||||
|
||||
createDateFromISO8601 = function(string) {
|
||||
var d, date, offset, regexp, time, _ref;
|
||||
regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" + "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\\.([0-9]+))?)?" + "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
|
||||
d = string.match(new RegExp(regexp));
|
||||
offset = 0;
|
||||
date = new Date(d[1], 0, 1);
|
||||
if (d[3]) {
|
||||
date.setMonth(d[3] - 1);
|
||||
}
|
||||
if (d[5]) {
|
||||
date.setDate(d[5]);
|
||||
}
|
||||
if (d[7]) {
|
||||
date.setHours(d[7]);
|
||||
}
|
||||
if (d[8]) {
|
||||
date.setMinutes(d[8]);
|
||||
}
|
||||
if (d[10]) {
|
||||
date.setSeconds(d[10]);
|
||||
}
|
||||
if (d[12]) {
|
||||
date.setMilliseconds(Number("0." + d[12]) * 1000);
|
||||
}
|
||||
if (d[14]) {
|
||||
offset = (Number(d[16]) * 60) + Number(d[17]);
|
||||
offset *= (_ref = d[15] === '-') != null ? _ref : {
|
||||
1: -1
|
||||
};
|
||||
}
|
||||
offset -= date.getTimezoneOffset();
|
||||
time = Number(date) + (offset * 60 * 1000);
|
||||
date.setTime(Number(time));
|
||||
return date;
|
||||
};
|
||||
|
||||
base64Decode = function(data) {
|
||||
var ac, b64, bits, dec, h1, h2, h3, h4, i, o1, o2, o3, tmp_arr;
|
||||
if (typeof atob !== "undefined" && atob !== null) {
|
||||
return atob(data);
|
||||
} else {
|
||||
b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
||||
i = 0;
|
||||
ac = 0;
|
||||
dec = "";
|
||||
tmp_arr = [];
|
||||
if (!data) {
|
||||
return data;
|
||||
}
|
||||
data += '';
|
||||
while (i < data.length) {
|
||||
h1 = b64.indexOf(data.charAt(i++));
|
||||
h2 = b64.indexOf(data.charAt(i++));
|
||||
h3 = b64.indexOf(data.charAt(i++));
|
||||
h4 = b64.indexOf(data.charAt(i++));
|
||||
bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
|
||||
o1 = bits >> 16 & 0xff;
|
||||
o2 = bits >> 8 & 0xff;
|
||||
o3 = bits & 0xff;
|
||||
if (h3 === 64) {
|
||||
tmp_arr[ac++] = String.fromCharCode(o1);
|
||||
} else if (h4 === 64) {
|
||||
tmp_arr[ac++] = String.fromCharCode(o1, o2);
|
||||
} else {
|
||||
tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
|
||||
}
|
||||
}
|
||||
return tmp_arr.join('');
|
||||
}
|
||||
};
|
||||
|
||||
base64UrlDecode = function(data) {
|
||||
var i, m, _i, _ref;
|
||||
m = data.length % 4;
|
||||
if (m !== 0) {
|
||||
for (i = _i = 0, _ref = 4 - m; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
|
||||
data += '=';
|
||||
}
|
||||
}
|
||||
data = data.replace(/-/g, '+');
|
||||
data = data.replace(/_/g, '/');
|
||||
return base64Decode(data);
|
||||
};
|
||||
|
||||
parseToken = function(token) {
|
||||
var head, payload, sig, _ref;
|
||||
_ref = token.split('.'), head = _ref[0], payload = _ref[1], sig = _ref[2];
|
||||
return JSON.parse(base64UrlDecode(payload));
|
||||
};
|
||||
|
||||
Annotator.Plugin.Auth = (function(_super) {
|
||||
__extends(Auth, _super);
|
||||
|
||||
Auth.prototype.options = {
|
||||
token: null,
|
||||
tokenUrl: '/auth/token',
|
||||
autoFetch: true
|
||||
};
|
||||
|
||||
function Auth(element, options) {
|
||||
Auth.__super__.constructor.apply(this, arguments);
|
||||
this.waitingForToken = [];
|
||||
if (this.options.token) {
|
||||
this.setToken(this.options.token);
|
||||
} else {
|
||||
this.requestToken();
|
||||
}
|
||||
}
|
||||
|
||||
Auth.prototype.requestToken = function() {
|
||||
var _this = this;
|
||||
this.requestInProgress = true;
|
||||
return $.ajax({
|
||||
url: this.options.tokenUrl,
|
||||
dataType: 'text',
|
||||
xhrFields: {
|
||||
withCredentials: true
|
||||
}
|
||||
}).done(function(data, status, xhr) {
|
||||
return _this.setToken(data);
|
||||
}).fail(function(xhr, status, err) {
|
||||
var msg;
|
||||
msg = Annotator._t("Couldn't get auth token:");
|
||||
console.error("" + msg + " " + err, xhr);
|
||||
return Annotator.showNotification("" + msg + " " + xhr.responseText, Annotator.Notification.ERROR);
|
||||
}).always(function() {
|
||||
return _this.requestInProgress = false;
|
||||
});
|
||||
};
|
||||
|
||||
Auth.prototype.setToken = function(token) {
|
||||
var _results,
|
||||
_this = this;
|
||||
this.token = token;
|
||||
this._unsafeToken = parseToken(token);
|
||||
if (this.haveValidToken()) {
|
||||
if (this.options.autoFetch) {
|
||||
this.refreshTimeout = setTimeout((function() {
|
||||
return _this.requestToken();
|
||||
}), (this.timeToExpiry() - 2) * 1000);
|
||||
}
|
||||
this.updateHeaders();
|
||||
_results = [];
|
||||
while (this.waitingForToken.length > 0) {
|
||||
_results.push(this.waitingForToken.pop()(this._unsafeToken));
|
||||
}
|
||||
return _results;
|
||||
} else {
|
||||
console.warn(Annotator._t("Didn't get a valid token."));
|
||||
if (this.options.autoFetch) {
|
||||
console.warn(Annotator._t("Getting a new token in 10s."));
|
||||
return setTimeout((function() {
|
||||
return _this.requestToken();
|
||||
}), 10 * 1000);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Auth.prototype.haveValidToken = function() {
|
||||
var allFields;
|
||||
allFields = this._unsafeToken && this._unsafeToken.issuedAt && this._unsafeToken.ttl && this._unsafeToken.consumerKey;
|
||||
if (allFields && this.timeToExpiry() > 0) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
Auth.prototype.timeToExpiry = function() {
|
||||
var expiry, issue, now, timeToExpiry;
|
||||
now = new Date().getTime() / 1000;
|
||||
issue = createDateFromISO8601(this._unsafeToken.issuedAt).getTime() / 1000;
|
||||
expiry = issue + this._unsafeToken.ttl;
|
||||
timeToExpiry = expiry - now;
|
||||
if (timeToExpiry > 0) {
|
||||
return timeToExpiry;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
Auth.prototype.updateHeaders = function() {
|
||||
var current;
|
||||
current = this.element.data('annotator:headers');
|
||||
return this.element.data('annotator:headers', $.extend(current, {
|
||||
'x-annotator-auth-token': this.token
|
||||
}));
|
||||
};
|
||||
|
||||
Auth.prototype.withToken = function(callback) {
|
||||
if (callback == null) {
|
||||
return;
|
||||
}
|
||||
if (this.haveValidToken()) {
|
||||
return callback(this._unsafeToken);
|
||||
} else {
|
||||
this.waitingForToken.push(callback);
|
||||
if (!this.requestInProgress) {
|
||||
return this.requestToken();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return Auth;
|
||||
|
||||
})(Annotator.Plugin);
|
||||
|
||||
/*
|
||||
//@ sourceMappingURL=auth.map
|
||||
*/
|
Loading…
Add table
Add a link
Reference in a new issue