新增 reset-password 子命令:免旧口令重设管理员口令并吊销全部会话
This commit is contained in:
+46
-1
@@ -1,4 +1,4 @@
|
||||
// pure-note 单二进制入口:serve / init / backup / gc / version(§7.6)。
|
||||
// pure-note 单二进制入口:serve / init / reset-password / backup / gc / version(§7.6)。
|
||||
package main
|
||||
|
||||
import (
|
||||
@@ -42,6 +42,8 @@ func main() {
|
||||
err = runServe(os.Args[2:])
|
||||
case "init":
|
||||
err = runInit(os.Args[2:])
|
||||
case "reset-password":
|
||||
err = runResetPassword(os.Args[2:])
|
||||
case "backup":
|
||||
err = runBackup(os.Args[2:])
|
||||
case "gc":
|
||||
@@ -67,6 +69,7 @@ func usage() {
|
||||
用法:
|
||||
pure-note serve [--addr :8080] [--data-dir ./data] [--behind-proxy] [--dev] [--allow-newer]
|
||||
pure-note init [--data-dir ./data]
|
||||
pure-note reset-password [--data-dir ./data] # 重设管理员口令并吊销全部会话
|
||||
pure-note backup [--data-dir ./data] [输出路径]
|
||||
pure-note gc [--data-dir ./data] [--commit] # 默认 dry-run
|
||||
pure-note version
|
||||
@@ -225,6 +228,48 @@ func runInit(args []string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// runResetPassword 重设管理员口令:CLI 可达即具备服务器权限,允许直接覆盖。
|
||||
// 口令来源与 init 一致:环境变量 PN_ADMIN_PASSWORD 或交互输入(避免出现在 ps 参数里)。
|
||||
// 重设成功后吊销全部会话,强制所有端重新登录。
|
||||
func runResetPassword(args []string) error {
|
||||
cfg, _, err := config.ParseMaint("reset-password", args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
st, err := store.Open(cfg.DBPath(), false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer st.Close()
|
||||
|
||||
var password string
|
||||
if env := os.Getenv("PN_ADMIN_PASSWORD"); env != "" {
|
||||
password = env
|
||||
fmt.Fprintln(os.Stderr, "已从环境变量 PN_ADMIN_PASSWORD 读取口令")
|
||||
} else {
|
||||
password, err = promptPassword()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err := auth.CheckPasswordStrength(password); err != nil {
|
||||
return err
|
||||
}
|
||||
hash, err := auth.HashPassword(password)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := st.SetSetting(store.KeyAdminPasswordHash, hash); err != nil {
|
||||
return err
|
||||
}
|
||||
revoked, err := st.DeleteAllSessions()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Printf("口令已重设;已吊销 %d 个会话,所有端需重新登录。\n", revoked)
|
||||
return nil
|
||||
}
|
||||
|
||||
func promptPassword() (string, error) {
|
||||
fmt.Print("设置管理员口令(≥12 字符): ")
|
||||
b1, err := term.ReadPassword(int(os.Stdin.Fd()))
|
||||
|
||||
Reference in New Issue
Block a user