/// <inheritdoc /> public virtual async Task <(ConnectionResponseMessage, ConnectionRecord)> CreateResponseAsync(IAgentContext agentContext, string connectionId) { Logger.LogInformation(LoggingEvents.AcceptConnectionRequest, "ConnectionId {0}", connectionId); var connection = await GetAsync(agentContext, connectionId); if (connection.State != ConnectionState.Negotiating) { throw new AriesFrameworkException(ErrorCode.RecordInInvalidState, $"Connection state was invalid. Expected '{ConnectionState.Negotiating}', found '{connection.State}'"); } await Pairwise.CreateAsync(agentContext.Wallet, connection.TheirDid, connection.MyDid, connection.Endpoint.ToJson()); await connection.TriggerAsync(ConnectionTrigger.Request); await RecordService.UpdateAsync(agentContext.Wallet, connection); // Send back response message var provisioning = await ProvisioningService.GetProvisioningAsync(agentContext.Wallet); var connectionData = new Connection { Did = connection.MyDid, DidDoc = connection.MyDidDoc(provisioning) }; var sigData = await SignatureUtils.SignData(agentContext, connectionData, connection.GetTag(TagConstants.ConnectionKey)); var threadId = connection.GetTag(TagConstants.LastThreadId); var response = new ConnectionResponseMessage { ConnectionSig = sigData }; response.ThreadFrom(threadId); return(response, connection); }
/// <inheritdoc /> public virtual async Task <string> ProcessResponseAsync(IAgentContext agentContext, ConnectionResponseMessage response, ConnectionRecord connection) { Logger.LogTrace(LoggingEvents.AcceptConnectionResponse, "To {1}", connection.MyDid); //TODO throw exception or a problem report if the connection request features a did doc that has no indy agent did doc convention featured //i.e there is no way for this agent to respond to messages. And or no keys specified var connectionObj = await SignatureUtils.UnpackAndVerifyAsync <Connection>(response.ConnectionSig); await Did.StoreTheirDidAsync(agentContext.Wallet, new { did = connectionObj.Did, verkey = connectionObj.DidDoc.Keys[0].PublicKeyBase58 }.ToJson()); connection.TheirDid = connectionObj.Did; connection.TheirVk = connectionObj.DidDoc.Keys[0].PublicKeyBase58; connection.SetTag(TagConstants.LastThreadId, response.GetThreadId()); if (connectionObj.DidDoc.Services[0] is IndyAgentDidDocService service) { connection.Endpoint = new AgentEndpoint(service.ServiceEndpoint, null, service.RoutingKeys != null && service.RoutingKeys.Count > 0 ? service.RoutingKeys.ToArray() : null); } await connection.TriggerAsync(ConnectionTrigger.Response); await RecordService.UpdateAsync(agentContext.Wallet, connection); EventAggregator.Publish(new ServiceMessageProcessingEvent { RecordId = connection.Id, MessageType = response.Type, ThreadId = response.GetThreadId() }); return(connection.Id); }