/// <summary>
        /// Asynchronously sets the signer as the required signer on a single package registration owned by the signer.
        /// </summary>
        /// <param name="registration">A package registration.</param>
        /// <param name="signer">A user.  May be <c>null</c>.</param>
        /// <returns>A task that represents the asynchronous operation.</returns>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="registration" /> is <c>null</c>.</exception>
        public async Task SetRequiredSignerAsync(PackageRegistration registration, User signer, bool commitChanges = true)
        {
            if (registration == null)
            {
                throw new ArgumentNullException(nameof(registration));
            }

            var isCommitRequired = false;

            string previousRequiredSigner = null;
            string newRequiredSigner      = null;

            if (signer == null)
            {
                var currentRequiredSigner = registration.RequiredSigners.FirstOrDefault();

                if (currentRequiredSigner != null)
                {
                    previousRequiredSigner = currentRequiredSigner.Username;

                    registration.RequiredSigners.Clear();

                    isCommitRequired = true;
                }
            }
            else if (!registration.RequiredSigners.Contains(signer))
            {
                previousRequiredSigner = registration.RequiredSigners.FirstOrDefault()?.Username;

                registration.RequiredSigners.Clear();

                isCommitRequired = true;

                registration.RequiredSigners.Add(signer);

                newRequiredSigner = signer.Username;
            }

            if (isCommitRequired)
            {
                if (commitChanges)
                {
                    await _packageRegistrationRepository.CommitChangesAsync();
                }

                var auditRecord = PackageRegistrationAuditRecord.CreateForSetRequiredSigner(
                    registration,
                    previousRequiredSigner,
                    newRequiredSigner);

                await _auditingService.SaveAuditRecordAsync(auditRecord);

                _telemetryService.TrackRequiredSignerSet(registration.Id);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Asynchronously sets the signer as the required signer on all package registrations owned by the signer.
        /// </summary>
        /// <param name="signer">A user.</param>
        /// <returns>A task that represents the asynchronous operation.</returns>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="signer" /> is <c>null</c>.</exception>
        public async Task SetRequiredSignerAsync(User signer)
        {
            if (signer == null)
            {
                throw new ArgumentNullException(nameof(signer));
            }

            var registrations    = FindPackageRegistrationsByOwner(signer);
            var auditRecords     = new List <PackageRegistrationAuditRecord>();
            var packageIds       = new List <string>();
            var isCommitRequired = false;

            foreach (var registration in registrations)
            {
                string previousRequiredSigner = null;
                string newRequiredSigner      = null;

                if (!registration.RequiredSigners.Contains(signer))
                {
                    previousRequiredSigner = registration.RequiredSigners.FirstOrDefault()?.Username;

                    registration.RequiredSigners.Clear();

                    isCommitRequired = true;

                    registration.RequiredSigners.Add(signer);

                    newRequiredSigner = signer.Username;

                    var auditRecord = PackageRegistrationAuditRecord.CreateForSetRequiredSigner(
                        registration,
                        previousRequiredSigner,
                        newRequiredSigner);

                    auditRecords.Add(auditRecord);
                    packageIds.Add(registration.Id);
                }
            }

            if (isCommitRequired)
            {
                await _packageRegistrationRepository.CommitChangesAsync();

                foreach (var auditRecord in auditRecords)
                {
                    await _auditingService.SaveAuditRecordAsync(auditRecord);
                }

                foreach (var packageId in packageIds)
                {
                    _telemetryService.TrackRequiredSignerSet(packageId);
                }
            }
        }
Exemplo n.º 3
0
        private async Task DeleteRegistration(SqlConnection conn)
        {
            // Capture the data from the database
            var registrationRecord = await conn.QueryDatatable(
                "SELECT * FROM PackageRegistrations WHERE id = @Id",
                new SqlParameter("@Id", Id));

            // Create a delete audit record
            var auditRecord = new PackageRegistrationAuditRecord(
                Id,
                registrationRecord,
                PackageRegistrationAuditAction.Deleted,
                Reason);

            await Console.WriteInfoLine(Strings.Package_DeleteCommand_WritingRegistrationAuditRecord, auditRecord.GetPath());

            if (!WhatIf)
            {
                await auditRecord.WriteAuditRecord("packageregistrations", StorageAccount);
            }

            // Delete all data
            var result = conn.Query(@"
                BEGIN TRAN

                DECLARE @actions TABLE(
                    TableName nvarchar(50),
                    Value nvarchar(MAX)
                )

                DELETE por 
                OUTPUT 'PackageOwnerRequests' AS TableName, u.Username AS Value INTO @actions
                FROM PackageOwnerRequests por 
                JOIN PackageRegistrations pr ON pr.[Key] = por.PackageRegistrationKey 
                JOIN Users u ON por.NewOwnerKey = u.[Key]
                WHERE pr.Id = @Id

                DELETE por 
                OUTPUT 'PackageRegistrationOwners' AS TableName, u.Username AS Value INTO @actions
                FROM PackageRegistrationOwners por 
                JOIN PackageRegistrations pr ON pr.[Key] = por.PackageRegistrationKey 
                JOIN Users u ON por.UserKey = u.[Key]
                WHERE pr.Id = @Id

                DELETE pr 
                OUTPUT 'PackageRegistrations' AS TableName, deleted.Id AS Value INTO @actions
                FROM PackageRegistrations pr 
                WHERE pr.Id = @Id

                SELECT * FROM @actions
                " + (WhatIf ? "ROLLBACK TRAN" : "COMMIT TRAN"), new
            {
                Id = Id
            });
            await Console.WriteInfoLine(Strings.Package_DeleteCommand_DatabaseActions);

            await Console.WriteTable(result, d => new
            {
                Action = "DELETE",
                Table  = (string)d.TableName,
                Value  = (string)d.Value
            });
        }
Exemplo n.º 4
0
        private async Task DeleteRegistration(SqlConnection conn)
        {
            // Capture the data from the database
            var registrationRecord = await conn.QueryDatatable(
                "SELECT * FROM PackageRegistrations WHERE id = @Id",
                new SqlParameter("@Id", Id));

            // Create a delete audit record
            var auditRecord = new PackageRegistrationAuditRecord(
                Id,
                registrationRecord,
                PackageRegistrationAuditAction.Deleted,
                Reason);

            await Console.WriteInfoLine(Strings.Package_DeleteCommand_WritingRegistrationAuditRecord, auditRecord.GetPath());
            if (!WhatIf)
            {
                await auditRecord.WriteAuditRecord("packageregistrations", StorageAccount);
            }

            // Delete all data
            var result = conn.Query(@"
                BEGIN TRAN

                DECLARE @actions TABLE(
                    TableName nvarchar(50),
                    Value nvarchar(MAX)
                )

                DELETE por 
                OUTPUT 'PackageOwnerRequests' AS TableName, u.Username AS Value INTO @actions
                FROM PackageOwnerRequests por 
                JOIN PackageRegistrations pr ON pr.[Key] = por.PackageRegistrationKey 
                JOIN Users u ON por.NewOwnerKey = u.[Key]
                WHERE pr.Id = @Id

                DELETE por 
                OUTPUT 'PackageRegistrationOwners' AS TableName, u.Username AS Value INTO @actions
                FROM PackageRegistrationOwners por 
                JOIN PackageRegistrations pr ON pr.[Key] = por.PackageRegistrationKey 
                JOIN Users u ON por.UserKey = u.[Key]
                WHERE pr.Id = @Id

                DELETE pr 
                OUTPUT 'PackageRegistrations' AS TableName, deleted.Id AS Value INTO @actions
                FROM PackageRegistrations pr 
                WHERE pr.Id = @Id

                SELECT * FROM @actions
                " + (WhatIf ? "ROLLBACK TRAN" : "COMMIT TRAN"), new
                {
                    Id = Id
                });
            await Console.WriteInfoLine(Strings.Package_DeleteCommand_DatabaseActions);
            await Console.WriteTable(result, d => new
            {
                Action = "DELETE",
                Table = (string)d.TableName,
                Value = (string)d.Value
            });
        }