From 6bbee89204b28c86bcc2b9dfad8df23263991be8 Mon Sep 17 00:00:00 2001 From: Neko Box Coder Date: Sun, 19 Jan 2025 22:56:22 +0000 Subject: [PATCH] Add the ability lock settings.json and bindings.json --- cmd/micro/initlua.go | 6 +++--- internal/action/bindings.go | 7 +++++++ internal/action/command.go | 14 ++++++++++++++ internal/config/settings.go | 2 ++ runtime/help/options.md | 10 ++++++++++ 5 files changed, 36 insertions(+), 3 deletions(-) diff --git a/cmd/micro/initlua.go b/cmd/micro/initlua.go index 7eac563763..ffe175a02d 100644 --- a/cmd/micro/initlua.go +++ b/cmd/micro/initlua.go @@ -73,7 +73,7 @@ func luaImportMicroConfig() *lua.LTable { ulua.L.SetField(pkg, "OptionComplete", luar.New(ulua.L, action.OptionComplete)) ulua.L.SetField(pkg, "OptionValueComplete", luar.New(ulua.L, action.OptionValueComplete)) ulua.L.SetField(pkg, "NoComplete", luar.New(ulua.L, nil)) - ulua.L.SetField(pkg, "TryBindKey", luar.New(ulua.L, action.TryBindKey)) + ulua.L.SetField(pkg, "TryBindKey", luar.New(ulua.L, action.TryBindKeyPlug)) ulua.L.SetField(pkg, "Reload", luar.New(ulua.L, action.ReloadConfig)) ulua.L.SetField(pkg, "AddRuntimeFileFromMemory", luar.New(ulua.L, config.PluginAddRuntimeFileFromMemory)) ulua.L.SetField(pkg, "AddRuntimeFilesFromDirectory", luar.New(ulua.L, config.PluginAddRuntimeFilesFromDirectory)) @@ -88,8 +88,8 @@ func luaImportMicroConfig() *lua.LTable { ulua.L.SetField(pkg, "RegisterCommonOption", luar.New(ulua.L, config.RegisterCommonOptionPlug)) ulua.L.SetField(pkg, "RegisterGlobalOption", luar.New(ulua.L, config.RegisterGlobalOptionPlug)) ulua.L.SetField(pkg, "GetGlobalOption", luar.New(ulua.L, config.GetGlobalOption)) - ulua.L.SetField(pkg, "SetGlobalOption", luar.New(ulua.L, action.SetGlobalOption)) - ulua.L.SetField(pkg, "SetGlobalOptionNative", luar.New(ulua.L, action.SetGlobalOptionNative)) + ulua.L.SetField(pkg, "SetGlobalOption", luar.New(ulua.L, action.SetGlobalOptionPlug)) + ulua.L.SetField(pkg, "SetGlobalOptionNative", luar.New(ulua.L, action.SetGlobalOptionNativePlug)) ulua.L.SetField(pkg, "ConfigDir", luar.New(ulua.L, config.ConfigDir)) return pkg diff --git a/internal/action/bindings.go b/internal/action/bindings.go index 67c4634ca3..5b99f9b79e 100644 --- a/internal/action/bindings.go +++ b/internal/action/bindings.go @@ -256,6 +256,13 @@ func eventsEqual(e1 Event, e2 Event) bool { return e1 == e2 } +func TryBindKeyPlug(k, v string, overwrite bool) (bool, error) { + if l, ok := config.GlobalSettings["lockbindings"]; ok && l.(bool) { + return false, errors.New("bindings.json file locked by user for all plugins") + } + return TryBindKey(k, v, overwrite) +} + // TryBindKey tries to bind a key by writing to config.ConfigDir/bindings.json // Returns true if the keybinding already existed and a possible error func TryBindKey(k, v string, overwrite bool) (bool, error) { diff --git a/internal/action/command.go b/internal/action/command.go index 211e237c63..13e760380c 100644 --- a/internal/action/command.go +++ b/internal/action/command.go @@ -634,6 +634,13 @@ func doSetGlobalOptionNative(option string, nativeValue interface{}) error { return nil } +func SetGlobalOptionNativePlug(option string, nativeValue interface{}) error { + if l, ok := config.GlobalSettings["locksettings"]; ok && l.(bool) { + return errors.New("settings.json file locked by user for all plugins") + } + return SetGlobalOptionNative(option, nativeValue) +} + func SetGlobalOptionNative(option string, nativeValue interface{}) error { if err := config.OptionIsValid(option, nativeValue); err != nil { return err @@ -660,6 +667,13 @@ func SetGlobalOptionNative(option string, nativeValue interface{}) error { return config.WriteSettings(filepath.Join(config.ConfigDir, "settings.json")) } +func SetGlobalOptionPlug(option, value string) error { + if l, ok := config.GlobalSettings["locksettings"]; ok && l.(bool) { + return errors.New("settings.json file locked by user for all plugins") + } + return SetGlobalOption(option, value) +} + func SetGlobalOption(option, value string) error { if _, ok := config.GlobalSettings[option]; !ok { return config.ErrInvalidOption diff --git a/internal/config/settings.go b/internal/config/settings.go index a1c01c81dd..bea07095f6 100644 --- a/internal/config/settings.go +++ b/internal/config/settings.go @@ -116,6 +116,8 @@ var DefaultGlobalOnlySettings = map[string]interface{}{ "helpsplit": "hsplit", "infobar": true, "keymenu": false, + "lockbindings": false, + "locksettings": false, "mouse": true, "multiopen": "tab", "parsecursor": false, diff --git a/runtime/help/options.md b/runtime/help/options.md index 87943392e4..f8c1e5bf23 100644 --- a/runtime/help/options.md +++ b/runtime/help/options.md @@ -237,6 +237,16 @@ Here are the available options: default value: `false` +* `lockbindings`: Disable plugins to modify the `bindings.json` in your config + directory. + + default value: `false` + +* `locksettings`: Disable plugins to modify the `settings.json` in your config + directory. + + default value: `false` + * `matchbrace`: show matching braces for '()', '{}', '[]' when the cursor is on a brace character or (if `matchbraceleft` is enabled) next to it.