Cloak/internal/server/activeuser_test.go
2019-10-20 15:18:27 +01:00

127 lines
3.1 KiB
Go

package server
import (
"crypto/rand"
"encoding/base64"
mux "github.com/cbeuw/Cloak/internal/multiplex"
"github.com/cbeuw/Cloak/internal/server/usermanager"
"github.com/cbeuw/Cloak/internal/util"
"os"
"testing"
)
func getSeshConfig(unordered bool) *mux.SessionConfig {
sessionKey := make([]byte, 32)
rand.Read(sessionKey)
obfuscator, _ := mux.GenerateObfs(0x00, sessionKey, true)
seshConfig := &mux.SessionConfig{
Obfuscator: obfuscator,
Valve: nil,
UnitRead: util.ReadTLS,
Unordered: unordered,
}
return seshConfig
}
func TestActiveUser_Bypass(t *testing.T) {
manager, err := usermanager.MakeLocalManager(MOCK_DB_NAME)
if err != nil {
t.Error("failed to make local manager", err)
}
panel := MakeUserPanel(manager)
UID, _ := base64.StdEncoding.DecodeString("u97xvcc5YoQA8obCyt9q/w==")
user, _ := panel.GetBypassUser(UID)
var sesh0 *mux.Session
var existing bool
var sesh1 *mux.Session
t.Run("get first session", func(t *testing.T) {
sesh0, existing, err = user.GetSession(0, getSeshConfig(false))
if err != nil {
t.Error(err)
}
if existing {
t.Error("first session returned as existing")
}
if sesh0 == nil {
t.Error("no session returned")
}
})
t.Run("get first session again", func(t *testing.T) {
seshx, existing, err := user.GetSession(0, &mux.SessionConfig{})
if err != nil {
t.Error(err)
}
if !existing {
t.Error("first session get again returned as not existing")
}
if seshx == nil {
t.Error("no session returned")
}
if seshx != sesh0 {
t.Error("returned a different instance")
}
})
t.Run("get second session", func(t *testing.T) {
sesh1, existing, err = user.GetSession(1, getSeshConfig(false))
if err != nil {
t.Error(err)
}
if existing {
t.Error("second session returned as existing")
}
if sesh0 == nil {
t.Error("no session returned")
}
})
t.Run("number of sessions", func(t *testing.T) {
if user.NumSession() != 2 {
t.Error("number of session is not 2")
}
})
t.Run("delete a session", func(t *testing.T) {
user.CloseSession(0, "")
if user.NumSession() != 1 {
t.Error("number of session is not 1 after deleting one")
}
if !sesh0.IsClosed() {
t.Error("session not closed after deletion")
}
})
t.Run("close all sessions", func(t *testing.T) {
user.closeAllSessions("")
if !sesh1.IsClosed() {
t.Error("session not closed after user termination")
}
})
t.Run("get session again after termination", func(t *testing.T) {
seshx, existing, err := user.GetSession(0, getSeshConfig(false))
if err != nil {
t.Error(err)
}
if existing {
t.Error("session returned as existing")
}
if seshx == nil {
t.Error("no session returned")
}
if seshx == sesh0 || seshx == sesh1 {
t.Error("get session after termination returned the same instance")
}
})
t.Run("delete last session", func(t *testing.T) {
user.CloseSession(0, "")
if panel.isActive(user.arrUID[:]) {
t.Error("user still active after last session deleted")
}
})
err = manager.Close()
if err != nil {
t.Error("failed to close localmanager", err)
}
err = os.Remove(MOCK_DB_NAME)
if err != nil {
t.Error("failed to delete mockdb", err)
}
}