Mark CVE

Mark the current page CVE

  1. // ==UserScript==
  2. // @name Mark CVE
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1.3
  5. // @description Mark the current page CVE
  6. // @author Kali-Team
  7. // @match *://*/*
  8. // @exclude https://scap.kali-team.cn/*
  9. // @icon https://avatars.githubusercontent.com/u/99640169?s=200&v=4
  10. // @grant none
  11. // @run-at document-idle
  12. // @homepage https://github.com/cn-kali-team/mark-cve
  13. // @license GPL-3.0-only
  14. // ==/UserScript==
  15.  
  16. (function () {
  17. 'use strict';
  18. let DefaultBaseUrl = 'https://scap.kali-team.cn/cve/';
  19.  
  20. function GetBaseURL() {
  21. const KeyName = 'base_url';
  22. if (typeof browser === "undefined") {
  23. return DefaultBaseUrl;
  24. }
  25. try {
  26. browser.storage.local.get(KeyName).then((item) => {
  27. DefaultBaseUrl = item.base_url || DefaultBaseUrl;
  28. });
  29. } catch (error) {
  30. console.error(error);
  31. }
  32. return DefaultBaseUrl;
  33. }
  34.  
  35. function Mark() {
  36. const userSelection = window.getSelection();
  37. const id = userSelection.toString().toLocaleUpperCase();
  38. const selectedTextRange = userSelection.getRangeAt(0);
  39. let cve = selectedTextRange.startContainer.parentNode;
  40. if (cve.querySelector(".Marked") != null || cve.getAttribute("class") === "Marked") {
  41. return;
  42. }
  43. if (["A", "CODE"].includes(cve.tagName)) {
  44. return;
  45. }
  46. const spanElement = document.createElement("span");
  47. spanElement.setAttribute("class", "Marked");
  48. selectedTextRange.surroundContents(spanElement);
  49. const icon = document.createElement("a");
  50. icon.href = DefaultBaseUrl + id;
  51. icon.target = "_blank";
  52. const svg = document.createElement('img');
  53. svg.setAttribute("style", "background-color: rgb(154, 205, 50);");
  54. svg.src = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJpY29uIGljb24tdGFibGVyIGljb24tdGFibGVyLWJ1ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggc3Ryb2tlPSJub25lIiBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTkgOXYtMWEzIDMgMCAwIDEgNiAwdjEiIC8+PHBhdGggZD0iTTggOWg4YTYgNiAwIDAgMSAxIDN2M2E1IDUgMCAwIDEgLTEwIDB2LTNhNiA2IDAgMCAxIDEgLTMiIC8+PHBhdGggZD0iTTMgMTNsNCAwIiAvPjxwYXRoIGQ9Ik0xNyAxM2w0IDAiIC8+PHBhdGggZD0iTTEyIDIwbDAgLTYiIC8+PHBhdGggZD0iTTQgMTlsMy4zNSAtMiIgLz48cGF0aCBkPSJNMjAgMTlsLTMuMzUgLTIiIC8+PHBhdGggZD0iTTQgN2wzLjc1IDIuNCIgLz48cGF0aCBkPSJNMjAgN2wtMy43NSAyLjQiIC8+PC9zdmc+";
  55. icon.appendChild(svg);
  56. spanElement.appendChild(icon);
  57. }
  58.  
  59. function FindCVE() {
  60. GetBaseURL();
  61. if (DefaultBaseUrl.startsWith(location.hostname)) {
  62. return;
  63. }
  64. const regex = new RegExp('\\bCVE-\\d{4}-\\d{4,7}\\b', 'gmi');
  65. let m;
  66. let cve_arr = [];
  67. while (m = regex.exec(document.body.innerText)) {
  68. cve_arr.push(m.toString().toLocaleUpperCase());
  69. }
  70. document.designMode = "on";
  71. Array.from(new Set(cve_arr)).forEach(cve => {
  72. const sel = window.getSelection();
  73. sel.collapse(document.body, 0);
  74. while (window.find(cve)) {
  75. Mark();
  76. sel.collapseToEnd();
  77. }
  78. Mark();
  79. sel.collapseToEnd();
  80. });
  81. window.scrollTo(0, 0);
  82. document.designMode = "off";
  83. }
  84.  
  85. FindCVE();
  86. })();