您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds saving of password configurations per service to getvau.lt
当前为
// ==UserScript== // @name Vault Save Password Configurations // @description Adds saving of password configurations per service to getvau.lt // @namespace https://github.com/insin/greasemonkey/ // @match https://getvau.lt/ // @version 1 // ==/UserScript== /** @typedef {'required' | 'allowed' | 'forbidden'} CharacterConfig */ /** * @typedef {{ * service: string * vlength: string * repeat: string * lower: CharacterConfig * upper: CharacterConfig * number: CharacterConfig * dash: CharacterConfig * space: CharacterConfig * symbol: CharacterConfig * }} Config */ function setText(selector, value) { let $input = document.querySelector(selector) $input.value = value $input.dispatchEvent(new Event('change')) } function setRadio(selector, value) { let $radio = document.querySelector(`${selector}[value="${value}"]`) $radio.checked = true $radio.dispatchEvent(new Event('change')) } /** @type {Config[]} */ let configs = JSON.parse(localStorage['configs'] || '[]') // Add a <datalist> for the service name input with stored service names let $services = document.createElement('datalist') $services.id = 'services' configs.forEach((config) => { let $option = document.createElement('option') $option.value = config.service $services.appendChild($option) }) document.body.appendChild($services) let $service = document.querySelector('#service') $service.setAttribute('list', 'services') // Populate config when a stored service name is entered $service.addEventListener('input', () => { let service = $service.value let config = configs.find((config) => config.service == service) if (!config) return setText('#vlength', config.vlength) setText('#repeat', config.repeat) setRadio('input[name="lower"]', config.lower) setRadio('input[name="upper"]', config.upper) setRadio('input[name="number"]', config.number) setRadio('input[name="dash"]', config.dash) setRadio('input[name="space"]', config.space) setRadio('input[name="symbol"]', config.symbol) }) // Wrap the form controls in a <form> so it's easier to get values out let $form = document.createElement('form') let $formDiv = document.querySelector('.form') $formDiv.insertAdjacentElement('beforebegin', $form) $form.appendChild($formDiv) // Add a Save Service Config button which saves the current configuration let $saveButtonSection = document.createElement('div') $saveButtonSection.className = 'sub' let $saveButton = document.createElement('button') $saveButton.type = 'button' $saveButton.innerText = 'Save Service Config' $saveButton.addEventListener('click', () => { let service = $form.elements.service.value let existingServiceIndex = configs.findIndex( (config) => config.service == service ) if (existingServiceIndex != -1) { configs.splice(existingServiceIndex, 1) } configs.push({ service, vlength: $form.elements.vlength.value, repeat: $form.elements.repeat.value, lower: $form.elements.lower.value, upper: $form.elements.upper.value, number: $form.elements.number.value, dash: $form.elements.dash.value, space: $form.elements.space.value, symbol: $form.elements.symbol.value, }) localStorage['configs'] = JSON.stringify(configs) }) $saveButtonSection.appendChild($saveButton) document.body.appendChild($saveButtonSection)