Skip to content

Commit

Permalink
More on setup
Browse files Browse the repository at this point in the history
  • Loading branch information
simonlindholm committed Jun 14, 2020
1 parent 315f700 commit 6a3e41c
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 33 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ __pycache__/
!test/*.c
/nonmatchings
.vscode/
pah.conf
52 changes: 40 additions & 12 deletions src/net/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@
import random
import string
import sys
import time
from typing import List, Optional, Tuple

from nacl.encoding import HexEncoder
from nacl.exceptions import BadSignatureError
from nacl.public import PublicKey, SealedBox
from nacl.signing import SigningKey, VerifyKey

from .common import Config
from .common import Config, RawConfig, read_config, write_config


def random_name() -> str:
Expand Down Expand Up @@ -39,23 +40,27 @@ def ask(msg: str, *, default: bool) -> bool:
sys.exit(1)


def initial_setup() -> None:
signing_key: Optional[SigningKey] = None
# TODO: read from config
def _initial_setup(config: RawConfig) -> None:
print(
"Using permuter@home requires someone to give you access to a central -J server."
)
print()

signing_key: Optional[SigningKey] = config.signing_key
if not signing_key or not ask("Keep previous secret key", default=True):
# TODO: signature key
signing_key = SigningKey.generate()
# TODO: write to config
config.signing_key = signing_key
write_config(config)
verify_key = signing_key.verify_key

nickname: Optional[str] = None
# TODO: read from config
if not nickname or not ask(f"Keep previous nickname {nickname}", default=True):
nickname: Optional[str] = config.initial_setup_nickname
if not nickname or not ask(f"Keep previous nickname [{nickname}]", default=True):
default_nickname = os.environ.get("USER") or random_name()
nickname = (
input(f"Nickname [default: {default_nickname}]: ") or default_nickname
)
# TODO: write to config
config.initial_setup_nickname = nickname
write_config(config)

signed_nickname = signing_key.sign(nickname.encode("utf-8"))

Expand All @@ -72,11 +77,34 @@ def initial_setup() -> None:
data = SealedBox(signing_key.to_curve25519_private_key()).decrypt(token)
auth_verify_key = data[:32]
auth_server = data[32:].decode("utf-8")
print("Server URL:", auth_server)
print(f"Server URL: {auth_server}")
print("Testing connection...")
time.sleep(1)
# TODO: verify that contacting auth server works and signs its messages
# TODO: write to config
print("permuter@home successfully set up!")
config.auth_server = auth_server
write_config(config)
except Exception:
print("Invalid token!")
sys.exit(1)


def setup() -> Config:
raw_config = read_config()
if (
not raw_config.auth_verify_key
or not raw_config.signing_key
or not raw_config.auth_server
):
_initial_setup(raw_config)
assert (
raw_config.auth_verify_key and raw_config.signing_key and raw_config.auth_server
), "set by _initial_setup"
return Config(
auth_server=raw_config.auth_server,
auth_verify_key=raw_config.auth_verify_key,
signing_key=raw_config.signing_key,
)


def run_vouch(vouch_text: str) -> None:
Expand Down
34 changes: 24 additions & 10 deletions src/net/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,30 @@
from typing import Optional

from nacl.encoding import HexEncoder
from nacl.signing import SigningKey
from nacl.public import Box, PrivateKey, PublicKey, SealedBox, VerifyKey
from nacl.signing import SigningKey, VerifyKey
from nacl.public import Box, PrivateKey, PublicKey, SealedBox


CONFIG_FILENAME = "pah.conf"


@dataclass
class Config:
class RawConfig:
auth_server: Optional[str] = None
auth_verify_key: Optional[VerifyKey] = None
signing_key: Optional[SigningKey] = None
initial_setup_nickname: Optional[str] = None


def read_config() -> Config:
config = Config()
@dataclass
class Config:
auth_server: str
auth_verify_key: VerifyKey
signing_key: SigningKey


def read_config() -> RawConfig:
config = RawConfig()
try:
with open(CONFIG_FILENAME) as f:
obj = toml.load(f)
Expand All @@ -35,6 +42,9 @@ def read_config() -> Config:
temp = obj.get("initial_setup_nickname")
if isinstance(temp, str):
config.initial_setup_nickname = temp
temp = obj.get("initial_setup_nickname")
if isinstance(temp, str):
config.initial_setup_nickname = temp
except FileNotFoundError:
pass
except Exception as e:
Expand All @@ -43,14 +53,18 @@ def read_config() -> Config:
return config


def write_config(config: Config) -> None:
def write_config(config: RawConfig) -> None:
obj = {}
if config.initial_setup_nickname:
obj["initial_setup_nickname"] = config.initial_setup_nickname
if config.auth_verify_key:
obj["auth_public_key"] = config.auth_verify_key.encode(HexEncoder)
key_hex: bytes = config.auth_verify_key.encode(HexEncoder)
obj["auth_public_key"] = key_hex.decode("utf-8")
if config.signing_key:
obj["secret_key"] = config.signing_key.encode(HexEncoder)
key_hex: bytes = config.signing_key.encode(HexEncoder)
obj["secret_key"] = key_hex.decode("utf-8")
if config.initial_setup_nickname:
obj["initial_setup_nickname"] = config.initial_setup_nickname
if config.auth_server:
obj["auth_server"] = config.auth_server
with open(CONFIG_FILENAME, "w") as f:
toml.dump(obj, f)

Expand Down
9 changes: 3 additions & 6 deletions src/net/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,15 +91,12 @@ def _send_init(self, port: Port, options: ServerOptions) -> None:

def handle(self) -> None:
shared: SharedServerData = getattr(self.server, "shared")
config = shared.config
signing_key = config.signing_key
assert signing_key is not None, "checked on startup"
signing_key = shared.config.signing_key
client_ver_key, port = self._setup(signing_key)

auth_ver_key = config.auth_verify_key
assert auth_ver_key is not None, "checked on startup"
auth_ver_key = shared.config.auth_verify_key
nickname = self._confirm_grant(port, client_ver_key, auth_ver_key)
print(f"[nickname] connected")
print(f"[{nickname}] connected")

self._send_init(port, shared.options)
# TODO: do stuff!
Expand Down
7 changes: 2 additions & 5 deletions src/server_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,12 @@

import pystray

from .net.common import read_config
from .net.auth import setup
from .net.server import ServerOptions, start_server


def run(options: ServerOptions) -> None:
config = read_config()
if not config.auth_verify_key or not config.signing_key:
print("Running permuter@home requires access to a central -J server.")
exit(1)
config = setup()
server = start_server(config, options)

# TODO: print statistics, run systray, etc.
Expand Down

0 comments on commit 6a3e41c

Please sign in to comment.