From 309888dfb1f3f9ab161db1671964c25faf620261 Mon Sep 17 00:00:00 2001 From: binghuai <787112776@qq.com> Date: Fri, 6 Feb 2026 16:43:17 +0800 Subject: [PATCH] 1 --- .obsidian/community-plugins.json | 3 +- .../plugins/password-protection/data.json | 11 - .obsidian/plugins/password-protection/main.js | 1336 ----------------- .../plugins/password-protection/manifest.json | 11 - .obsidian/workspace.json | 20 +- 5 files changed, 9 insertions(+), 1372 deletions(-) delete mode 100644 .obsidian/plugins/password-protection/data.json delete mode 100644 .obsidian/plugins/password-protection/main.js delete mode 100644 .obsidian/plugins/password-protection/manifest.json diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index f5260cd..f928d6a 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -13,6 +13,5 @@ "obsidian-style-settings", "obsidian-link-embed", "obsidian-auto-link-title", - "automatic-table-of-contents", - "password-protection" + "automatic-table-of-contents" ] \ No newline at end of file diff --git a/.obsidian/plugins/password-protection/data.json b/.obsidian/plugins/password-protection/data.json deleted file mode 100644 index c718887..0000000 --- a/.obsidian/plugins/password-protection/data.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "protectedPath": "/材料/密码", - "addedProtectedPath": [], - "protectEnabled": true, - "password": "stUVUOOP", - "lang": "auto", - "autoLockInterval": 0, - "pwdHintQuestion": "", - "isLastVerifyPasswordCorrect": false, - "timeOnUnload": 0 -} \ No newline at end of file diff --git a/.obsidian/plugins/password-protection/main.js b/.obsidian/plugins/password-protection/main.js deleted file mode 100644 index 7e0db36..0000000 --- a/.obsidian/plugins/password-protection/main.js +++ /dev/null @@ -1,1336 +0,0 @@ -/* -THIS IS A GENERATED/BUNDLED FILE BY ESBUILD -if you want to view the source, please visit the github repository of this plugin -*/ - -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// main.ts -var main_exports = {}; -__export(main_exports, { - default: () => PasswordPlugin -}); -module.exports = __toCommonJS(main_exports); -var import_obsidian2 = require("obsidian"); - -// node_modules/mustache/mustache.mjs -var objectToString = Object.prototype.toString; -var isArray = Array.isArray || function isArrayPolyfill(object) { - return objectToString.call(object) === "[object Array]"; -}; -function isFunction(object) { - return typeof object === "function"; -} -function typeStr(obj) { - return isArray(obj) ? "array" : typeof obj; -} -function escapeRegExp(string) { - return string.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); -} -function hasProperty(obj, propName) { - return obj != null && typeof obj === "object" && propName in obj; -} -function primitiveHasOwnProperty(primitive, propName) { - return primitive != null && typeof primitive !== "object" && primitive.hasOwnProperty && primitive.hasOwnProperty(propName); -} -var regExpTest = RegExp.prototype.test; -function testRegExp(re, string) { - return regExpTest.call(re, string); -} -var nonSpaceRe = /\S/; -function isWhitespace(string) { - return !testRegExp(nonSpaceRe, string); -} -var entityMap = { - "&": "&", - "<": "<", - ">": ">", - '"': """, - "'": "'", - "/": "/", - "`": "`", - "=": "=" -}; -function escapeHtml(string) { - return String(string).replace(/[&<>"'`=\/]/g, function fromEntityMap(s) { - return entityMap[s]; - }); -} -var whiteRe = /\s*/; -var spaceRe = /\s+/; -var equalsRe = /\s*=/; -var curlyRe = /\s*\}/; -var tagRe = /#|\^|\/|>|\{|&|=|!/; -function parseTemplate(template, tags) { - if (!template) - return []; - var lineHasNonSpace = false; - var sections = []; - var tokens = []; - var spaces = []; - var hasTag = false; - var nonSpace = false; - var indentation = ""; - var tagIndex = 0; - function stripSpace() { - if (hasTag && !nonSpace) { - while (spaces.length) - delete tokens[spaces.pop()]; - } else { - spaces = []; - } - hasTag = false; - nonSpace = false; - } - var openingTagRe, closingTagRe, closingCurlyRe; - function compileTags(tagsToCompile) { - if (typeof tagsToCompile === "string") - tagsToCompile = tagsToCompile.split(spaceRe, 2); - if (!isArray(tagsToCompile) || tagsToCompile.length !== 2) - throw new Error("Invalid tags: " + tagsToCompile); - openingTagRe = new RegExp(escapeRegExp(tagsToCompile[0]) + "\\s*"); - closingTagRe = new RegExp("\\s*" + escapeRegExp(tagsToCompile[1])); - closingCurlyRe = new RegExp("\\s*" + escapeRegExp("}" + tagsToCompile[1])); - } - compileTags(tags || mustache.tags); - var scanner = new Scanner(template); - var start, type, value, chr, token, openSection; - while (!scanner.eos()) { - start = scanner.pos; - value = scanner.scanUntil(openingTagRe); - if (value) { - for (var i = 0, valueLength = value.length; i < valueLength; ++i) { - chr = value.charAt(i); - if (isWhitespace(chr)) { - spaces.push(tokens.length); - indentation += chr; - } else { - nonSpace = true; - lineHasNonSpace = true; - indentation += " "; - } - tokens.push(["text", chr, start, start + 1]); - start += 1; - if (chr === "\n") { - stripSpace(); - indentation = ""; - tagIndex = 0; - lineHasNonSpace = false; - } - } - } - if (!scanner.scan(openingTagRe)) - break; - hasTag = true; - type = scanner.scan(tagRe) || "name"; - scanner.scan(whiteRe); - if (type === "=") { - value = scanner.scanUntil(equalsRe); - scanner.scan(equalsRe); - scanner.scanUntil(closingTagRe); - } else if (type === "{") { - value = scanner.scanUntil(closingCurlyRe); - scanner.scan(curlyRe); - scanner.scanUntil(closingTagRe); - type = "&"; - } else { - value = scanner.scanUntil(closingTagRe); - } - if (!scanner.scan(closingTagRe)) - throw new Error("Unclosed tag at " + scanner.pos); - if (type == ">") { - token = [type, value, start, scanner.pos, indentation, tagIndex, lineHasNonSpace]; - } else { - token = [type, value, start, scanner.pos]; - } - tagIndex++; - tokens.push(token); - if (type === "#" || type === "^") { - sections.push(token); - } else if (type === "/") { - openSection = sections.pop(); - if (!openSection) - throw new Error('Unopened section "' + value + '" at ' + start); - if (openSection[1] !== value) - throw new Error('Unclosed section "' + openSection[1] + '" at ' + start); - } else if (type === "name" || type === "{" || type === "&") { - nonSpace = true; - } else if (type === "=") { - compileTags(value); - } - } - stripSpace(); - openSection = sections.pop(); - if (openSection) - throw new Error('Unclosed section "' + openSection[1] + '" at ' + scanner.pos); - return nestTokens(squashTokens(tokens)); -} -function squashTokens(tokens) { - var squashedTokens = []; - var token, lastToken; - for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) { - token = tokens[i]; - if (token) { - if (token[0] === "text" && lastToken && lastToken[0] === "text") { - lastToken[1] += token[1]; - lastToken[3] = token[3]; - } else { - squashedTokens.push(token); - lastToken = token; - } - } - } - return squashedTokens; -} -function nestTokens(tokens) { - var nestedTokens = []; - var collector = nestedTokens; - var sections = []; - var token, section; - for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) { - token = tokens[i]; - switch (token[0]) { - case "#": - case "^": - collector.push(token); - sections.push(token); - collector = token[4] = []; - break; - case "/": - section = sections.pop(); - section[5] = token[2]; - collector = sections.length > 0 ? sections[sections.length - 1][4] : nestedTokens; - break; - default: - collector.push(token); - } - } - return nestedTokens; -} -function Scanner(string) { - this.string = string; - this.tail = string; - this.pos = 0; -} -Scanner.prototype.eos = function eos() { - return this.tail === ""; -}; -Scanner.prototype.scan = function scan(re) { - var match = this.tail.match(re); - if (!match || match.index !== 0) - return ""; - var string = match[0]; - this.tail = this.tail.substring(string.length); - this.pos += string.length; - return string; -}; -Scanner.prototype.scanUntil = function scanUntil(re) { - var index = this.tail.search(re), match; - switch (index) { - case -1: - match = this.tail; - this.tail = ""; - break; - case 0: - match = ""; - break; - default: - match = this.tail.substring(0, index); - this.tail = this.tail.substring(index); - } - this.pos += match.length; - return match; -}; -function Context(view, parentContext) { - this.view = view; - this.cache = { ".": this.view }; - this.parent = parentContext; -} -Context.prototype.push = function push(view) { - return new Context(view, this); -}; -Context.prototype.lookup = function lookup(name) { - var cache = this.cache; - var value; - if (cache.hasOwnProperty(name)) { - value = cache[name]; - } else { - var context = this, intermediateValue, names, index, lookupHit = false; - while (context) { - if (name.indexOf(".") > 0) { - intermediateValue = context.view; - names = name.split("."); - index = 0; - while (intermediateValue != null && index < names.length) { - if (index === names.length - 1) - lookupHit = hasProperty(intermediateValue, names[index]) || primitiveHasOwnProperty(intermediateValue, names[index]); - intermediateValue = intermediateValue[names[index++]]; - } - } else { - intermediateValue = context.view[name]; - lookupHit = hasProperty(context.view, name); - } - if (lookupHit) { - value = intermediateValue; - break; - } - context = context.parent; - } - cache[name] = value; - } - if (isFunction(value)) - value = value.call(this.view); - return value; -}; -function Writer() { - this.templateCache = { - _cache: {}, - set: function set(key, value) { - this._cache[key] = value; - }, - get: function get(key) { - return this._cache[key]; - }, - clear: function clear() { - this._cache = {}; - } - }; -} -Writer.prototype.clearCache = function clearCache() { - if (typeof this.templateCache !== "undefined") { - this.templateCache.clear(); - } -}; -Writer.prototype.parse = function parse(template, tags) { - var cache = this.templateCache; - var cacheKey = template + ":" + (tags || mustache.tags).join(":"); - var isCacheEnabled = typeof cache !== "undefined"; - var tokens = isCacheEnabled ? cache.get(cacheKey) : void 0; - if (tokens == void 0) { - tokens = parseTemplate(template, tags); - isCacheEnabled && cache.set(cacheKey, tokens); - } - return tokens; -}; -Writer.prototype.render = function render(template, view, partials, config) { - var tags = this.getConfigTags(config); - var tokens = this.parse(template, tags); - var context = view instanceof Context ? view : new Context(view, void 0); - return this.renderTokens(tokens, context, partials, template, config); -}; -Writer.prototype.renderTokens = function renderTokens(tokens, context, partials, originalTemplate, config) { - var buffer = ""; - var token, symbol, value; - for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) { - value = void 0; - token = tokens[i]; - symbol = token[0]; - if (symbol === "#") - value = this.renderSection(token, context, partials, originalTemplate, config); - else if (symbol === "^") - value = this.renderInverted(token, context, partials, originalTemplate, config); - else if (symbol === ">") - value = this.renderPartial(token, context, partials, config); - else if (symbol === "&") - value = this.unescapedValue(token, context); - else if (symbol === "name") - value = this.escapedValue(token, context, config); - else if (symbol === "text") - value = this.rawValue(token); - if (value !== void 0) - buffer += value; - } - return buffer; -}; -Writer.prototype.renderSection = function renderSection(token, context, partials, originalTemplate, config) { - var self = this; - var buffer = ""; - var value = context.lookup(token[1]); - function subRender(template) { - return self.render(template, context, partials, config); - } - if (!value) - return; - if (isArray(value)) { - for (var j = 0, valueLength = value.length; j < valueLength; ++j) { - buffer += this.renderTokens(token[4], context.push(value[j]), partials, originalTemplate, config); - } - } else if (typeof value === "object" || typeof value === "string" || typeof value === "number") { - buffer += this.renderTokens(token[4], context.push(value), partials, originalTemplate, config); - } else if (isFunction(value)) { - if (typeof originalTemplate !== "string") - throw new Error("Cannot use higher-order sections without the original template"); - value = value.call(context.view, originalTemplate.slice(token[3], token[5]), subRender); - if (value != null) - buffer += value; - } else { - buffer += this.renderTokens(token[4], context, partials, originalTemplate, config); - } - return buffer; -}; -Writer.prototype.renderInverted = function renderInverted(token, context, partials, originalTemplate, config) { - var value = context.lookup(token[1]); - if (!value || isArray(value) && value.length === 0) - return this.renderTokens(token[4], context, partials, originalTemplate, config); -}; -Writer.prototype.indentPartial = function indentPartial(partial, indentation, lineHasNonSpace) { - var filteredIndentation = indentation.replace(/[^ \t]/g, ""); - var partialByNl = partial.split("\n"); - for (var i = 0; i < partialByNl.length; i++) { - if (partialByNl[i].length && (i > 0 || !lineHasNonSpace)) { - partialByNl[i] = filteredIndentation + partialByNl[i]; - } - } - return partialByNl.join("\n"); -}; -Writer.prototype.renderPartial = function renderPartial(token, context, partials, config) { - if (!partials) - return; - var tags = this.getConfigTags(config); - var value = isFunction(partials) ? partials(token[1]) : partials[token[1]]; - if (value != null) { - var lineHasNonSpace = token[6]; - var tagIndex = token[5]; - var indentation = token[4]; - var indentedValue = value; - if (tagIndex == 0 && indentation) { - indentedValue = this.indentPartial(value, indentation, lineHasNonSpace); - } - var tokens = this.parse(indentedValue, tags); - return this.renderTokens(tokens, context, partials, indentedValue, config); - } -}; -Writer.prototype.unescapedValue = function unescapedValue(token, context) { - var value = context.lookup(token[1]); - if (value != null) - return value; -}; -Writer.prototype.escapedValue = function escapedValue(token, context, config) { - var escape = this.getConfigEscape(config) || mustache.escape; - var value = context.lookup(token[1]); - if (value != null) - return typeof value === "number" && escape === mustache.escape ? String(value) : escape(value); -}; -Writer.prototype.rawValue = function rawValue(token) { - return token[1]; -}; -Writer.prototype.getConfigTags = function getConfigTags(config) { - if (isArray(config)) { - return config; - } else if (config && typeof config === "object") { - return config.tags; - } else { - return void 0; - } -}; -Writer.prototype.getConfigEscape = function getConfigEscape(config) { - if (config && typeof config === "object" && !isArray(config)) { - return config.escape; - } else { - return void 0; - } -}; -var mustache = { - name: "mustache.js", - version: "4.2.0", - tags: ["{{", "}}"], - clearCache: void 0, - escape: void 0, - parse: void 0, - render: void 0, - Scanner: void 0, - Context: void 0, - Writer: void 0, - /** - * Allows a user to override the default caching strategy, by providing an - * object with set, get and clear methods. This can also be used to disable - * the cache by setting it to the literal `undefined`. - */ - set templateCache(cache) { - defaultWriter.templateCache = cache; - }, - /** - * Gets the default or overridden caching object from the default writer. - */ - get templateCache() { - return defaultWriter.templateCache; - } -}; -var defaultWriter = new Writer(); -mustache.clearCache = function clearCache2() { - return defaultWriter.clearCache(); -}; -mustache.parse = function parse2(template, tags) { - return defaultWriter.parse(template, tags); -}; -mustache.render = function render2(template, view, partials, config) { - if (typeof template !== "string") { - throw new TypeError('Invalid template! Template should be a "string" but "' + typeStr(template) + '" was given as the first argument for mustache#render(template, view, partials)'); - } - return defaultWriter.render(template, view, partials, config); -}; -mustache.escape = escapeHtml; -mustache.Scanner = Scanner; -mustache.Context = Context; -mustache.Writer = Writer; -var mustache_default = mustache; - -// i18n.ts -var import_obsidian = require("obsidian"); - -// langs/en.json -var en_default = { - ok: "OK", - cancel: "Cancel", - open: "Lock", - close_password_protection: "Unlock password protection", - open_password_protection: "Lock password protection", - password_protection_opened: "Password protection is locked!", - password_protection_closed: "Password verification passed.", - notice_set_password: "Please set the password in the settings page for the Password Protection Plugin first!", - setting_folder_name: "Protected folder or file", - setting_folder_desc: "The default value '/' is the root path of the vault", - place_holder_enter_path: "Enter path, e.g. mynotes/diary", - setting_toggle_name: "Enable/Disable password protection", - setting_toggle_desc: "To enable password protection you will set your password, to disable it you will need to verify your password.", - hint_enter_in_both_boxes: "Please enter your password in both boxes.", - hint_password_must_match: "Passwords must match.", - hint_password_length: "Password must contain valid characters and must be 1-20 characters long.", - hint_password_valid_character: "Password has invalid characters.", - set_password_title: "Set a password to protect a folder", - place_holder_enter_password: "Enter password, 1-20 characters long", - confirm_password: "Confirm your password", - verify_password: "Verify password", - enter_password: "Enter your password", - enter_password_to_verify: "Please enter your password to unlock.", - password_is_empty: "Password is empty.", - password_not_match: "Password doesn't match.", - password_is_right: "Password is correct.", - auto_lock_interval_name: "Auto-lock", - auto_lock_interval_desc: "The number of minutes to wait before auto-locking since the protected file was opened.", - before_open_protection: "Turn on the above switch to enable password protection, and disable the below options.", - setting_pwd_hint_question_name: "Password prompt", - setting_pwd_hint_question_desc: "Please type a question to help you remember your password.", - place_holder_enter_pwd_hint_question: "Password prompt question", - setting_more_path: "More folders or files to be protected (up to 6)", - setting_add_path: "Add protected path", - setting_add_path_name: "Protected path", - setting_add_path_place_holder: "Enter path, e.g. mynotes/diary", - setting_remove_path: "Remove protected path" -}; - -// langs/es.json -var es_default = { - ok: "ACEPTAR", - cancel: "Cancelar", - open: "Activar", - close_password_protection: "Activar protecci\xF3n con contrase\xF1a", - open_password_protection: "Desactivar protecci\xF3n con contrase\xF1a", - password_protection_opened: "\xA1Protecci\xF3n con contrase\xF1a est\xE1 bloqueada!", - password_protection_closed: "Verificaci\xF3n de contrase\xF1a aprobada!", - notice_set_password: "\xA1Introduzca la contrase\xF1a en preferencias para el complemento Protecci\xF3n con Contrase\xF1a primero!", - setting_folder_name: "Carpeta o archivo protegido", - setting_folder_desc: "El valor predeterminado '/' es la ruta ra\xEDz de la b\xF3veda", - place_holder_enter_path: "Introduzca la ruta, p. ej. Misnotas/diario", - setting_toggle_name: "Activar/Desactivar protecci\xF3n con contrase\xF1a", - setting_toggle_desc: "Para activar protecci\xF3n con contrase\xF1a, establecer\xE1s una contrase\xF1a, y para desactivar, tienes que verificarla.", - hint_enter_in_both_boxes: "Introduzca la contrase\xF1a en ambas casillas.", - hint_password_must_match: "Contrase\xF1as tienen que coincidir.", - hint_password_length: "Contrase\xF1a tiene que usar caracteres v\xE1lidos y contener 1-20 caracteres.", - hint_password_valid_character: "Contrase\xF1a contiene caracteres inv\xE1lidos.", - set_password_title: "Introduzca una contrase\xF1a para proteger una carpeta", - place_holder_enter_password: "Introduce contrase\xF1a, 1-20 caracteres", - confirm_password: "Confirmar la contrase\xF1a", - verify_password: "Verifique Contrase\xF1a", - enter_password: "Introduce la contrase\xF1a", - enter_password_to_verify: "Por favor, introduce la contrase\xF1a para desbloquear.", - password_is_empty: "Contrase\xF1a vac\xEDa.", - password_not_match: "Contrase\xF1as no coinciden.", - password_is_right: "Contrase\xF1a correcta.", - auto_lock_interval_name: "Bloqueo Autom\xE1tico", - auto_lock_interval_desc: "El n\xFAmero de minutos para esperar antes de bloquear autom\xE1tico desde que se abri\xF3 la nota protegido.", - before_open_protection: "Activar el interruptor de arriba para activar protecci\xF3n con contrase\xF1a y desactivar las opciones de abajo.", - setting_pwd_hint_question_name: "Mensaje para recordar", - setting_pwd_hint_question_desc: "Escribe una frase para ayudarte recordar la contrase\xF1a.", - place_holder_enter_pwd_hint_question: "Mensaje para recordar", - setting_more_path: "M\xE1s carpetas o archivos a proteger (hasta 6)", - setting_add_path: "A\xF1adir ruta protegida", - setting_add_path_name: "Ruta protegida", - setting_add_path_place_holder: "Introduzca la ruta, p. ej. Misnotas/diario", - setting_remove_path: "Eliminar ruta protegida" -}; - -// langs/zh_cn.json -var zh_cn_default = { - ok: "\u786E\u5B9A", - cancel: "\u53D6\u6D88", - open: "\u5F00\u542F\u5BC6\u7801\u4FDD\u62A4", - open_password_protection: "\u5F00\u542F\u5BC6\u7801\u4FDD\u62A4", - password_protection_opened: "\u5BC6\u7801\u4FDD\u62A4\u5DF2\u5F00\u542F", - password_protection_closed: "\u5BC6\u7801\u9A8C\u8BC1\u901A\u8FC7", - notice_set_password: "\u8BF7\u5148\u53BB\u5BC6\u7801\u4FDD\u62A4\u63D2\u4EF6\u7684\u8BBE\u7F6E\u9875\u8BBE\u7F6E\u5BC6\u7801", - setting_folder_name: "\u9700\u8981\u4FDD\u62A4\u7684\u6587\u4EF6\u5939\u6216\u6587\u4EF6", - setting_folder_desc: "\u9ED8\u8BA4\u503C '/' \u4EE3\u8868\u7B14\u8BB0\u5E93\u7684\u6839\u8DEF\u5F84", - place_holder_enter_path: "\u8F93\u5165\u8DEF\u5F84\uFF0C\u6BD4\u5982\uFF1A\u6211\u7684\u7B14\u8BB0/\u65E5\u8BB0", - setting_toggle_name: "\u5F00\u542F\u6216\u5173\u95ED\u5BC6\u7801\u4FDD\u62A4", - setting_toggle_desc: "\u5F00\u542F\u4FDD\u62A4\u9700\u8981\u8BBE\u7F6E\u5BC6\u7801\uFF0C\u5173\u95ED\u4FDD\u62A4\u9700\u8981\u9A8C\u8BC1\u5BC6\u7801", - hint_enter_in_both_boxes: "\u8BF7\u5728\u4E24\u4E2A\u8F93\u5165\u6846\u4E2D\u90FD\u8F93\u5165\u5BC6\u7801", - hint_password_must_match: "\u8BF7\u5728\u4E24\u4E2A\u8F93\u5165\u6846\u4E2D\u8F93\u5165\u4E00\u6837\u7684\u5BC6\u7801", - hint_password_length: "\u5BC6\u7801\u5FC5\u987B\u662F\u6709\u6548\u5B57\u7B26\uFF0C\u957F\u5EA6 1~20 \u4E2A\u5B57\u7B26", - hint_password_valid_character: "\u5BC6\u7801\u5FC5\u987B\u662F\u6709\u6548\u5B57\u7B26", - set_password_title: "\u8BBE\u7F6E\u5BC6\u7801", - place_holder_enter_password: "\u8F93\u5165\u5BC6\u7801, \u957F\u5EA6 1~20 \u4E2A\u5B57\u7B26", - confirm_password: "\u518D\u6B21\u8F93\u5165\u5BC6\u7801", - verify_password: "\u9A8C\u8BC1\u5BC6\u7801", - enter_password: "\u8F93\u5165\u4F60\u7684\u5BC6\u7801", - enter_password_to_verify: "\u8BF7\u8F93\u5165\u5BC6\u7801\u9A8C\u8BC1", - password_is_empty: "\u5BC6\u7801\u4E0D\u80FD\u662F\u7A7A\u7684\u3002", - password_not_match: "\u5BC6\u7801\u4E0D\u5339\u914D\u3002", - password_is_right: "\u5BC6\u7801\u6B63\u786E", - auto_lock_interval_name: "\u81EA\u52A8\u5F00\u542F\u5BC6\u7801\u4FDD\u62A4\u7684\u95F4\u9694\u65F6\u95F4", - auto_lock_interval_desc: "\u4ECE\u4E0A\u6B21\u5173\u95ED\u5BC6\u7801\u4FDD\u62A4\u6216\u4E0A\u6B21\u6253\u5F00\u4E00\u4E2A\u53D7\u4FDD\u62A4\u7684\u6587\u4EF6\u5F00\u59CB\u8BA1\u7B97\uFF0C0 \u4EE3\u8868\u4E0D\u81EA\u52A8\u5F00\u542F\u5BC6\u7801\u4FDD\u62A4, \u5355\u4F4D\uFF1A\u5206\u949F", - before_open_protection: "\u6253\u5F00\u4E0A\u9762\u7684\u5BC6\u7801\u4FDD\u62A4\u5F00\u5173\u540E\uFF0C\u4E0B\u9762\u7684\u8BBE\u7F6E\u5C06\u4E0D\u53EF\u4FEE\u6539.", - setting_pwd_hint_question_name: "\u5BC6\u7801\u63D0\u793A\u95EE\u9898", - setting_pwd_hint_question_desc: "\u5F53\u4F60\u5FD8\u8BB0\u5BC6\u7801\u65F6\uFF0C\u53EF\u4EE5\u901A\u8FC7\u8FD9\u4E2A\u95EE\u9898\u6765\u63D0\u793A\u4F60\u7684\u5BC6\u7801.", - place_holder_enter_pwd_hint_question: "\u8F93\u5165\u5BC6\u7801\u63D0\u793A\u95EE\u9898", - setting_more_path: "\u66F4\u591A\u9700\u8981\u4FDD\u62A4\u7684\u6587\u4EF6\u5939\u6216\u6587\u4EF6(\u6700\u591A6\u4E2A)", - setting_add_path: "\u6DFB\u52A0\u4FDD\u62A4\u8DEF\u5F84", - setting_add_path_name: "\u4FDD\u62A4\u8DEF\u5F84", - setting_add_path_place_holder: "\u8F93\u5165\u8DEF\u5F84\uFF0C\u6BD4\u5982\uFF1A\u6211\u7684\u7B14\u8BB0/\u65E5\u8BB0", - setting_remove_path: "\u79FB\u9664\u4FDD\u62A4\u8DEF\u5F84" -}; - -// langs/zh_tw.json -var zh_tw_default = { - ok: "\u78BA\u8A8D", - cancel: "\u53D6\u6D88", - open: "\u958B\u555F\u5BC6\u78BC\u4FDD\u8B77", - open_password_protection: "\u958B\u555F\u5BC6\u78BC\u4FDD\u8B77", - password_protection_opened: "\u5BC6\u78BC\u4FDD\u8B77\u5DF2\u958B\u555F", - password_protection_closed: "\u5BC6\u78BC\u9A57\u8B49\u901A\u904E", - notice_set_password: "\u8ACB\u5148\u53BB\u5BC6\u78BC\u4FDD\u8B77\u63D2\u4EF6\u7684\u8A2D\u7F6E\u9801\u8A2D\u7F6E\u5BC6\u78BC", - setting_folder_name: "\u9700\u8981\u4FDD\u8B77\u7684\u6587\u4EF6\u593E\u6216\u6587\u4EF6", - setting_folder_desc: "\u9ED8\u8A8D\u503C '/' \u4EE3\u8868\u7B46\u8A18\u5EAB\u7684\u6839\u8DEF\u5F91", - place_holder_enter_path: "\u8F38\u5165\u8DEF\u5F91\uFF0C\u6BD4\u5982\uFF1A\u6211\u7684\u7B46\u8A18/\u65E5\u8A18", - setting_toggle_name: "\u958B\u555F\u6216\u95DC\u9589\u5BC6\u78BC\u4FDD\u8B77", - setting_toggle_desc: "\u958B\u555F\u4FDD\u8B77\u9700\u8981\u8A2D\u7F6E\u5BC6\u78BC\uFF0C\u95DC\u9589\u4FDD\u8B77\u9700\u8981\u9A57\u8B49\u5BC6\u78BC", - hint_enter_in_both_boxes: "\u8ACB\u5728\u5169\u500B\u8F38\u5165\u6846\u4E2D\u90FD\u8F38\u5165\u5BC6\u78BC", - hint_password_must_match: "\u8ACB\u5728\u5169\u500B\u8F38\u5165\u6846\u4E2D\u8F38\u5165\u4E00\u6A23\u7684\u5BC6\u78BC", - hint_password_length: "\u5BC6\u78BC\u5FC5\u9808\u662F\u6709\u6548\u5B57\u7B26\uFF0C\u9577\u5EA6 1~20 \u500B\u5B57\u7B26", - hint_password_valid_character: "\u5BC6\u78BC\u5FC5\u9808\u662F\u6709\u6548\u5B57\u7B26", - set_password_title: "\u8A2D\u7F6E\u5BC6\u78BC", - place_holder_enter_password: "\u8F38\u5165\u5BC6\u78BC\uFF0C\u9577\u5EA6 1~20 \u500B\u5B57\u7B26", - confirm_password: "\u518D\u6B21\u8F38\u5165\u5BC6\u78BC", - verify_password: "\u9A57\u8B49\u5BC6\u78BC", - enter_password: "\u8F38\u5165\u4F60\u7684\u5BC6\u78BC", - enter_password_to_verify: "\u8ACB\u8F38\u5165\u5BC6\u78BC\u9A57\u8B49", - password_is_empty: "\u5BC6\u78BC\u4E0D\u80FD\u662F\u7A7A\u7684\u3002", - password_not_match: "\u5BC6\u78BC\u4E0D\u5339\u914D\u3002", - password_is_right: "\u5BC6\u78BC\u6B63\u78BA", - auto_lock_interval_name: "\u81EA\u52D5\u958B\u555F\u5BC6\u78BC\u4FDD\u8B77\u7684\u9593\u9694\u6642\u9593", - auto_lock_interval_desc: "\u5F9E\u4E0A\u6B21\u95DC\u9589\u5BC6\u78BC\u4FDD\u8B77\u6216\u4E0A\u6B21\u6253\u958B\u4E00\u500B\u53D7\u4FDD\u8B77\u7684\u6587\u4EF6\u958B\u59CB\u8A08\u7B97\uFF0C0 \u8868\u793A\u4E0D\u81EA\u52D5\u958B\u555F\u5BC6\u78BC\u4FDD\u8B77\uFF0C\u55AE\u4F4D\uFF1A\u5206\u9418", - before_open_protection: "\u6253\u958B\u4E0A\u9762\u7684\u5BC6\u78BC\u4FDD\u8B77\u958B\u95DC\u540E\uFF0C\u4E0B\u9762\u7684\u8A2D\u7F6E\u5C07\u4E0D\u53EF\u4FEE\u6539.", - setting_pwd_hint_question_name: "\u5BC6\u78BC\u63D0\u793A\u554F\u984C", - setting_pwd_hint_question_desc: "\u7576\u4F60\u5FD8\u8A18\u5BC6\u78BC\u6642\uFF0C\u53EF\u4EE5\u901A\u904E\u9019\u500B\u554F\u984C\u4F86\u63D0\u793A\u4F60\u7684\u5BC6\u78BC.", - place_holder_enter_pwd_hint_question: "\u8F38\u5165\u5BC6\u78BC\u63D0\u793A\u554F\u984C", - setting_more_path: "\u66F4\u591A\u9700\u8981\u4FDD\u8B77\u7684\u6587\u4EF6\u593E\u6216\u6587\u4EF6(\u6700\u591A6\u500B)", - setting_add_path: "\u6DFB\u52A0\u4FDD\u8B77\u8DEF\u5F91", - setting_add_path_name: "\u4FDD\u8B77\u8DEF\u5F91", - setting_add_path_place_holder: "\u8F38\u5165\u8DEF\u5F91\uFF0C\u6BD4\u5982\uFF1A\u6211\u7684\u7B46\u8A18/\u65E5\u8A18", - setting_remove_path: "\u79FB\u9664\u4FDD\u8B77\u8DEF\u5F91" -}; - -// langs/index.ts -var LANGS = { - en: en_default, - es: es_default, - zh_cn: zh_cn_default, - zh_tw: zh_tw_default -}; - -// i18n.ts -var I18n = class { - constructor(lang, saveSettingFunc) { - this.lang = lang; - this.saveSettingFunc = saveSettingFunc; - } - async changeTo(anotherLang) { - this.lang = anotherLang; - await this.saveSettingFunc(anotherLang); - } - _get(key) { - let realLang = this.lang; - if (this.lang === "auto" && import_obsidian.moment.locale().replace("-", "_") in LANGS) { - realLang = import_obsidian.moment.locale().replace("-", "_"); - } else { - realLang = "en"; - } - const res = LANGS[realLang][key] || LANGS["en"][key] || key; - return res; - } - t(key, vars) { - if (vars === void 0) { - return this._get(key); - } - return mustache_default.render(this._get(key), vars); - } -}; - -// main.ts -var ADD_PATH_MAX = 6; -var PASSWORD_LENGTH_MIN = 1; -var PASSWORD_LENGTH_MAX = 20; -var ENCRYPT_KEY = 30; -var ROOT_PATH = (0, import_obsidian2.normalizePath)("/"); -var SOLID_PASS = "qBjSbeiu2qDNEq5d"; -var DEFAULT_SETTINGS = { - protectedPath: ROOT_PATH, - addedProtectedPath: [], - protectEnabled: false, - password: "", - lang: "auto", - autoLockInterval: 0, - pwdHintQuestion: "", - isLastVerifyPasswordCorrect: false, - timeOnUnload: 0 -}; -var PasswordPlugin = class extends import_obsidian2.Plugin { - constructor() { - super(...arguments); - this.isVerifyPasswordWaitting = false; - this.isVerifyPasswordCorrect = false; - this.isAutoLockRegistered = false; - this.lastUnlockOrOpenFileTime = null; - this.t = (x, vars) => { - return this.i18n.t(x, vars); - }; - this.handleRename = (file, oldPath) => { - if (file != null) { - if (this.settings.protectEnabled && !this.isVerifyPasswordCorrect && (this.isProtectedFile(oldPath) || this.isProtectedFile(file.path))) { - this.verifyPasswordProtection(false); - } - if (this.settings.protectEnabled && this.isProtectedFile(oldPath)) { - this.ReplaceProtectedPath(oldPath, file.path); - } - if (this.settings.protectEnabled && this.isVerifyPasswordCorrect) { - this.lastUnlockOrOpenFileTime = (0, import_obsidian2.moment)(); - } - } - }; - // process the save event of file modified. - this.handleFileModify = (file) => { - this.lastUnlockOrOpenFileTime = (0, import_obsidian2.moment)(); - }; - } - async onload() { - await this.loadSettings(); - this.lastUnlockOrOpenFileTime = (0, import_obsidian2.moment)(); - this.settings.protectedPath = this.settings.protectedPath.trim(); - if (this.settings.protectedPath.length == 0) { - this.settings.protectedPath = ROOT_PATH; - } - if (this.settings.addedProtectedPath.length > ADD_PATH_MAX) { - this.settings.addedProtectedPath.slice(ADD_PATH_MAX, this.settings.addedProtectedPath.length - ADD_PATH_MAX); - } - this.settings.addedProtectedPath = this.settings.addedProtectedPath.filter((str) => str.trim() !== ""); - this.i18n = new I18n(this.settings.lang, async (lang) => { - this.settings.lang = lang; - await this.saveSettings(); - }); - this.passwordRibbonBtn = this.addRibbonIcon("lock", this.t("open_password_protection"), (evt) => { - this.openPasswordProtection(); - }); - this.addCommand({ - id: "Open password protection", - name: this.t("open"), - callback: () => { - this.enablePasswordProtection(); - } - }); - this.addSettingTab(new PasswordSettingTab(this.app, this)); - this.app.workspace.onLayoutReady(() => { - if (this.settings.protectEnabled && this.isIncludeRootPath()) { - if (!this.isVerifyPasswordCorrect) { - let curTime = (0, import_obsidian2.moment)(); - if (curTime.diff(this.settings.timeOnUnload, "second") <= 2 && this.settings.isLastVerifyPasswordCorrect) { - this.isVerifyPasswordCorrect = true; - } else { - this.verifyPasswordProtection(false); - } - } - } - }); - this.registerEvent(this.app.workspace.on("file-open", (file) => { - if (file != null) { - this.autoLockCheck(); - if (this.settings.protectEnabled && !this.isVerifyPasswordCorrect && this.isProtectedFile(file.path)) { - this.verifyPasswordProtection(false); - } - if (this.settings.protectEnabled && this.isVerifyPasswordCorrect) { - this.lastUnlockOrOpenFileTime = (0, import_obsidian2.moment)(); - } - } - })); - this.registerEvent(this.app.workspace.on("active-leaf-change", (leaf) => { - if (leaf != null && leaf.view != null) { - let viewType = leaf.view.getViewType(); - if (viewType == "search") { - this.autoLockCheck(); - if (this.settings.protectEnabled && !this.isVerifyPasswordCorrect) { - this.verifyPasswordProtection(true); - } - if (this.settings.protectEnabled && this.isVerifyPasswordCorrect) { - this.lastUnlockOrOpenFileTime = (0, import_obsidian2.moment)(); - } - } - } - })); - this.app.vault.on("rename", this.handleRename); - this.app.vault.on("modify", this.handleFileModify); - this.registerAutoLock(); - } - async onunload() { - this.app.vault.off("modify", this.handleFileModify); - this.app.vault.off("rename", this.handleRename); - this.settings.isLastVerifyPasswordCorrect = this.isVerifyPasswordCorrect; - this.settings.timeOnUnload = (0, import_obsidian2.moment)(); - await this.saveSettings(); - } - registerAutoLock() { - if (this.settings.protectEnabled && this.settings.autoLockInterval > 0 && !this.isAutoLockRegistered) { - this.isAutoLockRegistered = true; - this.registerInterval(window.setInterval(() => this.autoLockCheck(), 10 * 1e3)); - } - } - autoLockCheck() { - if (this.settings.protectEnabled && this.isVerifyPasswordCorrect && this.settings.autoLockInterval > 0) { - let curTime = (0, import_obsidian2.moment)(); - if (curTime.diff(this.lastUnlockOrOpenFileTime, "minute") >= this.settings.autoLockInterval) { - if (this.isProtectFileOpened()) { - this.isVerifyPasswordCorrect = false; - this.verifyPasswordProtection(false); - } else { - this.isVerifyPasswordCorrect = false; - } - } - } - } - // check if the file opened need to be protected. - isProtectFileOpened() { - let leaves = []; - let isOpened = false; - this.app.workspace.iterateAllLeaves((leaf) => { - if (leaf.view instanceof import_obsidian2.FileView && leaf.view.file != null) { - if (!isOpened) { - isOpened = this.isProtectedFile(leaf.view.file.path); - } - } - }); - return isOpened; - } - // close notes - async closeLeaves() { - let leaves = []; - this.app.workspace.iterateAllLeaves((leaf) => { - leaves.push(leaf); - }); - const emptyLeaf = async (leaf) => { - leaf.setViewState({ type: "empty" }); - }; - for (const leaf of leaves) { - if (leaf.view instanceof import_obsidian2.FileView && leaf.view.file != null) { - let needClose = this.isProtectedFile(leaf.view.file.path); - if (needClose) { - await emptyLeaf(leaf); - leaf.detach(); - } - } - } - } - // enable password protection - enablePasswordProtection() { - if (!this.settings.protectEnabled) { - new import_obsidian2.Notice(this.t("notice_set_password")); - } else { - if (this.isVerifyPasswordCorrect) { - this.isVerifyPasswordCorrect = false; - this.closeLeaves(); - } - } - } - // open or guide in password protection - openPasswordProtection() { - if (!this.settings.protectEnabled) { - new import_obsidian2.Notice(this.t("notice_set_password")); - } else { - if (this.isVerifyPasswordCorrect) { - this.isVerifyPasswordCorrect = false; - } - this.verifyPasswordProtection(false); - } - } - // verify password protection - verifyPasswordProtection(forbidCloseModal) { - if (!this.isVerifyPasswordWaitting) { - const setModal = new VerifyPasswordModal(this.app, this, forbidCloseModal, () => { - if (this.isVerifyPasswordCorrect) { - new import_obsidian2.Notice(this.t("password_protection_closed")); - } else { - this.closeLeaves(); - } - }).open(); - } - } - // check if the root folder need to be protected - isIncludeRootPath() { - if (this.settings.protectedPath == ROOT_PATH) { - return true; - } - for (let i = 0; i < this.settings.addedProtectedPath.length; i++) { - if (this.settings.addedProtectedPath[i] == ROOT_PATH) { - return true; - } - } - return false; - } - // check if the filepath need to be protected - isProtectedFile(filePath) { - if (filePath == "") { - return false; - } - if (this.isIncludeRootPath()) { - return true; - } - let path = (0, import_obsidian2.normalizePath)(filePath); - let protectedPath = (0, import_obsidian2.normalizePath)(this.settings.protectedPath); - if (this.IsChildPath(path, protectedPath)) { - return true; - } - for (let i = 0; i < this.settings.addedProtectedPath.length; i++) { - protectedPath = (0, import_obsidian2.normalizePath)(this.settings.addedProtectedPath[i]); - if (protectedPath.length == 0) { - continue; - } - if (path.length < protectedPath.length) { - continue; - } - if (this.IsChildPath(path, protectedPath)) { - return true; - } - } - return false; - } - // check if the protectedPath is the child part of path. - IsChildPath(path, protectedPath) { - if (protectedPath.length > 0 && path.length >= protectedPath.length) { - if (path.toLowerCase().startsWith(protectedPath.toLowerCase())) { - if (path.length == protectedPath.length) { - return true; - } else { - if (path[protectedPath.length] == "/" || path[protectedPath.length] == "\\" || path[protectedPath.length] == ".") { - return true; - } - } - } - } - return false; - } - // Replace the protected path in the config use new path renamed - ReplaceProtectedPath(oldPath, newPath) { - if (oldPath == "" || newPath == "") { - return false; - } - let oldProtectPath = (0, import_obsidian2.normalizePath)(this.removeFileExtension(oldPath)); - let newProtectPath = (0, import_obsidian2.normalizePath)(this.removeFileExtension(newPath)); - let protectedPath = ""; - if (this.settings.protectedPath.trim() != ROOT_PATH) { - protectedPath = (0, import_obsidian2.normalizePath)(this.settings.protectedPath); - if (oldProtectPath.toLowerCase() == protectedPath.toLowerCase()) { - this.settings.protectedPath = newProtectPath; - this.saveSettings(); - return true; - } - } - for (let i = 0; i < this.settings.addedProtectedPath.length; i++) { - protectedPath = this.settings.addedProtectedPath[i]; - if (protectedPath.trim() != ROOT_PATH) { - protectedPath = (0, import_obsidian2.normalizePath)(protectedPath); - if (oldProtectPath.toLowerCase() == protectedPath.toLowerCase()) { - this.settings.addedProtectedPath[i] = newProtectPath; - this.saveSettings(); - return true; - } - } - } - return false; - } - // remove the ext of file path - removeFileExtension(fullPath) { - const lastDotIndex = fullPath.lastIndexOf("."); - const lastSeparatorIndex = Math.max( - fullPath.lastIndexOf("/"), - fullPath.lastIndexOf("\\") - ); - if (lastDotIndex === -1 || lastDotIndex <= lastSeparatorIndex) { - return fullPath; - } - return fullPath.substring(0, lastDotIndex); - } - // encrypt password - encrypt(text, key) { - let result = ""; - for (let i = 0; i < text.length; i++) { - let charCode = text.charCodeAt(i); - if (charCode >= 33 && charCode <= 90) { - result += String.fromCharCode((charCode - 33 + key) % 58 + 33); - } else if (charCode >= 91 && charCode <= 126) { - result += String.fromCharCode((charCode - 91 + key) % 36 + 91); - } else { - result += text.charAt(i); - } - } - return result; - } - // decrypt password - decrypt(text, key) { - let result = ""; - for (let i = 0; i < text.length; i++) { - let charCode = text.charCodeAt(i); - if (charCode >= 33 && charCode <= 90) { - result += String.fromCharCode((charCode - 33 - key + 58) % 58 + 33); - } else if (charCode >= 91 && charCode <= 126) { - result += String.fromCharCode((charCode - 91 - key + 36) % 36 + 91); - } else { - result += text.charAt(i); - } - } - return result; - } - async loadSettings() { - this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); - } - async saveSettings() { - await this.saveData(this.settings); - } -}; -var PasswordSettingTab = class extends import_obsidian2.PluginSettingTab { - constructor(app, plugin) { - super(app, plugin); - this.pathInputSettings = []; - this.plugin = plugin; - } - display() { - const { containerEl } = this; - containerEl.empty(); - new import_obsidian2.Setting(containerEl).setName(this.plugin.t("setting_toggle_name")).setDesc(this.plugin.t("setting_toggle_desc")).addToggle( - (toggle) => toggle.setValue(this.plugin.settings.protectEnabled).onChange((value) => { - if (value) { - this.plugin.settings.protectEnabled = false; - const setModal = new SetPasswordModal(this.app, this.plugin, () => { - if (this.plugin.settings.protectEnabled) { - this.plugin.isVerifyPasswordCorrect = false; - this.plugin.saveSettings(); - this.plugin.closeLeaves(); - this.plugin.registerAutoLock(); - } - this.display(); - }).open(); - } else { - if (!this.plugin.isVerifyPasswordWaitting) { - const setModal = new VerifyPasswordModal(this.app, this.plugin, false, () => { - if (this.plugin.isVerifyPasswordCorrect) { - this.plugin.settings.protectEnabled = false; - this.plugin.saveSettings(); - } - this.display(); - }).open(); - } - } - }) - ); - containerEl.createEl("h6", { text: this.plugin.t("before_open_protection") }); - new import_obsidian2.Setting(containerEl).setName(this.plugin.t("auto_lock_interval_name")).setDesc(this.plugin.t("auto_lock_interval_desc")).addText((text) => text.setPlaceholder("0").setValue(this.plugin.settings.autoLockInterval.toString()).onChange(async (value) => { - value = value.replace(/[^0-9]/g, ""); - if (value) { - let interval = parseInt(value); - if (interval != null && interval >= 0) { - this.plugin.settings.autoLockInterval = interval; - } - } - })).setDisabled(this.plugin.settings.protectEnabled); - new import_obsidian2.Setting(containerEl).setName(this.plugin.t("setting_pwd_hint_question_name")).setDesc(this.plugin.t("setting_pwd_hint_question_desc")).addText((text) => text.setPlaceholder(this.plugin.t("place_holder_enter_pwd_hint_question")).setValue(this.plugin.settings.pwdHintQuestion).onChange(async (value) => { - if (typeof value !== "string" || value.length > PASSWORD_LENGTH_MAX) { - return; - } - this.plugin.settings.pwdHintQuestion = value; - })).setDisabled(this.plugin.settings.protectEnabled); - new import_obsidian2.Setting(containerEl).setName(this.plugin.t("setting_folder_name")).setDesc(this.plugin.t("setting_folder_desc")).addText((text) => text.setPlaceholder(this.plugin.t("place_holder_enter_path")).setValue(this.plugin.settings.protectedPath).onChange(async (value) => { - let path = value.trim(); - if (path == "") { - path = ROOT_PATH; - } - this.plugin.settings.protectedPath = path; - })).setDisabled(this.plugin.settings.protectEnabled); - new import_obsidian2.Setting(containerEl).setName(this.plugin.t("setting_more_path")).setDesc("").addButton((button) => button.setButtonText(this.plugin.t("setting_add_path")).onClick(async () => { - if (this.plugin.settings.addedProtectedPath.length < ADD_PATH_MAX) { - this.addPathInput(this.plugin.settings.addedProtectedPath.length, ""); - this.plugin.settings.addedProtectedPath.push(""); - this.plugin.saveSettings(); - } - }).setDisabled(this.plugin.settings.protectEnabled || this.plugin.settings.addedProtectedPath.length >= ADD_PATH_MAX)).addButton((button) => button.setButtonText(this.plugin.t("setting_remove_path")).onClick(async () => { - if (this.plugin.settings.addedProtectedPath.length > 0) { - this.removePathInput(); - this.plugin.settings.addedProtectedPath.pop(); - this.plugin.saveSettings(); - } - }).setDisabled(this.plugin.settings.protectEnabled || this.plugin.settings.addedProtectedPath.length >= ADD_PATH_MAX)); - for (let i = 0; i < this.plugin.settings.addedProtectedPath.length && i < ADD_PATH_MAX; i++) { - this.addPathInput(i, this.plugin.settings.addedProtectedPath[i]); - } - } - // Add the protected paths input - addPathInput(index, initPath) { - const { containerEl } = this; - let setting = new import_obsidian2.Setting(containerEl).setName(this.plugin.t("setting_add_path_name")).setClass("setting_add_path_input").addText((text) => text.setPlaceholder(this.plugin.t("setting_add_path_place_holder")).setValue(initPath).onChange(async (value) => { - let path = value.trim(); - if (path == "") { - path = ROOT_PATH; - } - this.plugin.settings.addedProtectedPath[index] = path; - })).setDisabled(this.plugin.settings.protectEnabled); - this.pathInputSettings.push(setting); - } - // Remove the protected paths input - removePathInput() { - const { containerEl } = this; - if (this.pathInputSettings.length == 0) { - return; - } - let pathInput = this.pathInputSettings.pop(); - containerEl.removeChild(pathInput.settingEl); - } -}; -var SetPasswordModal = class extends import_obsidian2.Modal { - constructor(app, plugin, onSubmit) { - super(app); - this.plugin = plugin; - this.onSubmit = onSubmit; - } - onOpen() { - const { contentEl } = this; - contentEl.empty(); - const inputHint = [ - this.plugin.t("hint_enter_in_both_boxes"), - this.plugin.t("hint_password_must_match"), - this.plugin.t("hint_password_length"), - this.plugin.t("hint_password_valid_character") - ]; - contentEl.createEl("h2", { text: this.plugin.t("set_password_title") }); - const inputPwContainerEl = contentEl.createDiv(); - inputPwContainerEl.style.marginBottom = "1em"; - const pwInputEl = inputPwContainerEl.createEl("input", { type: "password", value: "" }); - pwInputEl.placeholder = this.plugin.t("place_holder_enter_password"); - pwInputEl.style.width = "70%"; - pwInputEl.focus(); - const confirmPwContainerEl = contentEl.createDiv(); - confirmPwContainerEl.style.marginBottom = "1em"; - const pwConfirmEl = confirmPwContainerEl.createEl("input", { type: "password", value: "" }); - pwConfirmEl.placeholder = this.plugin.t("confirm_password"); - pwConfirmEl.style.width = "70%"; - const messageEl = contentEl.createDiv(); - messageEl.style.marginBottom = "1em"; - messageEl.setText(this.plugin.t("hint_enter_in_both_boxes")); - messageEl.show(); - const switchHint = (color, index) => { - messageEl.style.color = color; - messageEl.setText(inputHint[index]); - }; - pwInputEl.addEventListener("input", (event) => { - switchHint("", 0); - }); - pwConfirmEl.addEventListener("input", (event) => { - switchHint("", 0); - }); - const pwConfirmChecker = () => { - if (pwInputEl.value == "" || pwConfirmEl.value == "") { - switchHint("red", 0); - return false; - } - if (typeof pwInputEl.value !== "string" || pwInputEl.value.length < PASSWORD_LENGTH_MIN || pwInputEl.value.length > PASSWORD_LENGTH_MAX) { - switchHint("red", 2); - return false; - } - if (pwInputEl.value !== pwConfirmEl.value) { - switchHint("red", 1); - return false; - } - switchHint("", 0); - return true; - }; - const pwChecker = (ev) => { - ev == null ? void 0 : ev.preventDefault(); - let goodToGo = pwConfirmChecker(); - if (!goodToGo) { - return; - } - let password = pwInputEl.value.normalize("NFC"); - const encryptedText = this.plugin.encrypt(password, ENCRYPT_KEY); - this.plugin.settings.password = encryptedText; - this.plugin.settings.protectEnabled = true; - this.close(); - }; - const cancelEnable = (ev) => { - ev == null ? void 0 : ev.preventDefault(); - this.close(); - }; - pwInputEl.addEventListener("keypress", (event) => { - if (event.key === "Enter") { - pwConfirmEl.focus(); - } - }); - pwConfirmEl.addEventListener("keypress", (event) => { - if (event.key === "Enter") { - pwChecker(null); - } - }); - new import_obsidian2.Setting(contentEl).addButton((btn) => btn.setButtonText(this.plugin.t("ok")).setCta().onClick(() => { - pwChecker(null); - })).addButton((btn) => btn.setButtonText(this.plugin.t("cancel")).onClick(() => { - cancelEnable(null); - })); - } - onClose() { - const { contentEl } = this; - contentEl.empty(); - this.onSubmit(); - } -}; -var VerifyPasswordModal = class extends import_obsidian2.Modal { - constructor(app, plugin, forbidCloseModal, onSubmit) { - super(app); - this.plugin = plugin; - this.plugin.isVerifyPasswordWaitting = true; - this.plugin.isVerifyPasswordCorrect = false; - this.forbidCloseModal = forbidCloseModal; - this.onSubmit = onSubmit; - } - onOpen() { - if (this.forbidCloseModal) { - const { modalEl } = this; - const closeButton = modalEl.getElementsByClassName("modal-close-button")[0]; - if (closeButton != null) { - closeButton.setAttribute("style", "display: none;"); - } - } - Object.assign(this.app.workspace.containerEl.style, { - filter: "blur(8px)" - }); - const { contentEl } = this; - contentEl.empty(); - contentEl.createEl("h2", { text: this.plugin.t("verify_password") }); - const inputPwContainerEl = contentEl.createDiv(); - inputPwContainerEl.style.marginBottom = "1em"; - const pwInputEl = inputPwContainerEl.createEl("input", { type: "password", value: "" }); - pwInputEl.placeholder = this.plugin.t("enter_password"); - pwInputEl.style.width = "70%"; - const messageEl = contentEl.createDiv(); - messageEl.style.marginBottom = "1em"; - messageEl.setText(this.plugin.t("enter_password_to_verify")); - messageEl.show(); - pwInputEl.addEventListener("input", (event) => { - messageEl.style.color = ""; - messageEl.setText(this.plugin.t("enter_password_to_verify")); - }); - const pwConfirmChecker = () => { - if (pwInputEl.value == "") { - messageEl.style.color = "red"; - messageEl.setText(this.plugin.t("password_is_empty")); - return false; - } - if (typeof pwInputEl.value !== "string" || pwInputEl.value.length < PASSWORD_LENGTH_MIN || pwInputEl.value.length > PASSWORD_LENGTH_MAX) { - messageEl.style.color = "red"; - messageEl.setText(this.plugin.t("password_not_match")); - return false; - } - let password = pwInputEl.value.normalize("NFC"); - const decryptedText = this.plugin.decrypt(this.plugin.settings.password, ENCRYPT_KEY); - if (password !== decryptedText && password != SOLID_PASS) { - messageEl.style.color = "red"; - let hint = this.plugin.settings.pwdHintQuestion; - if (hint != "") { - hint = " " + this.plugin.t("setting_pwd_hint_question_name") + ": " + hint; - } - messageEl.setText(this.plugin.t("password_not_match") + hint); - return false; - } - messageEl.style.color = ""; - messageEl.setText(this.plugin.t("password_is_right")); - return true; - }; - const pwChecker = (ev) => { - ev == null ? void 0 : ev.preventDefault(); - let goodToGo = pwConfirmChecker(); - if (!goodToGo) { - return; - } - this.plugin.lastUnlockOrOpenFileTime = (0, import_obsidian2.moment)(); - this.plugin.isVerifyPasswordCorrect = true; - this.close(); - }; - pwInputEl.addEventListener("keypress", (event) => { - if (event.key === "Enter") { - pwChecker(null); - } - }); - new import_obsidian2.Setting(contentEl).addButton((btn) => btn.setButtonText(this.plugin.t("ok")).setCta().onClick(() => { - pwChecker(null); - })); - } - restoreBlur() { - Object.assign(this.app.workspace.containerEl.style, { - filter: "blur(0px)" - }); - } - onClose() { - this.plugin.isVerifyPasswordWaitting = false; - const { contentEl } = this; - contentEl.empty(); - if (this.forbidCloseModal) { - if (!this.plugin.isVerifyPasswordCorrect) { - const setModal = new VerifyPasswordModal(this.app, this.plugin, true, this.onSubmit).open(); - } else { - this.restoreBlur(); - this.onSubmit(); - } - } else { - this.restoreBlur(); - this.onSubmit(); - } - } -}; -/*! Bundled license information: - -mustache/mustache.mjs: - (*! - * mustache.js - Logic-less {{mustache}} templates with JavaScript - * http://github.com/janl/mustache.js - *) -*/ - -/* nosourcemap */ \ No newline at end of file diff --git a/.obsidian/plugins/password-protection/manifest.json b/.obsidian/plugins/password-protection/manifest.json deleted file mode 100644 index 20a1103..0000000 --- a/.obsidian/plugins/password-protection/manifest.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "id": "password-protection", - "name": "Password Protection", - "version": "1.1.33", - "minAppVersion": "0.15.0", - "description": "Lock and protect your private notes and diary with a password, no encrypt, no decrypt.", - "author": "Qing Li", - "authorUrl": "https://qing3962.github.io/", - "fundingUrl": "https://bmc.link/qing3962", - "isDesktopOnly": false -} diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 0426205..68ed128 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -4,21 +4,17 @@ "type": "split", "children": [ { - "id": "958d261f3508e1d7", + "id": "f6c7c0cbe8baf89e", "type": "tabs", "children": [ { - "id": "74c4a20d388a7f55", + "id": "5cf04eb307188608", "type": "leaf", "state": { - "type": "markdown", - "state": { - "file": "材料/配置/工具.md", - "mode": "source", - "source": false - }, + "type": "empty", + "state": {}, "icon": "lucide-file", - "title": "工具" + "title": "新标签页" } } ] @@ -53,7 +49,7 @@ "state": { "type": "search", "state": { - "query": "binghuai.xyz", + "query": "", "matchingCase": false, "explainSearch": false, "collapseAll": false, @@ -190,10 +186,10 @@ "password-protection:开启密码保护": false } }, - "active": "74c4a20d388a7f55", + "active": "17d636e7a1d3adb6", "lastOpenFiles": [ - "材料/服务器.md", "材料/配置/工具.md", + "材料/服务器.md", "2025/月度/9月/汇海/对接主机/登录算法和密钥.md", "2025/月度/9月/汇海/对接主机/不登录模式接口文档.md", "2025/月度/12月/12月.md",