-
Notifications
You must be signed in to change notification settings - Fork 2
/
cloak.js
74 lines (66 loc) · 2.46 KB
/
cloak.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// MutationObserver to watch for changes in the DOM
if (!window.cloakObserver) {
window.cloakObserver = new MutationObserver(cloakText);
}
function matchPatterns(value) {
const guidPattern = /\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\b/;
const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
const domainPattern = /(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}/;
const ipv4Pattern = /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/;
if (guidPattern.test(value) || emailPattern.test(value) || domainPattern.test(value) || ipv4Pattern.test(value)) {
return true;
}
return false;
}
function applyFilter(shouldCloak) {
const filter = shouldCloak ? "blur(5px)" : "none";
const maskText = "*****";
const elements = document.querySelectorAll("body *");
for (const element of elements) {
// Handle title
const title = element.getAttribute("title");
const maskTitle = element.getAttribute("maskTitle");
if (
(shouldCloak && title && matchPatterns(title)) ||
(!shouldCloak && maskTitle && matchPatterns(maskTitle))
) {
element.style.filter = filter;
if (shouldCloak) {
element.setAttribute("title", maskText);
element.setAttribute("maskTitle", title);
} else {
element.setAttribute("title", maskTitle);
element.removeAttribute("maskTitle");
}
continue;
}
// Handle children
for (const child of element.childNodes) {
if (
(child.nodeType === Node.TEXT_NODE) &&
matchPatterns(child.nodeValue)
) {
element.style.filter = filter;
break;
}
}
}
}
function cloakText() {
applyFilter(true);
}
function cloakTextAndStartObserving() {
cloakText();
// Start observing the whole document for changes
window.cloakObserver && window.cloakObserver.observe(document.body, {
childList: true, // Watch for added/removed elements
subtree: true // Watch the entire subtree of the document
});
}
function unCloakTextAndStopObserving() {
window.cloakObserver && window.cloakObserver.disconnect();
window.cloakObserver = null;
applyFilter(false);
}
window.unCloakTextAndStopObserving = unCloakTextAndStopObserving;
window.cloakTextAndStartObserving = cloakTextAndStartObserving;