Esempio n. 1
0
        internal static async Task <(ConnectionRecord firstParty, ConnectionRecord secondParty)> EstablishConnectionAsync(
            IConnectionService connectionService,
            IProducerConsumerCollection <IEnvelopeMessage> _messages,
            Wallet firstWallet,
            Wallet secondWallet,
            bool autoConnectionFlow = false)
        {
            // Create invitation by the issuer
            var issuerConnectionId = Guid.NewGuid().ToString();

            var inviteConfig = new DefaultCreateInviteConfiguration()
            {
                ConnectionId         = issuerConnectionId,
                AutoAcceptConnection = autoConnectionFlow,
                MyAlias = new ConnectionAlias()
                {
                    Name     = "Issuer",
                    ImageUrl = "www.issuerdomain.com/profilephoto"
                },
                TheirAlias = new ConnectionAlias()
                {
                    Name     = "Holder",
                    ImageUrl = "www.holderdomain.com/profilephoto"
                }
            };

            // Issuer creates an invitation
            var invitation = await connectionService.CreateInvitationAsync(firstWallet, inviteConfig);

            var connectionIssuer = await connectionService.GetAsync(firstWallet, issuerConnectionId);

            Assert.Equal(ConnectionState.Invited, connectionIssuer.State);
            Assert.True(invitation.Name == inviteConfig.MyAlias.Name &&
                        invitation.ImageUrl == inviteConfig.MyAlias.ImageUrl);

            // Holder accepts invitation and sends a message request
            var holderConnectionId = await connectionService.AcceptInvitationAsync(secondWallet, invitation);

            var connectionHolder = await connectionService.GetAsync(secondWallet, holderConnectionId);

            Assert.Equal(ConnectionState.Negotiating, connectionHolder.State);

            // Issuer processes incoming message
            var issuerMessage = _messages.OfType <ForwardToKeyEnvelopeMessage>()
                                .First(x => x.Type.Contains(connectionIssuer.Tags.Single(item => item.Key == "connectionKey").Value));

            var requestMessage = GetContentMessage(issuerMessage) as ConnectionRequestMessage;

            Assert.NotNull(requestMessage);

            // Issuer processes the connection request by storing it and accepting it if auto connection flow is enabled
            await connectionService.ProcessRequestAsync(firstWallet, requestMessage);

            if (!autoConnectionFlow)
            {
                connectionIssuer = await connectionService.GetAsync(firstWallet, issuerConnectionId);

                Assert.Equal(ConnectionState.Negotiating, connectionIssuer.State);

                // Issuer accepts the connection request
                await connectionService.AcceptRequestAsync(firstWallet, issuerConnectionId);
            }

            connectionIssuer = await connectionService.GetAsync(firstWallet, issuerConnectionId);

            Assert.Equal(ConnectionState.Connected, connectionIssuer.State);

            // Holder processes incoming message
            var holderMessage = _messages.OfType <ForwardEnvelopeMessage>()
                                .First(x => x.Type.Contains(connectionHolder.MyDid));

            var responseMessage = GetContentMessage(holderMessage) as ConnectionResponseMessage;

            Assert.NotNull(responseMessage);

            // Holder processes the response message by accepting it
            await connectionService.ProcessResponseAsync(secondWallet, responseMessage);

            // Retrieve updated connection state for both issuer and holder
            connectionIssuer = await connectionService.GetAsync(firstWallet, issuerConnectionId);

            connectionHolder = await connectionService.GetAsync(secondWallet, holderConnectionId);

            Assert.True(connectionIssuer.Alias.Name == inviteConfig.TheirAlias.Name &&
                        connectionIssuer.Alias.ImageUrl == inviteConfig.TheirAlias.ImageUrl);
            Assert.True(connectionHolder.Alias.Name == inviteConfig.MyAlias.Name &&
                        connectionHolder.Alias.ImageUrl == inviteConfig.MyAlias.ImageUrl);

            return(connectionIssuer, connectionHolder);
        }
Esempio n. 2
0
        /// <inheritdoc />
        public virtual async Task <ConnectionInvitationMessage> CreateInvitationAsync(Wallet wallet,
                                                                                      DefaultCreateInviteConfiguration config = null)
        {
            var connectionId = !string.IsNullOrEmpty(config?.ConnectionId)
                ? config.ConnectionId
                : Guid.NewGuid().ToString();

            Logger.LogInformation(LoggingEvents.CreateInvitation, "ConnectionId {0}", connectionId);

            var connectionKey = await Crypto.CreateKeyAsync(wallet, "{}");

            var connection = new ConnectionRecord();

            connection.ConnectionId = connectionId;
            connection.Tags.Add(TagConstants.ConnectionKey, connectionKey);

            if (config != null && config.AutoAcceptConnection)
            {
                connection.Tags.Add(TagConstants.AutoAcceptConnection, "true");
            }

            if (config?.TheirAlias != null)
            {
                connection.Alias = config.TheirAlias;
                if (!string.IsNullOrEmpty(config.TheirAlias.Name))
                {
                    connection.Tags.Add(TagConstants.Alias, config.TheirAlias.Name);
                }
            }

            if (config?.Tags != null)
            {
                foreach (var tag in config.Tags)
                {
                    if (!connection.Tags.Keys.Contains(tag.Key))
                    {
                        connection.Tags.Add(tag.Key, tag.Value);
                    }
                }
            }

            await RecordService.AddAsync(wallet, connection);

            var provisioning = await ProvisioningService.GetProvisioningAsync(wallet);

            var invite = new ConnectionInvitationMessage
            {
                Endpoint      = provisioning.Endpoint,
                ConnectionKey = connectionKey
            };

            if (!string.IsNullOrEmpty(provisioning.Owner?.Name))
            {
                invite.Name = provisioning.Owner.Name;
            }
            if (!string.IsNullOrEmpty(provisioning.Owner?.ImageUrl))
            {
                invite.ImageUrl = provisioning.Owner.ImageUrl;
            }

            if (!string.IsNullOrEmpty(config?.MyAlias?.Name))
            {
                invite.Name = config.MyAlias.Name;
            }
            if (!string.IsNullOrEmpty(config?.MyAlias?.ImageUrl))
            {
                invite.ImageUrl = config.MyAlias.ImageUrl;
            }

            return(invite);
        }