diff options
| author | Kyren223 <Kyren223@proton.me> | 2025-07-08 19:10:26 +0300 |
|---|---|---|
| committer | Kyren223 <Kyren223@proton.me> | 2025-07-08 19:10:26 +0300 |
| commit | 046b17959f2296a32a62d3b4f6174d47cdfbd4e9 (patch) | |
| tree | a4c614728ae19a42fc484ca904ada4311b81a647 /internal/client/ui/core | |
| parent | 56acb0d51e93ddd528422253137a3692d9bdc8de (diff) | |
Finished implementing authentication on the client-side
Diffstat (limited to 'internal/client/ui/core')
| -rw-r--r-- | internal/client/ui/core/core.go | 68 |
1 files changed, 50 insertions, 18 deletions
diff --git a/internal/client/ui/core/core.go b/internal/client/ui/core/core.go index 61810cd..5a0f8db 100644 --- a/internal/client/ui/core/core.go +++ b/internal/client/ui/core/core.go @@ -247,23 +247,6 @@ func (m *Model) updateDisconnected(msg tea.Msg) tea.Cmd { case gateway.ConnectionEstablished: m.state = Connected m.timeout = InitialTimeout - - // TODO: - // // state.UserID = (*snowflake.ID)(&msg) - // var setName tea.Cmd - // if m.name != "" { - // setName = gateway.Send(&packet.SetUserData{ - // Data: nil, - // User: &data.User{ - // Name: m.name, - // Description: "", - // IsPublicDM: true, - // }, - // }) - // m.name = "" - // } - // - // return tea.Batch(m.timer.Stop(), setName) return m.timer.Stop() case gateway.ConnectionFailed: @@ -326,12 +309,61 @@ func (m *Model) updateConnected(message tea.Msg) tea.Cmd { // // return tea.Batch(m.timer.Stop(), setName) + case *packet.Error: + if m.state == ConnectedAcceptedTos { + if msg.Error == "success" { + return gateway.Send(&packet.GetNonce{}) + } else { + log.Println("received error:", msg.Error) + gateway.Disconnect() + return ui.Transition(ui.NewAuth()) + } + } + + case *packet.NonceInfo: + if m.state == ConnectedAcceptedTos { + pubKey := ed25519.PublicKey(make([]byte, ed25519.PublicKeySize)) + copy(pubKey, m.privKey[32:]) + + signature := ed25519.Sign(m.privKey, msg.Nonce) + + return gateway.Send(&packet.Authenticate{ + PubKey: pubKey, + Signature: signature, + }) + } + + case *packet.UsersInfo: + if m.state == ConnectedAcceptedTos { + assert.Assert(len(msg.Users) == 1, "as per the spec, server must send a UsersInfo with exactly a single user", "users", msg.Users) + + m.state = Authenticated + state.UserID = &msg.Users[0].ID + + var setName tea.Cmd + if m.name != "" { + setName = gateway.Send(&packet.SetUserData{ + Data: nil, + User: &data.User{ + Name: m.name, + Description: "", + IsPublicDM: true, + }, + }) + m.name = "" + } + + return setName + } + case tea.KeyMsg: switch msg.String() { case "enter": if m.state == ConnectedReceivedTos { - // TODO: m.state = ConnectedAcceptedTos + return gateway.Send(&packet.AcceptTos{ + IAgreeToTheTermsOfServiceAndPrivacyPolicy: true, + }) } } |
