forked from syncthing/syncthing
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* main: (32 commits) cmd/syncthing: Implement generate as a subcommand with optional API credential setting (fixes syncthing#8021) (syncthing#8043) lib/model: Correct "reverting folder" log entry lib/model: Correct handling of fakefs cache gui, lib: Fix tracking deleted locally-changed on encrypted (fixes syncthing#7715) (syncthing#7726) lib/config: Move the bcrypt password hashing to GUIConfiguration (syncthing#8028) lib/syncthing: Clean up / refactor LoadOrGenerateCertificate() utility function. (syncthing#8025) lib/api: http.Request.BasicAuth instead of custom code (syncthing#8039) Normalize CLI options to always use two dashes. (syncthing#8037) gui: Display identicons for discovered device IDs. (syncthing#8022) cmd/syncthing/cli: indexDumpSize doesn't need a heap (syncthing#8024) lib/model: Optimize jobQueue performance and memory use (syncthing#8023) lib/model: Limit the number of default hashers on Android (ref syncthing#2220) lib/model: Set mod. time after writing trailer in shortcut (ref syncthing#7992) lib/protocol: Simplify codeToError, errorToCode lib/protocol: Eliminate nativeModel on Unix gui: Add direct link to Ignore Patterns from folder panel (fixes syncthing#4293) (syncthing#7993) gui: Translate theme names in settings (syncthing#8006) lib/model: Pull when a new connection is established (fixes syncthing#8012) (syncthing#8013) gui, man, authors: Update docs, translations, and contributors gui, man, authors: Update docs, translations, and contributors ...
- Loading branch information
Showing
96 changed files
with
1,399 additions
and
651 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
// Copyright (C) 2021 The Syncthing Authors. | ||
// | ||
// This Source Code Form is subject to the terms of the Mozilla Public | ||
// License, v. 2.0. If a copy of the MPL was not distributed with this file, | ||
// You can obtain one at https://mozilla.org/MPL/2.0/. | ||
|
||
package cmdutil | ||
|
||
// CommonOptions are reused among several subcommands | ||
type CommonOptions struct { | ||
buildCommonOptions | ||
ConfDir string `name:"config" placeholder:"PATH" help:"Set configuration directory (config and keys)"` | ||
HomeDir string `name:"home" placeholder:"PATH" help:"Set configuration and data directory"` | ||
NoDefaultFolder bool `env:"STNODEFAULTFOLDER" help:"Don't create the \"default\" folder on first startup"` | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,144 @@ | ||
// Copyright (C) 2021 The Syncthing Authors. | ||
// | ||
// This Source Code Form is subject to the terms of the Mozilla Public | ||
// License, v. 2.0. If a copy of the MPL was not distributed with this file, | ||
// You can obtain one at https://mozilla.org/MPL/2.0/. | ||
|
||
// Package generate implements the `syncthing generate` subcommand. | ||
package generate | ||
|
||
import ( | ||
"bufio" | ||
"context" | ||
"crypto/tls" | ||
"fmt" | ||
"log" | ||
"os" | ||
|
||
"github.com/syncthing/syncthing/cmd/syncthing/cmdutil" | ||
"github.com/syncthing/syncthing/lib/config" | ||
"github.com/syncthing/syncthing/lib/events" | ||
"github.com/syncthing/syncthing/lib/fs" | ||
"github.com/syncthing/syncthing/lib/locations" | ||
"github.com/syncthing/syncthing/lib/osutil" | ||
"github.com/syncthing/syncthing/lib/protocol" | ||
"github.com/syncthing/syncthing/lib/syncthing" | ||
) | ||
|
||
type CLI struct { | ||
cmdutil.CommonOptions | ||
GUIUser string `placeholder:"STRING" help:"Specify new GUI authentication user name"` | ||
GUIPassword string `placeholder:"STRING" help:"Specify new GUI authentication password (use - to read from standard input)"` | ||
} | ||
|
||
func (c *CLI) Run() error { | ||
log.SetFlags(0) | ||
|
||
if c.HideConsole { | ||
osutil.HideConsole() | ||
} | ||
|
||
if c.HomeDir != "" { | ||
if c.ConfDir != "" { | ||
return fmt.Errorf("--home must not be used together with --config") | ||
} | ||
c.ConfDir = c.HomeDir | ||
} | ||
if c.ConfDir == "" { | ||
c.ConfDir = locations.GetBaseDir(locations.ConfigBaseDir) | ||
} | ||
|
||
// Support reading the password from a pipe or similar | ||
if c.GUIPassword == "-" { | ||
reader := bufio.NewReader(os.Stdin) | ||
password, _, err := reader.ReadLine() | ||
if err != nil { | ||
return fmt.Errorf("Failed reading GUI password: %w", err) | ||
} | ||
c.GUIPassword = string(password) | ||
} | ||
|
||
if err := Generate(c.ConfDir, c.GUIUser, c.GUIPassword, c.NoDefaultFolder); err != nil { | ||
return fmt.Errorf("Failed to generate config and keys: %w", err) | ||
} | ||
return nil | ||
} | ||
|
||
func Generate(confDir, guiUser, guiPassword string, noDefaultFolder bool) error { | ||
dir, err := fs.ExpandTilde(confDir) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
if err := syncthing.EnsureDir(dir, 0700); err != nil { | ||
return err | ||
} | ||
locations.SetBaseDir(locations.ConfigBaseDir, dir) | ||
|
||
var myID protocol.DeviceID | ||
certFile, keyFile := locations.Get(locations.CertFile), locations.Get(locations.KeyFile) | ||
cert, err := tls.LoadX509KeyPair(certFile, keyFile) | ||
if err == nil { | ||
log.Println("WARNING: Key exists; will not overwrite.") | ||
} else { | ||
cert, err = syncthing.GenerateCertificate(certFile, keyFile) | ||
if err != nil { | ||
return fmt.Errorf("create certificate: %w", err) | ||
} | ||
} | ||
myID = protocol.NewDeviceID(cert.Certificate[0]) | ||
log.Println("Device ID:", myID) | ||
|
||
cfgFile := locations.Get(locations.ConfigFile) | ||
var cfg config.Wrapper | ||
if _, err := os.Stat(cfgFile); err == nil { | ||
if guiUser == "" && guiPassword == "" { | ||
log.Println("WARNING: Config exists; will not overwrite.") | ||
return nil | ||
} | ||
|
||
if cfg, _, err = config.Load(cfgFile, myID, events.NoopLogger); err != nil { | ||
return fmt.Errorf("load config: %w", err) | ||
} | ||
} else { | ||
if cfg, err = syncthing.DefaultConfig(cfgFile, myID, events.NoopLogger, noDefaultFolder); err != nil { | ||
return fmt.Errorf("create config: %w", err) | ||
} | ||
} | ||
|
||
ctx, cancel := context.WithCancel(context.Background()) | ||
go cfg.Serve(ctx) | ||
defer cancel() | ||
|
||
var updateErr error | ||
waiter, err := cfg.Modify(func(cfg *config.Configuration) { | ||
updateErr = updateGUIAuthentication(&cfg.GUI, guiUser, guiPassword) | ||
}) | ||
if err != nil { | ||
return fmt.Errorf("modify config: %w", err) | ||
} | ||
|
||
waiter.Wait() | ||
if updateErr != nil { | ||
return updateErr | ||
} | ||
if err := cfg.Save(); err != nil { | ||
return fmt.Errorf("save config: %w", err) | ||
} | ||
return nil | ||
} | ||
|
||
func updateGUIAuthentication(guiCfg *config.GUIConfiguration, guiUser, guiPassword string) error { | ||
if guiUser != "" && guiCfg.User != guiUser { | ||
guiCfg.User = guiUser | ||
log.Println("Updated GUI authentication user name:", guiUser) | ||
} | ||
|
||
if guiPassword != "" && guiCfg.Password != guiPassword { | ||
if err := guiCfg.HashAndSetPassword(guiPassword); err != nil { | ||
return fmt.Errorf("Failed to set GUI authentication password: %w", err) | ||
} | ||
log.Println("Updated GUI authentication password.") | ||
} | ||
return nil | ||
} |
Oops, something went wrong.