Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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.");
                }
            }
        }
Ejemplo n.º 4
0
 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;
 }
Ejemplo n.º 6
0
        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.");
                    }
                }
        }
Ejemplo n.º 7
0
        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);
        }