This commit is contained in:
dece 2021-05-13 01:25:50 +02:00
parent 8b1561e689
commit f63d875fc3
7 changed files with 45 additions and 13 deletions

View file

@ -18,12 +18,21 @@ TODO DONE
open last download open last download
media files media files
identity management identity management
home page
logging logging
-------------------------------------------------------------------------------- home page
BACKLOG BACKLOG
--------------------------------------------------------------------------------
bug: can't input unicode
click on links to open them click on links to open them
download to disk, not in memory bug: can't reload bebop: pages
bug: exiting editor breaks curses
dumb rendering mode per site
disable cache per site
well, preferences per site maybe?
download without memory buffer
download in the background download in the background
download view instead of last download download view instead of last download
does encoding really work? cf. egsam does encoding really work? cf. egsam
@ -36,8 +45,6 @@ bug: combining chars reduce lengths
non shit command-line non shit command-line
response code 11 (if still there) response code 11 (if still there)
gopher? gopher?
save history opt. maintain history between sessions
history (forward) (useful?) history (forward) (useful?)
bug: can't reload bebop: pages search in page (ugh)
bug: can't input unicode
bug: astrobotany loops on /app

View file

@ -1,4 +1,5 @@
import argparse import argparse
import logging
from bebop.browser.browser import Browser from bebop.browser.browser import Browser
from bebop.config import load_config from bebop.config import load_config
@ -9,8 +10,18 @@ from bebop.tofu import get_cert_stash_path, load_cert_stash, save_cert_stash
def main(): def main():
argparser = argparse.ArgumentParser() argparser = argparse.ArgumentParser()
argparser.add_argument("url", nargs="?", default=None) argparser.add_argument("url", nargs="?", default=None)
argparser.add_argument("-d", "--debug", action="store_true")
args = argparser.parse_args() args = argparser.parse_args()
if args.debug:
logging.basicConfig(
filename="bebop.log",
level=logging.DEBUG,
format="%(asctime)s %(levelname)-8s %(message)s"
)
else:
logging.disable()
if args.url: if args.url:
start_url = args.url start_url = args.url
else: else:
@ -21,7 +32,7 @@ def main():
bebop_files_error = ensure_bebop_files_exist() bebop_files_error = ensure_bebop_files_exist()
if bebop_files_error: if bebop_files_error:
print("Bebop could not create local files:", bebop_files_error) logging.critical(f"Failed to create files: {bebop_files_error}")
return return
cert_stash_path = get_cert_stash_path() cert_stash_path = get_cert_stash_path()

View file

@ -3,12 +3,13 @@
import curses import curses
import curses.ascii import curses.ascii
import curses.textpad import curses.textpad
import logging
import os import os
import subprocess import subprocess
import tempfile import tempfile
from math import inf from math import inf
from pathlib import Path from pathlib import Path
from typing import Optional, Tuple from typing import Dict, Optional, Tuple
from bebop.bookmarks import ( from bebop.bookmarks import (
get_bookmarks_path, get_bookmarks_document, save_bookmark get_bookmarks_path, get_bookmarks_document, save_bookmark
@ -113,6 +114,7 @@ class Browser:
def run(self, *args, **kwargs): def run(self, *args, **kwargs):
"""Use curses' wrapper around _run.""" """Use curses' wrapper around _run."""
os.environ.setdefault("ESCDELAY", "25") os.environ.setdefault("ESCDELAY", "25")
logging.info("Cursing…")
curses.wrapper(self._run, *args, **kwargs) curses.wrapper(self._run, *args, **kwargs)
def _run(self, stdscr, start_url=None): def _run(self, stdscr, start_url=None):
@ -259,6 +261,7 @@ class Browser:
def refresh_status_line(self): def refresh_status_line(self):
"""Refresh status line contents.""" """Refresh status line contents."""
text, pair, attributes = self.status_data text, pair, attributes = self.status_data
logging.debug("Status: " + text)
text = text[:self.w - 1] text = text[:self.w - 1]
color = curses.color_pair(pair) color = curses.color_pair(pair)
self.status_line.addstr(0, 0, text, color | attributes) self.status_line.addstr(0, 0, text, color | attributes)

View file

@ -1,5 +1,6 @@
"""Gemini-related features of the browser.""" """Gemini-related features of the browser."""
import logging
from pathlib import Path from pathlib import Path
from typing import Optional from typing import Optional
@ -77,6 +78,10 @@ def open_gemini_url(
browser.set_status(url) browser.set_status(url)
return url return url
logging.info(
f"Request {url}"
+ (f" using cert and key {cert_and_key}" if cert_and_key else "")
)
req = Request(url, browser.stash, identity=cert_and_key) req = Request(url, browser.stash, identity=cert_and_key)
connect_timeout = browser.config["connect_timeout"] connect_timeout = browser.config["connect_timeout"]
connected = req.connect(connect_timeout) connected = req.connect(connect_timeout)
@ -151,6 +156,7 @@ def _handle_response(
Returns: Returns:
The final URL on success, None otherwise. The final URL on success, None otherwise.
""" """
logging.info(f"Response {response.code} {response.meta}")
if response.code == 20: if response.code == 20:
return _handle_successful_response(browser, response, url) return _handle_successful_response(browser, response, url)
elif response.generic_code == 30 and response.meta: elif response.generic_code == 30 and response.meta:

View file

@ -1,6 +1,7 @@
"""Config management.""" """Config management."""
import json import json
import logging
import os.path import os.path
@ -25,9 +26,9 @@ def load_config(config_path):
with open(config_path, "rt") as config_file: with open(config_path, "rt") as config_file:
config = json.load(config_file) config = json.load(config_file)
except OSError as exc: except OSError as exc:
print(f"Could not read config file {config_path}: {exc}") logging.error(f"Could not read config file {config_path}: {exc}")
except ValueError as exc: except ValueError as exc:
print(f"Could not parse config file {config_path}: {exc}") logging.error(f"Could not parse config file {config_path}: {exc}")
else: else:
# Fill missing values with defaults. # Fill missing values with defaults.
for key, value in DEFAULT_CONFIG.items(): for key, value in DEFAULT_CONFIG.items():
@ -42,4 +43,4 @@ def create_default_config(config_path):
with open(config_path, "wt") as config_file: with open(config_path, "wt") as config_file:
json.dump(DEFAULT_CONFIG, config_file, indent=2) json.dump(DEFAULT_CONFIG, config_file, indent=2)
except OSError as exc: except OSError as exc:
print(f"Could not create config file {config_path}: {exc}") logging.error(f"Could not create config file {config_path}: {exc}")

View file

@ -24,6 +24,7 @@ The identity file and the identities dict both have the following format:
import hashlib import hashlib
import json import json
import logging
import secrets import secrets
import string import string
import subprocess import subprocess
@ -40,6 +41,7 @@ def load_identities(identities_path: Path) -> Optional[dict]:
with open(identities_path, "rt") as identities_file: with open(identities_path, "rt") as identities_file:
identities = json.load(identities_file) identities = json.load(identities_file)
except (OSError, ValueError) as exc: except (OSError, ValueError) as exc:
logging.error(f"Failed to load identities '{identities_path}': {exc}")
return None return None
return identities return identities
@ -50,6 +52,7 @@ def save_identities(identities: dict, identities_path: Path):
with open(identities_path, "wt") as identities_file: with open(identities_path, "wt") as identities_file:
json.dump(identities, identities_file) json.dump(identities, identities_file)
except (OSError, ValueError) as exc: except (OSError, ValueError) as exc:
logging.error(f"Failed to save identities '{identities_path}': {exc}")
return False return False
return True return True

View file

@ -5,6 +5,7 @@ requires more clarity both in specification and in our own implementation.
""" """
import hashlib import hashlib
import logging
import re import re
from enum import Enum from enum import Enum
from pathlib import Path from pathlib import Path
@ -105,7 +106,7 @@ def save_cert_stash(stash: dict, stash_path: Path):
entry_line = f"{name} {algo} {fingerprint}\n" entry_line = f"{name} {algo} {fingerprint}\n"
stash_file.write(entry_line) stash_file.write(entry_line)
except (OSError, ValueError) as exc: except (OSError, ValueError) as exc:
print(f"Failed to save certificate stash '{stash_path}': {exc}") logging.error(f"Failed to save certificate stash '{stash_path}': {exc}")
class CertStatus(Enum): class CertStatus(Enum):