Skip to content

Commit 046e550

Browse files
committed
Added support for SAML with app being on different domain from SAML callback
1 parent bbdc359 commit 046e550

File tree

5 files changed

+309
-46
lines changed

5 files changed

+309
-46
lines changed

internal/metadata/metadata.go

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121
_ "modernc.org/sqlite"
2222
)
2323

24-
const CURRENT_DB_VERSION = 6
24+
const CURRENT_DB_VERSION = 7
2525

2626
// Metadata is the metadata persistence layer
2727
type Metadata struct {
@@ -258,6 +258,18 @@ func (m *Metadata) VersionUpgrade(config *types.ServerConfig) error {
258258
}
259259
}
260260

261+
if version < 7 {
262+
m.Info().Msg("Upgrading to version 7")
263+
if _, err := tx.ExecContext(ctx, `create table keystore(key text, value `+system.MapDataType(m.dbType, "blob")+
264+
`, create_time `+system.MapDataType(m.dbType, "datetime")+`, delete_at `+system.MapDataType(m.dbType, "datetime")+`, PRIMARY KEY(key))`); err != nil {
265+
return err
266+
}
267+
268+
if _, err := tx.ExecContext(ctx, `update version set version=7, last_upgraded=`+system.FuncNow(m.dbType)); err != nil {
269+
return err
270+
}
271+
}
272+
261273
if err := tx.Commit(); err != nil {
262274
return err
263275
}
@@ -754,6 +766,78 @@ func (m *Metadata) GetConfig() (*types.DynamicConfig, error) {
754766
return &config, nil
755767
}
756768

769+
func (m *Metadata) FetchKV(ctx context.Context, key string) (map[string]any, error) {
770+
row := m.db.QueryRowContext(ctx, system.RebindQuery(m.dbType, `select value from keystore where key = ? and (delete_at is null or delete_at > `+system.FuncNow(m.dbType)+`)`), key)
771+
var value []byte
772+
err := row.Scan(&value)
773+
if err != nil {
774+
return nil, fmt.Errorf("error querying keystore: %w", err)
775+
}
776+
777+
var valueMap map[string]any
778+
err = json.Unmarshal([]byte(value), &valueMap)
779+
if err != nil {
780+
return nil, fmt.Errorf("error unmarshalling value: %w", err)
781+
}
782+
return valueMap, nil
783+
}
784+
785+
func (m *Metadata) StoreKV(ctx context.Context, key string, value map[string]any, expireAt *time.Time) error {
786+
valueJson, err := json.Marshal(value)
787+
if err != nil {
788+
return fmt.Errorf("error marshalling value: %w", err)
789+
}
790+
return m.StoreKVBlob(ctx, key, valueJson, expireAt)
791+
}
792+
793+
func (m *Metadata) StoreKVBlob(ctx context.Context, key string, value []byte, expireAt *time.Time) error {
794+
_, err := m.db.ExecContext(ctx, system.RebindQuery(m.dbType,
795+
`insert into keystore values (?, ?, `+system.FuncNow(m.dbType)+`, ?)`), key, value, toNullTime(expireAt))
796+
if err != nil {
797+
return fmt.Errorf("error storing value: %w", err)
798+
}
799+
return nil
800+
}
801+
802+
func (m *Metadata) UpdateKV(ctx context.Context, key string, value map[string]any) error {
803+
valueJson, err := json.Marshal(value)
804+
if err != nil {
805+
return fmt.Errorf("error marshalling value: %w", err)
806+
}
807+
return m.UpdateKVBlob(ctx, key, valueJson)
808+
}
809+
810+
func (m *Metadata) UpdateKVBlob(ctx context.Context, key string, value []byte) error {
811+
result, err := m.db.ExecContext(ctx, system.RebindQuery(m.dbType,
812+
`update keystore set value = ? where key = ?`), value, key)
813+
if err != nil {
814+
return fmt.Errorf("error updating value: %w", err)
815+
}
816+
rowsAffected, err := result.RowsAffected()
817+
if err != nil {
818+
return fmt.Errorf("error getting rows affected: %w", err)
819+
}
820+
if rowsAffected == 0 {
821+
return fmt.Errorf("no key entry found with key for update: %s", key)
822+
}
823+
return nil
824+
}
825+
826+
func (m *Metadata) DeleteKV(ctx context.Context, key string) error {
827+
_, err := m.db.ExecContext(ctx, system.RebindQuery(m.dbType, `delete from keystore where key = ?`), key)
828+
if err != nil {
829+
return fmt.Errorf("error deleting value: %w", err)
830+
}
831+
return nil
832+
}
833+
834+
func toNullTime(t *time.Time) sql.NullTime {
835+
if t == nil {
836+
return sql.NullTime{Valid: false}
837+
}
838+
return sql.NullTime{Time: *t, Valid: true}
839+
}
840+
757841
// BeginTransaction starts a new Transaction
758842
func (m *Metadata) BeginTransaction(ctx context.Context) (types.Transaction, error) {
759843
tx, err := m.db.BeginTx(ctx, nil)

internal/passwd/passwd.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package passwd
55

66
import (
77
"crypto/rand"
8+
"encoding/base64"
89
"math/big"
910
)
1011

@@ -29,6 +30,18 @@ func generateRandString(length int, charsAllowed string) (string, error) {
2930
return string(password), nil
3031
}
3132

33+
func GenerateSessionNonce() (string, string, error) {
34+
buf1 := make([]byte, 32)
35+
if _, err := rand.Read(buf1); err != nil {
36+
return "", "", err
37+
}
38+
buf2 := make([]byte, 32)
39+
if _, err := rand.Read(buf2); err != nil {
40+
return "", "", err
41+
}
42+
return base64.URLEncoding.EncodeToString(buf1), base64.URLEncoding.EncodeToString(buf1), nil
43+
}
44+
3245
// GeneratePassword generates a random password
3346
func GeneratePassword() (string, error) {
3447
return generateRandString(16, PASSWORD_CHARS)

internal/server/oauth.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,10 @@ const (
4040
USER_NICKNAME_KEY = "nickname"
4141
PROVIDER_NAME_KEY = "provider_name"
4242
GROUPS_KEY = "groups"
43+
NONCE_KEY = "nonce"
44+
SESSION_ID_KEY = "session_id"
4345
REDIRECT_URL = "redirect"
46+
SESSION_INDEX_KEY = "session_index"
4447
)
4548

4649
// OAuthManager manages the OAuth providers and their configurations (also OIDC)
@@ -373,7 +376,7 @@ func (s *OAuthManager) CheckAuth(w http.ResponseWriter, r *http.Request, appProv
373376
return "", nil, err
374377
}
375378
}
376-
s.Warn().Err(err).Msg("no auth, redirecting to login")
379+
s.Debug().Msg("no auth cookie, redirecting to login")
377380
if r.Header.Get("HX-Request") == "true" {
378381
w.Header().Set("HX-Redirect", s.config.Security.CallbackUrl+types.INTERNAL_URL_PREFIX+"/auth/"+appProvider)
379382
} else {

0 commit comments

Comments
 (0)