Archived
Merge pull request #1989 from AudriusButkevicius/session
Use different session cookies per device
This commit is contained in:
commit
8c0c03eb38
6 files changed
+29
-18
No files matched your search
@@ -52,6 +52,7 @@ var (
|
||||
)
|
||||
|
||||
type apiSvc struct {
|
||||
id protocol.DeviceID
|
||||
cfg config.GUIConfiguration
|
||||
assetDir string
|
||||
model *model.Model
|
||||
@@ -62,8 +63,9 @@ type apiSvc struct {
|
||||
eventSub *events.BufferedSubscription
|
||||
}
|
||||
|
||||
func newAPISvc(cfg config.GUIConfiguration, assetDir string, m *model.Model, eventSub *events.BufferedSubscription) (*apiSvc, error) {
|
||||
func newAPISvc(id protocol.DeviceID, cfg config.GUIConfiguration, assetDir string, m *model.Model, eventSub *events.BufferedSubscription) (*apiSvc, error) {
|
||||
svc := &apiSvc{
|
||||
id: id,
|
||||
cfg: cfg,
|
||||
assetDir: assetDir,
|
||||
model: m,
|
||||
@@ -188,14 +190,14 @@ func (s *apiSvc) Serve() {
|
||||
|
||||
// Wrap everything in CSRF protection. The /rest prefix should be
|
||||
// protected, other requests will grant cookies.
|
||||
handler := csrfMiddleware("/rest", s.cfg.APIKey, mux)
|
||||
handler := csrfMiddleware(s.id.String()[:5], "/rest", s.cfg.APIKey, mux)
|
||||
|
||||
// Add our version as a header to responses
|
||||
handler = withVersionMiddleware(handler)
|
||||
// Add our version and ID as a header to responses
|
||||
handler = withDetailsMiddleware(s.id, handler)
|
||||
|
||||
// Wrap everything in basic auth, if user/password is set.
|
||||
if len(s.cfg.User) > 0 && len(s.cfg.Password) > 0 {
|
||||
handler = basicAuthAndSessionMiddleware(s.cfg, handler)
|
||||
handler = basicAuthAndSessionMiddleware("sessionid-"+s.id.String()[:5], s.cfg, handler)
|
||||
}
|
||||
|
||||
// Redirect to HTTPS if we are supposed to
|
||||
@@ -334,9 +336,10 @@ func noCacheMiddleware(h http.Handler) http.Handler {
|
||||
})
|
||||
}
|
||||
|
||||
func withVersionMiddleware(h http.Handler) http.Handler {
|
||||
func withDetailsMiddleware(id protocol.DeviceID, h http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("X-Syncthing-Version", Version)
|
||||
w.Header().Set("X-Syncthing-ID", id.String())
|
||||
h.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -24,14 +24,15 @@ var (
|
||||
sessionsMut = sync.NewMutex()
|
||||
)
|
||||
|
||||
func basicAuthAndSessionMiddleware(cfg config.GUIConfiguration, next http.Handler) http.Handler {
|
||||
func basicAuthAndSessionMiddleware(cookieName string, cfg config.GUIConfiguration, next http.Handler) http.Handler {
|
||||
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if cfg.APIKey != "" && r.Header.Get("X-API-Key") == cfg.APIKey {
|
||||
next.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
cookie, err := r.Cookie("sessionid")
|
||||
cookie, err := r.Cookie(cookieName)
|
||||
if err == nil && cookie != nil {
|
||||
sessionsMut.Lock()
|
||||
_, ok := sessions[cookie.Value]
|
||||
@@ -86,7 +87,7 @@ func basicAuthAndSessionMiddleware(cfg config.GUIConfiguration, next http.Handle
|
||||
sessions[sessionid] = true
|
||||
sessionsMut.Unlock()
|
||||
http.SetCookie(w, &http.Cookie{
|
||||
Name: "sessionid",
|
||||
Name: cookieName,
|
||||
Value: sessionid,
|
||||
MaxAge: 0,
|
||||
})
|
||||
|
||||
@@ -24,7 +24,7 @@ var csrfMut = sync.NewMutex()
|
||||
// Check for CSRF token on /rest/ URLs. If a correct one is not given, reject
|
||||
// the request with 403. For / and /index.html, set a new CSRF cookie if none
|
||||
// is currently set.
|
||||
func csrfMiddleware(prefix, apiKey string, next http.Handler) http.Handler {
|
||||
func csrfMiddleware(unique, prefix, apiKey string, next http.Handler) http.Handler {
|
||||
loadCsrfTokens()
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
// Allow requests carrying a valid API key
|
||||
@@ -35,10 +35,10 @@ func csrfMiddleware(prefix, apiKey string, next http.Handler) http.Handler {
|
||||
|
||||
// Allow requests for the front page, and set a CSRF cookie if there isn't already a valid one.
|
||||
if !strings.HasPrefix(r.URL.Path, prefix) {
|
||||
cookie, err := r.Cookie("CSRF-Token")
|
||||
cookie, err := r.Cookie("CSRF-Token-" + unique)
|
||||
if err != nil || !validCsrfToken(cookie.Value) {
|
||||
cookie = &http.Cookie{
|
||||
Name: "CSRF-Token",
|
||||
Name: "CSRF-Token-" + unique,
|
||||
Value: newCsrfToken(),
|
||||
}
|
||||
http.SetCookie(w, cookie)
|
||||
@@ -54,7 +54,7 @@ func csrfMiddleware(prefix, apiKey string, next http.Handler) http.Handler {
|
||||
}
|
||||
|
||||
// Verify the CSRF token
|
||||
token := r.Header.Get("X-CSRF-Token")
|
||||
token := r.Header.Get("X-CSRF-Token-" + unique)
|
||||
if !validCsrfToken(token) {
|
||||
http.Error(w, "CSRF Error", 403)
|
||||
return
|
||||
|
||||
@@ -808,7 +808,7 @@ func setupGUI(mainSvc *suture.Supervisor, cfg *config.Wrapper, m *model.Model, a
|
||||
|
||||
urlShow := fmt.Sprintf("%s://%s/", proto, net.JoinHostPort(hostShow, strconv.Itoa(addr.Port)))
|
||||
l.Infoln("Starting web GUI on", urlShow)
|
||||
api, err := newAPISvc(guiCfg, guiAssets, m, apiSub)
|
||||
api, err := newAPISvc(myID, guiCfg, guiAssets, m, apiSub)
|
||||
if err != nil {
|
||||
l.Fatalln("Cannot start GUI:", err)
|
||||
}
|
||||
|
||||
@@ -17,10 +17,9 @@ var syncthing = angular.module('syncthing', [
|
||||
|
||||
var urlbase = 'rest';
|
||||
var guiVersion = null;
|
||||
var deviceId = null;
|
||||
|
||||
syncthing.config(function ($httpProvider, $translateProvider, LocaleServiceProvider) {
|
||||
$httpProvider.defaults.xsrfHeaderName = 'X-CSRF-Token';
|
||||
$httpProvider.defaults.xsrfCookieName = 'CSRF-Token';
|
||||
$httpProvider.interceptors.push(function () {
|
||||
return {
|
||||
response: function (response) {
|
||||
@@ -30,6 +29,14 @@ syncthing.config(function ($httpProvider, $translateProvider, LocaleServiceProvi
|
||||
} else if (guiVersion != responseVersion) {
|
||||
document.location.reload(true);
|
||||
}
|
||||
if (!deviceId) {
|
||||
deviceId = response.headers()['x-syncthing-id'];
|
||||
if (deviceId) {
|
||||
var deviceIdShort = deviceId.substring(0, 5);
|
||||
$httpProvider.defaults.xsrfHeaderName = 'X-CSRF-Token-' + deviceIdShort;
|
||||
$httpProvider.defaults.xsrfCookieName = 'CSRF-Token-' + deviceIdShort;
|
||||
}
|
||||
}
|
||||
return response;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
AssetsBuildDate = "Sun, 21 Jun 2015 09:45:37 GMT"
|
||||
AssetsBuildDate = "Mon, 22 Jun 2015 18:48:43 GMT"
|
||||
)
|
||||
|
||||
func Assets() map[string][]byte {
|
||||
@@ -50,7 +50,7 @@ func Assets() map[string][]byte {
|
||||
assets["assets/lang/valid-langs.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/yTMsQrCMBSF4d2nCJm9jyBIRRwUlVhwEIe0jW1oSEuSZvDpe0+6fH8ugZN1EFk7292076M4iI9sermXrS4c+c/41pYrMp1hjAO+QJcKjQU6v7g/CwIzLIxNzDjRVXEdDt8AjHiMzHjNiSq19Vlzw0TqgWIiZiZhcRmZ/0Cn+9b6Lb+7FQAA//8BAAD//9+xfOrFAAAA")
|
||||
assets["index.html"], _ = base64.StdEncoding.DecodeString("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 truncated
|
||||
assets["modal.html"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/3yTUW+bMBDH3/cpbjwsrVRCW/UpSzptkSZN6qRK7csejX2AV2Mj+0jHEN99h2EsrdI9JDbmfnf3/5/ZKn0AaUQIu6R2ShgohMIESOTaKvy1S9KrBGyZCiKfKkEizYV8Ut41u6TvGXUB4ROQbxE2sAokSMsVDMMr6gm73AmvIvXFOYPCnkX6fAy+fQewfZ+mvGQZ7F3TeV1WBGf7c7i+vLqBxwrhobOSKm1L+NxS5XxYx/CJeax0gAfXeonMK4SvztfAZ6HNf6IkIAfESQh9HcAV8eG7+62NEXDf5kbLKdGdlmgDXsBhDdfryzV8K0CA5JYW6v4OnkUA6wiUDuR13hIqeNZUcQDXLLTBiyndD9eCFBZcTkLzYhEEQUXUbLKsnuqvnS8zzppxvWwUlabRkNfDSZUWxpXR2vm8X01vTLnagBG+xMnMU7R0ltDS/P5URIU8fQ/CoKfpP+37caZtGIaFY7K6eQmSJoNHARwSGlbNjepil2gunfwlStM11XgCy46rjMtYY5uN4HGmvo/Zh+Ff+ay6WURkrOJtRblTXfSLvLBBmlbh2+TcbbyWycs8hXN8c44t4JkTa6CuwV0yPSxMThb4lyosRGso7kOdQPwU+MrUesnMiqNT/zHHY+0OuFjzAevQfJyoqMoIwtv92PQcsc2mfk4oXbbzZl7+AAAA//8BAAD//53P618IBAAA")
|
||||
assets["scripts/syncthing/app.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/5RXbXPUthN/f59iM8NgO9z5Lvz59yFHmNKEFNqEpFyg0ExeyLbsU5AtV5IvCUy+e1eSHxNnKB7g7NXub1e/fZCYz2FflDeSZWsN/n4ATxc7z+BsTWF1U8R6zYoMXlZ6LaQKJ/M5/sFFpmAlKhlTtE0oHAqZA8pUFV3SWIMWoBFAU5krEKn9OBZfGOcETquIs9jAHLGYFopOYRPC03ARwpsUCMQYTGtzegRXREEhNCRMacmiStMErpheowJ6TBmnUwP2SVQQkwJEpAnDn4IC0bDWutydz3PnOxQymyPmHL3Nw8lkMt++VJwVGiIprhSVu6BlhQHFotCsqGjzXfJKmb/uG7aRhe2Mi4hweLQLKeFmF6TIKk5k+40gSnDafm8IZ8kRaqlaZHAmGyJBtUTvNShhLpKKU99r17wpnE8AH69Wea8ZV2HCJDLONtS+npKMFUQzUXhTp1wSFRNeotJah1qSQnGiKa665RY+jIWk3uQiWLqYKskjgjHugSep0t7SSrOKfaBSIT4uFBXnqN2HKFKW+WmFAqPiPzL8n0qxYQmVU3jU+u9kRwLDoysqN1gNjTiArza8gX2Y0JRUXKvwWsn0NSUoe0tyG+LH2f7q3eHsTHymBYb6Ddt9IT4z2th+wxLLg2Khl9o0QFmpdW9/TZzmkVRXsugJnFCVWAamCFqjRhbc0TWP4bhZ74huJOHablr5wbl3PWt5n22cpnexvAfIUvC3uqyN+TTPIK93ArgPegvUlK/B7hlu3bN8yFsi4iqnhQ45Jt+QEkrKBUl8013BiL97kprsxt/QpFO/dQu3pqjNC84JbrqHZDgdigSMf86UjcFp3C/RsFJ0pVElPsRZo46ESYHfbQxbK2XXu9iWSlGt5saB/WdWt6B5VJU6pfBSYaKGUY22QIhgLzeEcRJx6jSU342QmqUHTQ9cvbt138PaNt6sSyThl7OTg5NdoNe4WxzX9SjjdEN5W6gKsPIFKFoSiXTgi3Xiq2AyaYs5oUa2L3JUoj6ZQtTk3BSHvikpTnISFqbVtvaw2aoCO5EVNPHg8WOoFaJRhX71GLQa5nmtHkxGCmK2s7zbkLXZi9qsrohJh+r28ObAIjcfI53dYDvbFr01f9EzX05ueyylgmNaHmKJhCyxvlny372iyQtrMubpmJQ+b7DMSMmxq7/WzcDDVMhXJO7PMdl3nJ/j0EsuzCDo2qfnPB9zeYSns5/3fXIEOK8nEnoE3wgxbDyc87477oZqfo4+g/5eeaiE1P6AvGEkfBhJQmOW48Fq2mSKp9MgnIRlTKupUVJ13xnyURX2sO4WI9QvmmjsjwPATR0TvQ5TLoT07SsXmXshkXUdBDCHdmVnEdRBG8+NeU6u/YWNEWY18nBrLsz+7nAuJSJf4R2oyHxOi/7m2NSMQux3c57hRSFeE2l8eYudp/979v8ffvzp5wWJYuysbM0uP/O8EOU/Uulqc3V98+Xlr/sHrw5/e/3m9z+Ojt+enP75bnX2/sNfHz/9PfN6+WMIuFgCw1pF9/jy5MmQNBvAkz3n/dzuUwrsZ8eOix+PzG3wrUaIKBne42awEwQXI1XuEIcsMPUqL/XNib1n+iK67NPQ9bcN2Pa9uQt2Wj10ewUb8WrOoLt1FeE2cPQZyRQvpEz3vWqWU1FpvADKTLm7Iw7WqZUrTfKySQ5qZHg3ravP9ggOVom0jt8onIYyST1AxbAQV7g+64CXg/loVZ8PwmueOkQEwqPhzH341rnbDoIa697RWx/xD8G4q19/zU4ys72xQ98umH12nPeftnYNDyEpS37jtzQaVkfuBPW6uTGjwmhIvXuAS3PNfFMAo6R3uOb/Fx1g7QV/7NWlt9KmY5Cn5SCNeArzt+IKNbZqEoe5a6Tfm7g7xHwvkd8gcbQImly6PukYvttfTffWzKPCvwAAAP//AQAA///bfbU5ag4AAA==")
|
||||
assets["scripts/syncthing/app.js"], _ = base64.StdEncoding.DecodeString("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")
|
||||
assets["scripts/syncthing/core/controllers/syncthingController.js"], _ = base64.StdEncoding.DecodeString("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 truncated
|
||||
assets["scripts/syncthing/core/directives/identiconDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/5xVTVPbMBC951dsZwp2GkcOdHpJ6s4wDMxwgENz6IEyHVdWYk0VKSPLcSnkv3clJ8F2FL50wUj79r2V3m5SOS9FqslCZaVgYVDcS2pyLueEKs2Cfg9wkYxrRg1fYQDPmDScKhlEcBt8rLjMVIXfsxKBXEkIN3t9eHBgu1aphmI1v5lCAkFuzHIcx1VVkeozUXoen45GoxjPg0lvB9nlu9oShqtUlCyCgv9jzeQNAkyfKVouEEGoZqlhF4LZ/26moeOPILA8/ck+OlelyC65EN+x1DODqZ5K0qqKgCrRpbVLM1NqCR+2dZNlqgt2JU2tl9A81ecqY2fGpoGBzQOf6ioiOBn14QhOO4LWh/Rdc62Vfq9Cy2nZ4PjYqUiSBBY8ywQ7R+RLChaOGyMvlW5xP0/rSIeObwgnL9Y5e/sLWJj152te38bZ5/eopYYUDHmN5r9Lg1b/i7YO69eyp1PnuwEER13/HMDfW7x983fiK56ZHHNswW/B5ozPc+MD76Hxaki6XDKZnedcZKFFvOxHG+XZVdX+Jl6hz00b3/lTW8kdrVZnu0gq0qLAGhtDqSPcmS+p/zw+wpf26e5uEuzDEcQurh2yk4kx16nJCWVc1I0UY9vWlm4h+AzqzvdbFQ8wVT0ajJpiLXIe9olmS5FSFsa3P3/8uos5FuV9rBn2nvNUAqOJvW74WquGwUC3h+4ezLV84+JdT36D4ckEhsMDvdWsqjsin5ryOaSj92A8xfkJmzPv9ZQ+2uYEc1PL00vNtT546j/Z323vrHsd+9UDcjV/ktEI2Rw/dDAFWoaaMQQXQdT2OlVLNj5kOgQkQVtNGy64/DNuTFyXLgJWj9AI0m3fFb6r34RtBkkoWdX44XapSN0U3cnSa3+t7zDgPwAAAP//AQAA//9afsjulQgAAA==")
|
||||
assets["scripts/syncthing/core/directives/languageSelectDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/5xVTY/jNgy9768g3MXYQSZJz5M4wLbd26CXAr0EQaHIjC2sIrmSnDTI+r+X8tfYsb0FqstMJPKR7/FZYiotJDPri04KiVFo74q7TKh0zbXBcPEJaK0TYZA7caUA6TNYin+gpK3wFc4FZQitIHrXnEk6MFfBcQGPKtevsLAI1hlBCdtu16ArjOqF1Zt13BuEX7+Er4Mzh5dcModvg92uyI6BSlfiHAdXYcVJYgCZQfr5UwBcMmvjIDE6T/RNrZxOUx+QMMeaHx+nATAj2Ar/yZlKMIkDZwoM9jtLv1ukVN7zTHCi3f23SqU++biND9y/qJPNt4+HrFSxv7ML2gMvjEHlaqWO8P07BF9VKoXNgrKEQQXOSKAObbdh+3A5Q7yQI+bPhC+oimAOoUaRwqMYzJG5OIjEq6KWFyAU9CkEPqhBf7DKFG8g4njArPxhqXZa3XSqKVSwgn8j5hl5DN8bo0ViEewfD99MWf5Ahhp1I8W8TptC7slTg1Mp1Le3nok/W67zgXvbdWUG2JUJyUjhmqeFGAauX6fovjzFRIvtJFataiXqFEyT/ZuwZPp7FTaH9NRVC/kot59G8ZsNEDhoJe9NB6CqeJcxBzl9fzRFP/QOtB3/COqsDUS+vqBiP2/pz24k0FqiSl1Gh8vllKgdBYJ4zj2I45ivX+IMUU+9AzvOQfs1pQ6lUMEhxnStElDS7TUPT4LaTN+A64SkItP69gRJaEHpSkmXISR0p/2PDsNDCEsSZwnhMZxpcLRbjqdeu3rd/5DHglfb4yJNbnO1UNoU2MvL1PYhRBUep11YWHpl4PONOZ4BZ/6JGH4DgxsFbkJKOCHUlwOws0NDrwVHuoCA+WcL/i7Q3IFxjrnDZNW+VGPjUnUay7CaQZb8YvTNonmf8bv3qcGLvuJfddedFDWLaPQN/9qn0H8qFd7+ZLKYvGf88g7/r5jebIZSxdCmTjvGrz6PqWvFrwlnLSZm2fYwuLWpiQ+2tSXmeAxVIx/UG03WK/jXd6bDGfp15jilHG598GsOPL1/AQAA//8BAAD//25IFV0RCQAA")
|
||||
|
||||
Reference in new issue
Block a user