api.winget.pro
A Python implementation of a private winget repository server (/REST API).
Running locallly
Install a local SSL certificate
winget only allows https:// sources. This means that if we want to run
locally, then we need a self-signed SSL certificate for localhost.
localhost.pfx can be used for this purpose. It was
created from these instructions.
To install it, issue the following in a Powershell Admin prompt:
$password=ConvertTo-SecureString "12345" -asplaintext -force
Import-PfxCertificate -FilePath conf\localhost.pfx Cert:\LocalMachine\My -Password $password -Exportable
Import-Certificate -FilePath conf\localhost.cert -CertStoreLocation Cert:\CurrentUser\Root
To remove it later, run mmc, click File/Add or Remove Snap-in then
Certificates/Add/My User account then Finish and again for
Computer account. Then click OK. Then delete localhost expiring 2041 from
Current User/Personal, Current User/Trusted Root Certification Authorities,
and Local Computer/Personal.
Set up the development environment
pip install -Ur requirements/base-full.txt
Initialise the database
- Run
python manage.py migrate - Run
python manage.py createsuperuser - Run
python manage.py runserver - Log into
/adminand create a Tenant.
Run locally
python manage.py runserver
Then:
python sslproxy.py
Then you can add the REST source (note the httpS):
winget source add -n dev -a https://localhost:8443/ab... -t "Microsoft.Rest"
Here, ab... is the UUID of the Tenant.
Then you can perform queries against the new source. Eg.:
winget search "search term" -s dev
Sniffing Microsoft's implementation
Microsoft's implementation is the msstore source shown in
winget source list. Typically, it runs under:
https://storeedgefd.dsx.mp.microsoft.com/v9.0
To sniff it, the easiest way is to use a network inspection tool such as Fiddler
Classic. This however uses its own SSL certificate, which winget rejects. To
work around this, set the REG_DWORD registry value
HKLM\SOFTWARE\Policies\Microsoft\Windows\AppInstaller\EnableBypassCertificatePinningForMicrosoftStore
to 1.
Deploying
Upload install.sh and a .bashrc file with the settings below
to a Debian 11 server, then run install.sh as root.
# Email address of server administrator:
export ADMIN_EMAIL=michael.herrmann@omaha-consulting.com
# The domain under which this server runs:
export HOST_NAME=api.winget.pro
# A space-separated list of alternative host names:
export ALT_HOST_NAMES=
# The server that hosts this repository:
export GIT_SERVER=github.com
# The path on GIT_SERVER where this repository lies:
export GIT_REPO_NAME=omaha-consulting/api.winget.pro
# The branch of this repository that should be checked out:
export GIT_REPO_BRANCH=main
# The SSH public key for fetching this repository from GIT_SERVER:
export GIT_REPO_PUBKEY="ssh-rsa ... user@machine"
# The SSH private key for fetching this repository from GIT_SERVER.
# "\n"s separate lines:
export GIT_REPO_PRIVKEY="-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----"
# Emails to the admin will be sent via this account:
export SMTP_HOST=email-smtp.eu-central-1.amazonaws.com
export SMTP_USER=ABC123...
export SMTP_PASSWORD=aBc1234...
export SMTP_FROM=api.winget.pro@servers.omaha-consulting.com
# Django SECRET_KEY:
export SECRET_KEY=atLeast50RandomChars