You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
3.1 KiB
Python

1 year ago
#!/usr/bin/env python3
import requests
import json
# https://www.npmjs.com/package/darcyclarke-manifest-pkg/v/2.1.15/index
1 year ago
# hex checksum = file name
1 year ago
# use hex to get *actual* manifest:
# https://www.npmjs.com/package/darcyclarke-manifest-pkg/file/a1c6250cb3f94bb3487c1bfb673d279642208b5db39a6c052a5c764f0d1abea5
def parse_manifest(pkg):
# get and parse the manifest which contains the values reported on the frontend
1 year ago
url = 'https://registry.npmjs.com/{}/'.format(pkg)
parsed = json.loads(requests.get(url).text)
1 year ago
# extract the interesting bits
1 year ago
latest_ver = parsed['dist-tags']['latest']
latest_manifest = parsed['versions'][latest_ver]
1 year ago
try:
1 year ago
dependencies = latest_manifest['dependencies']
1 year ago
except KeyError:
dependencies = None
try:
1 year ago
scripts = latest_manifest['scripts']
1 year ago
except KeyError:
scripts = None
1 year ago
name = latest_manifest['name']
1 year ago
return latest_ver, dependencies, scripts, name
1 year ago
1 year ago
def get_actual_manifest(pkg, ver):
# get and parse the manifest as it would be installed
1 year ago
# first, we need to find the package.json delivered with the package:
index_url = 'https://www.npmjs.com/package/{}/v/{}/index'.format(pkg, ver)
1 year ago
index = json.loads(requests.get(index_url).text)
hexsum = index['files']['/package.json']['hex']
manifest_url = 'https://www.npmjs.com/package/{}/file/{}'.format(pkg, hexsum)
1 year ago
# now we can parse it
1 year ago
manifest = json.loads(requests.get(manifest_url).text)
version = manifest['version']
1 year ago
try:
dependencies = manifest['dependencies']
except KeyError:
dependencies = None
try:
scripts = manifest['scripts']
except KeyError:
scripts = None
name = manifest['name']
return version, dependencies, scripts, name
1 year ago
def main():
import sys
mismatch = False
1 year ago
pkg = sys.argv[1]
reported_ver, reported_dependencies, reported_scripts, reported_name = parse_manifest(pkg)
actual_ver, actual_dependencies, actual_scripts, actual_name = get_actual_manifest(pkg, reported_ver)
if actual_ver != reported_ver:
mismatch = True
print('Version mismatch for {}!'.format(pkg))
print('Reported version: {}'.format(reported_ver))
print('Actual version: {}'.format(actual_ver))
1 year ago
if actual_dependencies != reported_dependencies:
mismatch = True
1 year ago
print('Dependency mismatch detected for {}!'.format(pkg))
print('Reported dependencies: {}'.format(reported_dependencies))
print('Actual dependencies: {}'.format(actual_dependencies))
if actual_scripts != reported_scripts:
mismatch = True
print('Scripts mismatch detected for {}!'.format(pkg))
print('Reported scripts: {}'.format(reported_scripts))
print('Actual scripts: {}'.format(actual_scripts))
1 year ago
if actual_name != reported_name:
mismatch = True
print('Name mismatch detected for {}!'.format(pkg))
print('Reported name: {}'.format(reported_name))
print('Actual name: {}'.format(actual_name))
if not mismatch:
print('No mismatch detected for {}.'.format(pkg))
else:
sys.exit(1)
1 year ago
if __name__ == '__main__':
main()