keeweb/app/scripts/mixins/protected-value-ex.js

82 lines
2.2 KiB
JavaScript
Raw Normal View History

2016-01-16 15:19:33 +01:00
'use strict';
var kdbxweb = require('kdbxweb');
kdbxweb.ProtectedValue.prototype.isProtected = true;
2016-01-17 12:36:52 +01:00
kdbxweb.ProtectedValue.prototype.forEachChar = function(fn) {
var value = this._value, salt = this._salt;
var b, b1, b2, b3;
for (var i = 0, len = value.length; i < len; i++) {
b = value[i] ^ salt[i];
if (b < 128) {
fn(b);
continue;
}
i++; b1 = value[i] ^ salt[i];
if (i === len) { break; }
if (b >= 192 && b < 224) {
fn(((b & 0x1f) << 6) | (b1 & 0x3f));
continue;
}
i++; b2 = value[i] ^ salt[i];
if (i === len) { break; }
if (b >= 224 && b < 240) {
fn(((b & 0xf) << 12) | ((b1 & 0x3f) << 6) | (b2 & 0x3f));
}
i++; b3 = value[i] ^ salt[i];
if (i === len) { break; }
if (b >= 240 && b < 248) {
var c = ((b & 7) << 18) | ((b1 & 0x3f) << 12) | ((b2 & 0x3f) << 6) | (b3 & 0x3f);
if (c <= 0xffff) {
fn(c);
2016-01-16 15:19:33 +01:00
} else {
2016-01-17 12:36:52 +01:00
c ^= 0x10000;
fn(0xd800 | (c >> 10));
fn(0xdc00 | (c & 0x3ff));
2016-01-16 15:19:33 +01:00
}
}
2016-01-17 12:36:52 +01:00
// skip error
}
};
Object.defineProperty(kdbxweb.ProtectedValue.prototype, 'textLength', {
get: function() {
var textLength = 0;
this.forEachChar(function() { textLength++; });
2016-01-16 15:19:33 +01:00
return textLength;
}
});
2016-01-17 12:36:52 +01:00
kdbxweb.ProtectedValue.prototype.includesLower = function(findLower) {
var matches = false;
var foundSeqs = [];
var ix = 0;
var len = findLower.length;
this.forEachChar(function(ch) {
ch = String.fromCharCode(ch).toLowerCase();
if (matches) {
return;
}
for (var i = 0; i < foundSeqs.length; i++) {
var seqIx = ++foundSeqs[i];
if (findLower[seqIx] !== ch) {
foundSeqs.splice(i, 1);
i--;
2016-01-17 13:44:37 +01:00
continue;
}
if (seqIx === len - 1) {
matches = true;
return;
2016-01-17 12:36:52 +01:00
}
}
if (findLower[0] === ch) {
foundSeqs.push(0);
}
ix++;
});
return matches;
};
2016-01-16 15:19:33 +01:00
module.exports = kdbxweb.ProtectedValue;