private async Task DeletePackage(dynamic package, SqlConnection conn) { // Capture the data from the database var packageRecord = await conn.QueryDatatable( "SELECT * FROM Packages WHERE [Key] = @key", new SqlParameter("@key", package.Key)); var registrationRecord = await conn.QueryDatatable( "SELECT * FROM PackageRegistrations WHERE [Key] = @key", new SqlParameter("@key", package.PackageRegistrationKey)); // Create a delete audit record var auditRecord = new PackageAuditRecord( package.Id, package.Version, package.Hash, packageRecord, registrationRecord, PackageAuditAction.Deleted, Reason); await Console.WriteInfoLine(Strings.Package_DeleteCommand_WritingAuditRecord, auditRecord.GetPath()); if (!WhatIf) { await auditRecord.WriteAuditRecord("package", StorageAccount); } await DeletePackageData(package, conn); await DeletePackageBlob(package); await Console.WriteInfoLine(Strings.Package_DeleteCommand_DeletionCompleted); }
public async Task ReflowHardDeletedPackageAsync(string id, string version) { if (string.IsNullOrEmpty(id)) { throw new UserSafeException("Must supply an ID for the hard-deleted package to reflow."); } if (string.IsNullOrEmpty(version)) { throw new UserSafeException("Must supply a version for the hard-deleted package to reflow."); } var normalizedId = id.ToLowerInvariant(); if (!NuGetVersion.TryParse(version, out var normalizedVersion)) { throw new UserSafeException($"{version} is not a valid version string!"); } var normalizedVersionString = normalizedVersion.ToNormalizedString(); var existingPackageRegistration = _packageRegistrationRepository.GetAll() .SingleOrDefault(p => p.Id == normalizedId); if (existingPackageRegistration != null) { var existingPackage = _packageRepository.GetAll() .Where(p => p.PackageRegistrationKey == existingPackageRegistration.Key) .SingleOrDefault(p => p.NormalizedVersion == normalizedVersionString); if (existingPackage != null) { throw new UserSafeException($"The package {id} {normalizedVersion} exists! You can only reflow hard-deleted packages that do not exist."); } } var auditRecord = new PackageAuditRecord( normalizedId, normalizedVersionString, hash: string.Empty, packageRecord: null, registrationRecord: null, deprecationRecord: null, action: AuditedPackageAction.Delete, reason: "reflow hard-deleted package"); await _auditingService.SaveAuditRecordAsync(auditRecord); _telemetryService.TrackPackageHardDeleteReflow(normalizedId, normalizedVersionString); }
public override void ExecuteCommand() { using (var sqlConnection = new SqlConnection(ConnectionString.ConnectionString)) using (var dbExecutor = new SqlExecutor(sqlConnection)) { sqlConnection.Open(); var package = Util.GetPackage( dbExecutor, PackageId, PackageVersion); // Multiple queries? Yes. Do I care? No. var packageRecord = new DataTable(); using (SqlCommand cmd = sqlConnection.CreateCommand()) { cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM Packages WHERE [Key] = @key"; cmd.Parameters.AddWithValue("@key", package.Key); var result = cmd.ExecuteReader(); packageRecord.Load(result); } var registrationRecord = new DataTable(); using (SqlCommand cmd = sqlConnection.CreateCommand()) { cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM PackageRegistrations WHERE [ID] = @id"; cmd.Parameters.AddWithValue("@id", package.Id); var result = cmd.ExecuteReader(); registrationRecord.Load(result); } // Write a delete audit record var auditRecord = new PackageAuditRecord( package.Id, package.Version, package.Hash, packageRecord, registrationRecord, PackageAuditAction.Deleted, Reason); if (WhatIf) { Log.Info("Would Write Audit Record to " + auditRecord.GetPath()); } else { Log.Info("Writing Audit Record"); var uri = Util.SaveAuditRecord(BackupStorage, auditRecord).Result; Log.Info("Successfully wrote audit record to: " + uri.AbsoluteUri); } if (package == null) { Log.Error("Package version does not exist: '{0}.{1}'", PackageId, PackageVersion); return; } if (!AuditOnly) { Log.Info( "Deleting package data for '{0}.{1}'", package.Id, package.Version); if (!WhatIf && !AuditOnly) { dbExecutor.Execute( "DELETE pa FROM PackageAuthors pa JOIN Packages p ON p.[Key] = pa.PackageKey WHERE p.[Key] = @key", new { key = package.Key }); dbExecutor.Execute( "DELETE pd FROM PackageDependencies pd JOIN Packages p ON p.[Key] = pd.PackageKey WHERE p.[Key] = @key", new { key = package.Key }); dbExecutor.Execute( "DELETE pf FROM PackageFrameworks pf JOIN Packages p ON p.[Key] = pf.Package_Key WHERE p.[Key] = @key", new { key = package.Key }); dbExecutor.Execute( "DELETE p FROM Packages p JOIN PackageRegistrations pr ON pr.[Key] = p.PackageRegistrationKey WHERE p.[Key] = @key", new { key = package.Key }); } new DeletePackageFileTask { BackupStorage = BackupStorage, StorageAccount = StorageAccount, PackageId = package.Id, PackageVersion = package.NormalizedVersion, PackageHash = package.Hash, WhatIf = WhatIf }.ExecuteCommand(); } else { Log.Info("Only wrote audit record. Package was NOT deleted."); } } }
protected override PackageAuditRecord CreateAuditRecord(Package package, PackageRegistration packageRegistration, AuditedPackageAction action, string reason) { LastAuditRecord = base.CreateAuditRecord(package, packageRegistration, action, reason); return(LastAuditRecord); }
protected override PackageAuditRecord CreateAuditRecord(Package package, PackageRegistration packageRegistration, AuditedPackageAction action, string reason) { LastAuditRecord = base.CreateAuditRecord(package, packageRegistration, action, reason); return LastAuditRecord; }
public override void ExecuteCommand() { using (var sqlConnection = new SqlConnection(ConnectionString.ConnectionString)) using (var dbExecutor = new SqlExecutor(sqlConnection)) { sqlConnection.Open(); var package = Util.GetPackage( dbExecutor, PackageId, PackageVersion); // Multiple queries? Yes. Do I care? No. var packageRecord = new DataTable(); using (SqlCommand cmd = sqlConnection.CreateCommand()) { cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM Packages WHERE [Key] = @key"; cmd.Parameters.AddWithValue("@key", package.Key); var result = cmd.ExecuteReader(); packageRecord.Load(result); } var registrationRecord = new DataTable(); using (SqlCommand cmd = sqlConnection.CreateCommand()) { cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM PackageRegistrations WHERE [ID] = @id"; cmd.Parameters.AddWithValue("@id", package.Id); var result = cmd.ExecuteReader(); registrationRecord.Load(result); } // Write a delete audit record var auditRecord = new PackageAuditRecord( package, packageRecord, registrationRecord, PackageAuditAction.Deleted, Reason, AuditEnvironment.GetCurrent()); string recordName = Util.GetPackageAuditBlobName(package.Id, package.Version, PackageAuditAction.Deleted); if (WhatIf) { var record = Util.RenderAuditRecord(auditRecord); Log.Info("Would Write Audit Record to " + recordName); Log.Info(record); } else { Log.Info("Writing Audit Record"); Util.SaveAuditRecord(BackupStorage, recordName, auditRecord); Log.Info("Successfully wrote audit record to: auditing/" + recordName); } if (package == null) { Log.Error("Package version does not exist: '{0}.{1}'", PackageId, PackageVersion); return; } if (!AuditOnly) { Log.Info( "Deleting package data for '{0}.{1}'", package.Id, package.Version); if (!WhatIf && !AuditOnly) { dbExecutor.Execute( "DELETE pa FROM PackageAuthors pa JOIN Packages p ON p.[Key] = pa.PackageKey WHERE p.[Key] = @key", new { key = package.Key }); dbExecutor.Execute( "DELETE pd FROM PackageDependencies pd JOIN Packages p ON p.[Key] = pd.PackageKey WHERE p.[Key] = @key", new { key = package.Key }); dbExecutor.Execute( "DELETE ps FROM PackageStatistics ps JOIN Packages p ON p.[Key] = ps.PackageKey WHERE p.[Key] = @key", new { key = package.Key }); dbExecutor.Execute( "DELETE pf FROM PackageFrameworks pf JOIN Packages p ON p.[Key] = pf.Package_Key WHERE p.[Key] = @key", new { key = package.Key }); dbExecutor.Execute( "DELETE p FROM Packages p JOIN PackageRegistrations pr ON pr.[Key] = p.PackageRegistrationKey WHERE p.[Key] = @key", new { key = package.Key }); } new DeletePackageFileTask { BackupStorage = BackupStorage, StorageAccount = StorageAccount, PackageId = package.Id, PackageVersion = package.Version, PackageHash = package.Hash, WhatIf = WhatIf }.ExecuteCommand(); } else { Log.Info("Only wrote audit record. Package was NOT deleted."); } } }