Skip to content

Commit 2754ce9

Browse files
committed
Merge pull request #10 from mayth/https-support
HTTPS support
2 parents be039fa + dba294f commit 2754ce9

File tree

5 files changed

+72
-10
lines changed

5 files changed

+72
-10
lines changed

Diff for: README.md

+18
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,24 @@ Content-Length: 19
7272
```
7373

7474

75+
# TLS
76+
77+
To enable TLS support, add `-cert` and `-key` options:
78+
79+
```
80+
$ ./simple_upload_server -cert ./cert.pem -key ./key.pem root/
81+
INFO[0000] starting up simple-upload-server
82+
WARN[0000] token generated token=28d93c74c8589ab62b5e
83+
INFO[0000] start listening TLS cert=./cert.pem key=./key.pem port=25443
84+
INFO[0000] start listening ip=0.0.0.0 port=25478 root=root token=28d93c74c8589ab62b5e upload_limit=5242880
85+
...
86+
```
87+
88+
This server listens on `25443/tcp` for TLS connections by default. This can be changed by passing `-tlsport` option.
89+
90+
NOTE: The endpoint using HTTP is still active even if TLS is enabled.
91+
92+
7593
# Security
7694

7795
There is no Basic/Digest authentication. This app implements dead simple authentication: "security token".

Diff for: go.mod

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module github.com/mayth/go-simple-upload-server
2+
3+
go 1.14
4+
5+
require github.com/sirupsen/logrus v1.5.0

Diff for: go.sum

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2+
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
3+
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
4+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
5+
github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q=
6+
github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo=
7+
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
8+
golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
9+
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

Diff for: server.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
"regexp"
1313
"strings"
1414

15-
"github.com/Sirupsen/logrus"
15+
"github.com/sirupsen/logrus"
1616
)
1717

1818
// Server represents a simple-upload server.

Diff for: simple_upload_server.go

+39-9
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,21 @@ import (
88

99
"crypto/rand"
1010

11-
"github.com/Sirupsen/logrus"
11+
"github.com/sirupsen/logrus"
1212
)
1313

1414
var logger *logrus.Logger
1515

1616
func run(args []string) int {
1717
bindAddress := flag.String("ip", "0.0.0.0", "IP address to bind")
1818
listenPort := flag.Int("port", 25478, "port number to listen on")
19+
tlsListenPort := flag.Int("tlsport", 25443, "port number to listen on with TLS")
1920
// 5,242,880 bytes == 5 MiB
2021
maxUploadSize := flag.Int64("upload_limit", 5242880, "max size of uploaded file (byte)")
2122
tokenFlag := flag.String("token", "", "specify the security token (it is automatically generated if empty)")
2223
logLevelFlag := flag.String("loglevel", "info", "logging level")
24+
certFile := flag.String("cert", "", "path to certificate file")
25+
keyFile := flag.String("key", "", "path to key file")
2326
flag.Parse()
2427
serverRoot := flag.Arg(0)
2528
if len(serverRoot) == 0 {
@@ -42,17 +45,44 @@ func run(args []string) int {
4245
token = fmt.Sprintf("%x", b)
4346
logger.WithField("token", token).Warn("token generated")
4447
}
45-
logger.WithFields(logrus.Fields{
46-
"ip": *bindAddress,
47-
"port": *listenPort,
48-
"token": token,
49-
"upload_limit": *maxUploadSize,
50-
"root": serverRoot,
51-
}).Info("start listening")
48+
tlsEnabled := *certFile != "" && *keyFile != ""
5249
server := NewServer(serverRoot, *maxUploadSize, token)
5350
http.Handle("/upload", server)
5451
http.Handle("/files/", server)
55-
http.ListenAndServe(fmt.Sprintf("%s:%d", *bindAddress, *listenPort), nil)
52+
53+
errors := make(chan error)
54+
55+
go func() {
56+
logger.WithFields(logrus.Fields{
57+
"ip": *bindAddress,
58+
"port": *listenPort,
59+
"token": token,
60+
"upload_limit": *maxUploadSize,
61+
"root": serverRoot,
62+
}).Info("start listening")
63+
64+
if err := http.ListenAndServe(fmt.Sprintf("%s:%d", *bindAddress, *listenPort), nil); err != nil {
65+
errors <- err
66+
}
67+
}()
68+
69+
if tlsEnabled {
70+
go func() {
71+
logger.WithFields(logrus.Fields{
72+
"cert": *certFile,
73+
"key": *keyFile,
74+
"port": *tlsListenPort,
75+
}).Info("start listening TLS")
76+
77+
if err := http.ListenAndServeTLS(fmt.Sprintf("%s:%d", *bindAddress, *tlsListenPort), *certFile, *keyFile, nil); err != nil {
78+
errors <- err
79+
}
80+
}()
81+
}
82+
83+
err := <-errors
84+
logger.WithError(err).Info("closing server")
85+
5686
return 0
5787
}
5888

0 commit comments

Comments
 (0)