Blame lang/python/examples/howto/pmkey-import.py

Packit Service 30b792
#!/usr/bin/env python3
Packit Service 30b792
# -*- coding: utf-8 -*-
Packit Service 30b792
Packit Service 30b792
from __future__ import absolute_import, division, unicode_literals
Packit Service 30b792
Packit Service 30b792
import gpg
Packit Service 30b792
import requests
Packit Service 30b792
import sys
Packit Service 30b792
Packit Service 30b792
del absolute_import, division, unicode_literals
Packit Service 30b792
Packit Service 30b792
# Copyright (C) 2018 Ben McGinnes <ben@gnupg.org>
Packit Service 30b792
#
Packit Service 30b792
# This program is free software; you can redistribute it and/or modify it under
Packit Service 30b792
# the terms of the GNU General Public License as published by the Free Software
Packit Service 30b792
# Foundation; either version 2 of the License, or (at your option) any later
Packit Service 30b792
# version.
Packit Service 30b792
#
Packit Service 30b792
# This program is free software; you can redistribute it and/or modify it under
Packit Service 30b792
# the terms of the GNU Lesser General Public License as published by the Free
Packit Service 30b792
# Software Foundation; either version 2.1 of the License, or (at your option)
Packit Service 30b792
# any later version.
Packit Service 30b792
#
Packit Service 30b792
# This program is distributed in the hope that it will be useful, but WITHOUT
Packit Service 30b792
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
Packit Service 30b792
# FOR A PARTICULAR PURPOSE.  See the GNU General Public License and the GNU
Packit Service 30b792
# Lesser General Public License for more details.
Packit Service 30b792
#
Packit Service 30b792
# You should have received a copy of the GNU General Public License and the GNU
Packit Service 30b792
# Lesser General Public along with this program; if not, see
Packit Service 30b792
# <https://www.gnu.org/licenses/>.
Packit Service 30b792
Packit Service 30b792
print("""
Packit Service 30b792
This script searches the ProtonMail key server for the specified key and
Packit Service 30b792
imports it.
Packit Service 30b792
Packit Service 30b792
Usage:  pmkey-import.py [search string]
Packit Service 30b792
""")
Packit Service 30b792
Packit Service 30b792
c = gpg.Context(armor=True)
Packit Service 30b792
url = "https://api.protonmail.ch/pks/lookup"
Packit Service 30b792
ksearch = []
Packit Service 30b792
Packit Service 30b792
if len(sys.argv) >= 2:
Packit Service 30b792
    keyterm = sys.argv[1]
Packit Service 30b792
else:
Packit Service 30b792
    keyterm = input("Enter the key ID, UID or search string: ")
Packit Service 30b792
Packit Service 30b792
if keyterm.count("@") == 2 and keyterm.startswith("@") is True:
Packit Service 30b792
    ksearch.append(keyterm[1:])
Packit Service 30b792
    ksearch.append(keyterm[1:])
Packit Service 30b792
    ksearch.append(keyterm[1:])
Packit Service 30b792
elif keyterm.count("@") == 1 and keyterm.startswith("@") is True:
Packit Service 30b792
    ksearch.append("{0}@protonmail.com".format(keyterm[1:]))
Packit Service 30b792
    ksearch.append("{0}@protonmail.ch".format(keyterm[1:]))
Packit Service 30b792
    ksearch.append("{0}@pm.me".format(keyterm[1:]))
Packit Service 30b792
elif keyterm.count("@") == 0:
Packit Service 30b792
    ksearch.append("{0}@protonmail.com".format(keyterm))
Packit Service 30b792
    ksearch.append("{0}@protonmail.ch".format(keyterm))
Packit Service 30b792
    ksearch.append("{0}@pm.me".format(keyterm))
Packit Service 30b792
elif keyterm.count("@") == 2 and keyterm.startswith("@") is False:
Packit Service 30b792
    uidlist = keyterm.split("@")
Packit Service 30b792
    for uid in uidlist:
Packit Service 30b792
        ksearch.append("{0}@protonmail.com".format(uid))
Packit Service 30b792
        ksearch.append("{0}@protonmail.ch".format(uid))
Packit Service 30b792
        ksearch.append("{0}@pm.me".format(uid))
Packit Service 30b792
elif keyterm.count("@") > 2:
Packit Service 30b792
    uidlist = keyterm.split("@")
Packit Service 30b792
    for uid in uidlist:
Packit Service 30b792
        ksearch.append("{0}@protonmail.com".format(uid))
Packit Service 30b792
        ksearch.append("{0}@protonmail.ch".format(uid))
Packit Service 30b792
        ksearch.append("{0}@pm.me".format(uid))
Packit Service 30b792
else:
Packit Service 30b792
    ksearch.append(keyterm)
Packit Service 30b792
Packit Service 30b792
for k in ksearch:
Packit Service 30b792
    payload = {"op": "get", "search": k}
Packit Service 30b792
    try:
Packit Service 30b792
        r = requests.get(url, verify=True, params=payload)
Packit Service 30b792
        if r.ok is True:
Packit Service 30b792
            result = c.key_import(r.content)
Packit Service 30b792
        elif r.ok is False:
Packit Service 30b792
            result = r.content
Packit Service 30b792
    except Exception as e:
Packit Service 30b792
        result = None
Packit Service 30b792
Packit Service 30b792
    if result is not None and hasattr(result, "considered") is False:
Packit Service 30b792
        print("{0} for {1}".format(result.decode(), k))
Packit Service 30b792
    elif result is not None and hasattr(result, "considered") is True:
Packit Service 30b792
        num_keys = len(result.imports)
Packit Service 30b792
        new_revs = result.new_revocations
Packit Service 30b792
        new_sigs = result.new_signatures
Packit Service 30b792
        new_subs = result.new_sub_keys
Packit Service 30b792
        new_uids = result.new_user_ids
Packit Service 30b792
        new_scrt = result.secret_imported
Packit Service 30b792
        nochange = result.unchanged
Packit Service 30b792
Packit Service 30b792
        def knom():
Packit Service 30b792
            for ki in result.imports:
Packit Service 30b792
                for ku in c.get_key(ki.fpr).uids:
Packit Service 30b792
                    return ku.uid
Packit Service 30b792
Packit Service 30b792
        print("""
Packit Service 30b792
The total number of keys considered for import was:  {0}
Packit Service 30b792
Packit Service 30b792
With UIDs wholely or partially matching the following string:
Packit Service 30b792
Packit Service 30b792
        {1}
Packit Service 30b792
Packit Service 30b792
   Number of keys revoked:  {2}
Packit Service 30b792
 Number of new signatures:  {3}
Packit Service 30b792
    Number of new subkeys:  {4}
Packit Service 30b792
   Number of new user IDs:  {5}
Packit Service 30b792
Number of new secret keys:  {6}
Packit Service 30b792
 Number of unchanged keys:  {7}
Packit Service 30b792
Packit Service 30b792
The key IDs for all considered keys were:
Packit Service 30b792
""".format(num_keys, knom(), new_revs, new_sigs, new_subs, new_uids, new_scrt,
Packit Service 30b792
           nochange))
Packit Service 30b792
        for i in range(num_keys):
Packit Service 30b792
            print(result.imports[i].fpr)
Packit Service 30b792
        print("")
Packit Service 30b792
    elif result is None:
Packit Service 30b792
        print(e)