diff --git a/cmd/stcli/utils.go b/cmd/stcli/utils.go index 0076e6a5f..60637b9de 100644 --- a/cmd/stcli/utils.go +++ b/cmd/stcli/utils.go @@ -12,7 +12,6 @@ import ( "io/ioutil" "net/http" "os" - "text/tabwriter" "github.com/syncthing/syncthing/lib/config" "github.com/urfave/cli" @@ -45,12 +44,6 @@ func dumpOutput(url string) cli.ActionFunc { } } -func newTableWriter() *tabwriter.Writer { - writer := new(tabwriter.Writer) - writer.Init(os.Stdout, 0, 8, 0, '\t', 0) - return writer -} - func getConfig(c *APIClient) (config.Configuration, error) { cfg := config.Configuration{} response, err := c.Get("system/config") diff --git a/cmd/syncthing/main.go b/cmd/syncthing/main.go index 7082793a7..578f002eb 100644 --- a/cmd/syncthing/main.go +++ b/cmd/syncthing/main.go @@ -45,19 +45,7 @@ import ( ) const ( - exitSuccess = 0 - exitError = 1 - exitNoUpgradeAvailable = 2 - exitRestarting = 3 - exitUpgrading = 4 -) - -const ( - bepProtocolName = "bep/1.0" tlsDefaultCommonName = "syncthing" - maxSystemErrors = 5 - initialSystemLog = 10 - maxSystemLog = 250 deviceCertLifetimeDays = 20 * 365 ) @@ -272,7 +260,7 @@ func main() { // default location if options.noRestart && (options.logFile != "" && options.logFile != "-") { l.Warnln("-logfile may not be used with -no-restart or STNORESTART") - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } if options.hideConsole { @@ -286,12 +274,12 @@ func main() { options.confDir, err = filepath.Abs(options.confDir) if err != nil { l.Warnln("Failed to make options path absolute:", err) - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } } if err := locations.SetBaseDir(locations.ConfigBaseDir, options.confDir); err != nil { l.Warnln(err) - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } } @@ -329,7 +317,7 @@ func main() { ) if err != nil { l.Warnln("Error reading device ID:", err) - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } fmt.Println(protocol.NewDeviceID(cert.Certificate[0])) @@ -339,7 +327,7 @@ func main() { if options.browserOnly { if err := openGUI(protocol.EmptyDeviceID); err != nil { l.Warnln("Failed to open web UI:", err) - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } return } @@ -347,7 +335,7 @@ func main() { if options.generateDir != "" { if err := generate(options.generateDir); err != nil { l.Warnln("Failed to generate config and keys:", err) - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } return } @@ -355,14 +343,14 @@ func main() { // Ensure that our home directory exists. if err := ensureDir(locations.GetBaseDir(locations.ConfigBaseDir), 0700); err != nil { l.Warnln("Failure on home directory:", err) - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } if options.upgradeTo != "" { err := upgrade.ToURL(options.upgradeTo) if err != nil { l.Warnln("Error while Upgrading:", err) - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } l.Infoln("Upgraded from", options.upgradeTo) return @@ -382,7 +370,7 @@ func main() { if options.resetDatabase { if err := resetDB(); err != nil { l.Warnln("Resetting database:", err) - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } return } @@ -477,13 +465,13 @@ func checkUpgrade() upgrade.Release { release, err := upgrade.LatestRelease(opts.ReleasesURL, build.Version, opts.UpgradeToPreReleases) if err != nil { l.Warnln("Upgrade:", err) - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } if upgrade.CompareVersions(release.Tag, build.Version) <= 0 { noUpgradeMessage := "No upgrade available (current %q >= latest %q)." l.Infof(noUpgradeMessage, build.Version, release.Tag) - os.Exit(exitNoUpgradeAvailable) + os.Exit(syncthing.ExitNoUpgradeAvailable.AsInt()) } l.Infof("Upgrade available (current %q < latest %q)", build.Version, release.Tag) @@ -497,7 +485,7 @@ func performUpgrade(release upgrade.Release) { err = upgrade.To(release) if err != nil { l.Warnln("Upgrade:", err) - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } l.Infof("Upgraded to %q", release.Tag) } else { @@ -505,10 +493,10 @@ func performUpgrade(release upgrade.Release) { err = upgradeViaRest() if err != nil { l.Warnln("Upgrade:", err) - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } l.Infoln("Syncthing upgrading") - os.Exit(exitUpgrading) + os.Exit(syncthing.ExitUpgrade.AsInt()) } } @@ -574,7 +562,7 @@ func syncthingMain(runtimeOptions RuntimeOptions) { cfg, err := syncthing.LoadConfigAtStartup(locations.Get(locations.ConfigFile), cert, evLogger, runtimeOptions.allowNewerConfig, noDefaultFolder) if err != nil { l.Warnln("Failed to initialize config:", err) - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } if runtimeOptions.unpaused { @@ -611,11 +599,11 @@ func syncthingMain(runtimeOptions RuntimeOptions) { f, err := os.Create(fmt.Sprintf("cpu-%d.pprof", os.Getpid())) if err != nil { l.Warnln("Creating profile:", err) - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } if err := pprof.StartCPUProfile(f); err != nil { l.Warnln("Starting profile:", err) - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } } @@ -649,7 +637,7 @@ func syncthingMain(runtimeOptions RuntimeOptions) { } if err := app.Start(); err != nil { - os.Exit(int(syncthing.ExitError)) + os.Exit(syncthing.ExitError.AsInt()) } cleanConfigDirectory() @@ -724,7 +712,7 @@ func auditWriter(auditFile string) io.Writer { fd, err = os.OpenFile(auditFile, auditFlags, 0600) if err != nil { l.Warnln("Audit:", err) - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } auditDest = auditFile } @@ -900,6 +888,6 @@ func setPauseState(cfg config.Wrapper, paused bool) { } if _, err := cfg.Replace(raw); err != nil { l.Warnln("Cannot adjust paused state:", err) - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } } diff --git a/cmd/syncthing/monitor.go b/cmd/syncthing/monitor.go index e44e876e1..1a6065417 100644 --- a/cmd/syncthing/monitor.go +++ b/cmd/syncthing/monitor.go @@ -23,6 +23,7 @@ import ( "github.com/syncthing/syncthing/lib/osutil" "github.com/syncthing/syncthing/lib/protocol" "github.com/syncthing/syncthing/lib/sync" + "github.com/syncthing/syncthing/lib/syncthing" ) var ( @@ -81,7 +82,7 @@ func monitorMain(runtimeOptions RuntimeOptions) { if t := time.Since(restarts[0]); t < loopThreshold { l.Warnf("%d restarts in %v; not retrying further", countRestarts, t) - os.Exit(exitError) + os.Exit(syncthing.ExitError.AsInt()) } copy(restarts[0:], restarts[1:]) @@ -152,7 +153,7 @@ func monitorMain(runtimeOptions RuntimeOptions) { } else if exiterr, ok := err.(*exec.ExitError); ok { if status, ok := exiterr.Sys().(syscall.WaitStatus); ok { switch status.ExitStatus() { - case exitUpgrading: + case syncthing.ExitUpgrade.AsInt(): // Restart the monitor process to release the .old // binary as part of the upgrade process. l.Infoln("Restarting monitor...") diff --git a/lib/osutil/net.go b/lib/osutil/net.go index fe7f36ab1..baddcd532 100644 --- a/lib/osutil/net.go +++ b/lib/osutil/net.go @@ -7,37 +7,9 @@ package osutil import ( - "bytes" "net" ) -// ResolveInterfaceAddresses returns available addresses of the given network -// type for a given interface. -func ResolveInterfaceAddresses(network, nameOrMac string) []string { - intf, err := net.InterfaceByName(nameOrMac) - if err == nil { - return interfaceAddresses(network, intf) - } - - mac, err := net.ParseMAC(nameOrMac) - if err != nil { - return []string{nameOrMac} - } - - intfs, err := net.Interfaces() - if err != nil { - return []string{nameOrMac} - } - - for _, intf := range intfs { - if bytes.Equal(intf.HardwareAddr, mac) { - return interfaceAddresses(network, &intf) - } - } - - return []string{nameOrMac} -} - func interfaceAddresses(network string, intf *net.Interface) []string { var out []string addrs, err := intf.Addrs() diff --git a/lib/protocol/protocol.go b/lib/protocol/protocol.go index e756ded21..59991732a 100644 --- a/lib/protocol/protocol.go +++ b/lib/protocol/protocol.go @@ -79,28 +79,6 @@ const ( stateReady ) -// Request message flags -const ( - FlagFromTemporary uint32 = 1 << iota -) - -// ClusterConfigMessage.Folders flags -const ( - FlagFolderReadOnly uint32 = 1 << 0 - FlagFolderIgnorePerms = 1 << 1 - FlagFolderIgnoreDelete = 1 << 2 - FlagFolderDisabledTempIndexes = 1 << 3 - FlagFolderAll = 1<<4 - 1 -) - -// ClusterConfigMessage.Folders.Devices flags -const ( - FlagShareTrusted uint32 = 1 << 0 - FlagShareReadOnly = 1 << 1 - FlagIntroducer = 1 << 2 - FlagShareBits = 0x000000ff -) - // FileInfo.LocalFlags flags const ( FlagLocalUnsupported = 1 << 0 // The kind is unsupported, e.g. symlinks on Windows @@ -120,15 +98,14 @@ const ( ) var ( - ErrClosed = errors.New("connection closed") - ErrTimeout = errors.New("read timeout") - ErrSwitchingConnections = errors.New("switching connections") - errUnknownMessage = errors.New("unknown message") - errInvalidFilename = errors.New("filename is invalid") - errUncleanFilename = errors.New("filename not in canonical format") - errDeletedHasBlocks = errors.New("deleted file with non-empty block list") - errDirectoryHasBlocks = errors.New("directory with non-empty block list") - errFileHasNoBlocks = errors.New("file with empty block list") + ErrClosed = errors.New("connection closed") + ErrTimeout = errors.New("read timeout") + errUnknownMessage = errors.New("unknown message") + errInvalidFilename = errors.New("filename is invalid") + errUncleanFilename = errors.New("filename not in canonical format") + errDeletedHasBlocks = errors.New("deleted file with non-empty block list") + errDirectoryHasBlocks = errors.New("directory with non-empty block list") + errFileHasNoBlocks = errors.New("file with empty block list") ) type Model interface { @@ -491,6 +468,8 @@ func (c *rawConnection) readMessageAfterHeader(hdr Header, fourByteBuf []byte) ( msgLen := int32(binary.BigEndian.Uint32(fourByteBuf)) if msgLen < 0 { return nil, fmt.Errorf("negative message length %d", msgLen) + } else if msgLen > MaxMessageLen { + return nil, fmt.Errorf("message length %d exceeds maximum %d", msgLen, MaxMessageLen) } // Then comes the message diff --git a/lib/relay/protocol/protocol.go b/lib/relay/protocol/protocol.go index 2a7339e11..423567491 100644 --- a/lib/relay/protocol/protocol.go +++ b/lib/relay/protocol/protocol.go @@ -16,7 +16,6 @@ var ( ResponseSuccess = Response{0, "success"} ResponseNotFound = Response{1, "not found"} ResponseAlreadyConnected = Response{2, "already connected"} - ResponseInternalError = Response{99, "internal error"} ResponseUnexpectedMessage = Response{100, "unexpected message"} ) diff --git a/lib/sha256/sha256.go b/lib/sha256/sha256.go index c301f4542..63dba134c 100644 --- a/lib/sha256/sha256.go +++ b/lib/sha256/sha256.go @@ -28,11 +28,6 @@ const ( minioImpl = "minio/sha256-simd" ) -const ( - BlockSize = cryptoSha256.BlockSize - Size = cryptoSha256.Size -) - // May be switched out for another implementation var ( New = cryptoSha256.New diff --git a/lib/syncthing/syncthing.go b/lib/syncthing/syncthing.go index 0b11d1d13..0bd19ea1a 100644 --- a/lib/syncthing/syncthing.go +++ b/lib/syncthing/syncthing.go @@ -47,11 +47,16 @@ const ( type ExitStatus int +func (s ExitStatus) AsInt() int { + return int(s) +} + const ( - ExitSuccess ExitStatus = 0 - ExitError ExitStatus = 1 - ExitRestart ExitStatus = 3 - ExitUpgrade ExitStatus = 4 + ExitSuccess ExitStatus = 0 + ExitError ExitStatus = 1 + ExitNoUpgradeAvailable ExitStatus = 2 + ExitRestart ExitStatus = 3 + ExitUpgrade ExitStatus = 4 ) type Options struct { diff --git a/lib/upgrade/upgrade_common.go b/lib/upgrade/upgrade_common.go index 042375151..cedb736bf 100644 --- a/lib/upgrade/upgrade_common.go +++ b/lib/upgrade/upgrade_common.go @@ -37,7 +37,6 @@ type Asset struct { } var ( - ErrVersionUpToDate = errors.New("current version is up to date") ErrNoReleaseDownload = errors.New("couldn't find a release to download") ErrNoVersionToSelect = errors.New("no version to select") ErrUpgradeUnsupported = errors.New("upgrade unsupported")