60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
package user
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"time"
|
|
|
|
"dev.tandem.ws/tandem/camper/pkg/auth"
|
|
"dev.tandem.ws/tandem/camper/pkg/database"
|
|
"dev.tandem.ws/tandem/camper/pkg/template"
|
|
)
|
|
|
|
func serveLoginAttemptIndex(w http.ResponseWriter, r *http.Request, loginAttempt *auth.User, company *auth.Company, conn *database.Conn) {
|
|
loginAttempts, err := collectLoginAttemptEntries(r.Context(), conn)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
loginAttempts.MustRender(w, r, loginAttempt, company)
|
|
}
|
|
|
|
func collectLoginAttemptEntries(ctx context.Context, conn *database.Conn) (loginAttemptIndex, error) {
|
|
rows, err := conn.Query(ctx, `
|
|
select user_name
|
|
, host(ip_address)
|
|
, attempted_at
|
|
, success
|
|
from company_login_attempt
|
|
order by attempted_at desc
|
|
limit 500
|
|
`)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var entries loginAttemptIndex
|
|
for rows.Next() {
|
|
entry := &loginAttemptEntry{}
|
|
if err = rows.Scan(&entry.UserName, &entry.IPAddress, &entry.Date, &entry.Success); err != nil {
|
|
return nil, err
|
|
}
|
|
entries = append(entries, entry)
|
|
}
|
|
|
|
return entries, nil
|
|
}
|
|
|
|
type loginAttemptEntry struct {
|
|
UserName string
|
|
IPAddress string
|
|
Date time.Time
|
|
Success bool
|
|
}
|
|
|
|
type loginAttemptIndex []*loginAttemptEntry
|
|
|
|
func (page *loginAttemptIndex) MustRender(w http.ResponseWriter, r *http.Request, loginAttempt *auth.User, company *auth.Company) {
|
|
template.MustRenderAdmin(w, r, loginAttempt, company, "user/login-attempts.gohtml", page)
|
|
}
|