lachlan2k / phatcrack

Modern web-based distributed hashcracking solution, built on hashcat
MIT License
109 stars 8 forks source link

Panic in-memory session handler #23

Closed JSmith-Aura closed 11 months ago

JSmith-Aura commented 11 months ago

Not sure what triggered this but unfortunately a map r/w triggered a panic.

{"hashlist_id":"5ef65b91-d745-4fe3-b330-d68d574b2135","level":"warning","log_type":"audit","msg":"New attack created","project_id":"3e8e5d56-ecd5-4f10-9540-846bd6aeeeb0","project_name":"tests","remote_ip":"192.168.11.2","time":"2023-10-10T03:28:56Z","user_id":"54a814e6-ac0e-4734-8764-c313b268edbe","user_username":"redacted"}
fatal error: concurrent map read and map write

goroutine 12173 [running]:
github.com/lachlan2k/phatcrack/api/internal/auth.(*InMemorySessionHandler).getEntry(0xc000e1ddd0, {0x10f31b0, 0xc000504140})
    /app/api/internal/auth/session_inmemory.go:193 +0xa5
github.com/lachlan2k/phatcrack/api/internal/auth.(*InMemorySessionHandler).CreateMiddleware.func1.1({0x10f31b0, 0xc000504140})
    /app/api/internal/auth/session_inmemory.go:44 +0x73
github.com/lachlan2k/phatcrack/api/internal/auth.CreateHeaderAuthMiddleware.func1.1({0x10f31b0, 0xc000504140})
    /app/api/internal/auth/header_auth_middleware.go:27 +0x1b3
github.com/labstack/echo/v4.(*Echo).add.func1({0x10f31b0, 0xc000504140})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/echo.go:582 +0x4b
github.com/lachlan2k/phatcrack/api/internal/webserver.Listen.Recover.RecoverWithConfig.func5.1({0x10f31b0, 0xc000504140})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/middleware/recover.go:131 +0x119
github.com/labstack/echo/v4/middleware.RequestLoggerConfig.ToMiddleware.func1.1({0x10f31b0, 0xc000504140})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/middleware/request_logger.go:259 +0x16b
github.com/labstack/echo/v4.(*Echo).ServeHTTP(0xc000e606c0, {0x10e6590?, 0xc0003aa1c0}, 0xc000ab4600)
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/echo.go:669 +0x399
net/http.serverHandler.ServeHTTP({0xc000b58c90?}, {0x10e6590?, 0xc0003aa1c0?}, 0x6?)
    /usr/local/go/src/net/http/server.go:2938 +0x8e
net/http.(*conn).serve(0xc0003d4e10, {0x10e83c8, 0xc000c18b10})
    /usr/local/go/src/net/http/server.go:2009 +0x5f4
created by net/http.(*Server).Serve in goroutine 1
    /usr/local/go/src/net/http/server.go:3086 +0x5cb

goroutine 1 [IO wait, 1 minutes]:
internal/poll.runtime_pollWait(0x7fac3c12eae8, 0x72)
    /usr/local/go/src/runtime/netpoll.go:343 +0x85
internal/poll.(*pollDesc).wait(0xc00093ea00?, 0x4?, 0x0)
    /usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.(*pollDesc).waitRead(...)
    /usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Accept(0xc00093ea00)
    /usr/local/go/src/internal/poll/fd_unix.go:611 +0x2ac
net.(*netFD).accept(0xc00093ea00)
    /usr/local/go/src/net/fd_unix.go:172 +0x29
net.(*TCPListener).accept(0xc000e0ecc0)
    /usr/local/go/src/net/tcpsock_posix.go:152 +0x1e
net.(*TCPListener).AcceptTCP(0xc000e0ecc0)
    /usr/local/go/src/net/tcpsock.go:302 +0x30
github.com/labstack/echo/v4.tcpKeepAliveListener.Accept({0x445fc0?})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/echo.go:989 +0x17
net/http.(*Server).Serve(0xc000e4c0f0, {0x10e63e0, 0xc000df83b0})
    /usr/local/go/src/net/http/server.go:3056 +0x364
github.com/labstack/echo/v4.(*Echo).Start(0xc000e606c0, {0xc000f0e198, 0x5})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/echo.go:686 +0xd2
github.com/lachlan2k/phatcrack/api/internal/webserver.Listen({0xc000014015, 0x4})
    /app/api/internal/webserver/webserver.go:77 +0x98d
main.main()
    /app/api/main.go:80 +0x43f

goroutine 9 [select, 125 minutes]:
database/sql.(*DB).connectionOpener(0xc0005fb040, {0x10e8400, 0xc00085fc70})
    /usr/local/go/src/database/sql/sql.go:1218 +0x87
created by database/sql.OpenDB in goroutine 1
    /usr/local/go/src/database/sql/sql.go:791 +0x165

goroutine 14 [sleep]:
time.Sleep(0xdf8475800)
    /usr/local/go/src/runtime/time.go:195 +0x125
github.com/lachlan2k/phatcrack/api/internal/auth.(*InMemorySessionHandler).janitor(0x0?)
    /app/api/internal/auth/session_inmemory.go:233 +0x27
created by github.com/lachlan2k/phatcrack/api/internal/auth.(*InMemorySessionHandler).CreateMiddleware in goroutine 1
    /app/api/internal/auth/session_inmemory.go:35 +0xae

goroutine 13 [select]:
github.com/lachlan2k/phatcrack/api/internal/fleet.stateReconciliationTask()
    /app/api/internal/fleet/state_reconcilition.go:371 +0x65
created by github.com/lachlan2k/phatcrack/api/internal/fleet.Setup in goroutine 1
    /app/api/internal/fleet/state_reconcilition.go:431 +0x1b1

goroutine 529 [IO wait]:
internal/poll.runtime_pollWait(0x7fac3c12e610, 0x72)
    /usr/local/go/src/runtime/netpoll.go:343 +0x85
internal/poll.(*pollDesc).wait(0xc000039000?, 0xc0001bd000?, 0x0)
    /usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.(*pollDesc).waitRead(...)
    /usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc000039000, {0xc0001bd000, 0x1000, 0x1000})
    /usr/local/go/src/internal/poll/fd_unix.go:164 +0x27a
net.(*netFD).Read(0xc000039000, {0xc0001bd000?, 0x0?, 0xcc26b8?})
    /usr/local/go/src/net/fd_posix.go:55 +0x25
net.(*conn).Read(0xc000306068, {0xc0001bd000?, 0xc000f73610?, 0xc00019af40?})
    /usr/local/go/src/net/net.go:179 +0x45
bufio.(*Reader).fill(0xc000322de0)
    /usr/local/go/src/bufio/bufio.go:113 +0x103
bufio.(*Reader).Peek(0xc000322de0, 0x2)
    /usr/local/go/src/bufio/bufio.go:151 +0x53
github.com/gorilla/websocket.(*Conn).read(0xc00039ec60, 0xc00019b050?)
    /go/pkg/mod/github.com/gorilla/websocket@v1.5.0/conn.go:371 +0x26
github.com/gorilla/websocket.(*Conn).advanceFrame(0xc00039ec60)
    /go/pkg/mod/github.com/gorilla/websocket@v1.5.0/conn.go:809 +0x6d
github.com/gorilla/websocket.(*Conn).NextReader(0xc00039ec60)
    /go/pkg/mod/github.com/gorilla/websocket@v1.5.0/conn.go:1009 +0xb0
github.com/gorilla/websocket.(*Conn).ReadJSON(0xcb3cda?, {0xb4e680, 0xc0013522a0})
    /go/pkg/mod/github.com/gorilla/websocket@v1.5.0/json.go:50 +0x25
github.com/lachlan2k/phatcrack/api/internal/fleet.(*AgentConnection).Handle(0xc0003d3098)
    /app/api/internal/fleet/agent.go:208 +0x225
github.com/lachlan2k/phatcrack/api/internal/controllers.handleAgentWs({0x10f31b0, 0xc0003b4e60})
    /app/api/internal/controllers/agent_handler.go:86 +0x3a7
github.com/labstack/echo/v4.(*Echo).add.func1({0x10f31b0, 0xc0003b4e60})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/echo.go:582 +0x4b
github.com/lachlan2k/phatcrack/api/internal/webserver.Listen.Recover.RecoverWithConfig.func5.1({0x10f31b0, 0xc0003b4e60})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/middleware/recover.go:131 +0x119
github.com/labstack/echo/v4/middleware.RequestLoggerConfig.ToMiddleware.func1.1({0x10f31b0, 0xc0003b4e60})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/middleware/request_logger.go:259 +0x16b
github.com/labstack/echo/v4.(*Echo).ServeHTTP(0xc000e606c0, {0x10e6590?, 0xc0003400e0}, 0xc000260a00)
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/echo.go:669 +0x399
net/http.serverHandler.ServeHTTP({0xc0003829c0?}, {0x10e6590?, 0xc0003400e0?}, 0x6?)
    /usr/local/go/src/net/http/server.go:2938 +0x8e
net/http.(*conn).serve(0xc000e1f200, {0x10e83c8, 0xc000c18b10})
    /usr/local/go/src/net/http/server.go:2009 +0x5f4
created by net/http.(*Server).Serve in goroutine 1
    /usr/local/go/src/net/http/server.go:3086 +0x5cb

goroutine 66 [IO wait]:
internal/poll.runtime_pollWait(0x7fac3c12e8f8, 0x72)
    /usr/local/go/src/runtime/netpoll.go:343 +0x85
internal/poll.(*pollDesc).wait(0xc000b9c000?, 0xc000208000?, 0x0)
    /usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.(*pollDesc).waitRead(...)
    /usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc000b9c000, {0xc000208000, 0x1000, 0x1000})
    /usr/local/go/src/internal/poll/fd_unix.go:164 +0x27a
net.(*netFD).Read(0xc000b9c000, {0xc000208000?, 0x1de000?, 0xcc26b8?})
    /usr/local/go/src/net/fd_posix.go:55 +0x25
net.(*conn).Read(0xc0001303e8, {0xc000208000?, 0xc000b65220?, 0xc0001a6f40?})
    /usr/local/go/src/net/net.go:179 +0x45
bufio.(*Reader).fill(0xc0001143c0)
    /usr/local/go/src/bufio/bufio.go:113 +0x103
bufio.(*Reader).Peek(0xc0001143c0, 0x2)
    /usr/local/go/src/bufio/bufio.go:151 +0x53
github.com/gorilla/websocket.(*Conn).read(0xc000228000, 0xc0001a7050?)
    /go/pkg/mod/github.com/gorilla/websocket@v1.5.0/conn.go:371 +0x26
github.com/gorilla/websocket.(*Conn).advanceFrame(0xc000228000)
    /go/pkg/mod/github.com/gorilla/websocket@v1.5.0/conn.go:809 +0x6d
github.com/gorilla/websocket.(*Conn).NextReader(0xc000228000)
    /go/pkg/mod/github.com/gorilla/websocket@v1.5.0/conn.go:1009 +0xb0
github.com/gorilla/websocket.(*Conn).ReadJSON(0xcb3cda?, {0xb4e680, 0xc000e0e300})
    /go/pkg/mod/github.com/gorilla/websocket@v1.5.0/json.go:50 +0x25
github.com/lachlan2k/phatcrack/api/internal/fleet.(*AgentConnection).Handle(0xc0000124f8)
    /app/api/internal/fleet/agent.go:208 +0x225
github.com/lachlan2k/phatcrack/api/internal/controllers.handleAgentWs({0x10f31b0, 0xc000504000})
    /app/api/internal/controllers/agent_handler.go:86 +0x3a7
github.com/labstack/echo/v4.(*Echo).add.func1({0x10f31b0, 0xc000504000})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/echo.go:582 +0x4b
github.com/lachlan2k/phatcrack/api/internal/webserver.Listen.Recover.RecoverWithConfig.func5.1({0x10f31b0, 0xc000504000})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/middleware/recover.go:131 +0x119
github.com/labstack/echo/v4/middleware.RequestLoggerConfig.ToMiddleware.func1.1({0x10f31b0, 0xc000504000})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/middleware/request_logger.go:259 +0x16b
github.com/labstack/echo/v4.(*Echo).ServeHTTP(0xc000e606c0, {0x10e6590?, 0xc000214000}, 0xc00020a000)
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/echo.go:669 +0x399
net/http.serverHandler.ServeHTTP({0xc000dc0090?}, {0x10e6590?, 0xc000214000?}, 0x6?)
    /usr/local/go/src/net/http/server.go:2938 +0x8e
net/http.(*conn).serve(0xc000c34120, {0x10e83c8, 0xc000c18b10})
    /usr/local/go/src/net/http/server.go:2009 +0x5f4
created by net/http.(*Server).Serve in goroutine 1
    /usr/local/go/src/net/http/server.go:3086 +0x5cb

goroutine 893 [IO wait]:
internal/poll.runtime_pollWait(0x7fac3c12e138, 0x72)
    /usr/local/go/src/runtime/netpoll.go:343 +0x85
internal/poll.(*pollDesc).wait(0xc000b9db00?, 0xc0001d5000?, 0x0)
    /usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.(*pollDesc).waitRead(...)
    /usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc000b9db00, {0xc0001d5000, 0x1000, 0x1000})
    /usr/local/go/src/internal/poll/fd_unix.go:164 +0x27a
net.(*netFD).Read(0xc000b9db00, {0xc0001d5000?, 0x639c00?, 0x9?})
    /usr/local/go/src/net/fd_posix.go:55 +0x25
net.(*conn).Read(0xc000ba61f8, {0xc0001d5000?, 0xc000a25958?, 0xc000286f40?})
    /usr/local/go/src/net/net.go:179 +0x45
bufio.(*Reader).fill(0xc000a06ae0)
    /usr/local/go/src/bufio/bufio.go:113 +0x103
bufio.(*Reader).Peek(0xc000a06ae0, 0x2)
    /usr/local/go/src/bufio/bufio.go:151 +0x53
github.com/gorilla/websocket.(*Conn).read(0xc0008a1ce0, 0xc000287050?)
    /go/pkg/mod/github.com/gorilla/websocket@v1.5.0/conn.go:371 +0x26
github.com/gorilla/websocket.(*Conn).advanceFrame(0xc0008a1ce0)
    /go/pkg/mod/github.com/gorilla/websocket@v1.5.0/conn.go:809 +0x6d
github.com/gorilla/websocket.(*Conn).NextReader(0xc0008a1ce0)
    /go/pkg/mod/github.com/gorilla/websocket@v1.5.0/conn.go:1009 +0xb0
github.com/gorilla/websocket.(*Conn).ReadJSON(0xcb3cda?, {0xb4e680, 0xc000b6b6c0})
    /go/pkg/mod/github.com/gorilla/websocket@v1.5.0/json.go:50 +0x25
github.com/lachlan2k/phatcrack/api/internal/fleet.(*AgentConnection).Handle(0xc0001deb40)
    /app/api/internal/fleet/agent.go:208 +0x225
github.com/lachlan2k/phatcrack/api/internal/controllers.handleAgentWs({0x10f31b0, 0xc00080a0a0})
    /app/api/internal/controllers/agent_handler.go:86 +0x3a7
github.com/labstack/echo/v4.(*Echo).add.func1({0x10f31b0, 0xc00080a0a0})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/echo.go:582 +0x4b
github.com/lachlan2k/phatcrack/api/internal/webserver.Listen.Recover.RecoverWithConfig.func5.1({0x10f31b0, 0xc00080a0a0})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/middleware/recover.go:131 +0x119
github.com/labstack/echo/v4/middleware.RequestLoggerConfig.ToMiddleware.func1.1({0x10f31b0, 0xc00080a0a0})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/middleware/request_logger.go:259 +0x16b
github.com/labstack/echo/v4.(*Echo).ServeHTTP(0xc000e606c0, {0x10e6590?, 0xc0003aa700}, 0xc00042f700)
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/echo.go:669 +0x399
net/http.serverHandler.ServeHTTP({0xc000dc1950?}, {0x10e6590?, 0xc0003aa700?}, 0x6?)
    /usr/local/go/src/net/http/server.go:2938 +0x8e
net/http.(*conn).serve(0xc000a9aab0, {0x10e83c8, 0xc000c18b10})
    /usr/local/go/src/net/http/server.go:2009 +0x5f4
created by net/http.(*Server).Serve in goroutine 1
    /usr/local/go/src/net/http/server.go:3086 +0x5cb

goroutine 3564 [IO wait, 1 minutes]:
internal/poll.runtime_pollWait(0x7fac3477dfd8, 0x72)
    /usr/local/go/src/runtime/netpoll.go:343 +0x85
internal/poll.(*pollDesc).wait(0xc000a00200?, 0xc00040d000?, 0x0)
    /usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.(*pollDesc).waitRead(...)
    /usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc000a00200, {0xc00040d000, 0x1000, 0x1000})
    /usr/local/go/src/internal/poll/fd_unix.go:164 +0x27a
net.(*netFD).Read(0xc000a00200, {0xc00040d000?, 0x4daba5?, 0x0?})
    /usr/local/go/src/net/fd_posix.go:55 +0x25
net.(*conn).Read(0xc000df85c0, {0xc00040d000?, 0x0?, 0xc000b7c038?})
    /usr/local/go/src/net/net.go:179 +0x45
net/http.(*connReader).Read(0xc000b7c030, {0xc00040d000, 0x1000, 0x1000})
    /usr/local/go/src/net/http/server.go:791 +0x14b
bufio.(*Reader).fill(0xc000a88000)
    /usr/local/go/src/bufio/bufio.go:113 +0x103
bufio.(*Reader).Peek(0xc000a88000, 0x4)
    /usr/local/go/src/bufio/bufio.go:151 +0x53
net/http.(*conn).serve(0xc000b95cb0, {0x10e83c8, 0xc000c18b10})
    /usr/local/go/src/net/http/server.go:2044 +0x75c
created by net/http.(*Server).Serve in goroutine 1
    /usr/local/go/src/net/http/server.go:3086 +0x5cb

goroutine 18248 [runnable]:
internal/poll.ignoringEINTRIO(...)
    /usr/local/go/src/internal/poll/fd_unix.go:737
internal/poll.(*FD).Read(0xc00013a100, {0xc0000c4461, 0x1, 0x1})
    /usr/local/go/src/internal/poll/fd_unix.go:160 +0x2e5
net.(*netFD).Read(0xc00013a100, {0xc0000c4461?, 0xc000a3cf40?, 0x469630?})
    /usr/local/go/src/net/fd_posix.go:55 +0x25
net.(*conn).Read(0xc000306008, {0xc0000c4461?, 0x10e8101?, 0xc000a1e6e0?})
    /usr/local/go/src/net/net.go:179 +0x45
net/http.(*connReader).backgroundRead(0xc0000c4450)
    /usr/local/go/src/net/http/server.go:683 +0x37
created by net/http.(*connReader).startBackgroundRead in goroutine 17780
    /usr/local/go/src/net/http/server.go:679 +0xba

goroutine 17779 [runnable]:
gorm.io/gorm.SoftDeleteQueryClause.ModifyStatement({{{0x0, 0x0}, 0x0}, 0xc000ba94a0}, 0xc00097f340)
    /go/pkg/mod/gorm.io/gorm@v1.25.4/soft_delete.go:92 +0x273
gorm.io/gorm.(*Statement).AddClause(0xc00097f340, {0x10e6770, 0xc000b6b8e0})
    /go/pkg/mod/gorm.io/gorm@v1.25.4/statement.go:266 +0x42
gorm.io/gorm/callbacks.BuildQuerySQL(0xc000a65260)
    /go/pkg/mod/gorm.io/gorm@v1.25.4/callbacks/query.go:36 +0x1cf5
gorm.io/gorm/callbacks.Query(0xc000a65260)
    /go/pkg/mod/gorm.io/gorm@v1.25.4/callbacks/query.go:17 +0x36
gorm.io/gorm.(*processor).Execute(0xc00085f2c0, 0xc000960420?)
    /go/pkg/mod/gorm.io/gorm@v1.25.4/callbacks.go:130 +0x375
gorm.io/gorm.(*DB).First(0xc001228450?, {0xbd0dc0?, 0xc0005fb2b0}, {0xc000b2f620, 0x2, 0x2})
    /go/pkg/mod/gorm.io/gorm@v1.25.4/finisher_api.go:129 +0x1b2
github.com/lachlan2k/phatcrack/api/internal/db.GetUserByID({0xc001228450, 0x24})
    /app/api/internal/db/user.go:64 +0xb9
github.com/lachlan2k/phatcrack/api/internal/auth.UserAndSessFromReq({0x10f31b0, 0xc0000e2d20})
    /app/api/internal/auth/session.go:61 +0x194
github.com/lachlan2k/phatcrack/api/internal/controllers.HookAuthEndpoints.handleRefresh.func10({0x10f31b0, 0xc0000e2d20})
    /app/api/internal/controllers/auth.go:273 +0x65
github.com/lachlan2k/phatcrack/api/internal/webserver.Listen.EnforceAuthMiddleware.func2.1({0x10f31b0, 0xc0000e2d20})
    /app/api/internal/auth/middleware.go:65 +0x102
github.com/lachlan2k/phatcrack/api/internal/auth.(*InMemorySessionHandler).CreateMiddleware.func1.1({0x10f31b0, 0xc0000e2d20})
    /app/api/internal/auth/session_inmemory.go:52 +0x110
github.com/lachlan2k/phatcrack/api/internal/auth.CreateHeaderAuthMiddleware.func1.1({0x10f31b0, 0xc0000e2d20})
    /app/api/internal/auth/header_auth_middleware.go:27 +0x1b3
github.com/labstack/echo/v4.(*Echo).add.func1({0x10f31b0, 0xc0000e2d20})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/echo.go:582 +0x4b
github.com/lachlan2k/phatcrack/api/internal/webserver.Listen.Recover.RecoverWithConfig.func5.1({0x10f31b0, 0xc0000e2d20})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/middleware/recover.go:131 +0x119
github.com/labstack/echo/v4/middleware.RequestLoggerConfig.ToMiddleware.func1.1({0x10f31b0, 0xc0000e2d20})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/middleware/request_logger.go:259 +0x16b
github.com/labstack/echo/v4.(*Echo).ServeHTTP(0xc000e606c0, {0x10e6590?, 0xc0004ecb60}, 0xc00042ff00)
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/echo.go:669 +0x399
net/http.serverHandler.ServeHTTP({0xc000e1c510?}, {0x10e6590?, 0xc0004ecb60?}, 0x6?)
    /usr/local/go/src/net/http/server.go:2938 +0x8e
net/http.(*conn).serve(0xc00017e000, {0x10e83c8, 0xc000c18b10})
    /usr/local/go/src/net/http/server.go:2009 +0x5f4
created by net/http.(*Server).Serve in goroutine 1
    /usr/local/go/src/net/http/server.go:3086 +0x5cb

goroutine 17780 [runnable]:
context.WithDeadlineCause({0x10e81d0, 0x16385a0}, {0x1608f60?, 0xf4240?, 0x1608f60?}, {0x0?, 0x0})
    /usr/local/go/src/context/context.go:633 +0x1d7
context.WithDeadline(...)
    /usr/local/go/src/context/context.go:607
context.WithTimeout({0x10e81d0, 0x16385a0}, 0x199?)
    /usr/local/go/src/context/context.go:685 +0x4d
github.com/jackc/pgx/v5/pgconn.(*PgConn).CheckConn(0xc1415484f0878141?)
    /go/pkg/mod/github.com/jackc/pgx/v5@v5.4.3/pgconn/pgconn.go:1694 +0x45
github.com/jackc/pgx/v5/stdlib.(*Conn).ResetSession(0xc000bc2420, {0x10e81d0, 0x16385a0})
    /go/pkg/mod/github.com/jackc/pgx/v5@v5.4.3/stdlib/sql.go:473 +0x8b
database/sql.(*driverConn).resetSession(0xc000101400?, {0x10e81d0, 0x16385a0})
    /usr/local/go/src/database/sql/sql.go:553 +0xe3
database/sql.(*DB).conn(0xc0005fb040, {0x10e81d0, 0x16385a0}, 0x1)
    /usr/local/go/src/database/sql/sql.go:1313 +0x1e5
database/sql.(*DB).query(0x7fac3c0d1730?, {0x10e81d0, 0x16385a0}, {0xc000b26f50, 0x62}, {0xc00129dc80, 0x1, 0x8}, 0xdd?)
    /usr/local/go/src/database/sql/sql.go:1721 +0x57
database/sql.(*DB).QueryContext.func1(0xd8?)
    /usr/local/go/src/database/sql/sql.go:1704 +0x4f
database/sql.(*DB).retry(0x10?, 0xc0002b4f80)
    /usr/local/go/src/database/sql/sql.go:1538 +0x42
database/sql.(*DB).QueryContext(0xc000e1d890?, {0x10e81d0?, 0x16385a0?}, {0xc000b26f50?, 0x0?}, {0xc00129dc80?, 0x40fe65?, 0x0?})
    /usr/local/go/src/database/sql/sql.go:1703 +0xc5
gorm.io/gorm/callbacks.Query(0xc000e1d890)
    /go/pkg/mod/gorm.io/gorm@v1.25.4/callbacks/query.go:20 +0xb2
gorm.io/gorm.(*processor).Execute(0xc00085f2c0, 0xc000960420?)
    /go/pkg/mod/gorm.io/gorm@v1.25.4/callbacks.go:130 +0x375
gorm.io/gorm.(*DB).First(0xc001228450?, {0xbd0dc0?, 0xc000e256c0}, {0xc000964760, 0x2, 0x2})
    /go/pkg/mod/gorm.io/gorm@v1.25.4/finisher_api.go:129 +0x1b2
github.com/lachlan2k/phatcrack/api/internal/db.GetUserByID({0xc001228450, 0x24})
    /app/api/internal/db/user.go:64 +0xb9
github.com/lachlan2k/phatcrack/api/internal/auth.UserAndSessFromReq({0x10f31b0, 0xc0009563c0})
    /app/api/internal/auth/session.go:61 +0x194
github.com/lachlan2k/phatcrack/api/internal/webserver.Listen.EnforceMFAMiddleware.func3.1({0x10f31b0, 0xc0009563c0})
    /app/api/internal/auth/middleware.go:14 +0x38
github.com/lachlan2k/phatcrack/api/internal/webserver.Listen.EnforceAuthMiddleware.func2.1({0x10f31b0, 0xc0009563c0})
    /app/api/internal/auth/middleware.go:65 +0x102
github.com/lachlan2k/phatcrack/api/internal/auth.(*InMemorySessionHandler).CreateMiddleware.func1.1({0x10f31b0, 0xc0009563c0})
    /app/api/internal/auth/session_inmemory.go:52 +0x110
github.com/lachlan2k/phatcrack/api/internal/auth.CreateHeaderAuthMiddleware.func1.1({0x10f31b0, 0xc0009563c0})
    /app/api/internal/auth/header_auth_middleware.go:27 +0x1b3
github.com/labstack/echo/v4.(*Echo).add.func1({0x10f31b0, 0xc0009563c0})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/echo.go:582 +0x4b
github.com/lachlan2k/phatcrack/api/internal/webserver.Listen.Recover.RecoverWithConfig.func5.1({0x10f31b0, 0xc0009563c0})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/middleware/recover.go:131 +0x119
github.com/labstack/echo/v4/middleware.RequestLoggerConfig.ToMiddleware.func1.1({0x10f31b0, 0xc0009563c0})
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/middleware/request_logger.go:259 +0x16b
github.com/labstack/echo/v4.(*Echo).ServeHTTP(0xc000e606c0, {0x10e6590?, 0xc000340460}, 0xc00020ac00)
    /go/pkg/mod/github.com/labstack/echo/v4@v4.11.1/echo.go:669 +0x399
net/http.serverHandler.ServeHTTP({0xc0000c4450?}, {0x10e6590?, 0xc000340460?}, 0x6?)
    /usr/local/go/src/net/http/server.go:2938 +0x8e
net/http.(*conn).serve(0xc00017e1b0, {0x10e83c8, 0xc000c18b10})
    /usr/local/go/src/net/http/server.go:2009 +0x5f4
created by net/http.(*Server).Serve in goroutine 1
    /usr/local/go/src/net/http/server.go:3086 +0x5cb

goroutine 18292 [runnable]:
net/http.(*connReader).startBackgroundRead.func2()
    /usr/local/go/src/net/http/server.go:679
runtime.goexit()
    /usr/local/go/src/runtime/asm_amd64.s:1650 +0x1
created by net/http.(*connReader).startBackgroundRead in goroutine 17779
    /usr/local/go/src/net/http/server.go:679 +0xba

goroutine 11223 [IO wait, 1 minutes]:
internal/poll.runtime_pollWait(0x7fac3c12df48, 0x72)
    /usr/local/go/src/runtime/netpoll.go:343 +0x85
internal/poll.(*pollDesc).wait(0xc000e00280?, 0xc0001bc000?, 0x0)
    /usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.(*pollDesc).waitRead(...)
    /usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc000e00280, {0xc0001bc000, 0x1000, 0x1000})
    /usr/local/go/src/internal/poll/fd_unix.go:164 +0x27a
net.(*netFD).Read(0xc000e00280, {0xc0001bc000?, 0x4daba5?, 0x0?})
    /usr/local/go/src/net/fd_posix.go:55 +0x25
net.(*conn).Read(0xc000df8028, {0xc0001bc000?, 0x0?, 0xc000b7c308?})
    /usr/local/go/src/net/net.go:179 +0x45
net/http.(*connReader).Read(0xc000b7c300, {0xc0001bc000, 0x1000, 0x1000})
    /usr/local/go/src/net/http/server.go:791 +0x14b
bufio.(*Reader).fill(0xc0001d6120)
    /usr/local/go/src/bufio/bufio.go:113 +0x103
bufio.(*Reader).Peek(0xc0001d6120, 0x4)
    /usr/local/go/src/bufio/bufio.go:151 +0x53
net/http.(*conn).serve(0xc000e1e000, {0x10e83c8, 0xc000c18b10})
    /usr/local/go/src/net/http/server.go:2044 +0x75c
created by net/http.(*Server).Serve in goroutine 1
    /usr/local/go/src/net/http/server.go:3086 +0x5cb

goroutine 18278 [runnable]:
net/http.(*connReader).startBackgroundRead.func2()
    /usr/local/go/src/net/http/server.go:679
runtime.goexit()
    /usr/local/go/src/runtime/asm_amd64.s:1650 +0x1
created by net/http.(*connReader).startBackgroundRead in goroutine 12173
    /usr/local/go/src/net/http/server.go:679 +0xba