Greasy Fork 支持简体中文。

Vault Save Password Configurations

Adds saving of password configurations per service to getvau.lt

目前為 2021-11-04 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name Vault Save Password Configurations
  3. // @description Adds saving of password configurations per service to getvau.lt
  4. // @namespace https://github.com/insin/greasemonkey/
  5. // @match https://getvau.lt/
  6. // @version 1
  7. // ==/UserScript==
  8.  
  9. /** @typedef {'required' | 'allowed' | 'forbidden'} CharacterConfig */
  10.  
  11. /**
  12. * @typedef {{
  13. * service: string
  14. * vlength: string
  15. * repeat: string
  16. * lower: CharacterConfig
  17. * upper: CharacterConfig
  18. * number: CharacterConfig
  19. * dash: CharacterConfig
  20. * space: CharacterConfig
  21. * symbol: CharacterConfig
  22. * }} Config
  23. */
  24.  
  25. function setText(selector, value) {
  26. let $input = document.querySelector(selector)
  27. $input.value = value
  28. $input.dispatchEvent(new Event('change'))
  29. }
  30.  
  31. function setRadio(selector, value) {
  32. let $radio = document.querySelector(`${selector}[value="${value}"]`)
  33. $radio.checked = true
  34. $radio.dispatchEvent(new Event('change'))
  35. }
  36.  
  37. /** @type {Config[]} */
  38. let configs = JSON.parse(localStorage['configs'] || '[]')
  39.  
  40. // Add a <datalist> for the service name input with stored service names
  41. let $services = document.createElement('datalist')
  42. $services.id = 'services'
  43. configs.forEach((config) => {
  44. let $option = document.createElement('option')
  45. $option.value = config.service
  46. $services.appendChild($option)
  47. })
  48. document.body.appendChild($services)
  49.  
  50. let $service = document.querySelector('#service')
  51. $service.setAttribute('list', 'services')
  52.  
  53. // Populate config when a stored service name is entered
  54. $service.addEventListener('input', () => {
  55. let service = $service.value
  56. let config = configs.find((config) => config.service == service)
  57. if (!config) return
  58.  
  59. setText('#vlength', config.vlength)
  60. setText('#repeat', config.repeat)
  61. setRadio('input[name="lower"]', config.lower)
  62. setRadio('input[name="upper"]', config.upper)
  63. setRadio('input[name="number"]', config.number)
  64. setRadio('input[name="dash"]', config.dash)
  65. setRadio('input[name="space"]', config.space)
  66. setRadio('input[name="symbol"]', config.symbol)
  67. })
  68.  
  69. // Wrap the form controls in a <form> so it's easier to get values out
  70. let $form = document.createElement('form')
  71. let $formDiv = document.querySelector('.form')
  72. $formDiv.insertAdjacentElement('beforebegin', $form)
  73. $form.appendChild($formDiv)
  74.  
  75. // Add a Save Service Config button which saves the current configuration
  76. let $saveButtonSection = document.createElement('div')
  77. $saveButtonSection.className = 'sub'
  78. let $saveButton = document.createElement('button')
  79. $saveButton.type = 'button'
  80. $saveButton.innerText = 'Save Service Config'
  81. $saveButton.addEventListener('click', () => {
  82. let service = $form.elements.service.value
  83. let existingServiceIndex = configs.findIndex(
  84. (config) => config.service == service
  85. )
  86. if (existingServiceIndex != -1) {
  87. configs.splice(existingServiceIndex, 1)
  88. }
  89. configs.push({
  90. service,
  91. vlength: $form.elements.vlength.value,
  92. repeat: $form.elements.repeat.value,
  93. lower: $form.elements.lower.value,
  94. upper: $form.elements.upper.value,
  95. number: $form.elements.number.value,
  96. dash: $form.elements.dash.value,
  97. space: $form.elements.space.value,
  98. symbol: $form.elements.symbol.value,
  99. })
  100. localStorage['configs'] = JSON.stringify(configs)
  101. })
  102. $saveButtonSection.appendChild($saveButton)
  103. document.body.appendChild($saveButtonSection)