# Module `onionr.keymanager`

Onionr - Private P2P Communication

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

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`
  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

    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)`
    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

    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

    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)