Skip to content
Snippets Groups Projects
Commit 8e6742de authored by Jake Taylor's avatar Jake Taylor
Browse files

fix segfaults surrounding connect.Callbacks implementation of auth.Callbacks

parent 04e13e62
No related branches found
No related tags found
1 merge request!510Release
...@@ -17,13 +17,11 @@ import ( ...@@ -17,13 +17,11 @@ import (
) )
// clientAuthCallback provides callback functionality for interfacing between // clientAuthCallback provides callback functionality for interfacing between
// auth.State and Connection. This is used both for blocking creation of a // auth.State and Connection. This is used for building new Connection
// Connection object until the auth Request is confirmed and for dynamically // objects when an auth Confirm is received.
// building new Connection objects when an auth Request is received.
type clientAuthCallback struct { type clientAuthCallback struct {
// Used for signaling confirmation of E2E partnership // Used for signaling confirmation of E2E partnership
confirmCallback Callback confirmCallback Callback
requestCallback Callback
// Used for building new Connection objects // Used for building new Connection objects
connectionE2e clientE2e.Handler connectionE2e clientE2e.Handler
...@@ -31,14 +29,12 @@ type clientAuthCallback struct { ...@@ -31,14 +29,12 @@ type clientAuthCallback struct {
authState auth.State authState auth.State
} }
// getClientAuthCallback returns a callback interface to be passed into the creation // getClientAuthCallback returns an auth.Callbacks interface to be passed into the creation
// of an auth.State object. // of an auth.State object for connect clients.
// it will accept requests only if a request callback is passed in func getClientAuthCallback(confirm Callback, e2e clientE2e.Handler,
func getClientAuthCallback(confirm, request Callback, e2e clientE2e.Handler,
auth auth.State, params xxdk.E2EParams) *clientAuthCallback { auth auth.State, params xxdk.E2EParams) *clientAuthCallback {
return &clientAuthCallback{ return &clientAuthCallback{
confirmCallback: confirm, confirmCallback: confirm,
requestCallback: request,
connectionE2e: e2e, connectionE2e: e2e,
connectionParams: params, connectionParams: params,
authState: auth, authState: auth,
...@@ -58,17 +54,13 @@ func (a clientAuthCallback) Confirm(requestor contact.Contact, ...@@ -58,17 +54,13 @@ func (a clientAuthCallback) Confirm(requestor contact.Contact,
jww.ERROR.Printf("Unable to build connection with "+ jww.ERROR.Printf("Unable to build connection with "+
"partner %s: %+v", requestor.ID, err) "partner %s: %+v", requestor.ID, err)
// Send a nil connection to avoid hold-ups down the line // Send a nil connection to avoid hold-ups down the line
if a.confirmCallback != nil { a.confirmCallback(nil)
a.confirmCallback(nil)
}
return return
} }
// Return the new Connection object // Return the new Connection object
if a.confirmCallback != nil { a.confirmCallback(BuildConnection(newPartner, a.connectionE2e,
a.confirmCallback(BuildConnection(newPartner, a.connectionE2e, a.authState, a.connectionParams))
a.authState, a.connectionParams))
}
} }
// Request will be called when an auth Request message is processed. // Request will be called when an auth Request message is processed.
...@@ -82,12 +74,10 @@ func (a clientAuthCallback) Reset(contact.Contact, ...@@ -82,12 +74,10 @@ func (a clientAuthCallback) Reset(contact.Contact,
} }
// serverAuthCallback provides callback functionality for interfacing between // serverAuthCallback provides callback functionality for interfacing between
// auth.State and Connection. This is used both for blocking creation of a // auth.State and Connection. This is used for building new Connection
// Connection object until the auth Request is confirmed and for dynamically //objects when an auth Request is received.
// building new Connection objects when an auth Request is received.
type serverAuthCallback struct { type serverAuthCallback struct {
// Used for signaling confirmation of E2E partnership // Used for signaling confirmation of E2E partnership
confirmCallback Callback
requestCallback Callback requestCallback Callback
// Used to track stale connections // Used to track stale connections
...@@ -97,13 +87,11 @@ type serverAuthCallback struct { ...@@ -97,13 +87,11 @@ type serverAuthCallback struct {
connectionParams xxdk.E2EParams connectionParams xxdk.E2EParams
} }
// getServerAuthCallback returns a callback interface to be passed into the creation // getServerAuthCallback returns an auth.Callbacks interface to be passed into the creation
// of a xxdk.E2e object. // of a xxdk.E2e object for connect servers.
// it will accept requests only if a request callback is passed in func getServerAuthCallback(request Callback, cl *ConnectionList,
func getServerAuthCallback(confirm, request Callback, cl *ConnectionList,
params xxdk.E2EParams) *serverAuthCallback { params xxdk.E2EParams) *serverAuthCallback {
return &serverAuthCallback{ return &serverAuthCallback{
confirmCallback: confirm,
requestCallback: request, requestCallback: request,
cl: cl, cl: cl,
connectionParams: params, connectionParams: params,
...@@ -118,25 +106,22 @@ func (a serverAuthCallback) Confirm(contact.Contact, ...@@ -118,25 +106,22 @@ func (a serverAuthCallback) Confirm(contact.Contact,
// Request will be called when an auth Request message is processed. // Request will be called when an auth Request message is processed.
func (a serverAuthCallback) Request(requestor contact.Contact, func (a serverAuthCallback) Request(requestor contact.Contact,
_ receptionID.EphemeralIdentity, _ rounds.Round, user *xxdk.E2e) { _ receptionID.EphemeralIdentity, _ rounds.Round, user *xxdk.E2e) {
if a.requestCallback == nil { jww.DEBUG.Printf("Connection auth request for %s received",
jww.ERROR.Printf("Received a request when requests are" + requestor.ID.String())
"not enable, will not accept")
} // Auto-confirm the auth request
_, err := user.GetAuth().Confirm(requestor) _, err := user.GetAuth().Confirm(requestor)
if err != nil { if err != nil {
jww.ERROR.Printf("Unable to build connection with "+ jww.ERROR.Printf("Unable to build connection with "+
"partner %s: %+v", requestor.ID, err) "partner %s: %+v", requestor.ID, err)
// Send a nil connection to avoid hold-ups down the line return
a.requestCallback(nil)
} }
// After confirmation, get the new partner // After confirmation, get the new partner
newPartner, err := user.GetE2E().GetPartner(requestor.ID) newPartner, err := user.GetE2E().GetPartner(requestor.ID)
if err != nil { if err != nil {
jww.ERROR.Printf("Unable to build connection with "+ jww.ERROR.Printf("Unable to build connection with "+
"partner %s: %+v", requestor.ID, err) "partner %s: %+v", requestor.ID, err)
// Send a nil connection to avoid hold-ups down the line
a.requestCallback(nil)
return return
} }
......
...@@ -88,7 +88,7 @@ func Connect(recipient contact.Contact, user *xxdk.E2e, ...@@ -88,7 +88,7 @@ func Connect(recipient contact.Contact, user *xxdk.E2e,
cb := func(connection Connection) { cb := func(connection Connection) {
signalChannel <- connection signalChannel <- connection
} }
callback := getClientAuthCallback(cb, nil, user.GetE2E(), callback := getClientAuthCallback(cb, user.GetE2E(),
user.GetAuth(), p) user.GetAuth(), p)
user.GetAuth().AddPartnerCallback(recipient.ID, callback) user.GetAuth().AddPartnerCallback(recipient.ID, callback)
...@@ -128,8 +128,6 @@ func Connect(recipient contact.Contact, user *xxdk.E2e, ...@@ -128,8 +128,6 @@ func Connect(recipient contact.Contact, user *xxdk.E2e,
// //
// This calls xxdk.LoginEphemeral under the hood and the connection // This calls xxdk.LoginEphemeral under the hood and the connection
// server must be the only listener on auth. // server must be the only listener on auth.
//
// The given Callback needs to handle receiving a nil Connection.
func StartServer(identity xxdk.ReceptionIdentity, connectionCallback Callback, func StartServer(identity xxdk.ReceptionIdentity, connectionCallback Callback,
net *xxdk.Cmix, params xxdk.E2EParams, clParams ConnectionListParams) (*ConnectionServer, error) { net *xxdk.Cmix, params xxdk.E2EParams, clParams ConnectionListParams) (*ConnectionServer, error) {
...@@ -141,7 +139,7 @@ func StartServer(identity xxdk.ReceptionIdentity, connectionCallback Callback, ...@@ -141,7 +139,7 @@ func StartServer(identity xxdk.ReceptionIdentity, connectionCallback Callback,
} }
// Build callback for E2E negotiation // Build callback for E2E negotiation
callback := getServerAuthCallback(nil, connectionCallback, cl, params) callback := getServerAuthCallback(connectionCallback, cl, params)
e2eClient, err := xxdk.LoginEphemeral(net, callback, identity, params) e2eClient, err := xxdk.LoginEphemeral(net, callback, identity, params)
if err != nil { if err != nil {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment