Files
filestash/server/ctrl/session.go
2018-09-14 17:32:16 +10:00

112 lines
2.4 KiB
Go

package ctrl
import (
"github.com/mickael-kerjean/mux"
. "github.com/mickael-kerjean/nuage/server/common"
"github.com/mickael-kerjean/nuage/server/model"
"net/http"
"time"
)
func SessionIsValid(ctx App, res http.ResponseWriter, req *http.Request) {
if ctx.Backend == nil {
SendSuccessResult(res, false)
return
}
if _, err := ctx.Backend.Ls("/"); err != nil {
SendSuccessResult(res, false)
return
}
home, _ := model.GetHome(ctx.Backend)
if home == "" {
SendSuccessResult(res, true)
return
}
SendSuccessResult(res, true)
}
func SessionAuthenticate(ctx App, res http.ResponseWriter, req *http.Request) {
ctx.Body["timestamp"] = time.Now().String()
backend, err := model.NewBackend(&ctx, ctx.Body)
if err != nil {
SendErrorResult(res, err)
return
}
if obj, ok := backend.(interface {
OAuthToken(*map[string]string) error
}); ok {
err := obj.OAuthToken(&ctx.Body)
if err != nil {
SendErrorResult(res, NewError("Can't authenticate (OAuth error)", 401))
return
}
backend, err = model.NewBackend(&ctx, ctx.Body)
if err != nil {
SendErrorResult(res, NewError("Can't authenticate", 401))
return
}
}
home, err := model.GetHome(backend)
if err != nil {
SendErrorResult(res, err)
return
}
obfuscate, err := Encrypt(ctx.Config.General.SecretKey, ctx.Body)
if err != nil {
SendErrorResult(res, NewError(err.Error(), 500))
return
}
cookie := http.Cookie{
Name: COOKIE_NAME,
Value: obfuscate,
MaxAge: 60 * 60 * 24 * 30,
Path: COOKIE_PATH,
HttpOnly: true,
}
http.SetCookie(res, &cookie)
if home == "" {
SendSuccessResult(res, nil)
} else {
SendSuccessResult(res, home)
}
}
func SessionLogout(ctx App, res http.ResponseWriter, req *http.Request) {
cookie := http.Cookie{
Name: COOKIE_NAME,
Value: "",
Path: COOKIE_PATH,
MaxAge: -1,
}
if ctx.Backend != nil {
if obj, ok := ctx.Backend.(interface{ Close() error }); ok {
go obj.Close()
}
}
http.SetCookie(res, &cookie)
SendSuccessResult(res, nil)
}
func SessionOAuthBackend(ctx App, res http.ResponseWriter, req *http.Request) {
vars := mux.Vars(req)
a := map[string]string{
"type": vars["service"],
}
b, err := model.NewBackend(&ctx, a)
if err != nil {
SendErrorResult(res, err)
return
}
obj, ok := b.(interface{ OAuthURL() string })
if ok == false {
SendErrorResult(res, NewError("No backend authentication ("+b.Info()+")", 500))
return
}
SendSuccessResult(res, obj.OAuthURL())
}