Skip to content

Commit

Permalink
馃悰 appkeys: fix key gen under Python 2
Browse files Browse the repository at this point in the history
And refactor key generation to be located in ONE central utility method
to avoid issues like that in the future.

Closes #3366
  • Loading branch information
foosel committed Dec 3, 2019
1 parent f2b2496 commit b57b7cb
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 7 deletions.
4 changes: 2 additions & 2 deletions src/octoprint/access/users.py
Expand Up @@ -21,7 +21,7 @@

from octoprint.settings import settings as s

from octoprint.util import atomic_write, to_bytes, deprecated, monotonic_time
from octoprint.util import atomic_write, to_bytes, deprecated, monotonic_time, generate_api_key
from octoprint.util import get_fully_qualified_classname as fqcn

from octoprint.access.permissions import Permissions, OctoPrintPermission
Expand Down Expand Up @@ -743,7 +743,7 @@ def generate_api_key(self, username):
raise UnknownUser(username)

user = self._users[username]
user._apikey = ''.join('%02X' % z for z in bytes(uuid.uuid4().bytes))
user._apikey = generate_api_key()
self._dirty = True
self._save()
return user._apikey
Expand Down
5 changes: 2 additions & 3 deletions src/octoprint/plugins/appkeys/__init__.py
Expand Up @@ -15,12 +15,11 @@
from octoprint.settings import valid_boolean_trues
from octoprint.server.util.flask import restricted_access, no_firstrun_access
from octoprint.server import NO_CONTENT, current_user, admin_permission
from octoprint.util import atomic_write, monotonic_time, ResettableTimer
from octoprint.util import atomic_write, monotonic_time, ResettableTimer, generate_api_key

from octoprint.access import ADMIN_GROUP
from octoprint.access.permissions import Permissions


CUTOFF_TIME = 10 * 60 # 10min
POLL_TIMEOUT = 5 # 5 seconds

Expand Down Expand Up @@ -399,7 +398,7 @@ def _all_api_keys(self):
return result

def _generate_key(self):
return ''.join('%02X' % z for z in bytes(uuid.uuid4().bytes))
return generate_api_key()

def _load_keys(self):
with self._keys_lock:
Expand Down
4 changes: 2 additions & 2 deletions src/octoprint/settings.py
Expand Up @@ -49,7 +49,7 @@
except ImportError:
from collections import KeysView

from octoprint.util import atomic_write, is_hidden_path, dict_merge, CaseInsensitiveSet
from octoprint.util import atomic_write, is_hidden_path, dict_merge, CaseInsensitiveSet, generate_api_key

_APPNAME = "OctoPrint"

Expand Down Expand Up @@ -1811,7 +1811,7 @@ def saveScript(self, script_type, name, script):
f.write(script)

def generateApiKey(self):
apikey = ''.join('%02X' % z for z in bytes(uuid.uuid4().bytes))
apikey = generate_api_key()
self.set(["api", "key"], apikey)
self.save(force=True)
return apikey
Expand Down
9 changes: 9 additions & 0 deletions src/octoprint/util/__init__.py
Expand Up @@ -33,6 +33,7 @@
except ImportError:
import Queue as queue

# noinspection PyCompatibility
from past.builtins import basestring, unicode

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -1834,3 +1835,11 @@ def decorator(*args, **kwargs):
logging.getLogger("octoprint.util.timing").debug("func:{} took {:0.2f}s".format(f.__name__,
end - start))
return decorator


def generate_api_key():
# noinspection PyCompatibility
from builtins import bytes
import uuid

return ''.join('%02X' % z for z in bytes(uuid.uuid4().bytes))

0 comments on commit b57b7cb

Please sign in to comment.