Module src.keymanager

Onionr - Private P2P Communication

Load, save, and delete the user's public key pairs (does not handle peer keys)

Expand source code
'''
    Onionr - Private P2P Communication

    Load, save, and delete the user's public key pairs (does not handle peer keys)
'''
'''
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
'''
from onionrutils import bytesconverter
from onionrcrypto import generate
import os
import filepaths

class KeyManager:
    def __init__(self):
        self.keyFile = filepaths.keys_file

    def addKey(self, pubKey=None, privKey=None):
        '''Add a new key pair, either specified or none to generate a new pair automatically'''
        if type(pubKey) is type(None) and type(privKey) is type(None):
            pubKey, privKey = generate.generate_pub_key()
        pubKey = bytesconverter.bytes_to_str(pubKey)
        privKey = bytesconverter.bytes_to_str(privKey)
        try:
            if pubKey in self.getPubkeyList():
                raise ValueError('Pubkey already in list: %s' % (pubKey,))
        except FileNotFoundError:
            pass

        with open(self.keyFile, "a") as keyFile:
            keyFile.write(pubKey + ',' + privKey + '\n')
        return (pubKey, privKey)

    def removeKey(self, pubKey):
        '''Remove a key pair by pubkey'''
        keyList = self.getPubkeyList()
        keyData = ''
        try:
            keyList.remove(pubKey)
        except ValueError:
            return False
        else:
            keyData = ','.join(keyList)
            with open(self.keyFile, "w") as keyFile:
                keyFile.write(keyData)

    def getPubkeyList(self):
        '''Return a list of the user's keys'''
        keyList = []
        try:
            with open(self.keyFile, "r") as keyFile:
                keyData = keyFile.read()
        except FileNotFoundError:
            keyData = ''
        keyData = keyData.split('\n')
        for pair in keyData:
            if len(pair) > 0: keyList.append(pair.split(',')[0])
        return keyList
    
    def getPrivkey(self, pubKey):
        privKey = None
        with open(self.keyFile, "r") as keyFile:
            keyData = keyFile.read()
        for pair in keyData.split('\n'):
            if pubKey in pair or pubKey.replace('=', '') in pair:
                privKey = pair.split(',')[1]
        return privKey

Classes

class KeyManager
Expand source code
class KeyManager:
    def __init__(self):
        self.keyFile = filepaths.keys_file

    def addKey(self, pubKey=None, privKey=None):
        '''Add a new key pair, either specified or none to generate a new pair automatically'''
        if type(pubKey) is type(None) and type(privKey) is type(None):
            pubKey, privKey = generate.generate_pub_key()
        pubKey = bytesconverter.bytes_to_str(pubKey)
        privKey = bytesconverter.bytes_to_str(privKey)
        try:
            if pubKey in self.getPubkeyList():
                raise ValueError('Pubkey already in list: %s' % (pubKey,))
        except FileNotFoundError:
            pass

        with open(self.keyFile, "a") as keyFile:
            keyFile.write(pubKey + ',' + privKey + '\n')
        return (pubKey, privKey)

    def removeKey(self, pubKey):
        '''Remove a key pair by pubkey'''
        keyList = self.getPubkeyList()
        keyData = ''
        try:
            keyList.remove(pubKey)
        except ValueError:
            return False
        else:
            keyData = ','.join(keyList)
            with open(self.keyFile, "w") as keyFile:
                keyFile.write(keyData)

    def getPubkeyList(self):
        '''Return a list of the user's keys'''
        keyList = []
        try:
            with open(self.keyFile, "r") as keyFile:
                keyData = keyFile.read()
        except FileNotFoundError:
            keyData = ''
        keyData = keyData.split('\n')
        for pair in keyData:
            if len(pair) > 0: keyList.append(pair.split(',')[0])
        return keyList
    
    def getPrivkey(self, pubKey):
        privKey = None
        with open(self.keyFile, "r") as keyFile:
            keyData = keyFile.read()
        for pair in keyData.split('\n'):
            if pubKey in pair or pubKey.replace('=', '') in pair:
                privKey = pair.split(',')[1]
        return privKey

Methods

def addKey(self, pubKey=None, privKey=None)

Add a new key pair, either specified or none to generate a new pair automatically

Expand source code
def addKey(self, pubKey=None, privKey=None):
    '''Add a new key pair, either specified or none to generate a new pair automatically'''
    if type(pubKey) is type(None) and type(privKey) is type(None):
        pubKey, privKey = generate.generate_pub_key()
    pubKey = bytesconverter.bytes_to_str(pubKey)
    privKey = bytesconverter.bytes_to_str(privKey)
    try:
        if pubKey in self.getPubkeyList():
            raise ValueError('Pubkey already in list: %s' % (pubKey,))
    except FileNotFoundError:
        pass

    with open(self.keyFile, "a") as keyFile:
        keyFile.write(pubKey + ',' + privKey + '\n')
    return (pubKey, privKey)
def getPrivkey(self, pubKey)
Expand source code
def getPrivkey(self, pubKey):
    privKey = None
    with open(self.keyFile, "r") as keyFile:
        keyData = keyFile.read()
    for pair in keyData.split('\n'):
        if pubKey in pair or pubKey.replace('=', '') in pair:
            privKey = pair.split(',')[1]
    return privKey
def getPubkeyList(self)

Return a list of the user's keys

Expand source code
def getPubkeyList(self):
    '''Return a list of the user's keys'''
    keyList = []
    try:
        with open(self.keyFile, "r") as keyFile:
            keyData = keyFile.read()
    except FileNotFoundError:
        keyData = ''
    keyData = keyData.split('\n')
    for pair in keyData:
        if len(pair) > 0: keyList.append(pair.split(',')[0])
    return keyList
def removeKey(self, pubKey)

Remove a key pair by pubkey

Expand source code
def removeKey(self, pubKey):
    '''Remove a key pair by pubkey'''
    keyList = self.getPubkeyList()
    keyData = ''
    try:
        keyList.remove(pubKey)
    except ValueError:
        return False
    else:
        keyData = ','.join(keyList)
        with open(self.keyFile, "w") as keyFile:
            keyFile.write(keyData)