This commit is contained in:
parent
3732fb2fa4
commit
2bbf24f581
@ -89,7 +89,14 @@ func main() {
|
|||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
app.Get("/login", oidc.HandleRedirect)
|
app.Get("/login", func(c *fiber.Ctx) error {
|
||||||
|
_, err := sessions.GetSession(c)
|
||||||
|
if err == nil {
|
||||||
|
return c.Redirect("/account")
|
||||||
|
} else {
|
||||||
|
return oidc.HandleRedirect(c)
|
||||||
|
}
|
||||||
|
})
|
||||||
app.Get(config.Config.Oidc.CallbackUrl, oidc.HandleCallback)
|
app.Get(config.Config.Oidc.CallbackUrl, oidc.HandleCallback)
|
||||||
|
|
||||||
// Static routes
|
// Static routes
|
||||||
|
@ -37,5 +37,4 @@ func Load(ctx context.Context) {
|
|||||||
Verifier = Provider.Verifier(oidcConfig)
|
Verifier = Provider.Verifier(oidcConfig)
|
||||||
|
|
||||||
log.Debug().Msg("loaded oidc")
|
log.Debug().Msg("loaded oidc")
|
||||||
log.Debug().Interface("Config", Config).Msg("data")
|
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package sessions
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
|
|
||||||
"git.tijl.dev/tijl/tijl.dev/internal/db"
|
"git.tijl.dev/tijl/tijl.dev/internal/db"
|
||||||
"git.tijl.dev/tijl/tijl.dev/internal/utils"
|
"git.tijl.dev/tijl/tijl.dev/internal/utils"
|
||||||
@ -24,7 +25,7 @@ func NewSession(uid string, c *fiber.Ctx) (string, error) {
|
|||||||
Secure: true,
|
Secure: true,
|
||||||
})
|
})
|
||||||
|
|
||||||
err = db.Queries.QuickUpdateSession(context.TODO(), database.QuickUpdateSessionParams{
|
_, err = db.Queries.QuickUpdateSession(context.TODO(), database.QuickUpdateSessionParams{
|
||||||
Token: createSessionParams.Token,
|
Token: createSessionParams.Token,
|
||||||
IpAddress: c.IP(),
|
IpAddress: c.IP(),
|
||||||
Agent: string(c.Context().UserAgent()),
|
Agent: string(c.Context().UserAgent()),
|
||||||
@ -36,18 +37,21 @@ func NewSession(uid string, c *fiber.Ctx) (string, error) {
|
|||||||
return createSessionParams.Token, nil
|
return createSessionParams.Token, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetSession(c *fiber.Ctx) (database.Session, error) {
|
func GetSession(c *fiber.Ctx) (string, error) {
|
||||||
err := db.Queries.QuickUpdateSession(context.TODO(), database.QuickUpdateSessionParams{
|
if c.Cookies("session") == "" {
|
||||||
|
return "", errors.New("no cookie found")
|
||||||
|
}
|
||||||
|
uid, err := db.Queries.QuickUpdateSession(context.TODO(), database.QuickUpdateSessionParams{
|
||||||
Token: c.Cookies("session"),
|
Token: c.Cookies("session"),
|
||||||
IpAddress: c.IP(),
|
IpAddress: c.IP(),
|
||||||
Agent: string(c.Context().UserAgent()),
|
Agent: string(c.Context().UserAgent()),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return database.Session{}, err
|
return uid, err
|
||||||
}
|
}
|
||||||
session, err := db.Queries.GetSession(context.TODO(), c.Cookies("session"))
|
//session, err := db.Queries.GetSession(context.TODO(), c.Cookies("session"))
|
||||||
if err != nil {
|
//if err != nil {
|
||||||
return session, err
|
// return session, err
|
||||||
}
|
//}
|
||||||
return session, nil
|
return uid, nil
|
||||||
}
|
}
|
||||||
|
@ -6,5 +6,6 @@
|
|||||||
"english": "English",
|
"english": "English",
|
||||||
"dutch": "Dutch",
|
"dutch": "Dutch",
|
||||||
"about": "About",
|
"about": "About",
|
||||||
"projects": "Projects"
|
"projects": "Projects",
|
||||||
|
"account": "Account"
|
||||||
}
|
}
|
||||||
|
@ -6,5 +6,6 @@
|
|||||||
"english": "Engels",
|
"english": "Engels",
|
||||||
"dutch": "Nederlands",
|
"dutch": "Nederlands",
|
||||||
"about": "Over",
|
"about": "Over",
|
||||||
"projects": "Projecten"
|
"projects": "Projecten",
|
||||||
|
"account": "Account"
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,10 @@ CREATE TABLE sessions (
|
|||||||
FOREIGN KEY (uid) REFERENCES users (uid)
|
FOREIGN KEY (uid) REFERENCES users (uid)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
-- Creating indexes for better performance
|
||||||
|
CREATE INDEX idx_sessions_last_activity ON sessions (last_activity);
|
||||||
|
CREATE INDEX idx_sessions_token ON sessions (token);
|
||||||
|
|
||||||
CREATE TABLE session_ips (
|
CREATE TABLE session_ips (
|
||||||
id SERIAL PRIMARY KEY,
|
id SERIAL PRIMARY KEY,
|
||||||
session_id INTEGER NOT NULL,
|
session_id INTEGER NOT NULL,
|
||||||
@ -29,3 +33,7 @@ CREATE TABLE session_ips (
|
|||||||
CONSTRAINT session_ips_unique UNIQUE (session_id, ip_address)
|
CONSTRAINT session_ips_unique UNIQUE (session_id, ip_address)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
-- Creating indexes for better performance
|
||||||
|
CREATE INDEX idx_session_ips_session_id_ip_address ON session_ips (session_id, ip_address);
|
||||||
|
CREATE INDEX idx_session_ips_access_time ON session_ips (access_time);
|
||||||
|
|
||||||
|
@ -10,13 +10,14 @@ SELECT * FROM sessions WHERE uid = $1 AND (expires > CURRENT_TIMESTAMP OR expire
|
|||||||
-- name: CreateSession :exec
|
-- name: CreateSession :exec
|
||||||
INSERT INTO sessions (uid, token, last_activity) VALUES ($1, $2, CURRENT_TIMESTAMP);
|
INSERT INTO sessions (uid, token, last_activity) VALUES ($1, $2, CURRENT_TIMESTAMP);
|
||||||
|
|
||||||
-- name: QuickUpdateSession :exec
|
-- name: QuickUpdateSession :one
|
||||||
WITH updated_session AS (
|
WITH updated_session AS (
|
||||||
UPDATE sessions
|
UPDATE sessions
|
||||||
SET last_activity = CURRENT_TIMESTAMP
|
SET last_activity = CURRENT_TIMESTAMP
|
||||||
WHERE token = $1
|
WHERE token = $1
|
||||||
RETURNING id
|
RETURNING id, uid
|
||||||
)
|
),
|
||||||
|
inserted_or_updated AS (
|
||||||
INSERT INTO session_ips (session_id, ip_address, agent, access_time)
|
INSERT INTO session_ips (session_id, ip_address, agent, access_time)
|
||||||
VALUES (
|
VALUES (
|
||||||
(SELECT id FROM updated_session),
|
(SELECT id FROM updated_session),
|
||||||
@ -27,7 +28,11 @@ VALUES (
|
|||||||
ON CONFLICT (session_id, ip_address)
|
ON CONFLICT (session_id, ip_address)
|
||||||
DO UPDATE SET
|
DO UPDATE SET
|
||||||
agent = EXCLUDED.agent,
|
agent = EXCLUDED.agent,
|
||||||
access_time = CURRENT_TIMESTAMP;
|
access_time = CURRENT_TIMESTAMP
|
||||||
|
RETURNING session_id
|
||||||
|
)
|
||||||
|
SELECT uid
|
||||||
|
FROM updated_session;
|
||||||
|
|
||||||
-- name: ExpireSession :exec
|
-- name: ExpireSession :exec
|
||||||
UPDATE sessions SET expires = 1 WHERE token = $1;
|
UPDATE sessions SET expires = 1 WHERE token = $1;
|
||||||
|
@ -128,13 +128,14 @@ func (q *Queries) GetSessions(ctx context.Context, arg GetSessionsParams) ([]Ses
|
|||||||
return items, nil
|
return items, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
const quickUpdateSession = `-- name: QuickUpdateSession :exec
|
const quickUpdateSession = `-- name: QuickUpdateSession :one
|
||||||
WITH updated_session AS (
|
WITH updated_session AS (
|
||||||
UPDATE sessions
|
UPDATE sessions
|
||||||
SET last_activity = CURRENT_TIMESTAMP
|
SET last_activity = CURRENT_TIMESTAMP
|
||||||
WHERE token = $1
|
WHERE token = $1
|
||||||
RETURNING id
|
RETURNING id, uid
|
||||||
)
|
),
|
||||||
|
inserted_or_updated AS (
|
||||||
INSERT INTO session_ips (session_id, ip_address, agent, access_time)
|
INSERT INTO session_ips (session_id, ip_address, agent, access_time)
|
||||||
VALUES (
|
VALUES (
|
||||||
(SELECT id FROM updated_session),
|
(SELECT id FROM updated_session),
|
||||||
@ -146,6 +147,10 @@ ON CONFLICT (session_id, ip_address)
|
|||||||
DO UPDATE SET
|
DO UPDATE SET
|
||||||
agent = EXCLUDED.agent,
|
agent = EXCLUDED.agent,
|
||||||
access_time = CURRENT_TIMESTAMP
|
access_time = CURRENT_TIMESTAMP
|
||||||
|
RETURNING session_id
|
||||||
|
)
|
||||||
|
SELECT uid
|
||||||
|
FROM updated_session
|
||||||
`
|
`
|
||||||
|
|
||||||
type QuickUpdateSessionParams struct {
|
type QuickUpdateSessionParams struct {
|
||||||
@ -154,7 +159,9 @@ type QuickUpdateSessionParams struct {
|
|||||||
Agent string
|
Agent string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *Queries) QuickUpdateSession(ctx context.Context, arg QuickUpdateSessionParams) error {
|
func (q *Queries) QuickUpdateSession(ctx context.Context, arg QuickUpdateSessionParams) (string, error) {
|
||||||
_, err := q.db.ExecContext(ctx, quickUpdateSession, arg.Token, arg.IpAddress, arg.Agent)
|
row := q.db.QueryRowContext(ctx, quickUpdateSession, arg.Token, arg.IpAddress, arg.Agent)
|
||||||
return err
|
var uid string
|
||||||
|
err := row.Scan(&uid)
|
||||||
|
return uid, err
|
||||||
}
|
}
|
||||||
|
@ -81,12 +81,22 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
</li>
|
</li>
|
||||||
<li><a class="active flex gap-4" hx-boost="false" href="/login">
|
<li>
|
||||||
|
{{if .SignedIn}}
|
||||||
|
<a class="flex gap-4" href="/account">
|
||||||
|
<span class="w-5 text-center">
|
||||||
|
{{icon "login"}}
|
||||||
|
</span>
|
||||||
|
<span class="text-base">{{.T.account}}</span>
|
||||||
|
</a>
|
||||||
|
{{else}}
|
||||||
|
<a class="active flex gap-4" hx-boost="false" href="/login">
|
||||||
<span class="w-5 text-center">
|
<span class="w-5 text-center">
|
||||||
{{icon "login"}}
|
{{icon "login"}}
|
||||||
</span>
|
</span>
|
||||||
<span class="text-base">{{.T.login}}</span>
|
<span class="text-base">{{.T.login}}</span>
|
||||||
</a>
|
</a>
|
||||||
|
{{end}}
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</details>
|
</details>
|
||||||
|
Loading…
Reference in New Issue
Block a user