Skip to content

Commit a88ec34

Browse files
committed
Admin tool to fix sha256 for a PackageVersion.
1 parent 4914f01 commit a88ec34

File tree

3 files changed

+44
-0
lines changed

3 files changed

+44
-0
lines changed

app/lib/admin/actions/actions.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import 'package_reservation_create.dart';
2727
import 'package_reservation_delete.dart';
2828
import 'package_reservation_list.dart';
2929
import 'package_version_delete.dart';
30+
import 'package_version_fix_sha256.dart';
3031
import 'package_version_info.dart';
3132
import 'package_version_retraction.dart';
3233
import 'publisher_create.dart';
@@ -116,6 +117,7 @@ final class AdminAction {
116117
packageReservationDelete,
117118
packageReservationList,
118119
packageVersionDelete,
120+
packageVersionFixSha256,
119121
packageVersionInfo,
120122
packageVersionRetraction,
121123
publisherCreate,

app/lib/package/tarball_storage.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'dart:io';
6+
import 'dart:typed_data';
67

78
import 'package:crypto/crypto.dart';
89
import 'package:gcloud/storage.dart';
910
import 'package:logging/logging.dart';
1011
import 'package:meta/meta.dart';
12+
import 'package:pub_dev/admin/actions/actions.dart';
1113
import 'package:pub_dev/package/api_export/exported_api.dart';
1214
import '../shared/datastore.dart';
1315
import '../shared/storage.dart';
@@ -317,6 +319,17 @@ class TarballStorage {
317319
archivesDeleted: deleteObjects.length,
318320
);
319321
}
322+
323+
/// Loads the bytes from the canonical archive for [package] [version].
324+
Future<Uint8List> getCanonicalArchiveBytes(
325+
String package, String version) async {
326+
final objectName = tarballObjectName(package, version);
327+
final info = await _canonicalBucket.tryInfo(objectName);
328+
if (info == null) {
329+
throw NotFoundException('Canonical archive not found.');
330+
}
331+
return await _canonicalBucket.readAsBytes(objectName);
332+
}
320333
}
321334

322335
class PublicBucketUpdateStat {

app/test/admin/package_version_actions_test.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:_pub_shared/data/admin_api.dart';
6+
import 'package:gcloud/db.dart';
67
import 'package:pub_dev/package/backend.dart';
78
import 'package:test/test.dart';
89

@@ -59,5 +60,33 @@ void main() {
5960
final newLatest = await packageBackend.getLatestVersion('oxygen');
6061
expect(newLatest != latest, isTrue);
6162
});
63+
64+
testWithProfile('package-version-fix-sha256', fn: () async {
65+
final latest = await packageBackend.getLatestVersion('oxygen');
66+
final oldPv =
67+
await packageBackend.lookupPackageVersion('oxygen', latest!);
68+
oldPv!.sha256 = [0, 1, 2];
69+
await dbService.commit(inserts: [oldPv]);
70+
71+
final api = createPubApiClient(authToken: siteAdminToken);
72+
final result = await api.adminInvokeAction(
73+
'package-version-fix-sha256',
74+
AdminInvokeActionArguments(arguments: {
75+
'package': 'oxygen',
76+
'version': latest,
77+
}),
78+
);
79+
80+
expect(result.output, {
81+
'package': 'oxygen',
82+
'version': latest,
83+
'before': {
84+
'sha256': '000102',
85+
},
86+
'after': {
87+
'sha256': hasLength(64),
88+
},
89+
});
90+
});
6291
});
6392
}

0 commit comments

Comments
 (0)