{"record":{"id":"0b554239370af0bc","repo":"siyuan-note/siyuan","slug":"encrypted-notebook-feature-is-not-enabled","errorCode":null,"errorMessage":"Encrypted notebook feature is not enabled","messagePattern":"Encrypted notebook feature is not enabled","errorType":"http","errorClass":null,"httpStatus":200,"severity":"error","filePath":"kernel/model/crypto.go","lineNumber":1173,"sourceCode":"\t*Conf.NotebookCrypto = *backup\n\tConf.m.Unlock()\n\tConf.Save()\n\t// 恢复成功后同步重写备份，确保配置和备份内容一致。\n\t// 调用方已持有 notebookCryptoMu，且 writeNotebookCryptoBackupData 不再申请该锁，故无死锁；\n\t// 同步写避免与 ChangeMasterPassword 的并发备份写竞争同一文件（lost update 导致 verifier 被回退）。\n\tnc := *backup\n\tif err := writeNotebookCryptoBackupData(&nc, kek); err != nil {\n\t\tlogging.LogWarnf(\"rewrite notebook crypto backup after restore failed: %s\", err)\n\t}\n\tlogging.LogInfof(\"notebook crypto restored from backup (e.g. after sync to a new device)\")\n\treturn kek, nil\n}\n\n// deriveNotebookCryptoBackupCandidate 对同步备份做无副作用验证，并确认它覆盖全部现有加密笔记本。\nfunc deriveNotebookCryptoBackupCandidate(password string) (backup *conf.NotebookCrypto, kek []byte, err error) {\n\tbackup, err = loadNotebookCryptoBackup()\n\tif err != nil || backup == nil || len(backup.MasterSalt) == 0 || len(backup.KEKVerifier) == 0 {\n\t\treturn nil, nil, errors.New(Conf.Language(310))\n\t}\n\tparams, validErr := util.ValidateArgon2Params(backup.KDFParams)\n\tif validErr != nil {\n\t\treturn nil, nil, errors.New(Conf.Language(317))\n\t}\n\tkek = util.DeriveKey(password, backup.MasterSalt, params)\n\tdecrypted, decryptErr := util.DecryptWithAAD(kek, backup.KEKVerifier, []byte(\"siyuan:kek-verifier\"))\n\tif decryptErr != nil || string(decrypted) != string(kekVerifierMagic) {\n\t\tzeroAndClear(kek)\n\t\treturn nil, nil, errors.New(Conf.Language(311))\n\t}\n\tif backup.Spec != conf.CurrentNotebookCryptoSpec || backup.Checksum == \"\" ||\n\t\tlen(backup.KEKMAC) == 0 || !verifyKEKMAC(backup, kek) {\n\t\tzeroAndClear(kek)\n\t\treturn nil, nil, errors.New(Conf.Language(316))\n\t}\n\tif !verifyKEKAgainstExistingBoxes(kek) || !verifyKEKAgainstEncryptedHistory(kek) {\n\t\tzeroAndClear(kek)","sourceCodeStart":1155,"sourceCodeEnd":1191,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/afa823b6b4e4f183511e0bc0a3be93caa94c7c97/kernel/model/crypto.go#L1155-L1191","documentation":"Error \"Encrypted notebook feature is not enabled\" thrown in siyuan-note/siyuan.","triggerScenarios":"Thrown at kernel/model/crypto.go:1173 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check whether encrypted notebooks are enabled before calling this operation; the key backup can only be restored or used when the feature is active.","If the feature was disabled, re-enable it first via Settings, then retry the operation.","Guard the calling code with the enabled flag so this path is unreachable when the feature is off."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"afa823b6b4e4f183511e0bc0a3be93caa94c7c97","analyzedAt":"2026-08-18T17:04:10.865Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}