/// <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); } }
/// <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); } } }
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 }); }