Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
language: python
python: 2.7
python: 3.9

sudo: required

Expand Down
11 changes: 6 additions & 5 deletions keyctl/key.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@

# -*- coding: utf-8 -*-

from keyctlwrapper import KeyctlWrapper
from typing import List
from .keyctlwrapper import KeyctlWrapper


# -------------------------------------------------------------------
Expand All @@ -22,7 +23,7 @@ def __init__(self, keyid=None, keyring=None, keytype=None):
# ---------------------------------------------------------------

@staticmethod
def _init_keyctl(keyring=None, keytype=None):
def _init_keyctl(keyring=None, keytype=None) -> KeyctlWrapper:
if keyring is not None and keytype is not None:
keyctl = KeyctlWrapper(keyring=keyring, keytype=keytype)
elif keyring is not None:
Expand All @@ -45,7 +46,7 @@ def _load_key(self, keyid):
# ---------------------------------------------------------------

@classmethod
def list(cls, keyring=None, keytype=None):
def list(cls, keyring=None, keytype=None) -> List["Key"]:
keyctl = cls._init_keyctl(keyring, keytype)
keyids = keyctl.get_all_key_ids()

Expand All @@ -59,7 +60,7 @@ def list(cls, keyring=None, keytype=None):
# ---------------------------------------------------------------

@classmethod
def search(cls, name, keyring=None, keytype=None):
def search(cls, name, keyring=None, keytype=None) -> "Key":
key = cls(keyring, keytype)

key.id = key._keyctl.get_id_from_name(name)
Expand All @@ -72,7 +73,7 @@ def search(cls, name, keyring=None, keytype=None):
# ---------------------------------------------------------------

@classmethod
def add(cls, name, data, keyring=None, keytype=None):
def add(cls, name, data, keyring=None, keytype=None) -> "Key":
keyctl = cls._init_keyctl(keyring, keytype)

keyid = keyctl.add_key(name, data)
Expand Down
25 changes: 14 additions & 11 deletions keyctl/keyctlwrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
# -*- coding: utf-8 -*-

import subprocess
from typing import List


# -------------------------------------------------------------------
Expand Down Expand Up @@ -50,21 +51,23 @@ class KeyctlWrapper(object):
default_keyring = '@u'
default_keytype = 'user'

def __init__(self, keyring=default_keyring, keytype=default_keytype):
def __init__(self, keyring: str=default_keyring, keytype: str=default_keytype):
self.keyring = keyring
self.keytype = keytype

# ---------------------------------------------------------------

@staticmethod
def _system(args, data=None, check=True):
def _system(args, data: str=None, check=True):

try:
p = subprocess.Popen(
args,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE,
bufsize=4096
bufsize=4096,
text=True,
)
except OSError as e:
raise OSError('Command \'{}\' execution failed. ErrMsg:{}'.format(' '.join(args), e))
Expand All @@ -78,22 +81,22 @@ def _system(args, data=None, check=True):

if not check:
return ret, out, err
elif ret is 0:
elif ret == 0:
return out
else:
raise KeyctlOperationError(errmsg='({}){} {}'.format(ret, err, out))

# ---------------------------------------------------------------

def get_all_key_ids(self):
def get_all_key_ids(self) -> List[int]:
out = self._system(['keyctl', 'rlist', self.keyring])
l = out.split()
l = [int(x) for x in l]
return l

# ---------------------------------------------------------------

def get_id_from_name(self, name):
def get_id_from_name(self, name: str) -> int:
# ret, out, err = self._system(['keyctl', 'request', self.keytype, name], check=False)
ret, out, err = self._system(['keyctl', 'search', self.keyring, self.keytype, name], check=False)

Expand All @@ -106,7 +109,7 @@ def get_id_from_name(self, name):

# ---------------------------------------------------------------

def get_name_from_id(self, keyid):
def get_name_from_id(self, keyid: int) -> str:
ret, out, err = self._system(['keyctl', 'rdescribe', str(keyid)], check=False)

if ret != 0:
Expand All @@ -118,7 +121,7 @@ def get_name_from_id(self, keyid):

# ---------------------------------------------------------------

def get_data_from_id(self, keyid, mode='raw'):
def get_data_from_id(self, keyid: int, mode='raw'):
if mode.lower() == 'raw':
kmode = 'pipe'
elif mode.lower() == 'hex':
Expand All @@ -141,7 +144,7 @@ def get_data_from_id(self, keyid, mode='raw'):

# ---------------------------------------------------------------

def add_key(self, name, data):
def add_key(self, name: str, data) -> int:
try:
keyid = self.get_id_from_name(name)
raise KeyAlreadyExistError(keyid=keyid, keyname=name)
Expand All @@ -155,7 +158,7 @@ def add_key(self, name, data):

# ---------------------------------------------------------------

def update_key(self, keyid, data):
def update_key(self, keyid: int, data):
ret, out, err = self._system(['keyctl', 'pupdate', str(keyid)], data, check=False)

if ret == 1:
Expand All @@ -165,7 +168,7 @@ def update_key(self, keyid, data):

# ---------------------------------------------------------------

def remove_key(self, keyid):
def remove_key(self, keyid: int):
# revoke first, because unlinking is slow
ret, out, err = self._system(['keyctl', 'revoke', str(keyid)], check=False)
if ret == 1:
Expand Down
4 changes: 2 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
readme = readme.replace('\r', '')
except ImportError:
readme = 'see README.md'
print 'NO README CREATED'
print('NO README CREATED')


setup(
Expand All @@ -40,7 +40,7 @@
'Intended Audience :: Developers',
'License :: OSI Approved :: GNU General Public License v3 (GPLv3)',
'Programming Language :: Python',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3.9',
'Environment :: X11 Applications :: Qt',
'Topic :: Utilities',
]
Expand Down
2 changes: 1 addition & 1 deletion tests/test_keyctlwrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ def test_get_data_from_id(self, empty_keyring):

# hex mode
data = keyctl.get_data_from_id(keyid, 'hEx')
assert data == content.encode('hex')
assert data == content.encode("utf8").hex()

# ---------------------------------------------------------------

Expand Down