Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.21 KB | None | 0 0
  1. 'use strict';
  2. alert('wtf')
  3. function defineobjectproperty(val, e, c, w) {
  4. // Makes an object describing a property
  5. return {
  6. value: val,
  7. enumerable: !!e,
  8. configurable: !!c,
  9. writable: !!w
  10. }
  11. }
  12.  
  13. var DEFAULT = 'auto'
  14.  
  15. var originalStyleSetProperty = CSSStyleDeclaration.prototype.setProperty
  16. var originalSetAttrib = Element.prototype.setAttribute
  17. var originalNodeAppendChild = Node.prototype.appendChild
  18. var FontListToUse = ["N0TR3ALf0NT","N0TR3ALf0NT2"].map(function(x){return x.toLowerCase()});
  19. var baseFonts= ["auto"]
  20. var keywords = ["inherit", "auto"]
  21. baseFonts.push.apply(baseFonts, FontListToUse)
  22. baseFonts.push.apply(baseFonts, keywords)
  23.  
  24. function getAllowedFontFamily(family) {
  25. var fonts = family.replace(/"|'/g,'').split(',')
  26. var allowedFonts = fonts.filter(function(font) {
  27. if(font && font.length) {
  28. var normalised = font.trim().toLowerCase()
  29. // Allow base fonts
  30. for(var allowed of baseFonts)
  31. if(normalised == allowed) return true
  32. // Allow web fonts
  33. for (var allowed of document.fonts.values())
  34. if(normalised == allowed) return true
  35. }
  36. })
  37. return allowedFonts.map(function(f){
  38. var trimmed = f.trim()
  39. return ~trimmed.indexOf(' ') ? "'" + trimmed + "'" : trimmed
  40. }).join(", ")
  41. }
  42.  
  43.  
  44. function modifiedCssSetProperty(key, val) {
  45. if(key.toLowerCase() == 'font-family') {
  46. var keyresult = key.toLowerCase()
  47. var allowed = getAllowedFontFamily(val)
  48. var oldFF = this.fontFamily
  49. return originalStyleSetProperty.call(this, 'font-family', allowed || DEFAULT)
  50. }
  51. return originalStyleSetProperty.call(this, key, val)
  52. }
  53.  
  54. function makeModifiedSetCssText(originalSetCssText) {
  55. return function modifiedSetCssText(css) {
  56. var fontFamilyMatch = css.match(/\b(?:font-family:([^;]+)(?:;|$))/i)
  57. if(fontFamilyMatch && fontFamilyMatch.length == 1) {
  58. css = css.replace(/\b(font-family:[^;]+(;|$))/i, '').trim()
  59. var allowed = getAllowedFontFamily(fontFamilyMatch[1]) || DEFAULT
  60. if(css.length && css[css.length - 1] != ';')
  61. css += ';'
  62. css += "font-family: " + allowed + ";"
  63. }
  64. return originalSetCssText.call(this, css)
  65. }
  66. }
  67.  
  68. var modifiedSetAttribute = (function() {
  69. var innerModify = makeModifiedSetCssText(function (val) {
  70. return originalSetAttrib.call(this, 'style', val)
  71. })
  72. return function modifiedSetAttribute(key, val) {
  73. if(key.toLowerCase() == 'style') {
  74. return innerModify.call(this, val)
  75. }
  76. return originalSetAttrib.call(this, key, val)
  77. }
  78. })();
  79.  
  80. function makeModifiedInnerHTML(originalInnerHTML) {
  81. return function modifiedInnerHTML(html) {
  82. var retval = originalInnerHTML.call(this, html)
  83. recursivelyModifyFonts(this.parentNode)
  84. return retval
  85. }
  86. }
  87.  
  88. function recursivelyModifyFonts(elem) {
  89. if(elem) {
  90. if(elem.style && elem.style.fontFamily) {
  91. modifiedCssSetProperty.call(elem.style, 'font-family', elem.style.fontFamily) // Uses the special setter
  92. }
  93. if(elem.childNodes)
  94. elem.childNodes.forEach(recursivelyModifyFonts)
  95. }
  96. return elem
  97. }
  98.  
  99. function modifiedAppend(child) {
  100. child = recursivelyModifyFonts(child)
  101. return originalNodeAppendChild.call(this, child)
  102. }
  103.  
  104.  
  105. var success = true
  106.  
  107. function overrideFunc(obj, name, f) {
  108. try {
  109. Object.defineProperty(obj.prototype, name, defineobjectproperty(f, true))
  110. } catch(e) {success=false;}
  111. }
  112.  
  113.  
  114. function overrideSetter(obj, name, makeSetter) {
  115. try {
  116. var current = Object.getOwnPropertyDescriptor(obj.prototype, name)
  117. current.set = makeSetter(current.set)
  118. current.configurable = false
  119. Object.defineProperty(obj.prototype, name, current)
  120. } catch(e) {success=false;}
  121. }
  122.  
  123. overrideFunc(Node, 'appendChild', modifiedAppend)
  124. overrideFunc(CSSStyleDeclaration, 'setProperty', modifiedCssSetProperty)
  125. overrideFunc(Element, 'setAttribute', modifiedSetAttribute)
  126.  
  127.  
  128.  
  129. try {
  130. Object.defineProperty(CSSStyleDeclaration.prototype, "fontFamily", {
  131. set: function fontFamily(f) {
  132. modifiedCssSetProperty.call(this, 'font-family', f)
  133. },
  134. get: function fontFamily() {
  135. return this.getPropertyValue('font-family')
  136. }
  137. })
  138. } catch(e) {success=false;}
  139.  
  140. overrideSetter(CSSStyleDeclaration,'cssText', makeModifiedSetCssText)
  141. overrideSetter(Element,'innerHTML', makeModifiedInnerHTML)
  142. overrideSetter(Element,'outerHTML', makeModifiedInnerHTML)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement