Created
October 26, 2015 18:32
-
-
Save eliasdorneles/fcd0a218a549079f537f to your computer and use it in GitHub Desktop.
Script to encrypt password for Travis
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
"""Script to encrypt a string for Travis config file | |
""" | |
from __future__ import print_function | |
import base64 | |
import json | |
from getpass import getpass | |
from cryptography.hazmat.primitives.serialization import load_pem_public_key | |
from cryptography.hazmat.backends import default_backend | |
from cryptography.hazmat.primitives.asymmetric.padding import PKCS1v15 | |
try: | |
from urllib import urlopen | |
except: | |
from urllib.request import urlopen | |
def load_key(pubkey): | |
"""Load public RSA key, with work-around for keys using | |
incorrect header/footer format. | |
Read more about RSA encryption with cryptography: | |
https://cryptography.io/latest/hazmat/primitives/asymmetric/rsa/ | |
""" | |
try: | |
return load_pem_public_key(pubkey.encode(), default_backend()) | |
except ValueError: | |
# workaround for https://github.com/travis-ci/travis-api/issues/196 | |
pubkey = pubkey.replace('BEGIN RSA', 'BEGIN').replace('END RSA', 'END') | |
return load_pem_public_key(pubkey.encode(), default_backend()) | |
def encrypt(pubkey, password): | |
"""Encrypt password using given RSA public key and encode it with base64. | |
The encrypted password can only be decrypted by someone with the | |
private key (in this case, only Travis). | |
""" | |
key = load_key(pubkey) | |
encrypted_password = key.encrypt(password, PKCS1v15()) | |
return base64.b64encode(encrypted_password) | |
def fetch_public_key(repo): | |
"""Download RSA public key Travis will use for this repo. | |
Travis API docs: http://docs.travis-ci.com/api/#repository-keys | |
""" | |
keyurl = 'https://api.travis-ci.org/repos/{0}/key'.format(repo) | |
data = json.loads(urlopen(keyurl).read()) | |
if 'key' not in data: | |
errmsg = "Could not find public key for repo: {}.\n".format(repo) | |
errmsg += "Have you already added your GitHub repo to Travis?" | |
raise ValueError(errmsg) | |
return data['key'] | |
def prepend_line(filepath, line): | |
"""Rewrite a file adding a line to its beginning. | |
""" | |
with open(filepath) as f: | |
lines = f.readlines() | |
lines.insert(0, line) | |
with open(filepath, 'w') as f: | |
f.writelines(lines) | |
def main(args): | |
public_key = fetch_public_key(args.repo) | |
password = getpass('PyPI password: ') | |
print(encrypt(public_key, password)) | |
if '__main__' == __name__: | |
import argparse | |
parser = argparse.ArgumentParser(description=__doc__) | |
parser.add_argument('repo', help='GitHub repo') | |
args = parser.parse_args() | |
main(args) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment