From c1cc84888988570f968495a06d018f3abb521482 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Thu, 28 Sep 2023 10:36:54 -0300 Subject: [PATCH 001/104] renamed ksigner.py to ksigner-cli.py renamed ksignerGUI.py to ksigner-gui.py creating gui with kivy --- pyproject.toml | 1 + src/constants.py | 7 + src/{ksigner.py => ksigner-cli.py} | 0 src/ksigner-gui.py | 78 +++++++++++ src/ksignerGUI.py | 202 ----------------------------- 5 files changed, 86 insertions(+), 202 deletions(-) rename src/{ksigner.py => ksigner-cli.py} (100%) create mode 100644 src/ksigner-gui.py delete mode 100644 src/ksignerGUI.py diff --git a/pyproject.toml b/pyproject.toml index 4c4e4eb..38b7526 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,7 @@ opencv-python = "^4.8.0.76" qrcode = "^7.4.2" pillow = "^10.0.1" pyzbar = "^0.1.9" +kivy = "^2.2.1" [tool.poetry.group.dev.dependencies] black = "^23.9.1" diff --git a/src/constants.py b/src/constants.py index 12f3226..7ca61b3 100644 --- a/src/constants.py +++ b/src/constants.py @@ -52,3 +52,10 @@ "signatures can be verified using openssl.", ] ) +KSIGNER_GUI_DESCRIPTION = "".join( + [ + "This is a GUI tool to create air-gapped signatures of files using Krux. ", + "The script can also convert hex publics exported from Krux to PEM public keys so ", + "signatures can be verified using openssl.", + ] +) diff --git a/src/ksigner.py b/src/ksigner-cli.py similarity index 100% rename from src/ksigner.py rename to src/ksigner-cli.py diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py new file mode 100644 index 0000000..cacf6b2 --- /dev/null +++ b/src/ksigner-gui.py @@ -0,0 +1,78 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-2023 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +""" +ksigner-gui.py + +A simple Graphical User Interface version +of ksigner-cli.py based o tkinter. + +TODO: rebuild to kivy? +""" + +#################### +# Standard libraries +#################### +import os +import base64 +import argparse + +####################### +# Third party libraries +####################### +from kivy.app import App +from kivy.uix.widget import Widget +from kivy.uix.gridlayout import GridLayout +from kivy.uix.button import Button + + +class KSignerWidget(Widget): + pass + +class KSignerApp(App): + + def build(self): + + self.current_page = 'Main' + + if (self.current_page == 'Main'): + btn = Button( + text ="Scan sha256 hash", + font_size ="20sp", + background_color =(0, 0, 0, 0), + color =(1, 1, 1, 1), + size_hint =(.2, .2), + pos =(300, 250) + ) + + # bind() use to bind the button to function callback + btn.bind(on_press = self.scan_sha256_hash_callback) + return btn + + def scan_sha256_hash_callback(self, event): + self.current_page = 'Scanning' + print("changed") + + +if __name__ == '__main__': + app = KSignerApp() + app.run() \ No newline at end of file diff --git a/src/ksignerGUI.py b/src/ksignerGUI.py deleted file mode 100644 index bd3ad09..0000000 --- a/src/ksignerGUI.py +++ /dev/null @@ -1,202 +0,0 @@ -""" -ksignerGUI.py - -A simple Graphical User Interface version -of ksigner-cli.py based o tkinter. - -TODO: rebuild to kivy? -""" - -#################### -# Standard libraries -#################### -import os -import base64 -from tkinter import Tk -from tkinter import Frame -from tkinter import Text -from tkinter import Label -from tkinter import PhotoImage -#from tkinter import BitmapImage -from tkinter import ttk -from tkinter import filedialog - -####################### -# Third party libraries -####################### -import cv2 -from PIL import ImageTk, Image - -################# -# Local libraries -################# -from hashutils import open_and_hash_file -from qrutils import make_qr_code_image - -# Scanned object types -SIGNATURE = 0 -PUB_KEY = 1 - -class KSignerTk(Tk): - """ - class KSignerTk - - an implementation of ksigner-cli in Tk GUI - """ - - def __init__(self, *args, **kwargs): - Tk.__init__(self, *args, **kwargs) - self.wm_title("Ksigner") - # self.option_add("*Foreground", "grey") - # self.option_add("*Background", "black") - self.grid_columnconfigure(0, weight=1) - self.grid_rowconfigure(0, weight=1) - self.grid_rowconfigure(1, weight=1) - self.grid_rowconfigure(2, weight=4) - # self.main_container = Frame(self) - # self.main_container.pack(fill="both", expand=True) - - # Variables - self.file_to_sign = None - self.qr_object = SIGNATURE - - # Buttons - self.buttons_panel = Frame() - self.buttons_panel.grid(column=0, row=0, sticky="nsew") - open_button = ttk.Button( - self.buttons_panel, - text="Open a File to Sign", - command=self.open_file_to_hash, - ) - open_button.pack(side="left", fill="both", expand=True) - - self.scan_sig_button = ttk.Button( - self.buttons_panel, - text="Scan and Save Signature", - command=self.capture_signature, - state="disabled", - ) - self.scan_sig_button.pack(side="left", fill="both", expand=True) - - scan_pb_key_button = ttk.Button( - self.buttons_panel, - text="Scan and Save Private Key", - # command=self.open_file_to_hash, - state="disabled", - ) - scan_pb_key_button.pack(side="left", fill="both", expand=True) - - # Info box - self.info_panel = Frame() - self.info_panel.grid(column=0, row=1, sticky="nsew") - self.text = Text(self.info_panel, height=4) - self.text.pack(side="right", fill="both", expand=True) - - # QRs and Camera panel - self.qr_panel = Frame() - self.qr_panel.grid(column=0, row=2, sticky="nsew") - krux_logo_path = os.path.join("assets", "krux.png") - self.krux_logo_image = PhotoImage(file=krux_logo_path) - self.label_qr = Label(self.qr_panel, image=self.krux_logo_image) - self.label_qr.pack(side="right", fill="both", expand=True) - - self.cam_panel = Frame() - self.cam_panel.grid(column=0, row=2, sticky="nsew") - self.cam_panel.grid_remove() - self.cap = None - self.detector = cv2.QRCodeDetector() - self.cam_label = Label(self.cam_panel) - self.cam_label.pack(side="left", fill="both", expand=True) - - def open_file_to_hash(self): - """ - open_file_to_hash - - Open a file and create a hash for it - """ - - # file type - filetypes = (("All files", "*.*"), ("bin files", "*.bin")) - # show the open file dialog - self.file_to_sign = filedialog.askopenfilename(filetypes=filetypes) - if not isinstance(self.file_to_sign, str): - return - # shows the hash of the file - hash_text = "File hash: " + open_and_hash_file(path=self.file_to_sign) - self.text.insert("1.0", hash_text + "\n") - qr_image = ImageTk.PhotoImage(make_qr_code_image(data=hash_text)) - self.label_qr.config(image=qr_image) - self.label_qr.image = qr_image - self.scan_sig_button["state"] = "normal" - - def capture_qr_code(self): - """ - capture_qr_code - - capture QRCode from camera - """ - _, frame = self.cap.read() - cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA) - img = Image.fromarray(cv2image) - cam_image = ImageTk.PhotoImage(image=img) - self.cam_label.config(image=cam_image) - self.label_qr.image = cam_image - qr_data, _bbox, _straight_qrcode = self.detector.detectAndDecode(frame) - - if len(qr_data) > 0: - if self.qr_object == SIGNATURE: - self.save_signature(qr_data) - elif self.qr_object == PUB_KEY: - self.save_pub_key(qr_data) - self.cap.release() - return - self.after(1, self.capture_qr_code) - - def detach_cam(self): - """ - detach_cam - - detachs camera to avoid new capture - """ - self.cam_panel.grid_remove() - self.label_qr.config(image=self.krux_logo_image) - self.label_qr.image = self.krux_logo_image - - def capture_signature(self): - """ - capture_signature - - capture the qrcode from the krux device - """ - self.cam_panel.grid() - self.qr_object = SIGNATURE - self.cap = cv2.VideoCapture(0) - self.capture_qr_code() - - def save_signature(self, signature): - """ - save_signature - - gets signature generated from qrcode - and create a text file on computer - """ - # Encode data - binary_signature = base64.b64decode(signature.encode()) - # Saves a signature - signature_file = f"{self.file_to_sign}.sig" - with open(signature_file, "wb") as sig_file: - sig_file.write(binary_signature) - self.text.insert("1.0", f"Saved signature file: {signature_file}\n") - self.detach_cam() - - def save_pub_key(self, pubkey): - """ - save_pubkey - - TODO - """ - pass - - -app = KSignerTk() -app.mainloop() From 11a8e3cf6eab229db519bfcf7dbcfa33aa6267d0 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Thu, 28 Sep 2023 13:03:00 -0300 Subject: [PATCH 002/104] added grid layout for 'MainPage' --- src/ksigner-gui.py | 27 ++++++--------------------- src/ksigner.kv | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 21 deletions(-) create mode 100644 src/ksigner.kv diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index cacf6b2..6ddf554 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -40,37 +40,22 @@ # Third party libraries ####################### from kivy.app import App -from kivy.uix.widget import Widget from kivy.uix.gridlayout import GridLayout from kivy.uix.button import Button -class KSignerWidget(Widget): +class MainPage(GridLayout): pass class KSignerApp(App): - + + PAGE = 'Main' + def build(self): - self.current_page = 'Main' + if (KSignerApp.PAGE == 'Main'): + return MainPage() - if (self.current_page == 'Main'): - btn = Button( - text ="Scan sha256 hash", - font_size ="20sp", - background_color =(0, 0, 0, 0), - color =(1, 1, 1, 1), - size_hint =(.2, .2), - pos =(300, 250) - ) - - # bind() use to bind the button to function callback - btn.bind(on_press = self.scan_sha256_hash_callback) - return btn - - def scan_sha256_hash_callback(self, event): - self.current_page = 'Scanning' - print("changed") if __name__ == '__main__': diff --git a/src/ksigner.kv b/src/ksigner.kv new file mode 100644 index 0000000..041c6da --- /dev/null +++ b/src/ksigner.kv @@ -0,0 +1,42 @@ +#:kivy 2.2.1 + +: + + cols: 1 + rows: 3 + + Button: + text: 'Scan sha256 hash' + font_size: '20sp' + background_color: 0, 0, 0, 0 + color: 1, 1, 1, 1 + canvas.before: + Color: + rgba: 1, 1, 1, 1 + Line: + width: 0.5 + rectangle: self.x, self.y, self.width, self.height + + Button: + text: 'Scan public key' + font_size: '20sp' + background_color: 0, 0, 0, 0 + color: 1, 1, 1, 1 + canvas.before: + Color: + rgba: 1, 1, 1, 1 + Line: + width: 0.5 + rectangle: self.x, self.y, self.width, self.height + Button: + text: 'Verify signature' + font_size: '20sp' + background_color: 0, 0, 0, 0 + color: 1, 1, 1, 1 + canvas.before: + Color: + rgba: 1, 1, 1, 1 + Line: + width: 0.5 + rectangle: self.x, self.y, self.width, self.height + \ No newline at end of file From 26dae67a2f86522530abf07f003311871ec4e7f3 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Thu, 28 Sep 2023 17:05:59 -0300 Subject: [PATCH 003/104] added click button effect on Sign and Verify Buttons --- src/ksigner-gui.py | 10 +++++++--- src/ksigner.kv | 27 ++++++++++++--------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index 6ddf554..a7b6a96 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -44,8 +44,9 @@ from kivy.uix.button import Button -class MainPage(GridLayout): - pass +class MainPage(GridLayout): pass +class SignPage(GridLayout): pass +class VerifyPage(GridLayout): pass class KSignerApp(App): @@ -55,7 +56,10 @@ def build(self): if (KSignerApp.PAGE == 'Main'): return MainPage() - + elif (KSignerApp.PAGE == 'Sign'): + return SignPage() + elif (KSignerPAGE == 'Verify'): + return VerifyPage() if __name__ == '__main__': diff --git a/src/ksigner.kv b/src/ksigner.kv index 041c6da..d26c970 100644 --- a/src/ksigner.kv +++ b/src/ksigner.kv @@ -3,13 +3,17 @@ : cols: 1 - rows: 3 + rows: 2 Button: - text: 'Scan sha256 hash' + text: 'Sign' font_size: '20sp' - background_color: 0, 0, 0, 0 + background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 + on_press: + self.background_color = (.5, .5, .5, .5) + on_release: + self.background_color = (0, 0, 0, 0) canvas.before: Color: rgba: 1, 1, 1, 1 @@ -18,21 +22,14 @@ rectangle: self.x, self.y, self.width, self.height Button: - text: 'Scan public key' - font_size: '20sp' - background_color: 0, 0, 0, 0 - color: 1, 1, 1, 1 - canvas.before: - Color: - rgba: 1, 1, 1, 1 - Line: - width: 0.5 - rectangle: self.x, self.y, self.width, self.height - Button: - text: 'Verify signature' + text: 'Verify' font_size: '20sp' background_color: 0, 0, 0, 0 color: 1, 1, 1, 1 + on_press: + self.background_color = (.5, .5, .5, .5) + on_release: + self.background_color = (0, 0, 0, 0) canvas.before: Color: rgba: 1, 1, 1, 1 From 43dca540357f782dd18b1c83ca85b131f0456b79 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Fri, 29 Sep 2023 20:54:53 -0300 Subject: [PATCH 004/104] updated README.md added Main, Sign and Verify Screens --- README.md | 112 ++++++++++++++------ assets/flow.jpg | Bin 0 -> 25884 bytes assets/ksigner-gui.gif | Bin 0 -> 923251 bytes src/ksigner-cli.py | 2 +- src/ksigner-gui.py | 39 +++---- src/ksigner.kv | 229 +++++++++++++++++++++++++++++++++++------ 6 files changed, 295 insertions(+), 87 deletions(-) create mode 100644 assets/flow.jpg create mode 100644 assets/ksigner-gui.gif diff --git a/README.md b/README.md index 8472b41..1f680c5 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,12 @@ Is a python script to help make airgapped signatures with Krux devices. It also can verify the signatures. -There's also a GUI version in development +The project is divided in two _softwares_: + +* `ksigner-cli`: is already able to sign and verify files. +* `ksigner-gui`: is under development with [`kivy` framework](https://kivy.org/) and shouldnt be used yet + ## Development ### Fetching the code @@ -12,13 +16,27 @@ There's also a GUI version in development git clone https://github.com/selfcustody/krux-file-signer.git ``` +### Learn the flow of usage + +This flow was made by [odudex](https://github.com/odudex) and is a helper +of usage and development. + +
+ Figure 1: Worflow of usage and development +

Figure 1: Workflow of usage and development

+
+ ### Install dev tools -The `ksigner` code is a Python script -that should be installed with Poetry. To generate -a new `poetry.lock` file use: `poetry lock --no-update`. +The `ksigner` suite is built as Python scripts with its dependencies +managed by [poetry](https://python-poetry.org/) -With `pip`, you can do: + +#### Install poetry and dependencies ```bash pip install poetry @@ -28,6 +46,14 @@ poetry install This will also install all development tools so that you can run pylint, format code with black, and build an agnostic OS executable. +#### Update lock file if already has one + +Use this everytime you want to add a dependency. + +```bash +poetry lock --no-update` +``` + ### Format code ```bash @@ -40,53 +66,66 @@ poetry run black ./src poetry run pylint ./src ``` -### Build executable +### Developing executables + +To run the suite as python scripts, you will need to use poetry correctly: + +#### ksigner-cli ```bash -poetry run pyinstaller ./src/ksigner.py +poetry run python src/ksigner-cli.py ``` -The generated executable will be placed on -`dist/ksigner/ksigner` +#### ksigner-cli +```bash +poetry run python src/ksigner-gui.py +``` + +### Build executables + +`ksigner` intends to be Operating System agnostic. +To achieve this goal, the project requires the correct use of pyinstaller: -### Run the GUI version +#### `ksigner-cli` build ```bash -poetry run python src/ksignerGUI.py +poetry run pyinstaller src/ksigner-cli.py ``` -### Build the GUI version executable +Will generate a executable placed on `dist/ksigner-cli/ksigner-cli` + +#### `ksigner-gui` build ```bash -poetry run pyinstaller ./src/ksignerGUI.py +poetry run pyinstaller src/ksigner-gui.py ``` -The generated executable will be placed on -`dist/ksignerGUI/ksignerGUI` - +Will generate a executable placed on `dist/ksigner-gui/ksigner-gui` ## Usage -### Commands - -#### Help +### `ksigner-cli` Running `./dist/ksigner/ksigner --help` will show: ```bash -usage: ksigner [-h] {sign,verify} ... +usage: ksigner-cli [-h] [-v] [-V] [-n] [-g] {sign,verify} ... -This python script is a tool to create air-gapped signatures of files using Krux. The script can also convert hex -publics exported from Krux to PEM public keys so signatures can be verified using openssl. +This python script is a tool to create air-gapped signatures of files using Krux. The script can also convert hex publics exported from Krux to PEM public keys so signatures can be verified using openssl. positional arguments: - {sign,verify} sub-command help - sign sign a file - verify verify signature + {sign,verify} sub-command help + sign sign a file + verify verify signature options: - -h, --help show this help message and exit + -h, --help show this help message and exit + -v, --version shows version + -V, --verbose verbose output (default: False) + -n, --normalize normalizes the image of camera (default: False) + -g, --gray-scale apply gray-scale filter on camera's image (default: False) + ``` #### sign @@ -94,7 +133,7 @@ options: Running `./dist/ksigner/ksigner sign --help`, will show: ```bash -usage: ksigner sign [-h] [-f FILE_TO_SIGN] [-o FILE_OWNER] [-u] [-l] +usage: ksigner-cli sign [-h] [-f FILE_TO_SIGN] [-o FILE_OWNER] [-u] options: -h, --help show this help message and exit @@ -103,8 +142,6 @@ options: -o FILE_OWNER, --owner FILE_OWNER the owner's name of public key certificate, i.e, the .pem file (default: 'pubkey') -u, --uncompressed flag to create a uncompreesed public key (default: False) - -l, --verbose-log verbose output (default: False) - ``` #### verify @@ -112,7 +149,7 @@ options: Running `/dist/krux-file-signer/krux-file-signer verify --help`, will show: ```bash -usage: ksigner verify [-h] [-f VERIFY_FILE] [-s SIG_FILE] [-p PUB_FILE] +usage: ksigner-cli verify [-h] [-f VERIFY_FILE] [-s SIG_FILE] [-p PUB_FILE] options: -h, --help show this help message and exit @@ -122,5 +159,20 @@ options: path to signature file -p PUB_FILE, --pub-file PUB_FILE path to pubkey file + ``` +### `ksigner-gui` + +*WARN*: this code is under development. + +Its current status is shown in the animation below: + +
+ Figure 2: Current status of ksigner-gui +

Figure 2: Current status of ksigner-gui

+
diff --git a/assets/flow.jpg b/assets/flow.jpg new file mode 100644 index 0000000000000000000000000000000000000000..39514e67ba3628344c38662955107df0a12f879e GIT binary patch literal 25884 zcmd431y~)+nl8L>3GN=;-5~^DxVt;SWnqCJ!QI{6-Q6v?yCgUS_du|p>^-y3-e=C4 zxo2kXeg5jAzPH}5>MQB))m=q(y)379JT91qB%q83`2~2Llxi8x08=lK>MN7Z)EN9|eQ(Eg{}p96Wry zUq-+np`f6lpb=nT5b#iuQSts|_tFbMg#~K>H-rEq1%RW1L7;-Y^aBV0U;uE4U)BA? zLBl{o!9sxl(qg|V{;YaU0|pNHvI0PWc+G|af$|#f>i#3={}AxWn{gWxGVg(Ak<9)Z zqL9)4uN43*US1p?YFo#6GQPX~CQa(53_Icc@FS+Wmaw#X8_RW9%HzuDZQF_Nhwo;t z{rYHT7mDxw{eBukVCZ5KI26OKo_)2HoBb2FgJD!{lpEgJlV#x!qF# zqDW&q40~M=Aauyc^alDJxO}ho zuQKuUaRE{J;QZ0BKLyFY|1)^X`YSDf7XMQYEwSmt?y7~N1v#3V5wAs2L9}zc);#|s zv1H|SnI`wt!Gz<%NK&`i6h2k2!f(0$8h|OR&ci7}xHFXx3nVMSS%;T4j@2PA&NQah zG|jE-^;}oR1~6C_<)KU8n+jTI!Dau-4u+YaGT=}&&|T_~IHtxs*Nk!3jG0wpT-L5M zk#yxhb^ON(h7bH&2Cws5kq~)2lLaC4(4JtD=fBkiVk@F{vt%^!1V}w8^IU8-{6WQd zRcE%MK>b0Dz#SNnA+y7w|Fw?cDnioHo&Jx?UtObq8^(zwH{y;7-V!4V`2(`McMDRT zLuLj1R>ezTP3slev3{*#qou&NyIr&pGc;41{0Dw@R4&5mU63xA&ks-GFF*jU?B zw6yN}KP|cA`529Fp*UcN7?^*|)eSB;R;JiHA}`AV>V^P`2LWz3b3 z^*=XM`J15xJ{?y0e)*f(-_X@H=DhrD`*S?xSJVV$ngqKn#v}ED%fydS$cf9^HXQhI zRqP7{lzY~c-hY?#-=a`pp9hfW^tZf!^TB#s-s?KGq+ct_lS?H?coZ%JEpLmqO+%Rc zxbWH+RE^DYWw$fLS2cE1hT{!caJA+S@Y6DR3I3t&*FIE9Q0C&WY%gL6@Y3X2oj+cV z%#x|NUBIbzzko7RcAaQ3ndN=$3TQ)yi>Yhi=|42X{_c$Z%UJlZ_a7J1KS)N}k{mr3 z@vPW6>Ox&LbFI>n{d!|ui0dV=I_z}f zX~XkmqYEUv%w5L!gmCpNZjMVj8oWv2pMlj>!wS|Wl>cWY0COh+jIB`r$V1Xv{=-uL z6%yw4-GB`R00s#L0S5j0V)FYt0_5wP1QZxF7B(gf3OWXd0xBA_ATbFkJ0}@A1)Bkj z_v?ED>}yIeDDW4+VTg$}i|mS!9u+xJ3-Qe`Or^wo2ce@_WS!_wJARA*W3v9VF?OME z#m19`hz>gVlcQv?*5w<;d2IRx=O=!8M7{U+s?`bH4W@WsYNk6s#SR8#XI)09D1vn0 zyUWYPE1;g3tI+U7iVWrhFw&Hag9k94)vCpCiNULrjY}96msM1vKSXNwpOaq{q7@61 zm3ph15TJ;@R}}5#;0YMyu%O7Z*a?sINvHpgypuWgqmeUJvXMBqcevN1oJ#-@K785j zSlKCqoW>QVsHdVa6ekQ+MB6xWJExw1wqzJjWd6A>L`T`ul>9wyyKlx6eN0g2Lc8~h z#HzQ?tT>x&B%YxM2#sM7K>e9~6PrzkBZR^9u>rB}9T$R&ZIMN(Mw+pH^0FZuTb~Uy zJRWI9;m4$zx5MvqSNSd7DIaN{yJNpf^M^x9&{w+Xoeku@0NzWUV0Nu7eLhSQQI@9c zDb$8evBop4wn+S6hN_>8T668pGUcJ+sULZ}?ue%8DKYfFV9X#>@G!EL-aHe^px!Ca zG!Uww*`}JdS|oli)GkclSRh-P3=#h_qqL7G zLmZ0A%^}(7n@E(QaJ$yd28S}+oT&Hik27KC(FUY70iEjLnrP=;n%rMS%U)?3~h`Q8ldqv$?pGN zyK>iLD!V7CWjDptWnSUQ!r7m=KPI{B*X#k3H&H}Gx6}l+FYnOD=Ci7QC3rMh&LCGC z=nZ8wHa+@qXTP2SLCoiq%#cD-bHy)N)WRHGR{jEzyrs7c{{AJ>-FG;uEaghxT9buu z`KzXjDBen!@-6*7;()fJok^R_BSZpsRC>wCN3XPNLZPS&?#Xdqk{%S<>`JmYqxFg~ zmqvz_r6#NYHY~M4HYJRzu@tU@#oRJLnZH56?!8Fe<`}dJU&O6s)A^8lyujIsqrt}s za-E;Ay_)YKsXVa^Tk6C-P~@eJW@v); zMdiDAWT5&Md#kdg)uKdGKg%5{1Or&k*O*s%0|Rd8%p1Y-!eZ{ zILLg`Qw9}?=ptjN>KKCR(~jH5{`95VGJUtN3CEVdVb`@EGN&3h&Mo*S9VO1-fC+<( z7YGbm8i%DMERwtE>Sl@tF(@Pbg?gq;P(6u+z-79^&-CS!<@ zjvMa}X)sZPjaJ*Qvr}vo@brP4r>~xOM$2tCdK>O|_6Jdq&6Cx)Dxg)K2t>$u(pA4jn^T{p5-!t) zuW+Jmm?~ZTpFj~v5%C+2FUuBDB0|p{if4G+?S^ZbP=3^b8fuc7@eGb5*xxNai>T^n z{Ajm|{Hd=-{+3(;w6`^Pcj%K?jyhC|LIPdFi}yA3@Mn+ZBmno&pbCNZhxt>XwMaDqLq9fe=87e;C#_ z0xtrF8~FF*n%YG^vmrX1ZAOIP9QLeBf#!uNp6#ayNF=-r;7<6`!}@p^yQ9JEaaeKB;y;jViPomo_TNJ{ zIN{AtS*Z(E=>DfrMP)(pKOHg7b}$QC>Ydk zJG57B?5yTHs{YSm?hPE5?Cqzj!dUG-_b}T*bmI&?qhE!>7afE*>jB_ET|}o*10ooG)&#-#T1_nP)pf-ml#S zX(*z~q!L~;KTIA4OO{jY1rTfFraUXRAM#$jJ2h=NgXbyLYk&C|vZv?!EE}^`y);}P z_QChMJ@8F!jA{BqKPQ&kpaa^*5v}2(lpWb?-r}p!e>wwIgx28b@x!YmD z|AJNmu}XtOI-O1FpOp_^{J!V|3kgIq2tr@dRZS@J9Xc|A|0a-H z{&CoJVb0X81NZ^}TQRf0;sRG~a%ypd; z7J6|PcpxWQP<<-CG4)#J^}ec3c8-X@aawnocU}c9+F$*(;=THlNqYTU4=07}( zn#Vz@MN{?*IFV0W0+peq~jKcRFh;bfbLnh3sw31|uOdf39fH4mP|^G2m=MuOFJ;fqs4f=|B8z!XvLT6gvr zz{mD)UNLGdXi5j2jc{owj1!QFl%`E~B^`>F1Sq=bQc)k1oLTbk}v}$%JR=o?#`fP5ezPI|g(ezJ`el!&>*+=gIf( zUmrxS-}aF(3_UH;QVGl4Q`!wI?^n66Cpcl{f|}n%bnDoHZ`)(zdpEB^4Q?=Uf&D{L z@w@kd;|pNu+v_lg85Qt4e+vZ#^J{|WcL#=gjzS^?4#6Ur!>pia7(;Ae531>zMnfm{ z+5Byc^E#g@0CrAU?d4reopUJYqj(O*iY%zN;s2a8rlx^}!g#(Rg%CZ%;n8XEO@cn2 z6o1Rd6y7)O^4@RS5kv4pn{eV2eSi|;%?Qyzr_aLxxsU#dFoG;l4e>f8bw{3GIsT2q z1*YN?!573-Z=kPtPBS^drLtay2|b-!GE+k9F2oy4dJ&+M#aN!?JqR z=3U)HcNdUVkOi+N(qSitOI&Kk-x7Odt57k_c&1WID1O9LgUxZ@`zGP&e2)CucKTm! zhlGHEg!uQS1Ac2ei;#liw4i|@C?=-{&Aw-oS@`0&c7y+F_bp}b)@1OzsAY)b?87^V zwlPAHQ{)YTc$~qT+Zv>)?+!2}BBp_xrZ7~K zLgJ$eq2`A^CT;H#h0xHvL^Ai54IU4;PZGuUp??ZSAPP$oqHzi-JRTtt7tjmt1dS;a zGR;B_X~Im61-h10_@IdkJ|1;Ko5Ri#zta-y6P!p zOJ-}g(laK*`^O4KK*j8KiZg%H5FqM#0lc{|mBcqz!?h9T+N!D%XxbH(?2@*P&C?XEE8C)pM^^v;p}>`F zb@0{c41C;G-`&IfbRiFEpio~L#B@C@Iraf1T2iDbiz=N_s-6oODSV^@Hf{t}5}9b_ z)Gaf_!XtaC9mLktGPcgdeABNlISi2uY24EVJ$OcJVn{J99Qym)RI8U2>EL@gIOUD}E4Bm2RTLdGPcH_Uu)XN;)8lKtXjreB(zhnqR>Eta z>3a}Sw52uA4TGV&A0bJHK}Ffnimbf=u!vmK4OHud>Y|V^R7W*jb(KV+2|zT1AsU%n z7^QtUJw=51^47+y))Mq9$9|USE>;@iQ&9LSs?u`7r9~i2%NpY2WYV(niZVIaxe8iE zI-E4Rh=vc7E?7#2!?8|S!|hnsq|bQzqd4-nvAlb;ilSn&(DUl8VQ5t&bjc|`szQ$3 z=Jnx@g30BH5k2rf$`Vlr@rq-oEX@;UwqS7 zL0W>>mI}=wA-z)~7r^_O)IclN2xL+XX)-Mz9VQcZi;(Ou97Lj|q~N#J>LD2i&@vQk zsD|U+$yRrdHUdtXP%-E$Rpj16%E|_h;#bO~ZtW2bWCyBfk>-{gs!{CWqJb9DtwTmh z&HbcQ-5*)}@L+tlECSH0RdZLg^I)17Wl&W|&21n;lhzZkVtiD;q~SwfwzP`Y>8nW9 zlaOzZp=#k4CA60%a7jWs<^vczuJRWw^*`ksa;C1>tO^YnWvRo?teAGjP#?DAgav-IE;V zQa5rO!^IfMiL~w0FOCRa9IQ$AEhuAfOOhg^TCJqD&dHFnXkW)kO5dKbMRz{On=@1y zqxR^k|4FAlyGgTR@gkp-TcH461I(HyQq;Mr0ql`1 zuvf*}T~{MYj!iW*O;>U%b+0BUQy6tJED6M{QD-rqY9&<_)uT8StzY66;9ie4#jc_K z$c;u0Vng6mIw{7tZS}cLu=3KW@slkn#92AnS`#M_Qp};9=e|4_y_4ph6;&?1%PaJ; zwpb5L<4X2gKonz$VF*(lDoyHduWce<;>;J0o!DlbrCrg8ezZE&n;YHO)Xvbh^MVYi zfqVgUn}=vicu}&4peSzyQHOM zT}t=$p8MS;H2u>LA-*-sx0w?pxfa)$Z*IbO9c3SGB+FpSdNX3n^KD-9tKbt$!`mBV8w9(AP_(@+dai;{tWx`h?% zZi0?qZw+aAqX9{Hd$XepB~FHQMnVb(Ha!CzbrY=!dMxru3EM}k#=v1P5Um(KoW+NX zWGgX4ApLHq-`8-Wx&HF{`sLJZZ;EcIaixSp33>t?US-SpUUpSG=g(;8qJ1JUO|Z({ zZDi1LH0HRa^z85CK&^aqZI&_F^4F;B_)<=sHNcG`>~w^y-+m_e~2_A_fX z9Yr*a(8d@6!FZZ=I%_fhU*Xh3$I=*ssn^KWtmHI$O^jV#fMT3_O_z^++Wvv5bk_2D zE|9f;iAskTCLxqmXh8fFttC*I98Q%ps>MhQg%C=AXN62D)zU&qG2I;(E;^C$U(Hbp8RjZHm z;OJinO*%+J>KKQQaxe6BN?agn#l-N`G3XP&E1FO?dFNS?=c znG0*J38=2C?LXja&P@XEV9?jr!R5|j_HQq{6lEgL=H1PA>~Ii2p;zViB&@M&i>MdGcwPC~>@`f)!iNSHa=3P|Uj-i1( zUz!i&z#QSCtpdXwiyav?qpiWIB1{V{(eB#am}F^2-SlX|o=66@Qs|{r_4ew@*vG93 zD+$Uqdxh5vQ5dW3T6*)+%dqi7NVP>1q2-i@9F!<m7L7GD8)7fk_`U$jp1Mfa$|jgSY!VW} zl;ycEK+Tr=WH4TWKXZ0va&sj|qC=yPC}O%5^$}1SS8b!f$bu7gBXD>X|8M_=d^8iq zGc7_{{HQhUpu57StQ%`+P0rr^6yMcV9l^q0ZP3HL?e=Fkp+Afr9cDj@Lo4nXv z-d`!8J8Vf1JQ=5F^{Pxk;wlEJ9C=9errJUby@ySaT{mkJHD|lPE`Q>ki%MNV2JyLi z(+DtzNh2+tZ-4#upBkTKUjPIL&R<>t(O1hLgMwj55uPyM11X$n1mAsLDf`u4Wby1| zDsP@Vzxm<+Gb+W>qb6`XL8O3A>o(A&S;hKt9j)gfvBmDEC1;}^RO2)VLoUQ)t-IQM z+bRKTVi4(rEF|G4Rb4t@f}-?NbkxbPY?b9mn{{!(fRy?$Is;vJ65O64Ey4v6&i44Q%wwGNI_Cq7Afn#OrPg1=6IyUB#$U_Lh^~Ce#uFcMb1Em#eG1RmonmNKqyJ|5k5uij}BS$Q`)CyLU*2j*a zG+P^}QPvMvCUg$#4*Aj$!m}>BF*9@@Nj-PB{82nh{0kjbixSW%irzxmN>X&E=iZ8A zwZ;1;H}=Otx`^ONOI=W^`ht#V4Cl?i_)D?Km1@_L*Kd@n#rO*V+}%a!yLX+>t`=cK zV)!#n_qBjdxD;rc!!@K*yQn1)=9StZ3a6KYiw#$8mg||jsbc6l&WVj-fFe^{mFmpq zo^kfQ6=;OCkRvg1h2rO#+N{3ZM1Q!#YGD9+&X%O`02PcDCCQC-9b74} zaH)1lRVf7u4RdluV<8wDm!2W>^f*i^)2?Sb7OA@*-L|ujqB?$Q!1hbv^deeDY-3QQzwC)Xmq0%sQB7p{1fnu0m_> zNR;erf^|!074POH+S7Yk2QVh1tlT zPa3-U<3hy5YpTTo{n&->!?zIoCL{$xST;V%gI6#2h__ChSsh$FInEI!(;D z#=`gRW75B|{xg-jVi8Q}I7!j!xV=^N+Y6TGPtUoP0%Ww?0r4R*sv2LH1+WPfJ8Hcc zdGp*&9(A0>Zinxh4o^6dcYr zz9-JJ={98?hm${yuYls$7}O4)a`=~JR^I_uFyjOFP4nr?%8Y(U+jlO-rl(oY%h&q2!>>xF$Os*QvVaAyxa$AA*!!d_=J6yw`Praol)RBy9dxeL=;Q^Yg=0ys9Ltk4=LMRdJ< zk|-=UhA$?4zcjsbA8;ma5VwcjLFg-=tat4K$8YF9y+r;m(;^OWW9;0k{;8$ zma0H+t;E*GL663R#YPb{P8K3ZvGh9cm2&)ZEa*m{=}_sn699*dll!wXw^W@JSeT-c z@FgNi)iLoIF>pq4Zcyoa0IgrT=K(S87L2OZ}$EnXh$qlhh z2b4gK1KL`8WL8ckI5c07`Y()Sb;vse?SOjxI6XnUN3();2UvUfwT%{WwCgzbW+%ms z^IVe2jWau2XQGGgv^FPP45SR0%3bJfvO&1AxhD$iO+8;FVwEeZdtB0Lu@>g<(E|+q zn^+&aQ&jg?1XYRXcgqc40AshFA5=G`!b~Le@GO7Em)TOlkE^~r(hYh6>=>(66^{-z z)@%B%&z@3hSPM~8-%azqsg@9lOyavel1IQlGfTbv$ca(#);T~sL7M{ydo9%?lOU2V z%z}?4ifUc`1u&q&^F8ZKbe8iR?|upZCKjpkWzgRfd9Hc4bIx#@gF8zr&nEwHU%bu|Q6 zGyM|S8(X>9L9kQdI&PkaA6dcEAHY&fqBDh0bj2pUH`Ks23)vi5;cSfSfu{^5Pf;|6^#a`9=1Ri` zEz!YzeF4y6N>6*GK_NR29Cp_Z(f3d9HS#z3&}^B4=@IssH|ey$L(DHg%^A8Ykj4J- z0+_glEDz3ZOF(Cc`l`pOLFN=cR;8rcVGQ3uzs$SIj)5vw`AG~Vfim65b1w*sJW(QW z{vgITf1iM|2m(j*qY;m&`wx19r^eZt4IEJwU(Y^$Vij~*f| zb15RI5Ba!^lj6R=Zf}~bY7vmrq9FAGh!5c$Y@CEnGxFa;TgfS)`_hB2S%^@Glcox4 zwGF^f_UpkB!E$2mv7yM(??Fd|up1krI}k8XwqCAYAw@ijWu|Ropxw4&gf^<({*idPCHgP{XrrK? z>0CimgH0U1y^2qyub7lUm;m8J5Oeg@0q&Lf;=}Fq1o4 z7usTFd82PFA;r&0sUy|$B@9y=b5}Ry?H2x%WDR+jXTn?k2N`mBXzFqu&IL5C4 ztN9zvBn|_pQ#q4aYulrU&!A!OUe2}0D&jKz!gmpWmuDNQl550q@Qu#@adOJ#45zIA zWd%~Likr<72ljiq4{sFMH~!NR^PK1deSLxfc)>@M|KeTk4K$IGVK*vD%6 zys4}3hVh)|YCFa~3?cVxs0F%=v@g|D4*>R=I@wmwk&um%Rt}oc&qa#~;f*n89;ZYp z!&VcQy;fB%MMipRKgPfbG~@hyf!ae=$R>uUsB3Wuvi|~-X*pJei%q$Y>=&?^n{tVS z)|2dpI4-A><8ack(FJHdClQ>8xzMeltf!EOsj*rIB;M)b2W~71C>@*X74wTs#ze7a zRewpY@r!~(*`?cZ$xZAO;Ur5<3~$>(!h+GYZ4I8~{aDo|f?DcXj?y2MxgtB2BymXD zc%=5UDpF7h@5BuxPRCWHW|*Tkk?m}&jnn0qcV+#Z3k3<(2e0w$={c>UC9w!H<6Nw) z>6WHpa53-}T5Lqu#VIvXNsFz;3@X1)xNf@seEPr2aELb$l&sJbQyqLmRyz)*k8wZc4c; zN+@ll9{dkOp=?JKG$7-;V`)3xriRfHE?a$L-EiMG3E6x*oS7RZ6!oDpG}frr^@3aZK+sy8W%yv|B6 z1?oO*1U!$C(EG=GTh}d9?wkLaEJ;DVoF4^G{lHu6q3V?IJ(XXa(HIXsj>irEEmaQKG9= zVrkABcsk+&=2*{JSk`X@H6e2&BASy3t8RsXFXvX8S85C_463T?!HXF64esXVKF)vN z4d`dzu7AkUQ0V8eU@QpR#tx%5TQ4}LHwxEb1jiFH#$&Ea%##vUfWI!)?SaKfVyHOa zw9`;zS0vxiVA>pA$Y@g}FJ%~s_D0r<|56Z5-fpW$L|tm?>&iM&N_)q8ldW&0yPw*> zT>7rLAU!lb1f_I&pmg>=kvVH8=(byq(W98!)oZe97`(PYUFkYs68|{AeWWwQ6fHrH zR}jT-AS9V0k4$SPWFWV(h&3^Yig21iiB6JEcLJo>L~bxgPI<6dK)_pS64K(KX?zG} zlr(b}3v3?LoP>6g4bgVqt`kMid7Wz%woao3GjmZ@^?fGjuvqPWCiaxRj7b#kUYIVe zuwfjP?HtBp;v7x%jF!V3(WmbUV$yOs-z^-hNWzA+P=2qgSTJ_uESAJJKaZy~sjgz- z_}`>(M`@bB7hsIL3f#Q?wWa{&bp<#CI0P&N;Po4_Uk(fvK*A!VXb8GMQSf?s5Ltn5GZjGc9&{=M(#Zywr^0WQh57_Di8 zh-1SWsVb`rLQd@+ZtNb~-fr_vEY&jR5yW<~M#s=$T0v^tx`=_YCPjVR0T+@(lnI*9 z0eBoF&?xA^d5kOy#f5_~Q=--!P-khdqIc-R-`5BfO@uFGSj00xHsCFSBx+)6MMkORfQD>f1~KOiFYY6MD(5%bQtr_+({$WzQs zItXU?0@q|AWDOpx%R?!c`fqZ zVBB=|$%V;;o+7_$kYP47$t8^3%U|7(7E&TLgo%(ITcJCu@ZdMEZ2n-7O0{Fo-e_`e zKprj&q4)({6TiGDK*LHe)x_7jL8OlnKk?nT?jCAluyaUx5~!Jw<@p$I0^~@V6d(ZfA8*I_rbT=HM3I3LB6p651 zd-Uw5>8$DyPn!9VTzH*9DLq4#_5ahOV8IE&ILHZ!zQ~88EK+u^YeUjbZ2KB#EA#_= z-n2c3x;mz(y~iB3oh(_6v#5^9rmoGudI0C)7zu(}>FiW`mCDH0?|C5kXgzPq9{HHo=>#MXv7|41EU0C@>d=u;Ec29du{LartL$%oh0VzYtv`hnM#G#Rr? z-h2=)<3uhJ+@@QnMT-VPv&`fjw?s5n_<~_lWS{SSRs9RVxzM&z+~w|gdi=7br2c0m zE(xWxSllET*N}~8u{9oX20&(0hzAq{IXzI`n1`TMk(?I7map;xc*;}|_BJGIbR+md z8zU{EtJ@W$1*l*LplIslvy+XMu6%uGO{rt*kcR^{Y9yzc?LAbO7UWG8z>J`5dSAJR zCv1g*HD=j_H`6yB{#C7d9881lW5>JpYr+6O2=a78t^ot4xd|T#N{dm+d5{v|B42F@ zskeoaKxTlvz05;mbR>~wl`!2w(YGk~0at_^F*&^9$HTkm`3dp11Po0lhR=&OhBEgm zLbqil6WneZvjGO07g}JZqT$Gr@TFEj8FvwBDDj`)(u0p57)sYKjy=6jN2`3-WN5Fa zISU;_)A$}Xy-0`aQq}Xd=F(8kRSuK<4<$h#YK}?aacs2b`hRr$&s@?oyBThrTDmGc zSY=v9NviP^!-S}>Vza~2y&qo9Lq&EerzPLO4T_ghDhd&L0U(0(*n}a3A_{NJ* ztQd{%1s6*FNHU(EZl^EVWuIVwe81yB)97Vcs%78DbNsPkPdlNXd~u312} z#)eYp#4w7^z)3*E6N?tdjffyCcOe)r7Qt6Oym>&zVLYIw-LFmCAr_)H$&nhSf5-*m zjtAk%ODCR})I+zHzTalBt>9%2Xl|%zrL#q04d_HlaBCT$%3b*rwti)o zykCE29&wg(4gUhrgFRO=)%K6w7E-gI2uKPz)ELke53X66E|fsgHq;>ONkwjNWpU89 zDTP->eRT&~0)3t|d?y&sU3wj#ZjKhK{!Y|@i84Xl zZa>C7iy<>U3L%ghGv0t7j)kmFWD@Q7Y((~4m{$2bXrGTRev7$&m?KHVFGR02xnN;- z$7J^by9=={)}SK{Yml}$Y?PCQjk~8ynivV*!{{nw@MX_7YmU4q`k4F{ErA$Drx{TQ zr^TE?9p3slhS8^LYyGVEHF-f z(A6FEMhCqM#1amYNBNL*9Ng31rR}lfDZd+5rPw{)Ed*^cOc{Yk9NG$q!af%Wcg&qC z@Pmj;BU6Bd3s1Zdi@)Q`3ZcJfGAnm~XvBXII()`9$0*AY7QT*TSze}{(K+|Ep4B~q zML;1S!k3FC*3yCQ$?1)snWgcE0A3QPF=-Av828SbpD6;>m*IGd)TS`}&szkU+4WeU zX`J}5z8aNl38S2-5>voW;frIL#_83ZJ;!_du3}#hDHd8#jn?(a+ik{CjOX46U)WC_ zuLz(Fdw)es91ET@=Z1taIC8^DHwq3DVcw+4-j@mXNZ_l5-%7UA;?&^HJ*8Jv*ZvSk z)?282k}4AguaS$!ihxg=Y_al)%5g;W0{G5H0*EP)W~;XyX!ZB&96;+pC2rR(YR4LZ=Pl+`L2HV!}2n5#KWgwq0Tk+yVW$L^{%=; zZ+DTVCy6WEJ^i%z-dp-nf=}kQ`z>urp1Z-4m;ZITzw4|&X}gA6A_bl6`dM;6)9p{5 zS{Jd8WVDqXx6}OTEGM@sTqV0I73sTC7>b`ICI`G+TZWdaqo%n+k&n8A5ZAa~kcOnU zeQNStv{Om(!uXo+xJ*Q;VEYEMM(8S=rS*jW^&Lii#p^SlRg!&~1pTcuGBpxFb|}TE z%oxp=AAaPc3W`=J<12^K9m zijdy}Y}?R^`#uA-PQQ*sEHsgLBy_?%v^Y~?Rek*)c2^)3)rluwpc`gT3mn7;8_eH9 zC|=XjR!SN|jX!_tFX0b1IS%WM`^;pYkZ?U{O;owF*Hgz%qck6LJZ?LRmYQsB<&2;Z zM}`}Xt0=*9I$b$JoG`1cAw@o~!%(rEN~;XfDq77*CiRoyA;(DV1z>}m!JMQ5JNx89 z)qx*1XDK;|&n$Y}l5alOO{d+;7v!^wq0~Xd$f8v6wDlaz3pLnl<`E#`874%lKY7q} zn)u$`rfc1Nok*myfDXq7r_WfaeW|eejY;E)Rb!ffqF4iNhy*m{h7=3UUG=*Fku{lj zxZdUx@9w*XXnx&e|8}eW62{)T)!f+5U!8HMcOo%iLWil>oU^RoC zSr6rk9T)B`pMBYTdYri*2<8jP|rHTpqyjQG>7&cYPvbldo{?_I7 z^zh^CH*uR_UuW-Z+?M^&zlj_9w&>I0Xm4=J_zXazV0ZV|dHwRf$aZ+|J zdi}ft9kfBJ!Ntjhml^x1&6bLx;S2U*X|GE2)EI?&)S4HRZcM9)IkEzkKI+k=c<>_K z5C)XTT+pH&(oNtBjpr!{xd(kh-_BhR*(q=oa{RO$L{jRBlghPVK!6O=Do8rHN8QWw z_Kbd`#63>sgT>n5-m4_f_n=wT@U62;Qk35vQ3Zw`@GvL#+38&XcTcZ7G|ZRO$iQc?>oP_*hv;iG-kVR)^pK&jo;{J z8_3X_Q#J<;K}uw)qdxmk@V$g*s@#Bj(7-5r9HL2VM7Y^ZW}Wo~XriEvSO>E4yojP) zBpTj4(H$XrACrcnfSoWmWoUxwC!IZ3Fqf7emRw0>asxk2e4SDPt-2ngo0w(+mA|!6}3+&T3tr5OS>aWe5 zAfbP4|MYuSFaYZ7Ox(GmVa~K5$S073_cixaZeLO(-t_Sc>R8vafH=-!Z-L?@l=yd#5dW~z`R%4-qz#qf4qi;^G484#5)*@Ug#gC!Nj zTyOur4BO}>eJV^GCpO1R44V%|l?~G)N6hZY3GWSe6c07QOA5!s?DMGO2@s1Rg@^vlOyJn=3Jce&0 zlbe1V=*fG@Y-G4shov_f*h~ockR)_XcdlK~r21EA+hZ76$v&!9*|(TKuaN9Db-Qn= zfkUI3ROoHNGCJX0cGN6@tpbnR_n{UkmfFJ_W;JAOm|mQ;4R)WoDcy8#`7pBb1v|#x ziV_R;eKsK;mv26_rgyY~a218yMqC3s8X=eD?(FQ%MRZz5pF>~Y9HDA;Efofstbo7I zz(^^%u{Fy{3rigG7E!!*&{pEz2^P(Sj(p!QY;Rk6z(P;G=%5G|Lhd3=KkvA5t--E) zon^{t8FZ|PGSG?eg=h*vTU@j)F5qUJPcUA(1I5pTq@@-tP<*ZxDr{$ch`$roNf6Sj z6%y++hF2yRT;=@*bXH;Ua;h2n7`2?3A#Pqav>93n3!gVEEX%;7%_ho5P@cJGW*<)O zPT1iaB$<@cZzj@B$W-6aw!?){-=-v;L%&Ulbs7_e@IIE)h|p934`DR|%4C9VDKPTJ zZ2ioYMw|15yII(Oo=J%QpMG{*pP4%QiI|tYZ`q#Iz zp4ySDcf{Dx)x4+5>BBevPB`jl{t!BZ?eT&*8|(jHYu6dnWVdb;l913L^dcn+hALe| z!~mh!Py|7cDouJXVyK~sAV?D>6a}P67b%h;(#22(L6lykgepbw@||<>vA`d1uyM&#Y%Z>*Zk39^9Xf3IM_=*(vw1wv^mg;{%BxP)^(7Jd5CO?>Frq zFK{Sp5w)+9(KO#a!Q@B`S}Il16Nn4D2211g*w`QPMnUhQS7A41-yZ(uymH=_2c)2& z27>B2>BM;TTmm3t6y+t<5| zS*NZB4^n(K#nnE?QE<^pbsrrHXkD~L#e;kKZGk&q3Sh!1E)=VYl0lAIwp*Hjb-zzi zfh8Ysai!|HS)^JxocqKEuKt zCTzOKcTH(j^Yu??*2ci^sDm)c1b-UgD7xlqMatS3DuB_Q+W>lx4giG;)$#4Gt$8Da zDY86WPzl&R-SM2G-lVtzLcwAi>YIo;K%$B|Yk~GPc%N<<#>fgGQ3Y zp=MM|J9L_1^b#VmM4vOW_-fc?R1NsnaWt)1o)Z|POb2@qp%XDX{4p?z(Zqs7)j&sJPo~0IcF29+@Yhgwx9%j6dSzqsX_hg zh2&aV{r!v55FQ-v29lk3RD(Bz`D<$t#kY0VQbL+JK35720v$%d+t0n;z_@q*fGmDn zpE)R4l_Nol?Yzxtm$^pD-^FQ8%=Ye*Bv!wNOV<7Y=pkD~luJx!D)W{344A-2!x)GA zDO#NnuOi<(tKvop4S26qj!;DAMT##gTI6{9GNp-od4bDQkHasoz!=e;^*@9x>TEmZ zUp3PKIkH-pK3AhJv%Z%we1fGYc*g(fnug$sbdVr?b8qLE)4>vfAk0Ka{8~O-)NKgm zU^BCPRr32HCgH;RIWgY+i?7csXB6j* z{g>U+KN>TxLIAkh~W<+G-_iFWwnAmuddgl#}wDOD@GVp-?F_^s!` zO|IS!RMWBScJ55H2){y8?=i1rzsJ3hS8{lTsUAw_Z)s%b)7!3y8q=e-Oa>2oJ1R}!3GRA7hxNAUw=oY zAm5RzRB-T1{H&tdC}zQHm8xfAyV}8i%@jOJ4QR9*>2Y&T0ZN2#T(IzF?^rW&Q}kl< zrb|7d%#+|$m=K6lvrVVWSHp}4Ay{n8AERf~W8Kv{O2j`Uu zBhl%-axUG%r-TV(-U7m#VO$nhMp=R?hsv>%UjozBIBQJk__#SYz|mXh<3jEt#no zNY>1XuZ!I}wW6B1V@k=QbSJH&V>=oZBT~gB?>brj>Dl#xyWLNdw#pIqk)3Cy#7fHU z^XlRh)1Xb5nN8|wk~K9-xzp0jLUnQcEG^{QtwIDocTQ|dMdfVN&O=#q&WPETn+hlR zy*QA+j3>TZ!#3df>GhG~ErawnMT5Q7|L?HHH!r)mk>cn3Rz$3v#zu7wDn~l|K}fvgV?qI;}B8v z!&cv$ePo+cgC%h$VeSW2TuE*gujc@w@G;z1+4*R*RnoLwO?ZSj#duuA=hx9jIs$lG zPAc8(zsS8=4}5Ab%Od&sQ09gP8{a)k)*g9r_gF)6A5kBq$lT4{8xr@P=BtXPz9E_E ze!qX|bp+1uH^LoyW zPO1!uG|aV0)h=X63L?jQX3E)=F%-ct7*Myc(o^(U30V^xAVBm-8x4r-e7TVj8bRyT zRpvjNcy0=#K;o{QmVr!HAYy?c)g~^C9Nw>2-i-*#?*#A;dFGw*Tl(ne z3gLCSn)>A*uGa0hF6q{$krJvOP3R0WvbpI(J4OsJ_Jm=JSKZrbl$o_=W*QrxJ7#&W z?^^i~Tm9n*zOzN2=5g|2X*A6gSKs&8rlzaLxO9TVBbL{e{e9ZZ#X>$iNkGj_BuxuO zL$0{Y(x+`7$Y25@E_{g#^t$;G#vnn|y4N?5;wK{q-Dg`c8)X>l1iQ&nuSUriL4?QI zyah!}`|)9KFkPbYB6xrxoOFq2o~=KyGV>d>PgS0sa$T*P;&o{Y0n;%idZ&oQky8O< z0^;i_5c{nSl>S1T#=UMMnch%0Nu`2@6-5vWU`m|*L!VchZ0Kmt29lq+h+-FES3(uBG z`TEe%d0#IQt?4Vm*ZBBOMEeW+fjB}#^2F%DAHYQ0`|A4D5;xiXXZhV7mLCbqmlW8( z2W<}WD0t6)z|sG00yH@qsYPY{rZLrA)!oAJEFLxZ7cc?$NnJ_-f9D30 z<+WT+q?~Gffkw7GmR8HkyT{XZUdq)}RzZk4T2!crvHn*S;~SN9VCAcC5&$8n&Jg1S zm`h%zE2C7_)+F}L?*U2$LQ{FqVqeh^qkqSiY7WSO-HQ$6K^}ifF>r6&9Xg=5QfbV# zn#J{tRhm@DeG|glnBWIB%6PH+0|Nbm(S#>CQPY2pCFHJNWLp*neF>+ogc^%nLMArd z7dAElhqFq*lh3pWxrd2AT2QU>ZBi3S!P5^4%1nM_H?os8mo@^8GuQSgn(P`|%U|Yi z23a||aCdGG@=(oj=(WeYbc%?5vAnIO4bn+f(CxYHZWJuR_d_KqiI4 z9PHpDv~4@k7Tz3uq?6N9iU*5nAJ?ckhdn_9ee^Qv|xq|KKl~2!@leY#EkXYI}7aib`b4`wHi?`XUpkjLTCFe zwl*c6(`8gTRdT=o(Ye*iKxfD^zk*B6+&RF&&)H(Z?`N!_Q8&iW+b6LCo9<~!PZ=uR~8J25h=PwqWNT#$|w zHJWrQSb0g`j-Q&99S{Bj%Uk<(koTclFdo~rEk=9ga6;h3hRWx2 z&BvYsH;_p67K|}!eyjfjK~`(|A_F3hOWXK?o3nT-7oQ0|X*ktg6Tbz3VQ;7psHYGq zfx1AnBb&M8#q1Ju?&gxb`feQ<@!X%yKgQ@ARfIHYsN>T2*wQ9!c?L&vaec3*1jg_x z&tg=I1_#p^iFzg=s`h!V!7VYLLfL`9dtxI*W3E z6Y}EgX?vGn-8wH{PbVoci+Uf??XYg3R)^n#17j%Qj^fkFI3GIe5VxqhFbtnRQmnst?hPZnx1PpZI>E_`2~0mz z1I}U*^NV-&pmL55;G#Up$VT0zs0X#3cN`dCzs`|o9o;UeY9>D4h?*#jTT`2%q6e2^ zSk?wG_BpYzTQ4hl{XZO#BqxlVW4!N2$TRUI9HyG(@?QHIh8w4@fu!*y?8l#+d#U{a zOeSY%zrcpy#!o2-hrZwm#@e?y*86jnhS(NHb&aE5;gGRw36D(s`sw*(F=~Amvv~y* zhl^B7mv92EAyV0%Fvfm=0j`!3dnWx+s(!Y}@Hykv@+-Od!>OsmLOz8LE*Xy&!r_fw*PsB9xH&H8ePwr`mDTGGu` z>WwJHLpa3BHPLl>80D7b6bzN>aI^Q7V9plX{eIZ{0dv4>5@yA~k#2jW znXFx78Nw*OuzQ}F3|ik;V_2wcz|zR+>#BuhFH6ZqIkIZ7uz@%bkYx$dQ2Ud|_8kI5 zW(a=>XL7dxp=Qf%rFLRWX4`c68TcfBYdJ)aC6c36=bHi2oJdzj2IZz>YUf3Qiieh5 zj?j{hVD7m66U}vG)4yjGvKCs2TF$z6y9J1Fbnz|5(Z#*G^MppSbx)0dFqkVi98ks@ z`SIDir7FvtHG~F>s|{)*Src%Cs#gayu?wV4#C(Kr*aUGZ&#LaNaNyCkPwEZc+Y0;8 zrW-TWUnG0{!q|Ddb#d_BT`GC>6ENMY@>2-v=wYd6oL*mqOC@QJOTYG^?`b7_>I8HvTDSc=axO|3Ry_zkj1kg5AKGt zJcvCCr6tL&N&zI2xfKA4yVuN@11O3c%lv>zm8;(pSVAQGc=$JBSt2pQ6u+xYZhw5r z6NVIH$^IEE<^p&UA36_X&`A`80$fbFIH>$@CFzMS7)T*1Nf32zVPeXY#YbO(m$>;| z-)bengJ?Tf2)nJ#+=H$UA6^ZL+YMKOv_!tO1z8RX^A{hFlBlOYHgX+a8!?49evN(c z2ax+R3AO9EOOM)>JN*MlmMy)@SaKr!i6$~~^AF$=gSUb7>61+8#y7ej-<4iQ5SH%! zax$gL9b5}APB`| zWA;D>wSb;g=54L}Y5Wt3b2lEwLmNLESWNp`o?lnfu|;l>^}U}$&AMMwBlyQmo#|V9 zvNLf`K6O~yckrPEPiJbVS8u6R2LLC|5fj8TcJD2Di zc`?n=IJxQCF$sCQES$pwSXC>@;6kEU{WP~HJ)OAO_7;QHNnT@wG}c3ZbDr|UyOa48IDntvw$3#M8`c>n+a literal 0 HcmV?d00001 diff --git a/assets/ksigner-gui.gif b/assets/ksigner-gui.gif new file mode 100644 index 0000000000000000000000000000000000000000..69915a3266cd51587737a001b08c8d7c10614afc GIT binary patch literal 923251 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�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%0A$;twwUY8RPJ`PFe^edJds_Ys^%MzLO|b+MgD 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%0D!{z2J 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%0Aupp8E3ZOzNi6F(1{K{PaW0)R0S2R2?CA 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 z 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: +: - cols: 1 - rows: 2 + GridLayout: + cols: 1 + rows: 2 - Button: - text: 'Sign' - font_size: '20sp' - background_color: 0, 0, 0, 0, - color: 1, 1, 1, 1 - on_press: - self.background_color = (.5, .5, .5, .5) - on_release: - self.background_color = (0, 0, 0, 0) - canvas.before: - Color: - rgba: 1, 1, 1, 1 - Line: - width: 0.5 - rectangle: self.x, self.y, self.width, self.height + Button: + text: 'Sign' + font_size: '20sp' + background_color: 0, 0, 0, 0, + color: 1, 1, 1, 1 + on_press: + self.background_color = (.5, .5, .5, .5) + on_release: + self.background_color = (0, 0, 0, 0) + root.manager.current = 'sign' + canvas.before: + Color: + rgba: 1, 1, 1, 1 + Line: + width: 0.5 + rectangle: self.x, self.y, self.width, self.height - Button: - text: 'Verify' - font_size: '20sp' - background_color: 0, 0, 0, 0 - color: 1, 1, 1, 1 - on_press: - self.background_color = (.5, .5, .5, .5) - on_release: - self.background_color = (0, 0, 0, 0) - canvas.before: - Color: - rgba: 1, 1, 1, 1 - Line: - width: 0.5 - rectangle: self.x, self.y, self.width, self.height - \ No newline at end of file + Button: + text: 'Verify' + font_size: '20sp' + background_color: 0, 0, 0, 0 + color: 1, 1, 1, 1 + on_press: + self.background_color = (.5, .5, .5, .5) + on_release: + self.background_color = (0, 0, 0, 0) + root.manager.current = 'verify' + canvas.before: + Color: + rgba: 1, 1, 1, 1 + Line: + width: 0.5 + rectangle: self.x, self.y, self.width, self.height + +: + + GridLayout: + cols: 1 + rows: 4 + + Button: + text: 'Load file & export hash QRCode' + font_size: '20sp' + background_color: 0, 0, 0, 0, + color: 1, 1, 1, 1 + on_press: + self.background_color = (.5, .5, .5, .5) + on_release: + self.background_color = (0, 0, 0, 0) + canvas.before: + Color: + rgba: 1, 1, 1, 1 + Line: + width: 0.5 + rectangle: self.x, self.y, self.width, self.height + + Button: + text: 'Import & save signature' + font_size: '20sp' + background_color: 0, 0, 0, 0, + color: 1, 1, 1, 1 + on_press: + self.background_color = (.5, .5, .5, .5) + on_release: + self.background_color = (0, 0, 0, 0) + canvas.before: + Color: + rgba: 1, 1, 1, 1 + Line: + width: 0.5 + rectangle: self.x, self.y, self.width, self.height + + Button: + text: 'Import & save public-key' + font_size: '20sp' + background_color: 0, 0, 0, 0, + color: 1, 1, 1, 1 + on_press: + self.background_color = (.5, .5, .5, .5) + on_release: + self.background_color = (0, 0, 0, 0) + canvas.before: + Color: + rgba: 1, 1, 1, 1 + Line: + width: 0.5 + rectangle: self.x, self.y, self.width, self.height + + + Button: + text: 'Back' + font_size: '20sp' + background_color: 0, 0, 0, 0, + color: 1, 1, 1, 1 + on_press: + self.background_color = (.5, .5, .5, .5) + on_release: + self.background_color = (0, 0, 0, 0) + root.manager.current = 'main' + canvas.before: + Color: + rgba: 1, 1, 1, 1 + Line: + width: 0.5 + rectangle: self.x, self.y, self.width, self.height + +: + + GridLayout: + cols: 1 + rows: 5 + + Button: + text: 'Load file' + font_size: '20sp' + background_color: 0, 0, 0, 0, + color: 1, 1, 1, 1 + on_press: + self.background_color = (.5, .5, .5, .5) + on_release: + self.background_color = (0, 0, 0, 0) + canvas.before: + Color: + rgba: 1, 1, 1, 1 + Line: + width: 0.5 + rectangle: self.x, self.y, self.width, self.height + + Button: + text: 'Load Signature' + font_size: '20sp' + background_color: 0, 0, 0, 0, + color: 1, 1, 1, 1 + on_press: + self.background_color = (.5, .5, .5, .5) + on_release: + self.background_color = (0, 0, 0, 0) + canvas.before: + Color: + rgba: 1, 1, 1, 1 + Line: + width: 0.5 + rectangle: self.x, self.y, self.width, self.height + + Button: + text: 'Load public-key' + font_size: '20sp' + background_color: 0, 0, 0, 0, + color: 1, 1, 1, 1 + on_press: + self.background_color = (.5, .5, .5, .5) + on_release: + self.background_color = (0, 0, 0, 0) + canvas.before: + Color: + rgba: 1, 1, 1, 1 + Line: + width: 0.5 + rectangle: self.x, self.y, self.width, self.height + + Button: + text: 'Verify signature' + font_size: '20sp' + background_color: 0, 0, 0, 0, + color: 1, 1, 1, 1 + on_press: + self.background_color = (.5, .5, .5, .5) + on_release: + self.background_color = (0, 0, 0, 0) + canvas.before: + Color: + rgba: 1, 1, 1, 1 + Line: + width: 0.5 + rectangle: self.x, self.y, self.width, self.height + + Button: + text: 'Back' + font_size: '20sp' + background_color: 0, 0, 0, 0, + color: 1, 1, 1, 1 + on_press: + self.background_color = (.5, .5, .5, .5) + on_release: + self.background_color = (0, 0, 0, 0) + root.manager.current = 'main' + canvas.before: + Color: + rgba: 1, 1, 1, 1 + Line: + width: 0.5 + rectangle: self.x, self.y, self.width, self.height \ No newline at end of file From ed0024f722e7ba6cc907615b1dc44c582114415e Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Fri, 29 Sep 2023 22:02:54 -0300 Subject: [PATCH 005/104] updated directions of transition on ksigner-gui.py Sign and Verify buttons have a 'left' transition Back buttons have a 'right' transition --- src/ksigner.kv | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ksigner.kv b/src/ksigner.kv index ce09719..cf74158 100644 --- a/src/ksigner.kv +++ b/src/ksigner.kv @@ -15,6 +15,7 @@ self.background_color = (.5, .5, .5, .5) on_release: self.background_color = (0, 0, 0, 0) + root.manager.transition.direction = 'left' root.manager.current = 'sign' canvas.before: Color: @@ -32,6 +33,7 @@ self.background_color = (.5, .5, .5, .5) on_release: self.background_color = (0, 0, 0, 0) + root.manager.transition.direction = 'left' root.manager.current = 'verify' canvas.before: Color: @@ -104,6 +106,7 @@ self.background_color = (.5, .5, .5, .5) on_release: self.background_color = (0, 0, 0, 0) + root.manager.transition.direction = 'right' root.manager.current = 'main' canvas.before: Color: @@ -191,6 +194,7 @@ self.background_color = (.5, .5, .5, .5) on_release: self.background_color = (0, 0, 0, 0) + root.manager.transition.direction = 'right' root.manager.current = 'main' canvas.before: Color: From 5c7d2e7003ef3eca509d1f35e900a77f9413197b Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Sat, 30 Sep 2023 14:08:07 -0300 Subject: [PATCH 006/104] Added FileChooser popup to choose a file to be hashed modularized methods into properly classes --- src/hashutils.py | 4 +- src/ksigner-gui.py | 122 +++++++++++++++++++++++++++++++++++++++++---- src/ksigner.kv | 57 +++++++++++++-------- src/logutils.py | 25 ++++++++-- 4 files changed, 170 insertions(+), 38 deletions(-) diff --git a/src/hashutils.py b/src/hashutils.py index 4875fd2..bb5a3f2 100644 --- a/src/hashutils.py +++ b/src/hashutils.py @@ -33,13 +33,13 @@ def open_and_hash_file(**kwargs) -> str: _bytes = f_to_be_sig.read() # read file as bytes if verbose: - verbose_log(f"Read bytes: {_bytes}") + verbose_log('INFO', f"Read bytes: {_bytes}") __readable_hash__ = hashlib.sha256(_bytes).hexdigest() # Prints the hash of the file if verbose: - verbose_log(f"Hash of {__filename__}: {__readable_hash__}") + verbose_log('INFO', f"Hash of {__filename__}: {__readable_hash__}") return __readable_hash__ except FileNotFoundError as exc: diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index 9df176f..48e347d 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -25,27 +25,130 @@ A simple Graphical User Interface built with kivy """ +#################### +# Standard libraries +#################### +import os ####################### # Third party libraries ####################### from kivy.app import App from kivy.uix.gridlayout import GridLayout +from kivy.uix.filechooser import FileChooserIconView from kivy.uix.button import Button from kivy.uix.screenmanager import ScreenManager, Screen -from kivy.properties import ( - StringProperty -) +from kivy.uix.popup import Popup +from kivy.properties import ObjectProperty, StringProperty +################# +# Local libraries +################# +from logutils import verbose_log +from hashutils import open_and_hash_file -class MainScreen(Screen): pass -class SignScreen(Screen): pass -class VerifyPage(Screen): pass +class MainScreen(Screen): + """ + MainScreen -class KSignerApp(App): + Class to manage the two main buttons: - page = StringProperty('Main') + - Sign; + - Verify; + """ + def on_click_sign_button(self): + verbose_log('INFO', ' clicked') + self.ids.main_screen_sign_button.background_color = (.5, .5, .5, .5) + + def on_release_sign_button(self): + verbose_log('INFO', ' released') + self.ids.main_screen_sign_button.background_color = (0, 0, 0, 0) + self.manager.transition.direction = 'left' + self.manager.current = 'sign' + + + def on_click_verify_button(self): + verbose_log('INFO', ' clicked') + self.ids.main_screen_verify_button.background_color = (.5, .5, .5, .5) + + def on_release_verify_button(self): + verbose_log('INFO', ' released') + self.ids.main_screen_verify_button.background_color = (0, 0, 0, 0) + self.manager.transition.direction = 'left' + self.manager.current = 'verify' + + +class FileChooser(FileChooserIconView): + """ + FileChooser + + Class to manage the file to choose in SignScreen and VerifyScreen + classes. In SignScreen, it will choose the file to load a content, + write it in a .sha256.txt file and show qrcode content. + """ + loaded = ObjectProperty(None) + cancel = ObjectProperty(None) + path = os.path.expanduser('~') + +class SignScreen(Screen): + """ + SignScreen + + Class to manage the creation of signatures. It has 4 buttons: + + - Load File & export hash QRCode: `show_load` method; + - Import & save signature: `TODO`; + - Import & save publickey: `TODO`; + - Back: `__on_release__` method + """ + + def __init__(self, **kwargs): + super(SignScreen, self).__init__(**kwargs) + self._content = FileChooser( + cancel=lambda: self._popup.dismiss, + path=FileChooser.path, + on_submit=self.on_submit_file + ) + self._popup = Popup( + title="Load a file", + content=self._content, + size_hint=(0.9, 0.9) + ) + self.file_input = StringProperty('') + self.file_content = StringProperty('') + self.file_hash = StringProperty('') + + def on_press_sign_screen_load_file_and_export_hash_qrcode(self): + verbose_log('INFO', ' clicked') + self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = (.5, .5, .5, .5) + + def on_release_sign_screen_load_file_and_export_hash_qrcode(self): + verbose_log('INFO', ' released') + self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = (0, 0, 0, 0) + + verbose_log('INFO', ' opening') + self._popup.open() + + def on_back_main(self): + verbose_log('INFO', 'Clicking ') + self.manager.transition.direction = 'right' + self.manager.current = 'main' + + def on_submit_file(self, *args): + self.file_input = args[1][0] + verbose_log('INFO', f" loading {self.file_input}") + self.file_hash = open_and_hash_file( + path=self.file_input, + verbose=True + ) + verbose_log('INFO', f" hash: {self.file_hash}") + self._popup.dismiss() + +class VerifyScreen(Screen): pass + + +class KSignerApp(App): def build(self): @@ -53,8 +156,7 @@ def build(self): sm = ScreenManager() sm.add_widget(MainScreen(name='main')) sm.add_widget(SignScreen(name='sign')) - sm.add_widget(SignScreen(name='verify')) - + sm.add_widget(VerifyScreen(name='verify')) return sm if __name__ == '__main__': diff --git a/src/ksigner.kv b/src/ksigner.kv index cf74158..5ba3c2a 100644 --- a/src/ksigner.kv +++ b/src/ksigner.kv @@ -2,21 +2,21 @@ : + id: main_screen + GridLayout: + cols: 1 rows: 2 Button: + id: main_screen_sign_button text: 'Sign' font_size: '20sp' - background_color: 0, 0, 0, 0, + background_color: 0, 0, 0, 0 color: 1, 1, 1, 1 - on_press: - self.background_color = (.5, .5, .5, .5) - on_release: - self.background_color = (0, 0, 0, 0) - root.manager.transition.direction = 'left' - root.manager.current = 'sign' + on_press: root.on_click_sign_button() + on_release: root.on_release_sign_button() canvas.before: Color: rgba: 1, 1, 1, 1 @@ -25,16 +25,13 @@ rectangle: self.x, self.y, self.width, self.height Button: + id: main_screen_verify_button text: 'Verify' font_size: '20sp' background_color: 0, 0, 0, 0 color: 1, 1, 1, 1 - on_press: - self.background_color = (.5, .5, .5, .5) - on_release: - self.background_color = (0, 0, 0, 0) - root.manager.transition.direction = 'left' - root.manager.current = 'verify' + on_press: root.on_click_verify_button() + on_release: root.on_release_verify_button() canvas.before: Color: rgba: 1, 1, 1, 1 @@ -49,14 +46,13 @@ rows: 4 Button: + id: sign_screen_load_file_and_export_hash_qrcode text: 'Load file & export hash QRCode' font_size: '20sp' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 - on_press: - self.background_color = (.5, .5, .5, .5) - on_release: - self.background_color = (0, 0, 0, 0) + on_press: root.on_press_sign_screen_load_file_and_export_hash_qrcode() + on_release: root.on_release_sign_screen_load_file_and_export_hash_qrcode() canvas.before: Color: rgba: 1, 1, 1, 1 @@ -104,10 +100,7 @@ color: 1, 1, 1, 1 on_press: self.background_color = (.5, .5, .5, .5) - on_release: - self.background_color = (0, 0, 0, 0) - root.manager.transition.direction = 'right' - root.manager.current = 'main' + on_release: root.on_back_main() canvas.before: Color: rgba: 1, 1, 1, 1 @@ -201,4 +194,24 @@ rgba: 1, 1, 1, 1 Line: width: 0.5 - rectangle: self.x, self.y, self.width, self.height \ No newline at end of file + rectangle: self.x, self.y, self.width, self.height + +: + BoxLayout: + size: root.size + pos: root.pos + orientation: "vertical" + FileChooserListView: + id: filechooser + on_selection: root.select(*args) + + BoxLayout: + size_hint_y: None + height: 30 + Button: + text: "Cancel" + on_release: root.cancel() + + Button: + text: "Load" + on_release: root.load(filechooser.path, filechooser.selection) \ No newline at end of file diff --git a/src/logutils.py b/src/logutils.py index 37cabfb..8c8dea4 100644 --- a/src/logutils.py +++ b/src/logutils.py @@ -4,14 +4,22 @@ simple log utilities """ import time - +class bcolors: + HEADER = '\033[95m' + OKBLUE = '\033[94m' + INFO = '\033[92m' + WARN = '\033[93m' + FAIL = '\033[91m' + ENDC = '\033[0m' + BOLD = '\033[1m' + UNDERLINE = '\033[4m' def now() -> str: """Return some formated time""" return time.strftime("%X %x %Z") -def verbose_log(v_data: str): +def verbose_log(v_type: str, v_data: str): """ Prints verbose data preceded by current time @@ -20,11 +28,20 @@ def verbose_log(v_data: str): ```bash >>> import logutils >>> verbose_log('Hello world') - [08:08:08 8/8/88 -08] Hello World + [ksigner 08:08:08 8/8/88 -08] Hello World ``` Args: :param v_data the message to be verbose """ - print(f"[{now()}] {v_data}") + if (v_type == 'INFO'): + c = f"{bcolors.BOLD}{bcolors.INFO}" + + if (v_type == 'WARN'): + c = f"{bcolors.BOLD}{bcolors.WARN}" + + if (v_type == 'FAIL'): + c = f"{bcolors.BOLD}{bcolors.FAIL}" + + print(f"[{c}{v_type}{bcolors.ENDC} ] [KSigner ] [{now()}] {v_data}") From 47d3d3687c13512b7af4f35a34d8c17539047177 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Sat, 30 Sep 2023 14:20:14 -0300 Subject: [PATCH 007/104] Changed font_name to terminus.ttf --- src/ksigner.kv | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/src/ksigner.kv b/src/ksigner.kv index 5ba3c2a..e989cc5 100644 --- a/src/ksigner.kv +++ b/src/ksigner.kv @@ -12,7 +12,8 @@ Button: id: main_screen_sign_button text: 'Sign' - font_size: '20sp' + font_size: root.height // 25 + font_name: 'terminus.ttf' background_color: 0, 0, 0, 0 color: 1, 1, 1, 1 on_press: root.on_click_sign_button() @@ -27,7 +28,8 @@ Button: id: main_screen_verify_button text: 'Verify' - font_size: '20sp' + font_size: root.height // 25 + font_name: 'terminus.ttf' background_color: 0, 0, 0, 0 color: 1, 1, 1, 1 on_press: root.on_click_verify_button() @@ -48,7 +50,8 @@ Button: id: sign_screen_load_file_and_export_hash_qrcode text: 'Load file & export hash QRCode' - font_size: '20sp' + font_size: root.height // 25 + font_name: 'terminus.ttf' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 on_press: root.on_press_sign_screen_load_file_and_export_hash_qrcode() @@ -62,6 +65,8 @@ Button: text: 'Import & save signature' + font_size: root.height // 25 + font_name: 'terminus.ttf' font_size: '20sp' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 @@ -78,7 +83,8 @@ Button: text: 'Import & save public-key' - font_size: '20sp' + font_size: root.height // 25 + font_name: 'terminus.ttf' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 on_press: @@ -95,7 +101,8 @@ Button: text: 'Back' - font_size: '20sp' + font_size: root.height // 25 + font_name: 'terminus.ttf' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 on_press: @@ -115,8 +122,9 @@ rows: 5 Button: - text: 'Load file' - font_size: '20sp' + text: 'Load file' + font_size: root.height // 25 + font_name: 'terminus.ttf' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 on_press: @@ -132,7 +140,8 @@ Button: text: 'Load Signature' - font_size: '20sp' + font_size: root.height // 25 + font_name: 'terminus.ttf' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 on_press: @@ -147,8 +156,9 @@ rectangle: self.x, self.y, self.width, self.height Button: - text: 'Load public-key' - font_size: '20sp' + text: 'Load public-key' + font_size: root.height // 25 + font_name: 'terminus.ttf' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 on_press: @@ -163,8 +173,9 @@ rectangle: self.x, self.y, self.width, self.height Button: - text: 'Verify signature' - font_size: '20sp' + text: 'Verify signature' + font_size: root.height // 25 + font_name: 'terminus.ttf' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 on_press: @@ -180,7 +191,8 @@ Button: text: 'Back' - font_size: '20sp' + font_size: root.height // 25 + font_name: 'terminus.ttf' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 on_press: @@ -209,9 +221,13 @@ size_hint_y: None height: 30 Button: + font_size: root.height // 25 + font_name: 'terminus.ttf' text: "Cancel" on_release: root.cancel() Button: + font_size: root.height // 25 + font_name: 'terminus.ttf' text: "Load" on_release: root.load(filechooser.path, filechooser.selection) \ No newline at end of file From 57a2e5e7dbe5cc20ce0ba212f274e76d0c6367d3 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Sat, 30 Sep 2023 17:22:24 +0000 Subject: [PATCH 008/104] Create pylint.yml Added pylint workflow --- .github/workflows/pylint.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/pylint.yml diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml new file mode 100644 index 0000000..c9c962e --- /dev/null +++ b/.github/workflows/pylint.yml @@ -0,0 +1,23 @@ +name: Pylint + +on: [push] + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.8", "3.9", "3.10", "3.11"] + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install pylint + - name: Analysing the code with pylint + run: | + pylint $(git ls-files '*.py') From 1c8c77f848838c770a387fef4991e59d70228ea1 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Sat, 30 Sep 2023 20:10:30 -0300 Subject: [PATCH 009/104] Added some pydoc on classes verbose_log expanded with colors added some lint Implemented terminus font --- src/hashutils.py | 4 +- src/ksigner-cli.py | 4 +- src/ksigner-gui.py | 208 +++++++++++++++++++++++++++++++++------------ src/ksigner.kv | 12 +-- src/logutils.py | 29 ++++--- src/terminus.ttf | Bin 0 -> 463232 bytes 6 files changed, 179 insertions(+), 78 deletions(-) create mode 100644 src/terminus.ttf diff --git a/src/hashutils.py b/src/hashutils.py index bb5a3f2..35a55a8 100644 --- a/src/hashutils.py +++ b/src/hashutils.py @@ -33,13 +33,13 @@ def open_and_hash_file(**kwargs) -> str: _bytes = f_to_be_sig.read() # read file as bytes if verbose: - verbose_log('INFO', f"Read bytes: {_bytes}") + verbose_log("INFO", f"Read bytes: {_bytes}") __readable_hash__ = hashlib.sha256(_bytes).hexdigest() # Prints the hash of the file if verbose: - verbose_log('INFO', f"Hash of {__filename__}: {__readable_hash__}") + verbose_log("INFO", f"Hash of {__filename__}: {__readable_hash__}") return __readable_hash__ except FileNotFoundError as exc: diff --git a/src/ksigner-cli.py b/src/ksigner-cli.py index 72075c0..e878be4 100644 --- a/src/ksigner-cli.py +++ b/src/ksigner-cli.py @@ -47,7 +47,9 @@ ################ # Command parser ################ -parser = argparse.ArgumentParser(prog="ksigner-cli", description=KSIGNER_CLI_DESCRIPTION) +parser = argparse.ArgumentParser( + prog="ksigner-cli", description=KSIGNER_CLI_DESCRIPTION +) # Version parser.add_argument( diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index 48e347d..258e9e0 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -34,9 +34,7 @@ # Third party libraries ####################### from kivy.app import App -from kivy.uix.gridlayout import GridLayout -from kivy.uix.filechooser import FileChooserIconView -from kivy.uix.button import Button +from kivy.uix.filechooser import FileChooserIconView from kivy.uix.screenmanager import ScreenManager, Screen from kivy.uix.popup import Popup from kivy.properties import ObjectProperty, StringProperty @@ -47,6 +45,7 @@ from logutils import verbose_log from hashutils import open_and_hash_file + class MainScreen(Screen): """ MainScreen @@ -56,27 +55,52 @@ class MainScreen(Screen): - Sign; - Verify; """ - - def on_click_sign_button(self): - verbose_log('INFO', ' clicked') - self.ids.main_screen_sign_button.background_color = (.5, .5, .5, .5) + + def on_press_sign_button(self): + """ + on_press_sign_button + + - change background color of button to (.5,.5,.5,.5), + giving a visual effect of 'pressed' + """ + verbose_log("INFO", " clicked") + self.ids.main_screen_sign_button.background_color = (0.5, 0.5, 0.5, 0.5) def on_release_sign_button(self): - verbose_log('INFO', ' released') + """ + on_release_sign_button + + - change background color of button to (0, 0, 0, 0), + giving a visual effect of 'unpressed' + - make a screen transition to SignScreen + """ + verbose_log("INFO", " released") self.ids.main_screen_sign_button.background_color = (0, 0, 0, 0) - self.manager.transition.direction = 'left' - self.manager.current = 'sign' + self.manager.transition.direction = "left" + self.manager.current = "sign" + def on_press_verify_button(self): + """ + on_press_verify_button - def on_click_verify_button(self): - verbose_log('INFO', ' clicked') - self.ids.main_screen_verify_button.background_color = (.5, .5, .5, .5) + - change background color of button to (.5,.5,.5,.5), + giving a visual effect of 'pressed' + """ + verbose_log("INFO", " clicked") + self.ids.main_screen_verify_button.background_color = (0.5, 0.5, 0.5, 0.5) def on_release_verify_button(self): - verbose_log('INFO', ' released') + """ + on_release_verify_button + + - change background color of button to (0, 0, 0, 0), + giving a visual effect of 'unpressed' + - make a screen transition to VerifyScreen + """ + verbose_log("INFO", " released") self.ids.main_screen_verify_button.background_color = (0, 0, 0, 0) - self.manager.transition.direction = 'left' - self.manager.current = 'verify' + self.manager.transition.direction = "left" + self.manager.current = "verify" class FileChooser(FileChooserIconView): @@ -87,9 +111,11 @@ class FileChooser(FileChooserIconView): classes. In SignScreen, it will choose the file to load a content, write it in a .sha256.txt file and show qrcode content. """ + loaded = ObjectProperty(None) cancel = ObjectProperty(None) - path = os.path.expanduser('~') + path = os.path.expanduser("~") + class SignScreen(Screen): """ @@ -100,65 +126,135 @@ class SignScreen(Screen): - Load File & export hash QRCode: `show_load` method; - Import & save signature: `TODO`; - Import & save publickey: `TODO`; - - Back: `__on_release__` method + - Back: `__on_release__` method """ - + def __init__(self, **kwargs): - super(SignScreen, self).__init__(**kwargs) + super().__init__(**kwargs) self._content = FileChooser( cancel=lambda: self._popup.dismiss, path=FileChooser.path, - on_submit=self.on_submit_file + on_submit=self.on_submit_file, ) self._popup = Popup( - title="Load a file", - content=self._content, - size_hint=(0.9, 0.9) + title="Load a file", content=self._content, size_hint=(0.9, 0.9) ) - self.file_input = StringProperty('') - self.file_content = StringProperty('') - self.file_hash = StringProperty('') + self.file_input = StringProperty("") + self.file_content = StringProperty("") + self.file_hash = StringProperty("") def on_press_sign_screen_load_file_and_export_hash_qrcode(self): - verbose_log('INFO', ' clicked') - self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = (.5, .5, .5, .5) - + """ + on_press_sign_screen_load_file_and_export_hash_qrcode + + - change background color of button to (.5,.5,.5,.5), + giving a visual effect of 'pressed' + """ + verbose_log( + "INFO", + " clicked", + ) + self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = ( + 0.5, + 0.5, + 0.5, + 0.5, + ) + def on_release_sign_screen_load_file_and_export_hash_qrcode(self): - verbose_log('INFO', ' released') - self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = (0, 0, 0, 0) + """ + on_release_sign_screen_load_file_and_export_hash_qrcode + + - change background color of button to (0, 0, 0, 0), + giving a visual effect of 'unpressed' + - open the FileChooser popup + """ + verbose_log( + "INFO", + " released", + ) + self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = ( + 0, + 0, + 0, + 0, + ) - verbose_log('INFO', ' opening') + verbose_log("INFO", " opening") self._popup.open() - - def on_back_main(self): - verbose_log('INFO', 'Clicking ') - self.manager.transition.direction = 'right' - self.manager.current = 'main' + + def on_press_back_main(self): + """ + on_press_back_main + + - change background color of button to (.5,.5,.5,.5), + giving a visual effect of 'pressed' + """ + verbose_log("INFO", "Clicking ") + self.ids.sign_screen_back.background_color = (0.5, 0.5, 0.5, 0.5) + + def on_release_back_main(self): + """ + on_release_back_main + + - change background color of button to (.5,.5,.5,.5), + giving a visual effect of 'pressed' + - go back to MainScreen + """ + verbose_log("INFO", "Clicking ") + self.ids.sign_screen_back.background_color = (0, 0, 0, 0) + self.manager.transition.direction = "right" + self.manager.current = "main" def on_submit_file(self, *args): + """ + on_submit_file + + Call `open_and_hash_file` to open, read and hash (sha256sum) + a given file + """ self.file_input = args[1][0] - verbose_log('INFO', f" loading {self.file_input}") - self.file_hash = open_and_hash_file( - path=self.file_input, - verbose=True - ) - verbose_log('INFO', f" hash: {self.file_hash}") + verbose_log("INFO", f" loading {self.file_input}") + self.file_hash = open_and_hash_file(path=self.file_input, verbose=True) + verbose_log("INFO", f" hash: {self.file_hash}") self._popup.dismiss() -class VerifyScreen(Screen): pass - -class KSignerApp(App): - +class VerifyScreen(Screen): + """ + VerifyScreen + + Is a sub-widget, managed by KSignerApp@ScreenManager + that executes signature verifications + """ + pass + + +class KSignerApp(App): + """ + KSignerApp is the Root widget + """ + def build(self): + """ + build + + Create the Root widget with an ScreenManager + as manager for its sub-widgets: + - main; + - sign; + - verify; + - TODO: others + """ # Create the screen manager - sm = ScreenManager() - sm.add_widget(MainScreen(name='main')) - sm.add_widget(SignScreen(name='sign')) - sm.add_widget(VerifyScreen(name='verify')) - return sm - -if __name__ == '__main__': + screen_manager = ScreenManager() + screen_manager.add_widget(MainScreen(name="main")) + screen_manager.add_widget(SignScreen(name="sign")) + screen_manager.add_widget(VerifyScreen(name="verify")) + return screen_manager + + +if __name__ == "__main__": app = KSignerApp() - app.run() \ No newline at end of file + app.run() diff --git a/src/ksigner.kv b/src/ksigner.kv index e989cc5..10d7783 100644 --- a/src/ksigner.kv +++ b/src/ksigner.kv @@ -16,7 +16,7 @@ font_name: 'terminus.ttf' background_color: 0, 0, 0, 0 color: 1, 1, 1, 1 - on_press: root.on_click_sign_button() + on_press: root.on_press_sign_button() on_release: root.on_release_sign_button() canvas.before: Color: @@ -32,7 +32,7 @@ font_name: 'terminus.ttf' background_color: 0, 0, 0, 0 color: 1, 1, 1, 1 - on_press: root.on_click_verify_button() + on_press: root.on_press_verify_button() on_release: root.on_release_verify_button() canvas.before: Color: @@ -100,14 +100,14 @@ Button: + id: sign_screen_back text: 'Back' font_size: root.height // 25 font_name: 'terminus.ttf' - background_color: 0, 0, 0, 0, + background_color: 0, 0, 0, 0 color: 1, 1, 1, 1 - on_press: - self.background_color = (.5, .5, .5, .5) - on_release: root.on_back_main() + on_press: root.on_press_back_main() + on_release: root.on_release_back_main() canvas.before: Color: rgba: 1, 1, 1, 1 diff --git a/src/logutils.py b/src/logutils.py index 8c8dea4..44322cf 100644 --- a/src/logutils.py +++ b/src/logutils.py @@ -4,15 +4,18 @@ simple log utilities """ import time + + class bcolors: - HEADER = '\033[95m' - OKBLUE = '\033[94m' - INFO = '\033[92m' - WARN = '\033[93m' - FAIL = '\033[91m' - ENDC = '\033[0m' - BOLD = '\033[1m' - UNDERLINE = '\033[4m' + HEADER = "\033[95m" + OKBLUE = "\033[94m" + INFO = "\033[92m" + WARN = "\033[93m" + FAIL = "\033[91m" + ENDC = "\033[0m" + BOLD = "\033[1m" + UNDERLINE = "\033[4m" + def now() -> str: """Return some formated time""" @@ -35,13 +38,13 @@ def verbose_log(v_type: str, v_data: str): :param v_data the message to be verbose """ - if (v_type == 'INFO'): + if v_type == "INFO": c = f"{bcolors.BOLD}{bcolors.INFO}" - - if (v_type == 'WARN'): + + if v_type == "WARN": c = f"{bcolors.BOLD}{bcolors.WARN}" - - if (v_type == 'FAIL'): + + if v_type == "FAIL": c = f"{bcolors.BOLD}{bcolors.FAIL}" print(f"[{c}{v_type}{bcolors.ENDC} ] [KSigner ] [{now()}] {v_data}") diff --git a/src/terminus.ttf b/src/terminus.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5c0ad64b9455af0c7668633cf37fa7742add2af8 GIT binary patch literal 463232 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

C<{+u@T^By7ft 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

wA|BLWp%n~1#Rp0~3IZTy&#ppZX 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 literal 0 HcmV?d00001 From cda8e4e54a85346049b7d83e290dcfb1d7995178 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Sat, 30 Sep 2023 21:33:43 -0300 Subject: [PATCH 010/104] separated many Screen classes to its modules --- src/filechooser.py | 34 ++++++++ src/ksigner-gui.py | 191 +------------------------------------------- src/ksigner.kv | 7 +- src/mainscreen.py | 72 +++++++++++++++++ src/signscreen.py | 126 +++++++++++++++++++++++++++++ src/verifyscreen.py | 49 ++++++++++++ 6 files changed, 287 insertions(+), 192 deletions(-) create mode 100644 src/filechooser.py create mode 100644 src/mainscreen.py create mode 100644 src/signscreen.py create mode 100644 src/verifyscreen.py diff --git a/src/filechooser.py b/src/filechooser.py new file mode 100644 index 0000000..1280446 --- /dev/null +++ b/src/filechooser.py @@ -0,0 +1,34 @@ +""" +filechooser.py + +implements a inherited class of FileChooserIconView +""" +#################### +# Standard libraries +#################### +import os + +######################## +# Thirdy party libraries +######################## +from kivy.uix.filechooser import FileChooserIconView + +# @see stackoverflow.complex/questions/65547279/ +# /no-name-object-property-in-module-kivy-properties +# -pylint-no-name-in-module +# pylint: disable=no-name-in-module +from kivy.properties import ObjectProperty + + +class FileChooser(FileChooserIconView): + """ + FileChooser + + Class to manage the file to choose in SignScreen and VerifyScreen + classes. In SignScreen, it will choose the file to load a content, + write it in a .sha256.txt file and show qrcode content. + """ + + loaded = ObjectProperty(None) + cancel = ObjectProperty(None) + path = os.path.expanduser("~") diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index 258e9e0..9f68c64 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -34,201 +34,16 @@ # Third party libraries ####################### from kivy.app import App -from kivy.uix.filechooser import FileChooserIconView from kivy.uix.screenmanager import ScreenManager, Screen -from kivy.uix.popup import Popup from kivy.properties import ObjectProperty, StringProperty ################# # Local libraries ################# from logutils import verbose_log -from hashutils import open_and_hash_file - - -class MainScreen(Screen): - """ - MainScreen - - Class to manage the two main buttons: - - - Sign; - - Verify; - """ - - def on_press_sign_button(self): - """ - on_press_sign_button - - - change background color of button to (.5,.5,.5,.5), - giving a visual effect of 'pressed' - """ - verbose_log("INFO", " clicked") - self.ids.main_screen_sign_button.background_color = (0.5, 0.5, 0.5, 0.5) - - def on_release_sign_button(self): - """ - on_release_sign_button - - - change background color of button to (0, 0, 0, 0), - giving a visual effect of 'unpressed' - - make a screen transition to SignScreen - """ - verbose_log("INFO", " released") - self.ids.main_screen_sign_button.background_color = (0, 0, 0, 0) - self.manager.transition.direction = "left" - self.manager.current = "sign" - - def on_press_verify_button(self): - """ - on_press_verify_button - - - change background color of button to (.5,.5,.5,.5), - giving a visual effect of 'pressed' - """ - verbose_log("INFO", " clicked") - self.ids.main_screen_verify_button.background_color = (0.5, 0.5, 0.5, 0.5) - - def on_release_verify_button(self): - """ - on_release_verify_button - - - change background color of button to (0, 0, 0, 0), - giving a visual effect of 'unpressed' - - make a screen transition to VerifyScreen - """ - verbose_log("INFO", " released") - self.ids.main_screen_verify_button.background_color = (0, 0, 0, 0) - self.manager.transition.direction = "left" - self.manager.current = "verify" - - -class FileChooser(FileChooserIconView): - """ - FileChooser - - Class to manage the file to choose in SignScreen and VerifyScreen - classes. In SignScreen, it will choose the file to load a content, - write it in a .sha256.txt file and show qrcode content. - """ - - loaded = ObjectProperty(None) - cancel = ObjectProperty(None) - path = os.path.expanduser("~") - - -class SignScreen(Screen): - """ - SignScreen - - Class to manage the creation of signatures. It has 4 buttons: - - - Load File & export hash QRCode: `show_load` method; - - Import & save signature: `TODO`; - - Import & save publickey: `TODO`; - - Back: `__on_release__` method - """ - - def __init__(self, **kwargs): - super().__init__(**kwargs) - self._content = FileChooser( - cancel=lambda: self._popup.dismiss, - path=FileChooser.path, - on_submit=self.on_submit_file, - ) - self._popup = Popup( - title="Load a file", content=self._content, size_hint=(0.9, 0.9) - ) - self.file_input = StringProperty("") - self.file_content = StringProperty("") - self.file_hash = StringProperty("") - - def on_press_sign_screen_load_file_and_export_hash_qrcode(self): - """ - on_press_sign_screen_load_file_and_export_hash_qrcode - - - change background color of button to (.5,.5,.5,.5), - giving a visual effect of 'pressed' - """ - verbose_log( - "INFO", - " clicked", - ) - self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = ( - 0.5, - 0.5, - 0.5, - 0.5, - ) - - def on_release_sign_screen_load_file_and_export_hash_qrcode(self): - """ - on_release_sign_screen_load_file_and_export_hash_qrcode - - - change background color of button to (0, 0, 0, 0), - giving a visual effect of 'unpressed' - - open the FileChooser popup - """ - verbose_log( - "INFO", - " released", - ) - self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = ( - 0, - 0, - 0, - 0, - ) - - verbose_log("INFO", " opening") - self._popup.open() - - def on_press_back_main(self): - """ - on_press_back_main - - - change background color of button to (.5,.5,.5,.5), - giving a visual effect of 'pressed' - """ - verbose_log("INFO", "Clicking ") - self.ids.sign_screen_back.background_color = (0.5, 0.5, 0.5, 0.5) - - def on_release_back_main(self): - """ - on_release_back_main - - - change background color of button to (.5,.5,.5,.5), - giving a visual effect of 'pressed' - - go back to MainScreen - """ - verbose_log("INFO", "Clicking ") - self.ids.sign_screen_back.background_color = (0, 0, 0, 0) - self.manager.transition.direction = "right" - self.manager.current = "main" - - def on_submit_file(self, *args): - """ - on_submit_file - - Call `open_and_hash_file` to open, read and hash (sha256sum) - a given file - """ - self.file_input = args[1][0] - verbose_log("INFO", f" loading {self.file_input}") - self.file_hash = open_and_hash_file(path=self.file_input, verbose=True) - verbose_log("INFO", f" hash: {self.file_hash}") - self._popup.dismiss() - - -class VerifyScreen(Screen): - """ - VerifyScreen - - Is a sub-widget, managed by KSignerApp@ScreenManager - that executes signature verifications - """ - pass - +from mainscreen import MainScreen +from signscreen import SignScreen +from verifyscreen import VerifyScreen class KSignerApp(App): """ diff --git a/src/ksigner.kv b/src/ksigner.kv index 10d7783..a2829fb 100644 --- a/src/ksigner.kv +++ b/src/ksigner.kv @@ -122,15 +122,14 @@ rows: 5 Button: + id: verify_screen_load_file_button text: 'Load file' font_size: root.height // 25 font_name: 'terminus.ttf' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 - on_press: - self.background_color = (.5, .5, .5, .5) - on_release: - self.background_color = (0, 0, 0, 0) + on_press: root.on_press_verify_screen_load_file_button() + on_release: root.on_release_verify_screen_load_file_button() canvas.before: Color: rgba: 1, 1, 1, 1 diff --git a/src/mainscreen.py b/src/mainscreen.py new file mode 100644 index 0000000..d145145 --- /dev/null +++ b/src/mainscreen.py @@ -0,0 +1,72 @@ +""" +mainscreen.py + +Implements an inherited kivy.uix.screenmanager.Screen +""" + +####################### +# Third party libraries +####################### +from kivy.uix.screenmanager import Screen + +################# +# Local libraries +################# +from logutils import verbose_log + + +class MainScreen(Screen): + """ + MainScreen + + Class to manage the two main buttons: + + - Sign; + - Verify; + """ + + def on_press_sign_button(self): + """ + on_press_sign_button + + - change background color of button to (.5,.5,.5,.5), + giving a visual effect of 'pressed' + """ + verbose_log("INFO", " clicked") + self.ids.main_screen_sign_button.background_color = (0.5, 0.5, 0.5, 0.5) + + def on_release_sign_button(self): + """ + on_release_sign_button + + - change background color of button to (0, 0, 0, 0), + giving a visual effect of 'unpressed' + - make a screen transition to SignScreen + """ + verbose_log("INFO", " released") + self.ids.main_screen_sign_button.background_color = (0, 0, 0, 0) + self.manager.transition.direction = "left" + self.manager.current = "sign" + + def on_press_verify_button(self): + """ + on_press_verify_button + + - change background color of button to (.5,.5,.5,.5), + giving a visual effect of 'pressed' + """ + verbose_log("INFO", " clicked") + self.ids.main_screen_verify_button.background_color = (0.5, 0.5, 0.5, 0.5) + + def on_release_verify_button(self): + """ + on_release_verify_button + + - change background color of button to (0, 0, 0, 0), + giving a visual effect of 'unpressed' + - make a screen transition to VerifyScreen + """ + verbose_log("INFO", " released") + self.ids.main_screen_verify_button.background_color = (0, 0, 0, 0) + self.manager.transition.direction = "left" + self.manager.current = "verify" diff --git a/src/signscreen.py b/src/signscreen.py new file mode 100644 index 0000000..255c5ff --- /dev/null +++ b/src/signscreen.py @@ -0,0 +1,126 @@ +""" +signscreen.py + +An inherited implementations of kivy.uix.screenmanager Screen +""" + +##################### +# Thirparty libraries +##################### +from kivy.uix.screenmanager import Screen +from kivy.uix.popup import Popup + +# @see stackoverflow.complex/questions/65547279/ +# /no-name-object-property-in-module-kivy-properties +# -pylint-no-name-in-module +# pylint: disable=no-name-in-module +from kivy.properties import StringProperty + +################# +# Local libraries +################# +from logutils import verbose_log +from hashutils import open_and_hash_file +from filechooser import FileChooser + +class SignScreen(Screen): + """ + SignScreen + + Class to manage the creation of signatures. It has 4 buttons: + + - Load File & export hash QRCode: `show_load` method; + - Import & save signature: `TODO`; + - Import & save publickey: `TODO`; + - Back: `__on_release__` method + """ + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self._content = FileChooser( + cancel=lambda: self._popup.dismiss, + path=FileChooser.path, + on_submit=self.on_submit_file, + ) + self._popup = Popup( + title="Load a file", content=self._content, size_hint=(0.9, 0.9) + ) + self.file_input = StringProperty("") + self.file_content = StringProperty("") + self.file_hash = StringProperty("") + + def on_press_sign_screen_load_file_and_export_hash_qrcode(self): + """ + on_press_sign_screen_load_file_and_export_hash_qrcode + + - change background color of button to (.5,.5,.5,.5), + giving a visual effect of 'pressed' + """ + verbose_log( + "INFO", + " clicked", + ) + self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = ( + 0.5, + 0.5, + 0.5, + 0.5, + ) + + def on_release_sign_screen_load_file_and_export_hash_qrcode(self): + """ + on_release_sign_screen_load_file_and_export_hash_qrcode + + - change background color of button to (0, 0, 0, 0), + giving a visual effect of 'unpressed' + - open the FileChooser popup + """ + verbose_log( + "INFO", + " released", + ) + self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = ( + 0, + 0, + 0, + 0, + ) + + verbose_log("INFO", " opening") + self._popup.open() + + def on_press_back_main(self): + """ + on_press_back_main + + - change background color of button to (.5,.5,.5,.5), + giving a visual effect of 'pressed' + """ + verbose_log("INFO", "Clicking ") + self.ids.sign_screen_back.background_color = (0.5, 0.5, 0.5, 0.5) + + def on_release_back_main(self): + """ + on_release_back_main + + - change background color of button to (.5,.5,.5,.5), + giving a visual effect of 'pressed' + - go back to MainScreen + """ + verbose_log("INFO", "Clicking ") + self.ids.sign_screen_back.background_color = (0, 0, 0, 0) + self.manager.transition.direction = "right" + self.manager.current = "main" + + def on_submit_file(self, *args): + """ + on_submit_file + + Call `open_and_hash_file` to open, read and hash (sha256sum) + a given file + """ + self.file_input = args[1][0] + verbose_log("INFO", f" loading {self.file_input}") + self.file_hash = open_and_hash_file(path=self.file_input, verbose=True) + verbose_log("INFO", f" hash: {self.file_hash}") + self._popup.dismiss() diff --git a/src/verifyscreen.py b/src/verifyscreen.py new file mode 100644 index 0000000..7a94127 --- /dev/null +++ b/src/verifyscreen.py @@ -0,0 +1,49 @@ +""" +verifyscreen.py + +Implements an inhrited kivy.uix.screenmanager.Screen +""" + +###################### +# Thirdparty libraries +###################### +from kivy.uix.screenmanager import Screen + +################# +# Local libraries +################# +from logutils import verbose_log + +class VerifyScreen(Screen): + """ + VerifyScreen + + Is a sub-widget, managed by KSignerApp@ScreenManager + that executes signature verifications + + - [x] Load file + - [x] Load signature + - Load publickey + - Verify signature + """ + + def on_press_verify_screen_load_file_button(self): + """ + on_press_verify_screen_load_file_button + + - change background color of button to (.5,.5,.5,.5), + giving a visual effect of 'pressed' + """ + verbose_log("INFO", " clicked") + self.ids.verify_screen_load_file_button.background_color = (0.5, 0.5, 0.5, 0.5) + + def on_release_verify_screen_load_file_button(self): + """ + on_release_verify_screen_load_file_button + + - change background color of button to (0, 0, 0, 0), + giving a visual effect of 'unpressed' + - make a screen transition to SignScreen + """ + verbose_log("INFO", " released") + self.ids.verify_screen_load_file_button.background_color = (0, 0, 0, 0) From b984d001f36124f4f11cecf48552743a51866bf8 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Sun, 1 Oct 2023 10:52:22 -0300 Subject: [PATCH 011/104] added a .pylintrc file added ksigner-gui and ksigner-cli to good-names in .pylintrc --- .pylintrc | 633 ++++++++++++++++++++++++++++++++++++++++++++ src/ksigner-gui.py | 20 +- src/verifyscreen.py | 2 +- 3 files changed, 644 insertions(+), 11 deletions(-) create mode 100644 .pylintrc diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 0000000..708a60c --- /dev/null +++ b/.pylintrc @@ -0,0 +1,633 @@ +[MAIN] + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + +# Clear in-memory caches upon conclusion of linting. Useful if running pylint +# in a server-like mode. +clear-cache-post-run=no + +# Load and enable all available extensions. Use --list-extensions to see a list +# all available extensions. +#enable-all-extensions= + +# In error mode, messages with a category besides ERROR or FATAL are +# suppressed, and no reports are done by default. Error mode is compatible with +# disabling specific errors. +#errors-only= + +# Always return a 0 (non-error) status code, even if lint errors are found. +# This is primarily useful in continuous integration scripts. +#exit-zero= + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code. +extension-pkg-allow-list= + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code. (This is an alternative name to extension-pkg-allow-list +# for backward compatibility.) +extension-pkg-whitelist= + +# Return non-zero exit code if any of these messages/categories are detected, +# even if score is above --fail-under value. Syntax same as enable. Messages +# specified are enabled, while categories only check already-enabled messages. +fail-on= + +# Specify a score threshold under which the program will exit with error. +fail-under=10 + +# Interpret the stdin as a python script, whose filename needs to be passed as +# the module_or_package argument. +#from-stdin= + +# Files or directories to be skipped. They should be base names, not paths. +ignore=CVS + +# Add files or directories matching the regular expressions patterns to the +# ignore-list. The regex matches against paths and can be in Posix or Windows +# format. Because '\\' represents the directory delimiter on Windows systems, +# it can't be used as an escape character. +ignore-paths= + +# Files or directories matching the regular expression patterns are skipped. +# The regex matches against base names, not paths. The default value ignores +# Emacs file locks +ignore-patterns=^\.# + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis). It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the +# number of processors available to use, and will cap the count on Windows to +# avoid hangs. +jobs=1 + +# Control the amount of potential inferred values when inferring a single +# object. This can help the performance when dealing with large functions or +# complex, nested conditions. +limit-inference-results=100 + +# List of plugins (as comma separated values of python module names) to load, +# usually to register additional checkers. +load-plugins= + +# Pickle collected data for later comparisons. +persistent=yes + +# Minimum Python version to use for version dependent checks. Will default to +# the version used to run pylint. +py-version=3.11 + +# Discover python modules and packages in the file system subtree. +recursive=no + +# Add paths to the list of the source roots. Supports globbing patterns. The +# source root is an absolute path or a path relative to the current working +# directory used to determine a package namespace for modules located under the +# source root. +source-roots= + +# When enabled, pylint would attempt to guess common misconfiguration and emit +# user-friendly hints instead of false-positive error messages. +suggestion-mode=yes + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + +# In verbose mode, extra non-checker-related info will be displayed. +#verbose= + + +[BASIC] + +# Naming style matching correct argument names. +argument-naming-style=snake_case + +# Regular expression matching correct argument names. Overrides argument- +# naming-style. If left empty, argument names will be checked with the set +# naming style. +#argument-rgx= + +# Naming style matching correct attribute names. +attr-naming-style=snake_case + +# Regular expression matching correct attribute names. Overrides attr-naming- +# style. If left empty, attribute names will be checked with the set naming +# style. +#attr-rgx= + +# Bad variable names which should always be refused, separated by a comma. +bad-names=foo, + bar, + baz, + toto, + tutu, + tata + +# Bad variable names regexes, separated by a comma. If names match any regex, +# they will always be refused +bad-names-rgxs= + +# Naming style matching correct class attribute names. +class-attribute-naming-style=any + +# Regular expression matching correct class attribute names. Overrides class- +# attribute-naming-style. If left empty, class attribute names will be checked +# with the set naming style. +#class-attribute-rgx= + +# Naming style matching correct class constant names. +class-const-naming-style=UPPER_CASE + +# Regular expression matching correct class constant names. Overrides class- +# const-naming-style. If left empty, class constant names will be checked with +# the set naming style. +#class-const-rgx= + +# Naming style matching correct class names. +class-naming-style=PascalCase + +# Regular expression matching correct class names. Overrides class-naming- +# style. If left empty, class names will be checked with the set naming style. +#class-rgx= + +# Naming style matching correct constant names. +const-naming-style=UPPER_CASE + +# Regular expression matching correct constant names. Overrides const-naming- +# style. If left empty, constant names will be checked with the set naming +# style. +#const-rgx= + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + +# Naming style matching correct function names. +function-naming-style=snake_case + +# Regular expression matching correct function names. Overrides function- +# naming-style. If left empty, function names will be checked with the set +# naming style. +#function-rgx= + +# Good variable names which should always be accepted, separated by a comma. +good-names=i, + j, + k, + ex, + Run, + _, + ksigner-cli, + ksigner-gui + +# Good variable names regexes, separated by a comma. If names match any regex, +# they will always be accepted +good-names-rgxs= + +# Include a hint for the correct naming format with invalid-name. +include-naming-hint=no + +# Naming style matching correct inline iteration names. +inlinevar-naming-style=any + +# Regular expression matching correct inline iteration names. Overrides +# inlinevar-naming-style. If left empty, inline iteration names will be checked +# with the set naming style. +#inlinevar-rgx= + +# Naming style matching correct method names. +method-naming-style=snake_case + +# Regular expression matching correct method names. Overrides method-naming- +# style. If left empty, method names will be checked with the set naming style. +#method-rgx= + +# Naming style matching correct module names. +module-naming-style=snake_case + +# Regular expression matching correct module names. Overrides module-naming- +# style. If left empty, module names will be checked with the set naming style. +#module-rgx= + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=^_ + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +# These decorators are taken in consideration only for invalid-name. +property-classes=abc.abstractproperty + +# Regular expression matching correct type alias names. If left empty, type +# alias names will be checked with the set naming style. +#typealias-rgx= + +# Regular expression matching correct type variable names. If left empty, type +# variable names will be checked with the set naming style. +#typevar-rgx= + +# Naming style matching correct variable names. +variable-naming-style=snake_case + +# Regular expression matching correct variable names. Overrides variable- +# naming-style. If left empty, variable names will be checked with the set +# naming style. +#variable-rgx= + + +[CLASSES] + +# Warn about protected attribute access inside special methods +check-protected-access-in-special-methods=no + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp, + asyncSetUp, + __post_init__ + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict,_fields,_replace,_source,_make,os._exit + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + + +[DESIGN] + +# List of regular expressions of class ancestor names to ignore when counting +# public methods (see R0903) +exclude-too-few-public-methods= + +# List of qualified class names to ignore when counting class parents (see +# R0901) +ignored-parents= + +# Maximum number of arguments for function / method. +max-args=5 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Maximum number of boolean expressions in an if statement (see R0916). +max-bool-expr=5 + +# Maximum number of branch for function / method body. +max-branches=12 + +# Maximum number of locals for function / method body. +max-locals=15 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + +# Maximum number of return / yield for function / method body. +max-returns=6 + +# Maximum number of statements in function / method body. +max-statements=50 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when caught. +overgeneral-exceptions=builtins.BaseException,builtins.Exception + + +[FORMAT] + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Maximum number of characters on a single line. +max-line-length=100 + +# Maximum number of lines in a module. +max-module-lines=1000 + +# Allow the body of a class to be on the same line as the declaration if body +# contains single statement. +single-line-class-stmt=no + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + + +[IMPORTS] + +# List of modules that can be imported at any level, not just the top level +# one. +allow-any-import-level= + +# Allow explicit reexports by alias from a package __init__. +allow-reexport-from-package=no + +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no + +# Deprecated modules which should not be used, separated by a comma. +deprecated-modules= + +# Output a graph (.gv or any supported image format) of external dependencies +# to the given file (report RP0402 must not be disabled). +ext-import-graph= + +# Output a graph (.gv or any supported image format) of all (i.e. internal and +# external) dependencies to the given file (report RP0402 must not be +# disabled). +import-graph= + +# Output a graph (.gv or any supported image format) of internal dependencies +# to the given file (report RP0402 must not be disabled). +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + +# Couples of modules and preferred modules, separated by a comma. +preferred-modules= + + +[LOGGING] + +# The type of string formatting that logging methods do. `old` means using % +# formatting, `new` is for `{}` formatting. +logging-format-style=old + +# Logging modules to check that the string format arguments are in logging +# function parameter format. +logging-modules=logging + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE, +# UNDEFINED. +confidence=HIGH, + CONTROL_FLOW, + INFERENCE, + INFERENCE_FAILURE, + UNDEFINED + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once). You can also use "--disable=all" to +# disable everything first and then re-enable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use "--disable=all --enable=classes +# --disable=W". +disable=raw-checker-failed, + bad-inline-option, + locally-disabled, + file-ignored, + suppressed-message, + useless-suppression, + deprecated-pragma, + use-symbolic-message-instead + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +enable=c-extension-no-member + + +[METHOD_ARGS] + +# List of qualified names (i.e., library.method) which require a timeout +# parameter e.g. 'requests.api.get,requests.api.post' +timeout-methods=requests.api.delete,requests.api.get,requests.api.head,requests.api.options,requests.api.patch,requests.api.post,requests.api.put,requests.api.request + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME, + XXX, + TODO + +# Regular expression of note tags to take in consideration. +notes-rgx= + + +[REFACTORING] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + +# Complete name of functions that never returns. When checking for +# inconsistent-return-statements if a never returning function is called then +# it will be considered as an explicit return statement and no message will be +# printed. +never-returning-functions=sys.exit,argparse.parse_error + + +[REPORTS] + +# Python expression which should return a score less than or equal to 10. You +# have access to the variables 'fatal', 'error', 'warning', 'refactor', +# 'convention', and 'info' which contain the number of messages in each +# category, as well as 'statement' which is the total number of statements +# analyzed. This score is used by the global evaluation report (RP0004). +evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details. +msg-template= + +# Set the output format. Available formats are text, parseable, colorized, json +# and msvs (visual studio). You can also give a reporter class, e.g. +# mypackage.mymodule.MyReporterClass. +#output-format= + +# Tells whether to display a full report or only the messages. +reports=no + +# Activate the evaluation score. +score=yes + + +[SIMILARITIES] + +# Comments are removed from the similarity computation +ignore-comments=yes + +# Docstrings are removed from the similarity computation +ignore-docstrings=yes + +# Imports are removed from the similarity computation +ignore-imports=yes + +# Signatures are removed from the similarity computation +ignore-signatures=yes + +# Minimum lines number of a similarity. +min-similarity-lines=4 + + +[SPELLING] + +# Limits count of emitted suggestions for spelling mistakes. +max-spelling-suggestions=4 + +# Spelling dictionary name. No available dictionaries : You need to install +# both the python package and the system dependency for enchant to work.. +spelling-dict= + +# List of comma separated words that should be considered directives if they +# appear at the beginning of a comment and should not be checked. +spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy: + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains the private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to the private dictionary (see the +# --spelling-private-dict-file option) instead of raising a message. +spelling-store-unknown-words=no + + +[STRING] + +# This flag controls whether inconsistent-quotes generates a warning when the +# character used as a quote delimiter is used inconsistently within a module. +check-quote-consistency=no + +# This flag controls whether the implicit-str-concat should generate a warning +# on implicit string concatenation in sequences defined over several lines. +check-str-concat-over-line-jumps=no + + +[TYPECHECK] + +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + +# Tells whether to warn about missing members when the owner of the attribute +# is inferred to be None. +ignore-none=yes + +# This flag controls whether pylint should warn about no-member and similar +# checks whenever an opaque object is returned when inferring. The inference +# can return multiple potential results while evaluating a Python object, but +# some branches might not be evaluated, which results in partial inference. In +# that case, it might be useful to still emit no-member and other checks for +# the rest of the inferred objects. +ignore-on-opaque-inference=yes + +# List of symbolic message names to ignore for Mixin members. +ignored-checks-for-mixins=no-member, + not-async-context-manager, + not-context-manager, + attribute-defined-outside-init + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes=optparse.Values,thread._local,_thread._local,argparse.Namespace + +# Show a hint with possible names when a member name was not found. The aspect +# of finding the hint is based on edit distance. +missing-member-hint=yes + +# The minimum edit distance a name should have in order to be considered a +# similar match for a missing member name. +missing-member-hint-distance=1 + +# The total number of similar names that should be taken in consideration when +# showing a hint for a missing member. +missing-member-max-choices=1 + +# Regex pattern to define which classes are considered mixins. +mixin-class-rgx=.*[Mm]ixin + +# List of decorators that change the signature of a decorated function. +signature-mutators= + + +[VARIABLES] + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid defining new builtins when possible. +additional-builtins= + +# Tells whether unused global variables should be treated as a violation. +allow-global-unused-variables=yes + +# List of names allowed to shadow builtins +allowed-redefined-builtins= + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_, + _cb + +# A regular expression matching the name of dummy variables (i.e. expected to +# not be used). +dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ + +# Argument names that match this expression will be ignored. +ignored-argument-names=_.*|^ignored_|^unused_ + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index 9f68c64..0ef26ae 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -25,23 +25,17 @@ A simple Graphical User Interface built with kivy """ -#################### -# Standard libraries -#################### -import os - ####################### # Third party libraries ####################### from kivy.app import App -from kivy.uix.screenmanager import ScreenManager, Screen -from kivy.properties import ObjectProperty, StringProperty +from kivy.uix.screenmanager import ScreenManager ################# # Local libraries ################# from logutils import verbose_log -from mainscreen import MainScreen +from mainscreen import MainScreen from signscreen import SignScreen from verifyscreen import VerifyScreen @@ -49,7 +43,7 @@ class KSignerApp(App): """ KSignerApp is the Root widget """ - + def build(self): """ build @@ -62,10 +56,16 @@ def build(self): - verify; - TODO: others """ - # Create the screen manager + verbose_log('INFO', 'Creating ScreenManager') screen_manager = ScreenManager() + + verbose_log('INFO', 'Adding ') screen_manager.add_widget(MainScreen(name="main")) + + verbose_log('INFO', 'Adding ') screen_manager.add_widget(SignScreen(name="sign")) + + verbose_log('INFO', 'Adding ') screen_manager.add_widget(VerifyScreen(name="verify")) return screen_manager diff --git a/src/verifyscreen.py b/src/verifyscreen.py index 7a94127..a5a823e 100644 --- a/src/verifyscreen.py +++ b/src/verifyscreen.py @@ -26,7 +26,7 @@ class VerifyScreen(Screen): - Load publickey - Verify signature """ - + def on_press_verify_screen_load_file_button(self): """ on_press_verify_screen_load_file_button From 7cad7114feceeba5d23dfc2ca2f85619ad8e2772 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Sun, 1 Oct 2023 11:21:02 -0300 Subject: [PATCH 012/104] linted all files --- .pylintrc | 2 +- src/callbacks.py | 8 ++++---- src/hashutils.py | 2 +- src/logutils.py | 33 +++++++++++++++++++++------------ src/pemutils.py | 12 ++++++------ src/processingutils.py | 4 ++-- src/qrutils.py | 8 ++++---- src/signandverifyutils.py | 4 ++-- src/videoutils.py | 26 +++++++++++++------------- 9 files changed, 54 insertions(+), 45 deletions(-) diff --git a/.pylintrc b/.pylintrc index 708a60c..582a0a5 100644 --- a/.pylintrc +++ b/.pylintrc @@ -557,7 +557,7 @@ contextmanager-decorators=contextlib.contextmanager # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E1101 when accessed. Python regular # expressions are accepted. -generated-members= +generated-members=cv2 # Tells whether to warn about missing members when the owner of the attribute # is inferred to be None. diff --git a/src/callbacks.py b/src/callbacks.py index b4cdb01..756290c 100644 --- a/src/callbacks.py +++ b/src/callbacks.py @@ -58,10 +58,10 @@ def on_sign(parser: argparse.ArgumentParser): save_hashed_file(data=data, path=args.file_to_sign, verbose=args.verbose) # Shows some message - verbose_log("To sign this file with Krux: ") - verbose_log(" (a) load a 24 words key;") - verbose_log(" (b) use the Sign->Message feature;") - verbose_log(" (c) and scan this QR code below.") + verbose_log("INFO", "To sign this file with Krux: ") + verbose_log("INFO", " (a) load a 24 words key;") + verbose_log("INFO", " (b) use the Sign->Message feature;") + verbose_log("INFO", " (c) and scan this QR code below.") # Prints the QR code __qrcode__ = make_qr_code(data=data, verbose=args.verbose) diff --git a/src/hashutils.py b/src/hashutils.py index 35a55a8..2dae843 100644 --- a/src/hashutils.py +++ b/src/hashutils.py @@ -66,7 +66,7 @@ def save_hashed_file(**kwargs): __hash_file__ = f"{__path__}.sha256sum.txt" if verbose: - verbose_log(f"Saving a hash file: {__hash_file__}") + verbose_log("INFO", f"Saving a hash file: {__hash_file__}") with open(__hash_file__, mode="w", encoding="utf-8") as hash_file: hash_file.write(f"{__data__} {__hash_file__}") diff --git a/src/logutils.py b/src/logutils.py index 44322cf..519ad77 100644 --- a/src/logutils.py +++ b/src/logutils.py @@ -5,8 +5,11 @@ """ import time - -class bcolors: +# pylint: disable=too-few-public-methods +class Bcolors: + """ + Simple class to manage colors in terminal + """ HEADER = "\033[95m" OKBLUE = "\033[94m" INFO = "\033[92m" @@ -16,6 +19,20 @@ class bcolors: BOLD = "\033[1m" UNDERLINE = "\033[4m" + @staticmethod + # pylint: disable=inconsistent-return-statements + def build_v_type(v_type: str) -> str: + """ + Get a type and convert into formated color + """ + if v_type == "INFO": + return f"{Bcolors.BOLD}{Bcolors.INFO}{v_type}{Bcolors.ENDC}" + + if v_type == "WARN": + return f"{Bcolors.BOLD}{Bcolors.WARN}{v_type}{Bcolors.ENDC}" + + if v_type == "FAIL": + return f"{Bcolors.BOLD}{Bcolors.FAIL}{v_type}{Bcolors.ENDC}" def now() -> str: """Return some formated time""" @@ -38,13 +55,5 @@ def verbose_log(v_type: str, v_data: str): :param v_data the message to be verbose """ - if v_type == "INFO": - c = f"{bcolors.BOLD}{bcolors.INFO}" - - if v_type == "WARN": - c = f"{bcolors.BOLD}{bcolors.WARN}" - - if v_type == "FAIL": - c = f"{bcolors.BOLD}{bcolors.FAIL}" - - print(f"[{c}{v_type}{bcolors.ENDC} ] [KSigner ] [{now()}] {v_data}") + vtype = Bcolors.build_v_type(v_type) + print(f"[{vtype} ] [KSigner ] [{now()}] {v_data}") diff --git a/src/pemutils.py b/src/pemutils.py index acf4352..ce150c5 100644 --- a/src/pemutils.py +++ b/src/pemutils.py @@ -47,23 +47,23 @@ def create_public_key_certificate(**kwargs): # Choose if will be compressed or uncompressed if uncompressed: if verbose: - verbose_log("Creating uncompressed public key certificate") + verbose_log("INFO", "Creating uncompressed public key certificate") __public_key_data__ = f"{KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND}{hex_pubkey}" else: if verbose: - verbose_log("Creating compressed public key certificate") + verbose_log("INFO", "Creating compressed public key certificate") __public_key_data__ = f"{KSIGNER_COMPRESSED_PUBKEY_PREPEND}{hex_pubkey}" # Convert pubkey data to bytes __public_key_data_bytes__ = bytes.fromhex(__public_key_data__) if verbose: - verbose_log(f"pubkey bytes: {__public_key_data_bytes__}") + verbose_log("INFO", f"pubkey bytes: {__public_key_data_bytes__}") # Decode to utf8 __public_key_data_utf8__ = __public_key_data_bytes__.decode("utf-8") if verbose: - verbose_log(f"pubkey utf8: {__public_key_data_utf8__}") + verbose_log("INFO", f"pubkey utf8: {__public_key_data_utf8__}") # Encode to formated base64 __pem_pub_key__ = "\n".join( @@ -75,11 +75,11 @@ def create_public_key_certificate(**kwargs): ) if verbose: - verbose_log(__pem_pub_key__) + verbose_log("INFO", __pem_pub_key__) __pem_key_file__ = f"{owner}.pem" if verbose: - verbose_log(f"Saving public key file: {__pem_key_file__}") + verbose_log("INFO", f"Saving public key file: {__pem_key_file__}") with open(file=__pem_key_file__, mode="w", encoding="utf-8") as pem_file: pem_file.write(__pem_pub_key__) diff --git a/src/processingutils.py b/src/processingutils.py index a53f68c..2f9173b 100644 --- a/src/processingutils.py +++ b/src/processingutils.py @@ -37,7 +37,7 @@ def normalization_transform(**kwargs): # Verbose some data if verbose: - verbose_log(f"normalized (frame={frame})") + verbose_log("INFO", f"normalized (frame={frame})") def gray_transform(**kwargs): @@ -59,4 +59,4 @@ def gray_transform(**kwargs): # verbose_loge some data if verbose: - verbose_log(f"gray scale (frame={frame})") + verbose_log("INFO", f"gray scale (frame={frame})") diff --git a/src/qrutils.py b/src/qrutils.py index a4a492a..a0ea878 100644 --- a/src/qrutils.py +++ b/src/qrutils.py @@ -35,12 +35,12 @@ def make_qr_code(**kwargs) -> str: qr_code = QRCode() if verbose: - verbose_log(f"Adding (data={qr_data})") + verbose_log("INFO", f"Adding (data={qr_data})") qr_code.add_data(qr_data) if verbose: - verbose_log("Converting data to ascii") + verbose_log("INFO", "Converting data to ascii") qr_string = StringIO() qr_code.print_ascii(out=qr_string, invert=True) @@ -64,12 +64,12 @@ def make_qr_code_image(**kwargs) -> str: qr_code = QRCode() if verbose: - verbose_log(f"Adding (data={qr_data})") + verbose_log("INFO", f"Adding (data={qr_data})") qr_code.add_data(qr_data) if verbose: - verbose_log("Creating image") + verbose_log("INFO", "Creating image") qr_image = qr_code.make_image() return qr_image diff --git a/src/signandverifyutils.py b/src/signandverifyutils.py index 7412ab2..9b1de99 100644 --- a/src/signandverifyutils.py +++ b/src/signandverifyutils.py @@ -62,7 +62,7 @@ def verify(**kwargs): Apply verbose or no """ - verbose_log("Verifying signature:") + verbose_log("INFO", "Verifying signature:") file2verify = kwargs.get("filename") pubkey_file = kwargs.get("pubkey") @@ -74,7 +74,7 @@ def verify(**kwargs): file=file2verify, pubkey=pubkey_file, signature=sig_file ) if verbose: - verbose_log(__command__) + verbose_log("INFO", __command__) subprocess.run(__command__, check=True, shell=True) except subprocess.CalledProcessError as __exc__: raise subprocess.CalledProcessError( diff --git a/src/videoutils.py b/src/videoutils.py index abd16a3..e5f7999 100644 --- a/src/videoutils.py +++ b/src/videoutils.py @@ -43,10 +43,10 @@ def scan(**kwargs) -> str: is_normalized = kwargs.get("is_normalized") is_gray_scale = kwargs.get("is_gray_scale") - verbose_log("Opening camera") + verbose_log("INFO", "Opening camera") vid = cv2.VideoCapture(0) - verbose_log("Starting detection") + verbose_log("INFO", "Starting detection") detector = cv2.QRCodeDetector() qr_data = None @@ -69,20 +69,20 @@ def scan(**kwargs) -> str: # Verbose some data if verbose: - verbose_log(f"reading (qr_data={qr_data})") - verbose_log(f"reading (_bbox={_bbox}") - verbose_log(f"reading (_straight_qrcode={_straight_qrcode})") + verbose_log("INFO", f"reading (qr_data={qr_data})") + verbose_log("INFO", f"reading (_bbox={_bbox}") + verbose_log("INFO", f"reading (_straight_qrcode={_straight_qrcode})") # Verify null data if verbose: - verbose_log(f"len(qr_data) = {len(qr_data)}") + verbose_log("INFO", f"len(qr_data) = {len(qr_data)}") if len(qr_data) > 0: break # Display the resulting frame if verbose: - verbose_log(f"Showing (frame={frame})") + verbose_log("INFO", f"Showing (frame={frame})") # Show image cv2.imshow("frame", frame) @@ -92,18 +92,18 @@ def scan(**kwargs) -> str: # desired button of your choice if cv2.waitKey(1) & 0xFF == ord("q"): if verbose: - verbose_log("quiting QRCode detection...") + verbose_log("INFO", "quiting QRCode detection...") break # After the loop release the cap object if verbose: - verbose_log("Releasing video...") + verbose_log("INFO", "Releasing video...") vid.release() # Destroy all the windows if verbose: - verbose_log("Destroying all ksigner windows...") + verbose_log("INFO", "Destroying all ksigner windows...") cv2.destroyAllWindows() @@ -134,11 +134,11 @@ def scan_and_save_signature(**kwargs): # Encode data binary_signature = base64.b64decode(signature.encode()) if verbose: - verbose_log(f"Signature: {binary_signature}") + verbose_log("INFO", f"Signature: {binary_signature}") # Saves a signature signature_file = f"{filename}.sig" - verbose_log(f"Saving a signature file: {signature_file}") + verbose_log("INFO", f"Saving a signature file: {signature_file}") with open(signature_file, "wb") as sig_file: sig_file.write(binary_signature) @@ -164,6 +164,6 @@ def scan_public_key(**kwargs) -> str: ) if verbose: - verbose_log(f"Public key: {public_key}") + verbose_log("INFO", f"Public key: {public_key}") return public_key From f6e0e4b4b1dfc5447d5ef5375e281015b0175167 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Mon, 2 Oct 2023 11:24:08 -0300 Subject: [PATCH 013/104] replaced FileChooserIconView to FileChooserListView once the last is able to browse files on directories --- src/filechooser.py | 10 +++++----- src/signscreen.py | 10 ++++++---- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/filechooser.py b/src/filechooser.py index 1280446..6addb89 100644 --- a/src/filechooser.py +++ b/src/filechooser.py @@ -11,16 +11,16 @@ ######################## # Thirdy party libraries ######################## -from kivy.uix.filechooser import FileChooserIconView +from kivy.uix.filechooser import FileChooserListView # @see stackoverflow.complex/questions/65547279/ # /no-name-object-property-in-module-kivy-properties # -pylint-no-name-in-module # pylint: disable=no-name-in-module -from kivy.properties import ObjectProperty +from kivy.properties import ObjectProperty, BooleanProperty -class FileChooser(FileChooserIconView): +class LoadDialog(FileChooserListView): """ FileChooser @@ -28,7 +28,7 @@ class FileChooser(FileChooserIconView): classes. In SignScreen, it will choose the file to load a content, write it in a .sha256.txt file and show qrcode content. """ - - loaded = ObjectProperty(None) + load = ObjectProperty(None) cancel = ObjectProperty(None) + dirseclect = BooleanProperty(True) path = os.path.expanduser("~") diff --git a/src/signscreen.py b/src/signscreen.py index 255c5ff..3e2e691 100644 --- a/src/signscreen.py +++ b/src/signscreen.py @@ -21,7 +21,7 @@ ################# from logutils import verbose_log from hashutils import open_and_hash_file -from filechooser import FileChooser +from filechooser import LoadDialog class SignScreen(Screen): """ @@ -37,13 +37,15 @@ class SignScreen(Screen): def __init__(self, **kwargs): super().__init__(**kwargs) - self._content = FileChooser( + self._content = LoadDialog( + load=LoadDialog.load, cancel=lambda: self._popup.dismiss, - path=FileChooser.path, on_submit=self.on_submit_file, ) self._popup = Popup( - title="Load a file", content=self._content, size_hint=(0.9, 0.9) + title="Load a file", + content=self._content, + size_hint=(0.9, 0.9) ) self.file_input = StringProperty("") self.file_content = StringProperty("") From ed340d8993f1766c3466e77c30f5ed9edb762b48 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Mon, 2 Oct 2023 12:05:51 -0300 Subject: [PATCH 014/104] Hashing files on Load file and encode to QRCode --- pyproject.toml | 1 + src/qrutils.py | 34 ++++++++++++++++++++++++++++++++++ src/signscreen.py | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 38b7526..e7e3b19 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,6 +16,7 @@ qrcode = "^7.4.2" pillow = "^10.0.1" pyzbar = "^0.1.9" kivy = "^2.2.1" +pyqrcode = "^1.2.1" [tool.poetry.group.dev.dependencies] black = "^23.9.1" diff --git a/src/qrutils.py b/src/qrutils.py index a0ea878..cac39ca 100644 --- a/src/qrutils.py +++ b/src/qrutils.py @@ -12,12 +12,46 @@ # Thrid party libraries ####################### from qrcode import QRCode +import pyqrcode ################# # Local libraries ################# from logutils import verbose_log +def encode_to_string(data): + #pre-decode if binary (Compact Seed QR) + try: + code_str = pyqrcode.create(data, error="L", mode="binary").text() + except: + # Try binary + data = data.decode('latin-1') + code_str = pyqrcode.create(data, error="L", mode="binary").text() + # if len(data) in (48,96) and isinstance(data, str): # Seed QR + code_str = pyqrcode.create(data, error="L").text() + # else: + # code_str = pyqrcode.create(data, error="M", mode="binary").text() + size = 0 + while code_str[size] != "\n": + size += 1 + i = 0 + padding = 0 + while code_str[i] != "1": + if code_str[i] == "\n": + padding += 1 + i += 1 + code_str = code_str[(padding) * (size + 1) : -(padding) * (size + 1)] + size -= 2 * padding + + new_code_str = "" + for i in range(size): + for j in range(size + 2 * padding + 1): + if padding <= j < size + padding: + index = i * (size + 2 * padding + 1) + j + new_code_str += code_str[index] + new_code_str += "\n" + + return new_code_str def make_qr_code(**kwargs) -> str: """ diff --git a/src/signscreen.py b/src/signscreen.py index 3e2e691..c21c1c5 100644 --- a/src/signscreen.py +++ b/src/signscreen.py @@ -3,6 +3,8 @@ An inherited implementations of kivy.uix.screenmanager Screen """ +import os +import tempfile ##################### # Thirparty libraries @@ -15,12 +17,15 @@ # -pylint-no-name-in-module # pylint: disable=no-name-in-module from kivy.properties import StringProperty +from kivy.uix.image import Image +import qrcode ################# # Local libraries ################# from logutils import verbose_log from hashutils import open_and_hash_file +from qrutils import encode_to_string from filechooser import LoadDialog class SignScreen(Screen): @@ -122,7 +127,37 @@ def on_submit_file(self, *args): a given file """ self.file_input = args[1][0] + verbose_log("INFO", f" loading {self.file_input}") self.file_hash = open_and_hash_file(path=self.file_input, verbose=True) + verbose_log("INFO", f" hash: {self.file_hash}") self._popup.dismiss() + + verbose_log("INFO", " converting to QRCode") + qr_binary_data = encode_to_string(self.file_hash) + verbose_log("INFO", " Raw data: "+ "".join(qr_binary_data)) + + qr = qrcode.QRCode( + version=1, + error_correction=qrcode.constants.ERROR_CORRECT_L, + box_size=10, + border=4 + ) + qr.add_data(qr_binary_data) + qr.make(fit=True) + img = qr.make_image(fill_color="black", back_color="white") + + img_path = os.path.join(tempfile.gettempdir(), f"{self.file_input}.png") + verbose_log("INFO", f" Saving on: {img_path}") + img.save(img_path) + + self._popup = Popup( + title=self.file_input, + content=Image(source=img_path), + size_hint=(None, None), + size=(400, 400) + ) + + self._popup.open() + \ No newline at end of file From 8d131a7a0791af018706a69d684246ae422d1bb3 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Tue, 3 Oct 2023 22:46:40 -0300 Subject: [PATCH 015/104] added qrcodescreen --- src/ksigner-gui.py | 4 + src/ksigner.kv | 14 ++- src/qrcodescreen.py | 203 ++++++++++++++++++++++++++++++++++++++ src/qrutils.py | 4 + src/signandverifyutils.py | 22 ++++- src/signscreen.py | 65 ++++++------ src/verifyscreen.py | 24 ++++- 7 files changed, 304 insertions(+), 32 deletions(-) create mode 100644 src/qrcodescreen.py diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index 0ef26ae..f2c8910 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -38,6 +38,7 @@ from mainscreen import MainScreen from signscreen import SignScreen from verifyscreen import VerifyScreen +from qrcodescreen import QRCodeScreen class KSignerApp(App): """ @@ -67,6 +68,9 @@ def build(self): verbose_log('INFO', 'Adding ') screen_manager.add_widget(VerifyScreen(name="verify")) + + verbose_log('INFO', 'Adding ') + screen_manager.add_widget(QRCodeScreen(name="qrcode-screen")) return screen_manager diff --git a/src/ksigner.kv b/src/ksigner.kv index a2829fb..4c57916 100644 --- a/src/ksigner.kv +++ b/src/ksigner.kv @@ -229,4 +229,16 @@ font_size: root.height // 25 font_name: 'terminus.ttf' text: "Load" - on_release: root.load(filechooser.path, filechooser.selection) \ No newline at end of file + on_release: root.load(filechooser.path, filechooser.selection) + +: + + GridLayout: + + cols: 1 + rows: 1 + + Label: + id: name + text: root.file_input + color: 1, 1, 1, 1 \ No newline at end of file diff --git a/src/qrcodescreen.py b/src/qrcodescreen.py new file mode 100644 index 0000000..0bcc33c --- /dev/null +++ b/src/qrcodescreen.py @@ -0,0 +1,203 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-2023 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +""" +qrcodescreen.py + +Implements an inherited kivy.uix.screenmanager.Screen +for display QRCodes +""" + +################## +# Standard library +################## +import time + +####################### +# Third party libraries +####################### +from kivy.uix.widget import Widget +from kivy.uix.screenmanager import Screen +from kivy.graphics import Color, Rectangle +from kivy.graphics.texture import Texture +from kivy.uix.label import CoreLabel +from kivy.core.window import Window +from kivy.properties import ListProperty, StringProperty +from kivy.graphics import Rotate +from kivy.clock import mainthread + + +COLOR_BLACK = (0, 0, 0, 1) +COLOR_WHITE = (1, 1, 1, 1) + +class QRCodeScreen(Screen): + """ + Class responsible to display qrcodes. + It's an custom clone from + https://github.com/odudex/krux/blob/android/android/mocks/lcd_mock.py + """ + file_input = StringProperty('') + #file_hash = StringProperty(None) + #file_raw_hash = StringProperty(None) + +class QRCodeWidget(Widget): + + pressed = ListProperty([0, 0]) + released = ListProperty([0, 0]) + + def __init__(self, **kwargs): + super(QRCodeWidget, self).__init__(**kwargs) + self.landscape = False + self.frame_counter = 0 + _, window_height = Window.size + self.font_size = window_height // 25 + + def rgb565torgb111(self, color): + """convert from gggbbbbbrrrrrggg to tuple""" + MASK5 = 0b11111 + MASK3 = 0b111 + + red = ((color >> 3) & MASK5) + red /= 31 + green = color >> 13 + green += (color & MASK3) << 3 + green /= 63 + blue = ((color >> 8) & MASK5) + blue /= 31 + return (red, green, blue, 1) + + @mainthread + def clear(self, color): + color = self.rgb565torgb111(color) + Window.clearcolor = color + self.canvas.clear() + + @mainthread + def rotation(self, r): + if r == 2: + with self.canvas: + # PushMatrix() + Rotate(origin=self.center, angle=-90) + # PopMatrix() + self.landscape = True + else: + with self.canvas: + # PushMatrix() + Rotate(origin=self.center, angle=90) + # PopMatrix() + self.landscape = False + time.sleep(0.01) + + + def _width(self): + return int(self.width) + + def _height(self): + if self.height > 200: + return int(self.height) + # widget size not ready at boot, so gets window size + _, window_height = Window.size + return window_height + + @mainthread + def draw_qr_code(self, offset_y, code_str, max_width, dark_color=COLOR_BLACK, light_color=COLOR_WHITE, bg_color=COLOR_BLACK): + dark_color = self.rgb565torgb111(dark_color) + light_color = self.rgb565torgb111(light_color) + starting_size = 2 + while code_str[starting_size] != "\n": + starting_size += 1 + # starting size is the amount of blocks per line + max_width = min(self._width(), self._height()) + # scale is how many pixels per block + scale = max_width // starting_size + # qr_width is total QR width in pixels + qr_width = starting_size * scale + #texture = Texture.create(size=(starting_size, starting_size), colorfmt='rgb') + texture = Texture.create(size=(starting_size, starting_size), colorfmt='rgb') + # buf_size = starting_size * starting_size + buf_size = starting_size * starting_size + buf_size *= 3 + buf = [0 for x in range(buf_size)] + pixel_index = 0 + for inverted_y in range(starting_size): # vertical blocks loop + y = starting_size - inverted_y - 1 + for x in range(starting_size): # horizontal blocks loop + xy_index = y * (starting_size+1) + x # individual block index + color = dark_color if code_str[xy_index] == "1" else light_color + if isinstance(color, int): + color = int(str(color),16) + red = color//256 + green = red + blue = red + else: + red, green, blue, _ = color + red *= 255 + green *= 255 + blue *= 255 + buf[pixel_index*3] = int(red) + buf[pixel_index*3+1] = int(green) + buf[pixel_index*3+2] = int(blue) + pixel_index += 1 + # offset will be used only in position for Android + offset = (max_width - qr_width) // 2 + buf = bytes(buf) + texture.blit_buffer(buf, colorfmt='rgb', bufferfmt='ubyte') + texture.mag_filter = 'nearest' + + with self.canvas: + Rectangle( + texture=texture, + pos=(offset + 0, self._height() - offset - qr_width), + size=(starting_size*scale, starting_size*scale) + ) + + @mainthread + def display(self, img, oft=None, roi=None): + return + self.frame_counter += 1 + self.draw_string(50,50, str(self.frame_counter)) + frame = img.get_frame() + if not isinstance(frame, MagicMock): + buf = frame.tostring()/enc + image_texture = Texture.create( + size=(self._width(), self._height()), + colorfmt='bgr' + ) + image_texture.blit_buffer(buf, colorfmt='bgr', bufferfmt='ubyte') + self.texture = image_texture + with self.canvas: + Rectangle(texture=image_texture, pos=self.pos, size=(self._width(), self._height())) + + def on_touch_down(self, touch): + x, y = touch.pos + y = self._height() - y + if self.pressed == ([x, y]): + x +=1 #force event if touches in same place as before + self.pressed = ([x, y]) + return True + + def on_touch_up(self, touch): + x, y = touch.pos + y = self._height() - y + if self.released == ([x, y]): + x +=1 #force event if touches in same place as before + self.released = ([x, y]) + return True diff --git a/src/qrutils.py b/src/qrutils.py index cac39ca..0fc1a2a 100644 --- a/src/qrutils.py +++ b/src/qrutils.py @@ -20,6 +20,10 @@ from logutils import verbose_log def encode_to_string(data): + """ + Cloned from https://github.com/odudex/krux/blob/android/android/mocks/qrcode.py + """ + #pre-decode if binary (Compact Seed QR) try: code_str = pyqrcode.create(data, error="L", mode="binary").text() diff --git a/src/signandverifyutils.py b/src/signandverifyutils.py index 9b1de99..cd175ae 100644 --- a/src/signandverifyutils.py +++ b/src/signandverifyutils.py @@ -1,3 +1,24 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-2023 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. """ signandverify.py @@ -16,7 +37,6 @@ ################# from logutils import verbose_log - def verify_openssl_command(**kwargs) -> str: """ Create the properly openssl command diff --git a/src/signscreen.py b/src/signscreen.py index c21c1c5..e6c4c86 100644 --- a/src/signscreen.py +++ b/src/signscreen.py @@ -1,8 +1,32 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-2023 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. """ signscreen.py An inherited implementations of kivy.uix.screenmanager Screen """ +#################### +# Standard libraries +#################### import os import tempfile @@ -124,40 +148,23 @@ def on_submit_file(self, *args): on_submit_file Call `open_and_hash_file` to open, read and hash (sha256sum) - a given file + a given file and redirect to QRCodeScreen """ self.file_input = args[1][0] - verbose_log("INFO", f" loading {self.file_input}") + self.file_hash = open_and_hash_file(path=self.file_input, verbose=True) - verbose_log("INFO", f" hash: {self.file_hash}") + verbose_log("INFO", "Closing popup...") self._popup.dismiss() - verbose_log("INFO", " converting to QRCode") - qr_binary_data = encode_to_string(self.file_hash) - verbose_log("INFO", " Raw data: "+ "".join(qr_binary_data)) - - qr = qrcode.QRCode( - version=1, - error_correction=qrcode.constants.ERROR_CORRECT_L, - box_size=10, - border=4 - ) - qr.add_data(qr_binary_data) - qr.make(fit=True) - img = qr.make_image(fill_color="black", back_color="white") - - img_path = os.path.join(tempfile.gettempdir(), f"{self.file_input}.png") - verbose_log("INFO", f" Saving on: {img_path}") - img.save(img_path) + verbose_log("INFO", "Cache filename and hash to ") + print(self.manager.get_screen('qrcode-screen').ids) - self._popup = Popup( - title=self.file_input, - content=Image(source=img_path), - size_hint=(None, None), - size=(400, 400) - ) - - self._popup.open() - \ No newline at end of file + #self.manager.get_screen('qrcode-screen').ids.raw.data = encode_to_string(self.file_hash) + self.manager.get_screen('qrcode-screen').ids.name.file_input = self.file_input + #self.manager.get_screen('qrcode-screen').ids.data.file_hash = self.file_hash + + verbose_log("INFO", "Redirecting to ") + self.manager.transition.direction = "left" + self.manager.current = "qrcode-screen" \ No newline at end of file diff --git a/src/verifyscreen.py b/src/verifyscreen.py index a5a823e..a697902 100644 --- a/src/verifyscreen.py +++ b/src/verifyscreen.py @@ -1,7 +1,29 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-2023 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. """ verifyscreen.py -Implements an inhrited kivy.uix.screenmanager.Screen +Implements an inherited kivy.uix.screenmanager.Screen +for verify signature options """ ###################### From c8b5b95ffc6bf92252f33e87dd78be30b6e0e666 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Wed, 4 Oct 2023 13:55:21 -0300 Subject: [PATCH 016/104] Added label with filename and hash string for QRCodeScreen --- src/hashutils.py | 3 --- src/ksigner.kv | 17 ++++++++--------- src/qrcode_widget.kv | 26 ++++++++++++++++++++++++++ src/qrcodescreen.py | 8 +++++--- src/signscreen.py | 12 +++++------- 5 files changed, 44 insertions(+), 22 deletions(-) create mode 100644 src/qrcode_widget.kv diff --git a/src/hashutils.py b/src/hashutils.py index 2dae843..5ae9a54 100644 --- a/src/hashutils.py +++ b/src/hashutils.py @@ -32,9 +32,6 @@ def open_and_hash_file(**kwargs) -> str: with open(__filename__, "rb") as f_to_be_sig: _bytes = f_to_be_sig.read() # read file as bytes - if verbose: - verbose_log("INFO", f"Read bytes: {_bytes}") - __readable_hash__ = hashlib.sha256(_bytes).hexdigest() # Prints the hash of the file diff --git a/src/ksigner.kv b/src/ksigner.kv index 4c57916..3cb828e 100644 --- a/src/ksigner.kv +++ b/src/ksigner.kv @@ -233,12 +233,11 @@ : - GridLayout: - - cols: 1 - rows: 1 - - Label: - id: name - text: root.file_input - color: 1, 1, 1, 1 \ No newline at end of file + Label: + id: qrcode_label + font_size: root.height // 30 + font_name: 'terminus.ttf' + halign: 'center' + color: 1, 1, 1 + background_color: 0, 0, 0 + markup: True \ No newline at end of file diff --git a/src/qrcode_widget.kv b/src/qrcode_widget.kv new file mode 100644 index 0000000..b976b69 --- /dev/null +++ b/src/qrcode_widget.kv @@ -0,0 +1,26 @@ + + on_parent: if args[1]: qrimage.source = self.loading_image + canvas.before: + # Draw white Rectangle + Color: + rgba: root.background_color + Rectangle: + size: self.size + pos: self.pos + canvas.after: + Color: + rgba: .5, .5, .5, 1 if root.show_border else 0 + Line: + width: dp(1.333) + points: + self.x + dp(2), self.y + dp(2),\ + self.x + self.width - dp(2), self.y + dp(2),\ + self.x + self.width - dp(2), self.y + self.height - dp(2),\ + self.x + dp(2), self.y + self.height - dp(2),\ + self.x + dp(2), self.y + dp(2) + Image + id: qrimage + pos_hint: {'center_x': .5, 'center_y': .5} + allow_stretch: True + size_hint: None, None + size: root.width * .9, root.height * .9 \ No newline at end of file diff --git a/src/qrcodescreen.py b/src/qrcodescreen.py index 0bcc33c..7a6e0b8 100644 --- a/src/qrcodescreen.py +++ b/src/qrcodescreen.py @@ -54,10 +54,12 @@ class QRCodeScreen(Screen): It's an custom clone from https://github.com/odudex/krux/blob/android/android/mocks/lcd_mock.py """ - file_input = StringProperty('') - #file_hash = StringProperty(None) - #file_raw_hash = StringProperty(None) + qrcode_label = StringProperty('') + def __init__(self, **kwargs): + super(QRCodeScreen, self).__init__(**kwargs) + print(self.qrcode_label) + class QRCodeWidget(Widget): pressed = ListProperty([0, 0]) diff --git a/src/signscreen.py b/src/signscreen.py index e6c4c86..13b764d 100644 --- a/src/signscreen.py +++ b/src/signscreen.py @@ -155,16 +155,14 @@ def on_submit_file(self, *args): self.file_hash = open_and_hash_file(path=self.file_input, verbose=True) - verbose_log("INFO", "Closing popup...") + verbose_log("INFO", " Closing popup...") self._popup.dismiss() - verbose_log("INFO", "Cache filename and hash to ") - print(self.manager.get_screen('qrcode-screen').ids) + verbose_log("INFO", " Cache filename and hash to ") - #self.manager.get_screen('qrcode-screen').ids.raw.data = encode_to_string(self.file_hash) - self.manager.get_screen('qrcode-screen').ids.name.file_input = self.file_input - #self.manager.get_screen('qrcode-screen').ids.data.file_hash = self.file_hash - + qrcodescreen = self.manager.get_screen('qrcode-screen') + qrcodescreen.ids.qrcode_label.text = f"[b]{self.file_input}[/b]\n\n[b]{self.file_hash}[/b]" + verbose_log("INFO", "Redirecting to ") self.manager.transition.direction = "left" self.manager.current = "qrcode-screen" \ No newline at end of file From 5a6c6db21ea77df7079a432bd00c69c139b48f2b Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Thu, 5 Oct 2023 00:33:53 -0300 Subject: [PATCH 017/104] replaced qrcode generation --- pyproject.toml | 1 + src/ksigner-gui.py | 2 +- src/ksigner.kv | 5 ++ src/qrcode_widget.kv | 26 ------- src/qrcodescreen.py | 165 +++---------------------------------------- src/signscreen.py | 7 +- 6 files changed, 21 insertions(+), 185 deletions(-) delete mode 100644 src/qrcode_widget.kv diff --git a/pyproject.toml b/pyproject.toml index e7e3b19..01d0fd4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,6 +17,7 @@ pillow = "^10.0.1" pyzbar = "^0.1.9" kivy = "^2.2.1" pyqrcode = "^1.2.1" +kivy-garden-qrcode = "^2021.314" [tool.poetry.group.dev.dependencies] black = "^23.9.1" diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index f2c8910..1b8c4e5 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -70,7 +70,7 @@ def build(self): screen_manager.add_widget(VerifyScreen(name="verify")) verbose_log('INFO', 'Adding ') - screen_manager.add_widget(QRCodeScreen(name="qrcode-screen")) + screen_manager.add_widget(QRCodeScreen(name="qrcode")) return screen_manager diff --git a/src/ksigner.kv b/src/ksigner.kv index 3cb828e..289f5f9 100644 --- a/src/ksigner.kv +++ b/src/ksigner.kv @@ -1,4 +1,5 @@ #:kivy 2.2.1 +#:import QRCodeWidget kivy_garden.qrcode : @@ -233,6 +234,10 @@ : + QRCodeWidget: + id: qrcode_data + data: root.code + Label: id: qrcode_label font_size: root.height // 30 diff --git a/src/qrcode_widget.kv b/src/qrcode_widget.kv deleted file mode 100644 index b976b69..0000000 --- a/src/qrcode_widget.kv +++ /dev/null @@ -1,26 +0,0 @@ - - on_parent: if args[1]: qrimage.source = self.loading_image - canvas.before: - # Draw white Rectangle - Color: - rgba: root.background_color - Rectangle: - size: self.size - pos: self.pos - canvas.after: - Color: - rgba: .5, .5, .5, 1 if root.show_border else 0 - Line: - width: dp(1.333) - points: - self.x + dp(2), self.y + dp(2),\ - self.x + self.width - dp(2), self.y + dp(2),\ - self.x + self.width - dp(2), self.y + self.height - dp(2),\ - self.x + dp(2), self.y + self.height - dp(2),\ - self.x + dp(2), self.y + dp(2) - Image - id: qrimage - pos_hint: {'center_x': .5, 'center_y': .5} - allow_stretch: True - size_hint: None, None - size: root.width * .9, root.height * .9 \ No newline at end of file diff --git a/src/qrcodescreen.py b/src/qrcodescreen.py index 7a6e0b8..190c6e6 100644 --- a/src/qrcodescreen.py +++ b/src/qrcodescreen.py @@ -36,170 +36,25 @@ ####################### from kivy.uix.widget import Widget from kivy.uix.screenmanager import Screen -from kivy.graphics import Color, Rectangle -from kivy.graphics.texture import Texture -from kivy.uix.label import CoreLabel -from kivy.core.window import Window -from kivy.properties import ListProperty, StringProperty -from kivy.graphics import Rotate -from kivy.clock import mainthread +from kivy.properties import StringProperty +from kivy_garden.qrcode import QRCodeWidget +################# +# Local libraries +################# +from logutils import verbose_log COLOR_BLACK = (0, 0, 0, 1) COLOR_WHITE = (1, 1, 1, 1) class QRCodeScreen(Screen): + + code = StringProperty('') + """ Class responsible to display qrcodes. It's an custom clone from https://github.com/odudex/krux/blob/android/android/mocks/lcd_mock.py """ - qrcode_label = StringProperty('') - def __init__(self, **kwargs): - super(QRCodeScreen, self).__init__(**kwargs) - print(self.qrcode_label) - -class QRCodeWidget(Widget): - - pressed = ListProperty([0, 0]) - released = ListProperty([0, 0]) - - def __init__(self, **kwargs): - super(QRCodeWidget, self).__init__(**kwargs) - self.landscape = False - self.frame_counter = 0 - _, window_height = Window.size - self.font_size = window_height // 25 - - def rgb565torgb111(self, color): - """convert from gggbbbbbrrrrrggg to tuple""" - MASK5 = 0b11111 - MASK3 = 0b111 - - red = ((color >> 3) & MASK5) - red /= 31 - green = color >> 13 - green += (color & MASK3) << 3 - green /= 63 - blue = ((color >> 8) & MASK5) - blue /= 31 - return (red, green, blue, 1) - - @mainthread - def clear(self, color): - color = self.rgb565torgb111(color) - Window.clearcolor = color - self.canvas.clear() - - @mainthread - def rotation(self, r): - if r == 2: - with self.canvas: - # PushMatrix() - Rotate(origin=self.center, angle=-90) - # PopMatrix() - self.landscape = True - else: - with self.canvas: - # PushMatrix() - Rotate(origin=self.center, angle=90) - # PopMatrix() - self.landscape = False - time.sleep(0.01) - - - def _width(self): - return int(self.width) - - def _height(self): - if self.height > 200: - return int(self.height) - # widget size not ready at boot, so gets window size - _, window_height = Window.size - return window_height - - @mainthread - def draw_qr_code(self, offset_y, code_str, max_width, dark_color=COLOR_BLACK, light_color=COLOR_WHITE, bg_color=COLOR_BLACK): - dark_color = self.rgb565torgb111(dark_color) - light_color = self.rgb565torgb111(light_color) - starting_size = 2 - while code_str[starting_size] != "\n": - starting_size += 1 - # starting size is the amount of blocks per line - max_width = min(self._width(), self._height()) - # scale is how many pixels per block - scale = max_width // starting_size - # qr_width is total QR width in pixels - qr_width = starting_size * scale - #texture = Texture.create(size=(starting_size, starting_size), colorfmt='rgb') - texture = Texture.create(size=(starting_size, starting_size), colorfmt='rgb') - # buf_size = starting_size * starting_size - buf_size = starting_size * starting_size - buf_size *= 3 - buf = [0 for x in range(buf_size)] - pixel_index = 0 - for inverted_y in range(starting_size): # vertical blocks loop - y = starting_size - inverted_y - 1 - for x in range(starting_size): # horizontal blocks loop - xy_index = y * (starting_size+1) + x # individual block index - color = dark_color if code_str[xy_index] == "1" else light_color - if isinstance(color, int): - color = int(str(color),16) - red = color//256 - green = red - blue = red - else: - red, green, blue, _ = color - red *= 255 - green *= 255 - blue *= 255 - buf[pixel_index*3] = int(red) - buf[pixel_index*3+1] = int(green) - buf[pixel_index*3+2] = int(blue) - pixel_index += 1 - # offset will be used only in position for Android - offset = (max_width - qr_width) // 2 - buf = bytes(buf) - texture.blit_buffer(buf, colorfmt='rgb', bufferfmt='ubyte') - texture.mag_filter = 'nearest' - - with self.canvas: - Rectangle( - texture=texture, - pos=(offset + 0, self._height() - offset - qr_width), - size=(starting_size*scale, starting_size*scale) - ) - - @mainthread - def display(self, img, oft=None, roi=None): - return - self.frame_counter += 1 - self.draw_string(50,50, str(self.frame_counter)) - frame = img.get_frame() - if not isinstance(frame, MagicMock): - buf = frame.tostring()/enc - image_texture = Texture.create( - size=(self._width(), self._height()), - colorfmt='bgr' - ) - image_texture.blit_buffer(buf, colorfmt='bgr', bufferfmt='ubyte') - self.texture = image_texture - with self.canvas: - Rectangle(texture=image_texture, pos=self.pos, size=(self._width(), self._height())) - - def on_touch_down(self, touch): - x, y = touch.pos - y = self._height() - y - if self.pressed == ([x, y]): - x +=1 #force event if touches in same place as before - self.pressed = ([x, y]) - return True - - def on_touch_up(self, touch): - x, y = touch.pos - y = self._height() - y - if self.released == ([x, y]): - x +=1 #force event if touches in same place as before - self.released = ([x, y]) - return True + super(QRCodeScreen, self).__init__(**kwargs) \ No newline at end of file diff --git a/src/signscreen.py b/src/signscreen.py index 13b764d..4609b5e 100644 --- a/src/signscreen.py +++ b/src/signscreen.py @@ -160,9 +160,10 @@ def on_submit_file(self, *args): verbose_log("INFO", " Cache filename and hash to ") - qrcodescreen = self.manager.get_screen('qrcode-screen') + qrcodescreen = self.manager.get_screen('qrcode') qrcodescreen.ids.qrcode_label.text = f"[b]{self.file_input}[/b]\n\n[b]{self.file_hash}[/b]" - + qrcodescreen.ids.qrcode_data.code = self.file_hash + verbose_log("INFO", "Redirecting to ") self.manager.transition.direction = "left" - self.manager.current = "qrcode-screen" \ No newline at end of file + self.manager.current = "qrcode" \ No newline at end of file From be3cfc2c50fd7392100e208ec95607732bb94532 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Thu, 5 Oct 2023 13:08:05 -0300 Subject: [PATCH 018/104] refactored QRCodeScreen --- src/ksigner.kv | 29 ++++++++++++---------- src/qrcodescreen.py | 59 +++++++++++++++++++++++++++++++++++++++------ src/signscreen.py | 5 ++-- 3 files changed, 70 insertions(+), 23 deletions(-) diff --git a/src/ksigner.kv b/src/ksigner.kv index 289f5f9..4955fc4 100644 --- a/src/ksigner.kv +++ b/src/ksigner.kv @@ -1,5 +1,4 @@ #:kivy 2.2.1 -#:import QRCodeWidget kivy_garden.qrcode : @@ -234,15 +233,19 @@ : - QRCodeWidget: - id: qrcode_data - data: root.code - - Label: - id: qrcode_label - font_size: root.height // 30 - font_name: 'terminus.ttf' - halign: 'center' - color: 1, 1, 1 - background_color: 0, 0, 0 - markup: True \ No newline at end of file + id: qrcode + data: root.data + label: root.label + +# QRCodeWidget: +# id: qrcode_data +# data: root.code +# +# Label: +# id: qrcode_label +# font_size: root.height // 30 +# font_name: 'terminus.ttf' +# halign: 'center' +# color: 1, 1, 1 +# background_color: 0, 0, 0 +# markup: True \ No newline at end of file diff --git a/src/qrcodescreen.py b/src/qrcodescreen.py index 190c6e6..9936889 100644 --- a/src/qrcodescreen.py +++ b/src/qrcodescreen.py @@ -34,10 +34,11 @@ ####################### # Third party libraries ####################### -from kivy.uix.widget import Widget +from qrcode import QRCode +from qrcode.constants import ERROR_CORRECT_L +from kivy.uix.label import Label from kivy.uix.screenmanager import Screen from kivy.properties import StringProperty -from kivy_garden.qrcode import QRCodeWidget ################# # Local libraries @@ -46,15 +47,59 @@ COLOR_BLACK = (0, 0, 0, 1) COLOR_WHITE = (1, 1, 1, 1) +QRCODE_VERSION = 1 +BOX_SIZE = 10 +BORDER_SIZE = 4 class QRCodeScreen(Screen): - - code = StringProperty('') - """ Class responsible to display qrcodes. It's an custom clone from https://github.com/odudex/krux/blob/android/android/mocks/lcd_mock.py """ - def __init__(self, **kwargs): - super(QRCodeScreen, self).__init__(**kwargs) \ No newline at end of file + code = StringProperty('') + text = StringProperty('') + + + def on_pre_enter(self): + """ + Event fired when the screen is about to be used: the entering animation is started. + """ + self.generate_label() + self.generate_qrcode() + + def on_enter(self): + """ + Event fired when the screen is displayed: the entering animation is complete. + """ + pass + + def generate_label(self): + verbose_log("INFO", "Creating ") + label = Label( + text=self.text, + font_size=self.height // 5, + font_name='terminus.ttf', + halign='center', + color=COLOR_WHITE, + markup=True + ) + self.add_widget(label) + + def generate_qrcode(self): + verbose_log("INFO", "Creating QRCode") + qrcode = QRCode( + version=QRCODE_VERSION, + error_correction=ERROR_CORRECT_L, + box_size=BOX_SIZE, + border=BORDER_SIZE + ) + verbose_log("INFO", qrcode) + + verbose_log("INFO", "Adding data") + qrcode.add_data(self.code) + + verbose_log("INFO", "Creating ") + qrcode.make(fit=True) + self.img = qrcode.make_image(fill_color="black", back_color="white") + diff --git a/src/signscreen.py b/src/signscreen.py index 4609b5e..97d5d4a 100644 --- a/src/signscreen.py +++ b/src/signscreen.py @@ -159,10 +159,9 @@ def on_submit_file(self, *args): self._popup.dismiss() verbose_log("INFO", " Cache filename and hash to ") - qrcodescreen = self.manager.get_screen('qrcode') - qrcodescreen.ids.qrcode_label.text = f"[b]{self.file_input}[/b]\n\n[b]{self.file_hash}[/b]" - qrcodescreen.ids.qrcode_data.code = self.file_hash + qrcodescreen.text = f"[b]{self.file_input}[/b]\n\n[b]{self.file_hash}[/b]" + qrcodescreen.code = self.file_hash verbose_log("INFO", "Redirecting to ") self.manager.transition.direction = "left" From 692d65f481295367523b24dc58381c7860c5f0ed Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Fri, 6 Oct 2023 10:26:35 -0300 Subject: [PATCH 019/104] added some functions to parse qrcode on texture --- src/ksigner.kv | 2 - src/qrcodescreen.py | 201 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 175 insertions(+), 28 deletions(-) diff --git a/src/ksigner.kv b/src/ksigner.kv index 4955fc4..7ed7be1 100644 --- a/src/ksigner.kv +++ b/src/ksigner.kv @@ -234,8 +234,6 @@ : id: qrcode - data: root.data - label: root.label # QRCodeWidget: # id: qrcode_data diff --git a/src/qrcodescreen.py b/src/qrcodescreen.py index 9936889..39230f5 100644 --- a/src/qrcodescreen.py +++ b/src/qrcodescreen.py @@ -30,53 +30,142 @@ # Standard library ################## import time +from threading import Thread ####################### # Third party libraries ####################### +from functools import partial from qrcode import QRCode + +################ +# Kivy libraries +################ +from kivy.clock import Clock +from kivy.uix.image import Image +from kivy.graphics.texture import Texture from qrcode.constants import ERROR_CORRECT_L from kivy.uix.label import Label + from kivy.uix.screenmanager import Screen -from kivy.properties import StringProperty +from kivy.properties import ( + StringProperty, + NumericProperty, + ListProperty +) ################# # Local libraries ################# from logutils import verbose_log -COLOR_BLACK = (0, 0, 0, 1) COLOR_WHITE = (1, 1, 1, 1) -QRCODE_VERSION = 1 -BOX_SIZE = 10 -BORDER_SIZE = 4 class QRCodeScreen(Screen): """ Class responsible to display qrcodes. It's an custom clone from https://github.com/odudex/krux/blob/android/android/mocks/lcd_mock.py - """ + """ + code = StringProperty('') + """ + The string code to be parsed on QRCode. + """ + text = StringProperty('') - + """ + The label to be show describing the QRCode + """ + + version = NumericProperty(1) + """ + The QRCode version. GO from 1 to 40. + """ + + ecc = NumericProperty(ERROR_CORRECT_L) + """ + The error correction code level for the qrcode. + + :data:`ecc` is the Error Correrction Code level. + The default value is a constant in :module:`~qrcode.constants`, + defaulting to `qrcode.constants.ERROR_CORRECT_L`. + """ + + box_size = 10 + """ + Size of box + """ + + border_size = 3 + """ + Size of border + """ + + background_color = ListProperty((0, 0, 0, 1)) + """ + :data:`color_black` is a tuple describing the background + """ + + loading_image = StringProperty('data/images/image-loading.gif') + """Intermediate image to be displayed while the widget ios being loaded. + + :data:`loading_image` is a :class:`~kivy.properties.StringProperty`, + defaulting to `'data/images/image-loading.gif'`. + """ + + def __init__(self, **kwargs): + super(QRCodeScreen, self).__init__(**kwargs) + self._label = None + self._qrcode = None + self._qrtexture = None + self._image = None + + def on_data(self, instance, value): + if not (self.canvas or value): + return + + if not self._img: + # if texture hasn't yet been created delay the texture updating + Clock.schedule_once(lambda dt: self._on_data(instance, value)) + return + self._img.anim_delay = .25 + self._img.source = self.loading_image + def on_pre_enter(self): """ Event fired when the screen is about to be used: the entering animation is started. """ - self.generate_label() - self.generate_qrcode() + self.set_image() + self.set_label() + Thread(target=partial(self.generate_qrcode)).start() def on_enter(self): """ Event fired when the screen is displayed: the entering animation is complete. """ pass - - def generate_label(self): + + def set_image(self): + """ + Sets and add Image Widget to QRCodeScreen + """ + verbose_log("INFO", "Creating ") - label = Label( + self._label = Label( text=self.text, font_size=self.height // 5, font_name='terminus.ttf', @@ -84,22 +173,82 @@ def generate_label(self): color=COLOR_WHITE, markup=True ) - self.add_widget(label) + self.add_widget(self._label) def generate_qrcode(self): - verbose_log("INFO", "Creating QRCode") - qrcode = QRCode( - version=QRCODE_VERSION, - error_correction=ERROR_CORRECT_L, - box_size=BOX_SIZE, - border=BORDER_SIZE - ) - verbose_log("INFO", qrcode) + """ + Setup QRCode + """ + try: + verbose_log("INFO", "Creating QRCode") + self._qrcode = QRCode( + version=self.version, + error_correction=self.ecc, + box_size=self.box_size, + border=self.border_size + ) - verbose_log("INFO", "Adding data") - qrcode.add_data(self.code) + verbose_log("INFO", "Adding data") + self._qrcode.add_data(self.code) - verbose_log("INFO", "Creating ") - qrcode.make(fit=True) - self.img = qrcode.make_image(fill_color="black", back_color="white") + verbose_log("INFO", "Creating ") + self._qrcode.make(fit=True) + except Exception as e: + verbose_log("ERROR", e) + self._qrcode = None + finally: + self._update_texture() + + def _create_texture(self, k, dt): + verbose_log("INFO", "Setting ") + self._qrtexture = texture = Texture.create(size=(k, k), colorfmt='rgb') + # don't interpolate texture + texture.min_filter = 'nearest' + texture.mag_filter = 'nearest' + + def _update_texture(self): + verbose_log("INFO", "Updating ") + matrix = self._qrcode.get_matrix() + k = len(matrix) + + # create the texture in main UI thread otherwise + # this will lead to memory corruption + verbose_log("INFO", "Creating in mainUI Thread") + Clock.schedule_once(partial(self._create_texture, k), -1) + + cr, cg, cb, ca = self.background_color[:] + cr, cg, cb = int(cr*255), int(cg*255), int(cb*255) + # used bytearray for python 3.5 eliminates need for btext + buff = bytearray() + for r in range(k): + for c in range(k): + buff.extend([0, 0, 0] if matrix[r][c] else [cr, cg, cb]) + + # then blit the buffer + # join not necessary when using a byte array + # buff =''.join(map(chr, buff)) + # update texture in UI thread. + verbose_log("INFO", "Blitting buffer in ") + Clock.schedule_once(lambda dt: self._upd_texture(buff)) + + def _upd_texture(self, buff): + texture = self._qrtexture + + if not texture: + verbose_log("WARN", "Texture hasn't been created") + Clock.schedule_once(lambda dt: self._upd_texture(buff)) + return + + verbose_log("INFO", "Setup image texture") + texture.blit_buffer( + buff, + colorfmt='rgb', + bufferfmt='ubyte' + ) + texture.flip_vertical() + self._img.anim_delay = -1 + self._img.texture = texture + self._img.canvas.ask_update() + + From d62073b950604ff646e05774f0bf9ade1972f1e7 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Fri, 6 Oct 2023 13:15:47 -0300 Subject: [PATCH 020/104] fixed the process of showing qrcodes on a screen --- src/qrcodescreen.py | 63 ++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/src/qrcodescreen.py b/src/qrcodescreen.py index 39230f5..0283ffd 100644 --- a/src/qrcodescreen.py +++ b/src/qrcodescreen.py @@ -42,6 +42,7 @@ # Kivy libraries ################ from kivy.clock import Clock +from kivy.core.window import Window from kivy.uix.image import Image from kivy.graphics.texture import Texture from qrcode.constants import ERROR_CORRECT_L @@ -51,7 +52,8 @@ from kivy.properties import ( StringProperty, NumericProperty, - ListProperty + ListProperty, + ObjectProperty ) ################# @@ -59,12 +61,13 @@ ################# from logutils import verbose_log -COLOR_WHITE = (1, 1, 1, 1) - class QRCodeScreen(Screen): """ Class responsible to display qrcodes. + It's an custom clone from + https://pypi.org/project/kivy-garden.qrcode/ + and https://github.com/odudex/krux/blob/android/android/mocks/lcd_mock.py """ @@ -104,7 +107,14 @@ class QRCodeScreen(Screen): background_color = ListProperty((0, 0, 0, 1)) """ - :data:`color_black` is a tuple describing the background + :data:`fill_color` is a tuple describing the color of filled dots + defined at :class:`~qrcode.QRCode` + """ + + fill_color = ListProperty((1, 1, 1, 1)) + """ + :data:`background_color` is a tuple describing the color of background + defined at :class:`~qrcode.QRCode` """ loading_image = StringProperty('data/images/image-loading.gif') @@ -114,25 +124,17 @@ class QRCodeScreen(Screen): defaulting to `'data/images/image-loading.gif'`. """ + image_pos_hint = ObjectProperty({'center_x': .5, 'center_y': .6}) + + label_pos_hint = ObjectProperty({'center_x': .5, 'center_y': .2}) + def __init__(self, **kwargs): super(QRCodeScreen, self).__init__(**kwargs) self._label = None self._qrcode = None self._qrtexture = None - self._image = None - def on_data(self, instance, value): - if not (self.canvas or value): - return - - if not self._img: - # if texture hasn't yet been created delay the texture updating - Clock.schedule_once(lambda dt: self._on_data(instance, value)) - return - self._img.anim_delay = .25 - self._img.source = self.loading_image - def on_pre_enter(self): """ Event fired when the screen is about to be used: the entering animation is started. @@ -152,11 +154,12 @@ def set_image(self): Sets and add Image Widget to QRCodeScreen """ verbose_log("INFO", "Creating ") self._label = Label( text=self.text, - font_size=self.height // 5, + font_size=Window.height // 35, font_name='terminus.ttf', halign='center', - color=COLOR_WHITE, - markup=True + color=self.fill_color, + markup=True, + pos_hint=self.label_pos_hint ) self.add_widget(self._label) @@ -203,26 +207,31 @@ def _create_texture(self, k, dt): verbose_log("INFO", "Setting ") self._qrtexture = texture = Texture.create(size=(k, k), colorfmt='rgb') # don't interpolate texture - texture.min_filter = 'nearest' - texture.mag_filter = 'nearest' - + self._qrtexture.min_filter = 'nearest' + self._qrtexture.mag_filter = 'nearest' + print(self._qrtexture) + def _update_texture(self): verbose_log("INFO", "Updating ") matrix = self._qrcode.get_matrix() k = len(matrix) + verbose_log("INFO", f"={k}") # create the texture in main UI thread otherwise # this will lead to memory corruption verbose_log("INFO", "Creating in mainUI Thread") Clock.schedule_once(partial(self._create_texture, k), -1) - cr, cg, cb, ca = self.background_color[:] - cr, cg, cb = int(cr*255), int(cg*255), int(cb*255) + cr, cg, cb, ca = self.fill_color[:] + color = (int(cr*255), int(cg*255), int(cb*255)) + # used bytearray for python 3.5 eliminates need for btext buff = bytearray() for r in range(k): + verbose_log("INFO", f" Date: Fri, 6 Oct 2023 16:23:56 -0300 Subject: [PATCH 021/104] linted files --- pyproject.toml | 4 +- src/filechooser.py | 1 + src/ksigner-gui.py | 13 ++-- src/logutils.py | 5 +- src/qrcodescreen.py | 147 +++++++++++++++++--------------------- src/qrutils.py | 39 ---------- src/signandverifyutils.py | 1 + src/signscreen.py | 24 ++----- src/verifyscreen.py | 9 +-- 9 files changed, 93 insertions(+), 150 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 01d0fd4..fea6197 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ version = "0.0.1" description = "A python script to sign files and verify signatures in a airgapped manner" authors = [ "odudex ", - "qlrddev " + "qlrd " ] license = "MIT" readme = "README.md" @@ -16,8 +16,6 @@ qrcode = "^7.4.2" pillow = "^10.0.1" pyzbar = "^0.1.9" kivy = "^2.2.1" -pyqrcode = "^1.2.1" -kivy-garden-qrcode = "^2021.314" [tool.poetry.group.dev.dependencies] black = "^23.9.1" diff --git a/src/filechooser.py b/src/filechooser.py index 6addb89..7fbeed0 100644 --- a/src/filechooser.py +++ b/src/filechooser.py @@ -28,6 +28,7 @@ class LoadDialog(FileChooserListView): classes. In SignScreen, it will choose the file to load a content, write it in a .sha256.txt file and show qrcode content. """ + load = ObjectProperty(None) cancel = ObjectProperty(None) dirseclect = BooleanProperty(True) diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index 1b8c4e5..34e2834 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -40,6 +40,7 @@ from verifyscreen import VerifyScreen from qrcodescreen import QRCodeScreen + class KSignerApp(App): """ KSignerApp is the Root widget @@ -57,19 +58,19 @@ def build(self): - verify; - TODO: others """ - verbose_log('INFO', 'Creating ScreenManager') + verbose_log("INFO", "Creating ScreenManager") screen_manager = ScreenManager() - verbose_log('INFO', 'Adding ') + verbose_log("INFO", "Adding ") screen_manager.add_widget(MainScreen(name="main")) - verbose_log('INFO', 'Adding ') + verbose_log("INFO", "Adding ") screen_manager.add_widget(SignScreen(name="sign")) - verbose_log('INFO', 'Adding ') + verbose_log("INFO", "Adding ") screen_manager.add_widget(VerifyScreen(name="verify")) - - verbose_log('INFO', 'Adding ') + + verbose_log("INFO", "Adding ") screen_manager.add_widget(QRCodeScreen(name="qrcode")) return screen_manager diff --git a/src/logutils.py b/src/logutils.py index 519ad77..8526008 100644 --- a/src/logutils.py +++ b/src/logutils.py @@ -5,11 +5,13 @@ """ import time + # pylint: disable=too-few-public-methods class Bcolors: """ Simple class to manage colors in terminal """ + HEADER = "\033[95m" OKBLUE = "\033[94m" INFO = "\033[92m" @@ -23,7 +25,7 @@ class Bcolors: # pylint: disable=inconsistent-return-statements def build_v_type(v_type: str) -> str: """ - Get a type and convert into formated color + Get a type and convert into formated color """ if v_type == "INFO": return f"{Bcolors.BOLD}{Bcolors.INFO}{v_type}{Bcolors.ENDC}" @@ -34,6 +36,7 @@ def build_v_type(v_type: str) -> str: if v_type == "FAIL": return f"{Bcolors.BOLD}{Bcolors.FAIL}{v_type}{Bcolors.ENDC}" + def now() -> str: """Return some formated time""" return time.strftime("%X %x %Z") diff --git a/src/qrcodescreen.py b/src/qrcodescreen.py index 0283ffd..fd9bf7a 100644 --- a/src/qrcodescreen.py +++ b/src/qrcodescreen.py @@ -29,7 +29,6 @@ ################## # Standard library ################## -import time from threading import Thread ####################### @@ -37,23 +36,22 @@ ####################### from functools import partial from qrcode import QRCode - +from qrcode.constants import ERROR_CORRECT_L ################ # Kivy libraries ################ from kivy.clock import Clock from kivy.core.window import Window from kivy.uix.image import Image +# pylint: disable=no-name-in-module from kivy.graphics.texture import Texture -from qrcode.constants import ERROR_CORRECT_L from kivy.uix.label import Label - from kivy.uix.screenmanager import Screen from kivy.properties import ( StringProperty, NumericProperty, ListProperty, - ObjectProperty + ObjectProperty, ) ################# @@ -61,31 +59,32 @@ ################# from logutils import verbose_log + class QRCodeScreen(Screen): """ Class responsible to display qrcodes. - + It's an custom clone from https://pypi.org/project/kivy-garden.qrcode/ and https://github.com/odudex/krux/blob/android/android/mocks/lcd_mock.py - """ - - code = StringProperty('') + """ + + code = StringProperty("") """ The string code to be parsed on QRCode. """ - - text = StringProperty('') + + text = StringProperty("") """ The label to be show describing the QRCode """ - + version = NumericProperty(1) """ The QRCode version. GO from 1 to 40. """ - + ecc = NumericProperty(ERROR_CORRECT_L) """ The error correction code level for the qrcode. @@ -110,59 +109,54 @@ class QRCodeScreen(Screen): :data:`fill_color` is a tuple describing the color of filled dots defined at :class:`~qrcode.QRCode` """ - + fill_color = ListProperty((1, 1, 1, 1)) """ :data:`background_color` is a tuple describing the color of background defined at :class:`~qrcode.QRCode` """ - loading_image = StringProperty('data/images/image-loading.gif') + loading_image = StringProperty("data/images/image-loading.gif") """Intermediate image to be displayed while the widget ios being loaded. :data:`loading_image` is a :class:`~kivy.properties.StringProperty`, defaulting to `'data/images/image-loading.gif'`. """ - image_pos_hint = ObjectProperty({'center_x': .5, 'center_y': .6}) - - label_pos_hint = ObjectProperty({'center_x': .5, 'center_y': .2}) + image_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.6}) + label_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.2}) def __init__(self, **kwargs): - super(QRCodeScreen, self).__init__(**kwargs) + super().__init__(**kwargs) self._label = None self._qrcode = None self._qrtexture = None + self._img = None - def on_pre_enter(self): + def on_pre_enter(self, *args): """ Event fired when the screen is about to be used: the entering animation is started. """ self.set_image() - self.set_label() + self.set_label() Thread(target=partial(self.generate_qrcode)).start() - - def on_enter(self): - """ - Event fired when the screen is displayed: the entering animation is complete. - """ - pass def set_image(self): """ Sets and add Image Widget to QRCodeScreen """ - verbose_log("INFO", "Creating ") self._img = Image( pos_hint=self.image_pos_hint, allow_stretch=True, size_hint=(None, None), - size=(Window.height * .60, Window.height * .6) + size=(Window.height * 0.60, Window.height * 0.6), ) + + verbose_log("INFO", "Adding ") self.add_widget(self._img) - + def set_label(self): """ Sets and add Label Widget to QRCodeScreen @@ -171,46 +165,42 @@ def set_label(self): self._label = Label( text=self.text, font_size=Window.height // 35, - font_name='terminus.ttf', - halign='center', + font_name="terminus.ttf", + halign="center", color=self.fill_color, markup=True, - pos_hint=self.label_pos_hint - ) + pos_hint=self.label_pos_hint, + ) + + verbose_log("INFO", "Adding ") self.add_widget(self._label) def generate_qrcode(self): """ Setup QRCode """ - try: - verbose_log("INFO", "Creating QRCode") - self._qrcode = QRCode( - version=self.version, - error_correction=self.ecc, - box_size=self.box_size, - border=self.border_size - ) - - verbose_log("INFO", "Adding data") - self._qrcode.add_data(self.code) - - verbose_log("INFO", "Creating ") - self._qrcode.make(fit=True) - except Exception as e: - verbose_log("ERROR", e) - self._qrcode = None - finally: - self._update_texture() - - def _create_texture(self, k, dt): + verbose_log("INFO", "Creating QRCode") + self._qrcode = QRCode( + version=self.version, + error_correction=self.ecc, + box_size=self.box_size, + border=self.border_size, + ) + + verbose_log("INFO", "Adding data") + self._qrcode.add_data(self.code) + + verbose_log("INFO", "Creating ") + self._qrcode.make(fit=True) + self._update_texture() + + def _create_texture(self, k): verbose_log("INFO", "Setting ") - self._qrtexture = texture = Texture.create(size=(k, k), colorfmt='rgb') + self._qrtexture = Texture.create(size=(k, k), colorfmt="rgb") # don't interpolate texture - self._qrtexture.min_filter = 'nearest' - self._qrtexture.mag_filter = 'nearest' - print(self._qrtexture) - + self._qrtexture.min_filter = "nearest" + self._qrtexture.mag_filter = "nearest" + def _update_texture(self): verbose_log("INFO", "Updating ") matrix = self._qrcode.get_matrix() @@ -222,42 +212,39 @@ def _update_texture(self): verbose_log("INFO", "Creating in mainUI Thread") Clock.schedule_once(partial(self._create_texture, k), -1) - cr, cg, cb, ca = self.fill_color[:] - color = (int(cr*255), int(cg*255), int(cb*255)) - + _color = self.fill_color[:] + color = ( + int(_color[0] * 255), + int(_color[1] * 255), + int(_color[2] * 255) + ) + # used bytearray for python 3.5 eliminates need for btext buff = bytearray() - for r in range(k): - verbose_log("INFO", f"") - Clock.schedule_once(lambda dt: self._upd_texture(buff)) + Clock.schedule_once(lambda: self._upd_texture(buff)) def _upd_texture(self, buff): texture = self._qrtexture - + if not texture: verbose_log("WARN", "Texture hasn't been created") - Clock.schedule_once(lambda dt: self._upd_texture(buff)) + Clock.schedule_once(lambda d_t: self._upd_texture(buff)) return verbose_log("INFO", "Setup image texture") - texture.blit_buffer( - buff, - colorfmt='rgb', - bufferfmt='ubyte' - ) + texture.blit_buffer(buff, colorfmt="rgb", bufferfmt="ubyte") texture.flip_vertical() self._img.anim_delay = -1 self._img.texture = texture self._img.canvas.ask_update() - - - diff --git a/src/qrutils.py b/src/qrutils.py index 0fc1a2a..bdb180d 100644 --- a/src/qrutils.py +++ b/src/qrutils.py @@ -12,51 +12,12 @@ # Thrid party libraries ####################### from qrcode import QRCode -import pyqrcode ################# # Local libraries ################# from logutils import verbose_log -def encode_to_string(data): - """ - Cloned from https://github.com/odudex/krux/blob/android/android/mocks/qrcode.py - """ - - #pre-decode if binary (Compact Seed QR) - try: - code_str = pyqrcode.create(data, error="L", mode="binary").text() - except: - # Try binary - data = data.decode('latin-1') - code_str = pyqrcode.create(data, error="L", mode="binary").text() - # if len(data) in (48,96) and isinstance(data, str): # Seed QR - code_str = pyqrcode.create(data, error="L").text() - # else: - # code_str = pyqrcode.create(data, error="M", mode="binary").text() - size = 0 - while code_str[size] != "\n": - size += 1 - i = 0 - padding = 0 - while code_str[i] != "1": - if code_str[i] == "\n": - padding += 1 - i += 1 - code_str = code_str[(padding) * (size + 1) : -(padding) * (size + 1)] - size -= 2 * padding - - new_code_str = "" - for i in range(size): - for j in range(size + 2 * padding + 1): - if padding <= j < size + padding: - index = i * (size + 2 * padding + 1) + j - new_code_str += code_str[index] - new_code_str += "\n" - - return new_code_str - def make_qr_code(**kwargs) -> str: """ Builds the ascii data to QR code diff --git a/src/signandverifyutils.py b/src/signandverifyutils.py index cd175ae..8cddbeb 100644 --- a/src/signandverifyutils.py +++ b/src/signandverifyutils.py @@ -37,6 +37,7 @@ ################# from logutils import verbose_log + def verify_openssl_command(**kwargs) -> str: """ Create the properly openssl command diff --git a/src/signscreen.py b/src/signscreen.py index 97d5d4a..ffc6563 100644 --- a/src/signscreen.py +++ b/src/signscreen.py @@ -24,12 +24,6 @@ An inherited implementations of kivy.uix.screenmanager Screen """ -#################### -# Standard libraries -#################### -import os -import tempfile - ##################### # Thirparty libraries ##################### @@ -41,17 +35,15 @@ # -pylint-no-name-in-module # pylint: disable=no-name-in-module from kivy.properties import StringProperty -from kivy.uix.image import Image -import qrcode ################# # Local libraries ################# from logutils import verbose_log from hashutils import open_and_hash_file -from qrutils import encode_to_string from filechooser import LoadDialog + class SignScreen(Screen): """ SignScreen @@ -72,9 +64,7 @@ def __init__(self, **kwargs): on_submit=self.on_submit_file, ) self._popup = Popup( - title="Load a file", - content=self._content, - size_hint=(0.9, 0.9) + title="Load a file", content=self._content, size_hint=(0.9, 0.9) ) self.file_input = StringProperty("") self.file_content = StringProperty("") @@ -152,17 +142,17 @@ def on_submit_file(self, *args): """ self.file_input = args[1][0] verbose_log("INFO", f" loading {self.file_input}") - + self.file_hash = open_and_hash_file(path=self.file_input, verbose=True) - + verbose_log("INFO", " Closing popup...") self._popup.dismiss() verbose_log("INFO", " Cache filename and hash to ") - qrcodescreen = self.manager.get_screen('qrcode') + qrcodescreen = self.manager.get_screen("qrcode") qrcodescreen.text = f"[b]{self.file_input}[/b]\n\n[b]{self.file_hash}[/b]" qrcodescreen.code = self.file_hash - + verbose_log("INFO", "Redirecting to ") self.manager.transition.direction = "left" - self.manager.current = "qrcode" \ No newline at end of file + self.manager.current = "qrcode" diff --git a/src/verifyscreen.py b/src/verifyscreen.py index a697902..e5c2156 100644 --- a/src/verifyscreen.py +++ b/src/verifyscreen.py @@ -36,13 +36,14 @@ ################# from logutils import verbose_log + class VerifyScreen(Screen): """ VerifyScreen - + Is a sub-widget, managed by KSignerApp@ScreenManager that executes signature verifications - + - [x] Load file - [x] Load signature - Load publickey @@ -52,7 +53,7 @@ class VerifyScreen(Screen): def on_press_verify_screen_load_file_button(self): """ on_press_verify_screen_load_file_button - + - change background color of button to (.5,.5,.5,.5), giving a visual effect of 'pressed' """ @@ -62,7 +63,7 @@ def on_press_verify_screen_load_file_button(self): def on_release_verify_screen_load_file_button(self): """ on_release_verify_screen_load_file_button - + - change background color of button to (0, 0, 0, 0), giving a visual effect of 'unpressed' - make a screen transition to SignScreen From 42702854ce97b478e3b45597fab04b7a635be82f Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:38:29 -0300 Subject: [PATCH 022/104] de-linted qrcodescreen to fix error --- src/qrcodescreen.py | 6 +++--- src/signscreen.py | 4 ---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/qrcodescreen.py b/src/qrcodescreen.py index fd9bf7a..34e833d 100644 --- a/src/qrcodescreen.py +++ b/src/qrcodescreen.py @@ -194,7 +194,7 @@ def generate_qrcode(self): self._qrcode.make(fit=True) self._update_texture() - def _create_texture(self, k): + def _create_texture(self, k, dt): verbose_log("INFO", "Setting ") self._qrtexture = Texture.create(size=(k, k), colorfmt="rgb") # don't interpolate texture @@ -232,14 +232,14 @@ def _update_texture(self): # buff =''.join(map(chr, buff)) # update texture in UI thread. verbose_log("INFO", "Blitting buffer in ") - Clock.schedule_once(lambda: self._upd_texture(buff)) + Clock.schedule_once(lambda dt: self._upd_texture(buff)) def _upd_texture(self, buff): texture = self._qrtexture if not texture: verbose_log("WARN", "Texture hasn't been created") - Clock.schedule_once(lambda d_t: self._upd_texture(buff)) + Clock.schedule_once(lambda dt: self._upd_texture(buff)) return verbose_log("INFO", "Setup image texture") diff --git a/src/signscreen.py b/src/signscreen.py index ffc6563..3e87ab5 100644 --- a/src/signscreen.py +++ b/src/signscreen.py @@ -29,10 +29,6 @@ ##################### from kivy.uix.screenmanager import Screen from kivy.uix.popup import Popup - -# @see stackoverflow.complex/questions/65547279/ -# /no-name-object-property-in-module-kivy-properties -# -pylint-no-name-in-module # pylint: disable=no-name-in-module from kivy.properties import StringProperty From d2825f6b25884fd895e8468e21ba4aa17099d380 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Mon, 9 Oct 2023 19:58:31 -0300 Subject: [PATCH 023/104] added step messages above qrcode indicating how to sign --- src/qrcodescreen.py | 71 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 13 deletions(-) diff --git a/src/qrcodescreen.py b/src/qrcodescreen.py index 34e833d..e231f60 100644 --- a/src/qrcodescreen.py +++ b/src/qrcodescreen.py @@ -37,6 +37,7 @@ from functools import partial from qrcode import QRCode from qrcode.constants import ERROR_CORRECT_L + ################ # Kivy libraries ################ @@ -117,19 +118,35 @@ class QRCodeScreen(Screen): """ loading_image = StringProperty("data/images/image-loading.gif") - """Intermediate image to be displayed while the widget ios being loaded. + """ + Intermediate image to be displayed while the widget ios being loaded. :data:`loading_image` is a :class:`~kivy.properties.StringProperty`, defaulting to `'data/images/image-loading.gif'`. """ - image_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.6}) - - label_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.2}) - + image_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.5}) + """ + :data:`ìmage_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, + to set the default position on Screen + """ + + label_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.125}) + """ + :data:`label_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, + to set the default position on Screen + """ + + warn_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.9}) + """ + :data:`warn_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, + to set the default position on Screen + """ + def __init__(self, **kwargs): super().__init__(**kwargs) - self._label = None + self._label_warn = None + self._label_desc = None self._qrcode = None self._qrtexture = None self._img = None @@ -138,8 +155,9 @@ def on_pre_enter(self, *args): """ Event fired when the screen is about to be used: the entering animation is started. """ + self.set_label_warn() + self.set_label_desc() self.set_image() - self.set_label() Thread(target=partial(self.generate_qrcode)).start() def set_image(self): @@ -157,12 +175,39 @@ def set_image(self): verbose_log("INFO", "Adding ") self.add_widget(self._img) - def set_label(self): + def set_label_warn(self): + """ + Sets and add Label Widget that warn user about + the what to do on QRCodeScreen + """ + verbose_log("INFO", "Creating ") + self._label_warn = Label( + text="\n".join([ + "[b]To sign this file with Krux:[/b]", + "", + " (a) load a 12/24 words key, with or without BIP39 password;", + " (b) use the Sign->Message feature;", + " (c) and scan this QR code below;", + " (d) click on screen or type 'esc' to proceed." + ]), + font_size=Window.height // 35, + font_name="terminus.ttf", + halign="center", + color=self.fill_color, + markup=True, + pos_hint=self.warn_pos_hint, + ) + + verbose_log("INFO", "Adding ") + self.add_widget(self._label_warn) + + def set_label_desc(self): """ - Sets and add Label Widget to QRCodeScreen + Sets and add Label Widget that describe the qrcode's + data to QRCodeScreen """ - verbose_log("INFO", "Creating ") - self._label = Label( + verbose_log("INFO", "Creating ") + self._label_desc = Label( text=self.text, font_size=Window.height // 35, font_name="terminus.ttf", @@ -172,8 +217,8 @@ def set_label(self): pos_hint=self.label_pos_hint, ) - verbose_log("INFO", "Adding ") - self.add_widget(self._label) + verbose_log("INFO", "Adding ") + self.add_widget(self._label_desc) def generate_qrcode(self): """ From e5fda3a34575d87c81fae7579c73ea563f77809a Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Mon, 9 Oct 2023 21:48:35 -0300 Subject: [PATCH 024/104] added event on_touch_down to when users touch screen in QRCodeScreen, back to SignScreen --- src/qrcodescreen.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/qrcodescreen.py b/src/qrcodescreen.py index e231f60..2135ffc 100644 --- a/src/qrcodescreen.py +++ b/src/qrcodescreen.py @@ -160,6 +160,14 @@ def on_pre_enter(self, *args): self.set_image() Thread(target=partial(self.generate_qrcode)).start() + def on_touch_down(self, touch): + """ + Event fired when user clicked and release the left mouse button + (or the touchable screen) + """ + verbose_log("INFO", touch) + self._back_to_signscreen() + def set_image(self): """ Sets and add Image Widget to QRCodeScreen @@ -175,6 +183,13 @@ def set_image(self): verbose_log("INFO", "Adding ") self.add_widget(self._img) + def _on_keyboard_down(self, keyboard, keycode, text, modifiers): + verbose_log("INFO", keycode) + key = keycode[1] + if key == 'escape': # the esc key + self._back_to_signscreen() + return True + def set_label_warn(self): """ Sets and add Label Widget that warn user about @@ -293,3 +308,11 @@ def _upd_texture(self, buff): self._img.anim_delay = -1 self._img.texture = texture self._img.canvas.ask_update() + + def _back_to_signscreen(self): + """ + Back to SignScreen + """ + verbose_log("INFO", "Redirecting to ") + self.manager.transition.direction = "right" + self.manager.current = "sign" From 9b0cdf6659d5d9cac6d3e6257c0fc999d1c2e276 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Thu, 12 Oct 2023 16:10:57 -0300 Subject: [PATCH 025/104] Refactored tree's files refactored logger --- .gitignore | 2 +- src/ksigner-gui.py | 21 ++- src/logutils.py | 62 --------- src/screens/__init__.py | 0 src/{mainscreen.py => screens/main.py} | 37 +++-- src/{qrcodescreen.py => screens/qrcode.py} | 52 +++---- src/{signscreen.py => screens/sign.py} | 30 ++-- src/{verifyscreen.py => screens/verify.py} | 6 +- src/utils/__init__.py | 0 src/{hashutils.py => utils/hash.py} | 18 +-- src/utils/log.py | 154 +++++++++++++++++++++ 11 files changed, 229 insertions(+), 153 deletions(-) delete mode 100644 src/logutils.py create mode 100644 src/screens/__init__.py rename src/{mainscreen.py => screens/main.py} (53%) rename src/{qrcodescreen.py => screens/qrcode.py} (85%) rename src/{signscreen.py => screens/sign.py} (84%) rename src/{verifyscreen.py => screens/verify.py} (93%) create mode 100644 src/utils/__init__.py rename src/{hashutils.py => utils/hash.py} (71%) create mode 100644 src/utils/log.py diff --git a/.gitignore b/.gitignore index 3c1d746..e96bd6e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,4 @@ build dist *.spec *.sha256*.txt -src/__pycache__ \ No newline at end of file +src/**/__pycache__ \ No newline at end of file diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index 34e2834..931a137 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -34,11 +34,11 @@ ################# # Local libraries ################# -from logutils import verbose_log -from mainscreen import MainScreen -from signscreen import SignScreen -from verifyscreen import VerifyScreen -from qrcodescreen import QRCodeScreen +from utils.log import logger +from screens.main import MainScreen +from screens.sign import SignScreen +from screens.verify import VerifyScreen +from screens.qrcode import QRCodeScreen class KSignerApp(App): @@ -58,23 +58,22 @@ def build(self): - verify; - TODO: others """ - verbose_log("INFO", "Creating ScreenManager") + logger("DEBUG", "KSignerApp: Creating ScreenManager") screen_manager = ScreenManager() - verbose_log("INFO", "Adding ") + logger("DEBUG", "KsignerApp: Adding ") screen_manager.add_widget(MainScreen(name="main")) - verbose_log("INFO", "Adding ") + logger("DEBUG", "KsignerApp: Adding ") screen_manager.add_widget(SignScreen(name="sign")) - verbose_log("INFO", "Adding ") + logger("DEBUG", "KsignerApp: Adding ") screen_manager.add_widget(VerifyScreen(name="verify")) - verbose_log("INFO", "Adding ") + logger("DEBUG", "KsignerApp: Adding ") screen_manager.add_widget(QRCodeScreen(name="qrcode")) return screen_manager - if __name__ == "__main__": app = KSignerApp() app.run() diff --git a/src/logutils.py b/src/logutils.py deleted file mode 100644 index 8526008..0000000 --- a/src/logutils.py +++ /dev/null @@ -1,62 +0,0 @@ -""" -logutils.py - -simple log utilities -""" -import time - - -# pylint: disable=too-few-public-methods -class Bcolors: - """ - Simple class to manage colors in terminal - """ - - HEADER = "\033[95m" - OKBLUE = "\033[94m" - INFO = "\033[92m" - WARN = "\033[93m" - FAIL = "\033[91m" - ENDC = "\033[0m" - BOLD = "\033[1m" - UNDERLINE = "\033[4m" - - @staticmethod - # pylint: disable=inconsistent-return-statements - def build_v_type(v_type: str) -> str: - """ - Get a type and convert into formated color - """ - if v_type == "INFO": - return f"{Bcolors.BOLD}{Bcolors.INFO}{v_type}{Bcolors.ENDC}" - - if v_type == "WARN": - return f"{Bcolors.BOLD}{Bcolors.WARN}{v_type}{Bcolors.ENDC}" - - if v_type == "FAIL": - return f"{Bcolors.BOLD}{Bcolors.FAIL}{v_type}{Bcolors.ENDC}" - - -def now() -> str: - """Return some formated time""" - return time.strftime("%X %x %Z") - - -def verbose_log(v_type: str, v_data: str): - """ - Prints verbose data preceded by current time - - Example: - - ```bash - >>> import logutils - >>> verbose_log('Hello world') - [ksigner 08:08:08 8/8/88 -08] Hello World - - ``` - Args: - :param v_data - the message to be verbose - """ - vtype = Bcolors.build_v_type(v_type) - print(f"[{vtype} ] [KSigner ] [{now()}] {v_data}") diff --git a/src/screens/__init__.py b/src/screens/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/mainscreen.py b/src/screens/main.py similarity index 53% rename from src/mainscreen.py rename to src/screens/main.py index d145145..bd20649 100644 --- a/src/mainscreen.py +++ b/src/screens/main.py @@ -1,3 +1,24 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-2023 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. """ mainscreen.py @@ -12,17 +33,15 @@ ################# # Local libraries ################# -from logutils import verbose_log +from utils.log import logger class MainScreen(Screen): """ MainScreen - Class to manage the two main buttons: - - - Sign; - - Verify; + Class to manage :mod:`screens` :class:`screens.SignScreen` and + :class:`screens.VerifyScreen`. """ def on_press_sign_button(self): @@ -32,7 +51,7 @@ def on_press_sign_button(self): - change background color of button to (.5,.5,.5,.5), giving a visual effect of 'pressed' """ - verbose_log("INFO", " clicked") + logger("DEBUG", "MainScreen: clicked") self.ids.main_screen_sign_button.background_color = (0.5, 0.5, 0.5, 0.5) def on_release_sign_button(self): @@ -43,7 +62,7 @@ def on_release_sign_button(self): giving a visual effect of 'unpressed' - make a screen transition to SignScreen """ - verbose_log("INFO", " released") + logger("DEBUG", "MainScreen: released") self.ids.main_screen_sign_button.background_color = (0, 0, 0, 0) self.manager.transition.direction = "left" self.manager.current = "sign" @@ -55,7 +74,7 @@ def on_press_verify_button(self): - change background color of button to (.5,.5,.5,.5), giving a visual effect of 'pressed' """ - verbose_log("INFO", " clicked") + logger("DEBUG", "MainScreen: clicked") self.ids.main_screen_verify_button.background_color = (0.5, 0.5, 0.5, 0.5) def on_release_verify_button(self): @@ -66,7 +85,7 @@ def on_release_verify_button(self): giving a visual effect of 'unpressed' - make a screen transition to VerifyScreen """ - verbose_log("INFO", " released") + logger("DEBUG", "MainScreen: released") self.ids.main_screen_verify_button.background_color = (0, 0, 0, 0) self.manager.transition.direction = "left" self.manager.current = "verify" diff --git a/src/qrcodescreen.py b/src/screens/qrcode.py similarity index 85% rename from src/qrcodescreen.py rename to src/screens/qrcode.py index 2135ffc..d041571 100644 --- a/src/qrcodescreen.py +++ b/src/screens/qrcode.py @@ -58,7 +58,7 @@ ################# # Local libraries ################# -from logutils import verbose_log +from utils.log import logger class QRCodeScreen(Screen): @@ -165,14 +165,12 @@ def on_touch_down(self, touch): Event fired when user clicked and release the left mouse button (or the touchable screen) """ - verbose_log("INFO", touch) self._back_to_signscreen() def set_image(self): """ Sets and add Image Widget to QRCodeScreen """ - verbose_log("INFO", "Creating ") self._img = Image( pos_hint=self.image_pos_hint, allow_stretch=True, @@ -180,22 +178,14 @@ def set_image(self): size=(Window.height * 0.60, Window.height * 0.6), ) - verbose_log("INFO", "Adding ") self.add_widget(self._img) - - def _on_keyboard_down(self, keyboard, keycode, text, modifiers): - verbose_log("INFO", keycode) - key = keycode[1] - if key == 'escape': # the esc key - self._back_to_signscreen() - return True - + logger("INFO", "QRCodeScreen: added") + def set_label_warn(self): """ Sets and add Label Widget that warn user about the what to do on QRCodeScreen """ - verbose_log("INFO", "Creating ") self._label_warn = Label( text="\n".join([ "[b]To sign this file with Krux:[/b]", @@ -212,16 +202,14 @@ def set_label_warn(self): markup=True, pos_hint=self.warn_pos_hint, ) - - verbose_log("INFO", "Adding ") self.add_widget(self._label_warn) - + logger("INFO", "QRCodeScreen: added") + def set_label_desc(self): """ Sets and add Label Widget that describe the qrcode's data to QRCodeScreen """ - verbose_log("INFO", "Creating ") self._label_desc = Label( text=self.text, font_size=Window.height // 35, @@ -231,45 +219,41 @@ def set_label_desc(self): markup=True, pos_hint=self.label_pos_hint, ) - - verbose_log("INFO", "Adding ") self.add_widget(self._label_desc) + logger("INFO", "QRCodeScreen: added") def generate_qrcode(self): """ Setup QRCode """ - verbose_log("INFO", "Creating QRCode") + logger("INFO", "QRCodeScreen: Creating") self._qrcode = QRCode( version=self.version, error_correction=self.ecc, box_size=self.box_size, border=self.border_size, ) - - verbose_log("INFO", "Adding data") self._qrcode.add_data(self.code) - - verbose_log("INFO", "Creating ") + logger("DEBUG", "QRCodeScreen: data added") + self._qrcode.make(fit=True) self._update_texture() - + def _create_texture(self, k, dt): - verbose_log("INFO", "Setting ") + logger("DEBUG", "QRCodeScreen: creating") self._qrtexture = Texture.create(size=(k, k), colorfmt="rgb") # don't interpolate texture self._qrtexture.min_filter = "nearest" self._qrtexture.mag_filter = "nearest" def _update_texture(self): - verbose_log("INFO", "Updating ") matrix = self._qrcode.get_matrix() k = len(matrix) - verbose_log("INFO", f"={k}") + logger("DEBUG", f"QRCodeScreen: ={k}") # create the texture in main UI thread otherwise # this will lead to memory corruption - verbose_log("INFO", "Creating in mainUI Thread") + logger("DEBUG", "QRCodeScreen: in mainUI Thread") Clock.schedule_once(partial(self._create_texture, k), -1) _color = self.fill_color[:] @@ -282,8 +266,6 @@ def _update_texture(self): # used bytearray for python 3.5 eliminates need for btext buff = bytearray() for row in range(k): - verbose_log("INFO", f"") + logger("DEBUG", "QRCodeScreen: Blitting buffer in ") Clock.schedule_once(lambda dt: self._upd_texture(buff)) def _upd_texture(self, buff): texture = self._qrtexture if not texture: - verbose_log("WARN", "Texture hasn't been created") + logger("WARNING", "QRCodeScreen: Texture hasn't been created") Clock.schedule_once(lambda dt: self._upd_texture(buff)) return - verbose_log("INFO", "Setup image texture") texture.blit_buffer(buff, colorfmt="rgb", bufferfmt="ubyte") texture.flip_vertical() self._img.anim_delay = -1 self._img.texture = texture self._img.canvas.ask_update() + logger("DEBUG", "QRCodeScreen: updated") def _back_to_signscreen(self): """ Back to SignScreen """ - verbose_log("INFO", "Redirecting to ") + logger("DEBUG", "QRCodeScreen: Redirecting to ") self.manager.transition.direction = "right" self.manager.current = "sign" diff --git a/src/signscreen.py b/src/screens/sign.py similarity index 84% rename from src/signscreen.py rename to src/screens/sign.py index 3e87ab5..a3dae20 100644 --- a/src/signscreen.py +++ b/src/screens/sign.py @@ -35,8 +35,8 @@ ################# # Local libraries ################# -from logutils import verbose_log -from hashutils import open_and_hash_file +from utils.log import logger +from utils.hash import open_and_hash_file from filechooser import LoadDialog @@ -73,9 +73,9 @@ def on_press_sign_screen_load_file_and_export_hash_qrcode(self): - change background color of button to (.5,.5,.5,.5), giving a visual effect of 'pressed' """ - verbose_log( - "INFO", - " clicked", + logger( + "DEBUG", + "SignScreen: clicked", ) self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = ( 0.5, @@ -92,9 +92,9 @@ def on_release_sign_screen_load_file_and_export_hash_qrcode(self): giving a visual effect of 'unpressed' - open the FileChooser popup """ - verbose_log( - "INFO", - " released", + logger( + "DEBUG", + "SignScreen: released", ) self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = ( 0, @@ -103,7 +103,7 @@ def on_release_sign_screen_load_file_and_export_hash_qrcode(self): 0, ) - verbose_log("INFO", " opening") + logger("DEBUG", "SignScreen: opening") self._popup.open() def on_press_back_main(self): @@ -113,7 +113,7 @@ def on_press_back_main(self): - change background color of button to (.5,.5,.5,.5), giving a visual effect of 'pressed' """ - verbose_log("INFO", "Clicking ") + logger("DEBUG", "SignScreen: pressed") self.ids.sign_screen_back.background_color = (0.5, 0.5, 0.5, 0.5) def on_release_back_main(self): @@ -124,7 +124,7 @@ def on_release_back_main(self): giving a visual effect of 'pressed' - go back to MainScreen """ - verbose_log("INFO", "Clicking ") + logger("DEBUG", "SignScreen: released") self.ids.sign_screen_back.background_color = (0, 0, 0, 0) self.manager.transition.direction = "right" self.manager.current = "main" @@ -137,18 +137,18 @@ def on_submit_file(self, *args): a given file and redirect to QRCodeScreen """ self.file_input = args[1][0] - verbose_log("INFO", f" loading {self.file_input}") + logger("DEBUG", f"SignScreen: loading {self.file_input}") self.file_hash = open_and_hash_file(path=self.file_input, verbose=True) - verbose_log("INFO", " Closing popup...") + logger("DEBUG", "SignScreen: closed") self._popup.dismiss() - verbose_log("INFO", " Cache filename and hash to ") + logger("DEBUG", "SignScreen: Caching filename and hash to ") qrcodescreen = self.manager.get_screen("qrcode") qrcodescreen.text = f"[b]{self.file_input}[/b]\n\n[b]{self.file_hash}[/b]" qrcodescreen.code = self.file_hash - verbose_log("INFO", "Redirecting to ") + logger("DEBUG", "SignScreen: Redirecting to ") self.manager.transition.direction = "left" self.manager.current = "qrcode" diff --git a/src/verifyscreen.py b/src/screens/verify.py similarity index 93% rename from src/verifyscreen.py rename to src/screens/verify.py index e5c2156..78bcda9 100644 --- a/src/verifyscreen.py +++ b/src/screens/verify.py @@ -34,7 +34,7 @@ ################# # Local libraries ################# -from logutils import verbose_log +from utils.log import logger class VerifyScreen(Screen): @@ -57,7 +57,7 @@ def on_press_verify_screen_load_file_button(self): - change background color of button to (.5,.5,.5,.5), giving a visual effect of 'pressed' """ - verbose_log("INFO", " clicked") + logger("INFO", " clicked") self.ids.verify_screen_load_file_button.background_color = (0.5, 0.5, 0.5, 0.5) def on_release_verify_screen_load_file_button(self): @@ -68,5 +68,5 @@ def on_release_verify_screen_load_file_button(self): giving a visual effect of 'unpressed' - make a screen transition to SignScreen """ - verbose_log("INFO", " released") + logger("INFO", " released") self.ids.verify_screen_load_file_button.background_color = (0, 0, 0, 0) diff --git a/src/utils/__init__.py b/src/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/hashutils.py b/src/utils/hash.py similarity index 71% rename from src/hashutils.py rename to src/utils/hash.py index 5ae9a54..17e914b 100644 --- a/src/hashutils.py +++ b/src/utils/hash.py @@ -9,12 +9,6 @@ #################### import hashlib -################# -# Local libraries -################# -from logutils import verbose_log - - def open_and_hash_file(**kwargs) -> str: """ " Read file from --file argument on `sign` command and return its hash @@ -26,19 +20,13 @@ def open_and_hash_file(**kwargs) -> str: Apply verbose or not """ __filename__ = kwargs.get("path") - verbose = kwargs.get("verbose") try: with open(__filename__, "rb") as f_to_be_sig: _bytes = f_to_be_sig.read() # read file as bytes - __readable_hash__ = hashlib.sha256(_bytes).hexdigest() + return hashlib.sha256(_bytes).hexdigest() - # Prints the hash of the file - if verbose: - verbose_log("INFO", f"Hash of {__filename__}: {__readable_hash__}") - - return __readable_hash__ except FileNotFoundError as exc: raise FileNotFoundError(f"Unable to read target file: {__filename__}") from exc @@ -58,12 +46,8 @@ def save_hashed_file(**kwargs): """ __data__ = kwargs.get("data") __path__ = kwargs.get("path") - verbose = kwargs.get("verbose") __hash_file__ = f"{__path__}.sha256sum.txt" - if verbose: - verbose_log("INFO", f"Saving a hash file: {__hash_file__}") - with open(__hash_file__, mode="w", encoding="utf-8") as hash_file: hash_file.write(f"{__data__} {__hash_file__}") diff --git a/src/utils/log.py b/src/utils/log.py new file mode 100644 index 0000000..b60bfc7 --- /dev/null +++ b/src/utils/log.py @@ -0,0 +1,154 @@ +""" +logutils.py + +simple log utilities +""" +from logging import ( + NOTSET, + DEBUG, + INFO, + WARNING, + ERROR, + CRITICAL, + Formatter, + StreamHandler, + basicConfig, + info, + debug, + warning, + error +) +import time + + +# pylint: disable=too-few-public-methods +class Colors: + """ + Simple class to manage ANSI colors in terminal + + see https://gist.github.com/rene-d/9e584a7dd2935d0f461904b9f2950007 + """ + BLACK = "\033[0;30m" + RED = "\033[0;31m" + GREEN = "\033[0;32m" + BROWN = "\033[0;33m" + BLUE = "\033[0;34m" + PURPLE = "\033[0;35m" + CYAN = "\033[0;36m" + LIGHT_GRAY = "\033[0;37m" + DARK_GRAY = "\033[1;30m" + LIGHT_RED = "\033[1;31m" + LIGHT_GREEN = "\033[1;32m" + YELLOW = "\033[1;33m" + LIGHT_BLUE = "\033[1;34m" + LIGHT_PURPLE = "\033[1;35m" + LIGHT_CYAN = "\033[1;36m" + LIGHT_WHITE = "\033[1;37m" + BOLD = "\033[1m" + FAINT = "\033[2m" + ITALIC = "\033[3m" + UNDERLINE = "\033[4m" + BLINK = "\033[5m" + NEGATIVE = "\033[7m" + CROSSED = "\033[9m" + END = "\033[0m" + + # cancel SGR codes if we don't write to a terminal + if not __import__("sys").stdout.isatty(): + for _ in dir(): + if isinstance(_, str) and _[0] != "_": + locals()[_] = "" + + else: + # set Windows console in VT mode + if __import__("platform").system() == "Windows": + kernel32 = __import__("ctypes").windll.kernel32 + kernel32.SetConsoleMode(kernel32.GetStdHandle(-11), 7) + del kernel32 + + @staticmethod + # pylint: disable=inconsistent-return-statements + def log(level: int) -> str: + """ + Get a level and convert into formated color. + + Supported levels are those from :mod:`logging` module + + - :const:`logging.NOTSET` + - :const:`logging.DEBUG` + - :const:`logging.INFO` + - :const:`logging.WARNING` + - :const:`logging.ERROR` + - :const:`logging.CRITICAL` + + Parameters + ---------- + *level* : The level from :mod:`logging` + + Returns + ------- + *str*: The formated color with level name + """ + if level == NOTSET: + return f"{Colors.BOLD}{Colors.GREEN}INFO{Colors.END}" + + elif level == DEBUG: + return f"{Colors.BOLD}{Colors.BLUE}DEBUG{Colors.END}" + + elif level == INFO: + return f"{Colors.BOLD}{Colors.GREEN}INFO{Colors.END}" + + elif level == WARNING: + return f"{Colors.BOLD}{Colors.YELLOW}WARNING{Colors.END}" + + elif level == ERROR: + return f"{Colors.BOLD}{Colors.BROWN}ERROR{Colors.END}" + + elif level == CRITICAL: + return f"{Colors.BOLD}{Colors.RED}CRITICAL{Colors.END}" + +class KSignerFormatter(Formatter): + + def format(self, record): + colored = Colors.log(record.levelno) + return _fmt.format(record) + +def now() -> str: + """Return some formated time""" + return time.strftime("%X %x %Z") + + + +def logger(level, message): + """ + Prints verbose data preceded by logger level + and current asctime + + Example: + -------- + + ```bash + >>> from utils import logger + >>> logger.info('Hello world') + [INFO ] 08:08:08 8/8/88 -08 :: Hello World + ``` + + Parameters + ---------- + :param:`mes + the message to be verbose + """ + + basicConfig(format="[%(colored)s ] %(channel)s %(asctime)s %(message)s") + + if (level == "INFO"): + info(message, extra={'colored': INFO }) + + if (level == "DEBUG"): + debug(message, extra={'colored': DEBUG }) + + if (level == "WARNING"): + warning(message, extra={'colored': WARNING }) + + if (level == "ERROR"): + error(message, extra={'colored': ERROR }) From 87166cd78df9ebfc1f4a45dcb4e8147b6e93d26f Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Thu, 12 Oct 2023 16:31:19 -0300 Subject: [PATCH 026/104] Implemented keys esc|enter|backspace|left in QRCodeScreen to back to the previous menu --- src/screens/qrcode.py | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/screens/qrcode.py b/src/screens/qrcode.py index d041571..3494d5f 100644 --- a/src/screens/qrcode.py +++ b/src/screens/qrcode.py @@ -150,6 +150,13 @@ def __init__(self, **kwargs): self._qrcode = None self._qrtexture = None self._img = None + self._keyboard = Window.request_keyboard(self._keyboard_closed, self, 'text') + if self._keyboard.widget: + logger("WARNING", "QRCodeScreen: This widget is a VKeyboard object") + # which you can use + # to change the keyboard layout. + passss + self._keyboard.bind(on_key_down=self._on_keyboard_down) def on_pre_enter(self, *args): """ @@ -188,12 +195,12 @@ def set_label_warn(self): """ self._label_warn = Label( text="\n".join([ - "[b]To sign this file with Krux:[/b]", + "To sign this file with Krux:", "", " (a) load a 12/24 words key, with or without BIP39 password;", - " (b) use the Sign->Message feature;", - " (c) and scan this QR code below;", - " (d) click on screen or type 'esc' to proceed." + " (b) use the Sign -> Message feature;", + " (c) scan this QR code below;", + " (d) click on screen or type one of 'esc|backspace|enter|left' keys to proceed." ]), font_size=Window.height // 35, font_name="terminus.ttf", @@ -298,3 +305,27 @@ def _back_to_signscreen(self): logger("DEBUG", "QRCodeScreen: Redirecting to ") self.manager.transition.direction = "right" self.manager.current = "sign" + + def _keyboard_closed(self): + logger("WARNING", "QRCodeScreen: keyboard have been closed") + self._keyboard.unbind(on_key_down=self._on_keyboard_down) + self._keyboard = None + + def _on_keyboard_down(self, keyboard, keycode, text, modifiers): + # Keycode is composed of an integer + a string + # If we hit escape, release the keyboard + if keycode[1] == 'escape': + self._back_to_signscreen() + + elif keycode[1] == 'enter': + self._back_to_signscreen() + + elif keycode[1] == 'left': + self._back_to_signscreen() + + elif keycode[1] == 'backspace': + self._back_to_signscreen() + else: + logger("WARNING", f"QRCodeScreen: key '{keycode[1]}' not implemented") + + return True From 859441e3cfe16633c3aa80915b4e8e425a2622d2 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Fri, 13 Oct 2023 17:05:55 -0300 Subject: [PATCH 027/104] added capture camera to ScanScreen --- pyproject.toml | 3 +- src/ksigner-gui.py | 5 +- src/ksigner.kv | 7 +- src/screens/qrcode.py | 2 +- src/screens/scan.py | 203 ++++++++++++++++++++++++++++++++++++++++++ src/screens/sign.py | 31 +++++++ 6 files changed, 243 insertions(+), 8 deletions(-) create mode 100644 src/screens/scan.py diff --git a/pyproject.toml b/pyproject.toml index fea6197..fd9f7cd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,11 +11,10 @@ readme = "README.md" [tool.poetry.dependencies] python = ">=3.8,<=3.11.5" -opencv-python = "^4.8.0.76" qrcode = "^7.4.2" pillow = "^10.0.1" -pyzbar = "^0.1.9" kivy = "^2.2.1" +zbarcam = "^2020.524" [tool.poetry.group.dev.dependencies] black = "^23.9.1" diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index 931a137..c92ec31 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -39,7 +39,7 @@ from screens.sign import SignScreen from screens.verify import VerifyScreen from screens.qrcode import QRCodeScreen - +from screens.scan import ScanScreen class KSignerApp(App): """ @@ -72,6 +72,9 @@ def build(self): logger("DEBUG", "KsignerApp: Adding ") screen_manager.add_widget(QRCodeScreen(name="qrcode")) + + logger("DEBUG", "KsignerApp: Adding ") + screen_manager.add_widget(ScanScreen(name="scan")) return screen_manager if __name__ == "__main__": diff --git a/src/ksigner.kv b/src/ksigner.kv index 7ed7be1..c5297a6 100644 --- a/src/ksigner.kv +++ b/src/ksigner.kv @@ -64,16 +64,15 @@ rectangle: self.x, self.y, self.width, self.height Button: + id: sign_screen_import_and_save_signature text: 'Import & save signature' font_size: root.height // 25 font_name: 'terminus.ttf' font_size: '20sp' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 - on_press: - self.background_color = (.5, .5, .5, .5) - on_release: - self.background_color = (0, 0, 0, 0) + on_press: root.on_press_sign_screen_import_and_save_signature() + on_release:root.on_release_sign_screen_import_and_save_signature() canvas.before: Color: rgba: 1, 1, 1, 1 diff --git a/src/screens/qrcode.py b/src/screens/qrcode.py index 3494d5f..5066b91 100644 --- a/src/screens/qrcode.py +++ b/src/screens/qrcode.py @@ -195,7 +195,7 @@ def set_label_warn(self): """ self._label_warn = Label( text="\n".join([ - "To sign this file with Krux:", + "[b]To sign this file with Krux:[/b]", "", " (a) load a 12/24 words key, with or without BIP39 password;", " (b) use the Sign -> Message feature;", diff --git a/src/screens/scan.py b/src/screens/scan.py new file mode 100644 index 0000000..eee639c --- /dev/null +++ b/src/screens/scan.py @@ -0,0 +1,203 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-2023 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +""" +scan.py + +Implements an inherited kivy.uix.screenmanager.Screen +for scan QRCodes +""" + +################ +# Kivy libraries +################ +from kivy.clock import Clock +from kivy.core.window import Window +from kivy.uix.label import Label +from kivy.uix.screenmanager import Screen +from kivy.properties import ( + StringProperty, + NumericProperty, + ListProperty, + ObjectProperty, +) +from kivy_garden.zbarcam import ZBarCam +from pyzbar.pyzbar import ZBarSymbol + +################# +# Local libraries +################# +from utils.log import logger + + +class ScanScreen(Screen): + """ + Class responsible to scan qrcodes. + """ + + code = StringProperty("") + """ + The string code to be scanned + """ + + text = StringProperty("") + """ + The label to be show describing the QRCode + """ + + fill_color = ListProperty((1, 1, 1, 1)) + """ + :data:`background_color` is a tuple describing the color of background + defined at :class:`~qrcode.QRCode` + """ + + label_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.125}) + """ + :data:`label_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, + to set the default position on Screen + """ + + zbar_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.5}) + """ + :data:`label_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, + to set the default position on Screen + """ + + warn_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.9}) + """ + :data:`warn_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, + to set the default position on Screen + """ + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self._label_warn = None + self._label_desc = None + self._zbarcam = None + self._keyboard = Window.request_keyboard(self._keyboard_closed, self, 'text') + if self._keyboard.widget: + logger("WARNING", "QRCodeScreen: This widget is a VKeyboard object") + # which you can use + # to change the keyboard layout. + passss + self._keyboard.bind(on_key_down=self._on_keyboard_down) + + def on_pre_enter(self, *args): + """ + Event fired when the screen is about to be used: the entering animation is started. + """ + self.set_label_warn() + self.set_zbarcam() + + def set_label_warn(self): + """ + Sets and add Label Widget that warn user about + the what to do on ScanScreen + """ + self._label_warn = Label( + text="\n".join([ + "[b]To create .sig file:[/b]", + "", + " (a) Scan the qrcode signature created on 'Import QRCode'" + ]), + font_size=Window.height // 35, + font_name="terminus.ttf", + halign="center", + color=self.fill_color, + markup=True, + pos_hint=self.warn_pos_hint, + ) + logger("INFO", "ScanScreen: added") + + def set_zbarcam(self): + """ + Sets and add ZBarCam Widget that describe the qrcode's + data to ScanScreen + """ + self._zbarcam = ZBarCam() + self.add_widget(self._zbarcam) + logger("INFO", "ScanScreen: added") + Clock.schedule_interval(self._decode_qrcode, 1) + + def set_label_desc(self): + """ + Sets and add Label Widget that describe the qrcode's + data to ScanScreen + """ + self._label_desc = Label( + text=self._zbarcam.symbols[0].data, + font_size=Window.height // 35, + font_name="terminus.ttf", + halign="center", + color=self.fill_color, + markup=True, + pos_hint=self.label_pos_hint, + ) + self.add_widget(self._label_desc) + logger("INFO", "ScanScreen: added") + + def _back_to_signscreen(self): + """ + Back to SignScreen + """ + logger("DEBUG", "ScanScreen: Redirecting to ") + self.manager.transition.direction = "left" + self.manager.current = "sign" + + def _keyboard_closed(self): + logger("WARNING", "ScanScreen: keyboard have been closed") + self._keyboard.unbind(on_key_down=self._on_keyboard_down) + self._keyboard = None + + def _on_keyboard_down(self, keyboard, keycode, text, modifiers): + # Keycode is composed of an integer + a string + # If we hit escape, release the keyboard + if keycode[1] == 'escape': + self._back_to_signscreen() + + elif keycode[1] == 'enter': + self._back_to_signscreen() + + elif keycode[1] == 'left': + self._back_to_signscreen() + + elif keycode[1] == 'backspace': + self._back_to_signscreen() + else: + logger("WARNING", f"ScanScreen: key '{keycode[1]}' not implemented") + + return True + + def _decode_qrcode(self, *args): + """ + When camera capture the QRCode, + :data:`zbarcam.symbols` will be filled; + When it occurs, stop scanning + + @see https://stackoverflow.com/questions/73067952/kivy-load-camera-zbarscan-on-click-button/73077097#73077097 + """ + logger("DEBUG", "ScanScreen: waiting for qrcode") + if len(self._zbarcam.symbols) > 0: + logger("DEBUG", f"ScanScreen: captured data={self._zbarcam.symbols[0].data}") + self.set_label_desc() + Clock.unschedule(self._decode_qrcode, 1) + self._zbarcam.stop() # stop zbarcam + self._zbarcam.ids['xcamera']._camera._device.release() diff --git a/src/screens/sign.py b/src/screens/sign.py index a3dae20..c801700 100644 --- a/src/screens/sign.py +++ b/src/screens/sign.py @@ -105,7 +105,36 @@ def on_release_sign_screen_load_file_and_export_hash_qrcode(self): logger("DEBUG", "SignScreen: opening") self._popup.open() + + def on_press_sign_screen_import_and_save_signature(self): + """ + on_press_import_and_save_signature + + - change background color of button to (.5,.5,.5,.5), + giving a visual effect of 'pressed' + """ + logger("DEBUG", "SignScreen: pressed") + self.ids.sign_screen_import_and_save_signature.background_color = (0.5, 0.5, 0.5, 0.5) + + def on_release_sign_screen_import_and_save_signature(self): + """ + on_release_sign_screen_import_and_save_signature + + - change background color of button to (0, 0, 0, 0), + giving a visual effect of 'pressed' + - go to ScanScreen + """ + logger("DEBUG", "SignScreen: released") + self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = ( + 0, + 0, + 0, + 0, + ) + self.manager.transition.direction = "right" + self.manager.current = "scan" + def on_press_back_main(self): """ on_press_back_main @@ -152,3 +181,5 @@ def on_submit_file(self, *args): logger("DEBUG", "SignScreen: Redirecting to ") self.manager.transition.direction = "left" self.manager.current = "qrcode" + + From cdb21676afb5e9d459a3e3085e2d7d2d671fd07f Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Fri, 13 Oct 2023 19:10:12 -0300 Subject: [PATCH 028/104] fixed ScanScreen with labels and camera --- src/screens/scan.py | 52 ++++++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/src/screens/scan.py b/src/screens/scan.py index eee639c..092b29a 100644 --- a/src/screens/scan.py +++ b/src/screens/scan.py @@ -32,6 +32,7 @@ from kivy.clock import Clock from kivy.core.window import Window from kivy.uix.label import Label +from kivy.uix.boxlayout import BoxLayout from kivy.uix.screenmanager import Screen from kivy.properties import ( StringProperty, @@ -75,13 +76,13 @@ class ScanScreen(Screen): to set the default position on Screen """ - zbar_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.5}) + zbar_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.25}) """ :data:`label_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, to set the default position on Screen """ - warn_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.9}) + warn_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 1}) """ :data:`warn_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, to set the default position on Screen @@ -91,22 +92,35 @@ def __init__(self, **kwargs): super().__init__(**kwargs) self._label_warn = None self._label_desc = None + self._box_layout = None self._zbarcam = None + self._scanned_data = None self._keyboard = Window.request_keyboard(self._keyboard_closed, self, 'text') if self._keyboard.widget: logger("WARNING", "QRCodeScreen: This widget is a VKeyboard object") # which you can use # to change the keyboard layout. - passss + pass self._keyboard.bind(on_key_down=self._on_keyboard_down) def on_pre_enter(self, *args): """ Event fired when the screen is about to be used: the entering animation is started. """ + self.set_box_layout() self.set_label_warn() self.set_zbarcam() - + self.set_label_desc() + + def set_box_layout(self): + """ + Sets and add BoxLayout Widget that wrap + all needed widgets + """ + self._box_layout = BoxLayout(orientation="vertical") + self.add_widget(self._box_layout) + logger("DEBUG", "ScanScreen: added") + def set_label_warn(self): """ Sets and add Label Widget that warn user about @@ -122,19 +136,20 @@ def set_label_warn(self): font_name="terminus.ttf", halign="center", color=self.fill_color, - markup=True, - pos_hint=self.warn_pos_hint, + markup=True ) - logger("INFO", "ScanScreen: added") - + logger("INFO", "ScanScreen: added to ") + self._box_layout.add_widget(self._label_warn) + def set_zbarcam(self): """ Sets and add ZBarCam Widget that describe the qrcode's data to ScanScreen """ + self._box_layout self._zbarcam = ZBarCam() - self.add_widget(self._zbarcam) - logger("INFO", "ScanScreen: added") + self._box_layout.add_widget(self._zbarcam) + logger("INFO", "ScanScreen: added to ") Clock.schedule_interval(self._decode_qrcode, 1) def set_label_desc(self): @@ -143,7 +158,7 @@ def set_label_desc(self): data to ScanScreen """ self._label_desc = Label( - text=self._zbarcam.symbols[0].data, + text="None", font_size=Window.height // 35, font_name="terminus.ttf", halign="center", @@ -151,8 +166,8 @@ def set_label_desc(self): markup=True, pos_hint=self.label_pos_hint, ) - self.add_widget(self._label_desc) - logger("INFO", "ScanScreen: added") + self._box_layout.add_widget(self._label_desc) + logger("INFO", "ScanScreen: added to ") def _back_to_signscreen(self): """ @@ -186,6 +201,12 @@ def _on_keyboard_down(self, keyboard, keycode, text, modifiers): return True + @staticmethod + def _chunk_str(msg, size): + return "\n".join([ + msg[i:i+size] for i in range(0, len(msg), size) + ]) + def _decode_qrcode(self, *args): """ When camera capture the QRCode, @@ -196,8 +217,9 @@ def _decode_qrcode(self, *args): """ logger("DEBUG", "ScanScreen: waiting for qrcode") if len(self._zbarcam.symbols) > 0: - logger("DEBUG", f"ScanScreen: captured data={self._zbarcam.symbols[0].data}") - self.set_label_desc() + scanned_data = self._zbarcam.symbols[0].data.decode("UTF-8") + logger("DEBUG", f"ScanScreen: captured '{scanned_data}'") + self._label_desc.text = ScanScreen._chunk_str(scanned_data, 16) Clock.unschedule(self._decode_qrcode, 1) self._zbarcam.stop() # stop zbarcam self._zbarcam.ids['xcamera']._camera._device.release() From 773d07fed863b2f4b1636fb657afa32c27180754 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Sat, 14 Oct 2023 12:03:48 -0300 Subject: [PATCH 029/104] modified some messages on scan signature --- src/ksigner-gui.py | 4 +- src/screens/scan.py | 93 +++++++++++++++++++++++++++++++-------------- src/screens/sign.py | 3 +- 3 files changed, 69 insertions(+), 31 deletions(-) diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index c92ec31..df6da4d 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -73,8 +73,8 @@ def build(self): logger("DEBUG", "KsignerApp: Adding ") screen_manager.add_widget(QRCodeScreen(name="qrcode")) - logger("DEBUG", "KsignerApp: Adding ") - screen_manager.add_widget(ScanScreen(name="scan")) + logger("DEBUG", "KsignerApp: Adding ") + screen_manager.add_widget(ScanScreen(name="scan-import-save-signature")) return screen_manager if __name__ == "__main__": diff --git a/src/screens/scan.py b/src/screens/scan.py index 092b29a..d4e6ac9 100644 --- a/src/screens/scan.py +++ b/src/screens/scan.py @@ -54,16 +54,6 @@ class ScanScreen(Screen): Class responsible to scan qrcodes. """ - code = StringProperty("") - """ - The string code to be scanned - """ - - text = StringProperty("") - """ - The label to be show describing the QRCode - """ - fill_color = ListProperty((1, 1, 1, 1)) """ :data:`background_color` is a tuple describing the color of background @@ -76,7 +66,7 @@ class ScanScreen(Screen): to set the default position on Screen """ - zbar_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.25}) + zbar_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.5}) """ :data:`label_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, to set the default position on Screen @@ -88,13 +78,37 @@ class ScanScreen(Screen): to set the default position on Screen """ + scan_steps = ObjectProperty({ + "scan-import-save-signature-warnings": ( + "\n".join(["Step (1):", "", "Scan the signed message"]), + "\n".join(["Step (2):", "", "Scan the hexadecimal public key"]) + ), + "scan-import-save-signature-labels": ( + "Scanned signature: ", + "Scanned public key: " + ), + "scan-import-save-signature-datas": ( + None, + None + ) + }) + """ + Scan steps messages to help user + """ + def __init__(self, **kwargs): super().__init__(**kwargs) - self._label_warn = None + + #Widgets + self._label_warn = None self._label_desc = None self._box_layout = None self._zbarcam = None - self._scanned_data = None + + # Setup message steps dynamically on :data:`self._label_warn.text` + self._step = 0 + + # Keyboard bindings for close ScanScreen self._keyboard = Window.request_keyboard(self._keyboard_closed, self, 'text') if self._keyboard.widget: logger("WARNING", "QRCodeScreen: This widget is a VKeyboard object") @@ -127,11 +141,7 @@ def set_label_warn(self): the what to do on ScanScreen """ self._label_warn = Label( - text="\n".join([ - "[b]To create .sig file:[/b]", - "", - " (a) Scan the qrcode signature created on 'Import QRCode'" - ]), + text=self.scan_steps[f"{self.manager.current}-warnings"][self._step], font_size=Window.height // 35, font_name="terminus.ttf", halign="center", @@ -146,7 +156,6 @@ def set_zbarcam(self): Sets and add ZBarCam Widget that describe the qrcode's data to ScanScreen """ - self._box_layout self._zbarcam = ZBarCam() self._box_layout.add_widget(self._zbarcam) logger("INFO", "ScanScreen: added to ") @@ -157,9 +166,22 @@ def set_label_desc(self): Sets and add Label Widget that describe the qrcode's data to ScanScreen """ + messages = [] + for i in range(2): + messages.append(( + self.scan_steps[f"{self.manager.current}-labels"][i], + ScanScreen._chunk_str(self.scan_steps[f"{self.manager.current}-datas"][i], 32) + )) + + print(messages) + self._label_desc = Label( - text="None", - font_size=Window.height // 35, + text="\n".join([ + messages[0][0] + messages[0][1], + "", + messages[1][0] + messages[1][1] + ]), + font_size=Window.height // 50, font_name="terminus.ttf", halign="center", color=self.fill_color, @@ -203,9 +225,16 @@ def _on_keyboard_down(self, keyboard, keycode, text, modifiers): @staticmethod def _chunk_str(msg, size): - return "\n".join([ - msg[i:i+size] for i in range(0, len(msg), size) - ]) + """ + Split a big string in multiple lines; + Use with sha256 or signature strings. + """ + if (not msg): + return "None" + else: + return "\n".join([ + msg[i:i+size] for i in range(0, len(msg), size) + ]) def _decode_qrcode(self, *args): """ @@ -219,7 +248,15 @@ def _decode_qrcode(self, *args): if len(self._zbarcam.symbols) > 0: scanned_data = self._zbarcam.symbols[0].data.decode("UTF-8") logger("DEBUG", f"ScanScreen: captured '{scanned_data}'") - self._label_desc.text = ScanScreen._chunk_str(scanned_data, 16) - Clock.unschedule(self._decode_qrcode, 1) - self._zbarcam.stop() # stop zbarcam - self._zbarcam.ids['xcamera']._camera._device.release() + + # Now dinamically set the properly data + self.scan_steps[f"{self.manager.current}-datas"][self._step] = scanned_data + + # Change + self._step += 1 + + if (self._step > 1): + Clock.unschedule(self._decode_qrcode, 1) + self._zbarcam.stop() # stop zbarcam + self._zbarcam.ids['xcamera']._camera._device.release() + self._back_to_signscreen() \ No newline at end of file diff --git a/src/screens/sign.py b/src/screens/sign.py index c801700..8034f93 100644 --- a/src/screens/sign.py +++ b/src/screens/sign.py @@ -131,8 +131,9 @@ def on_release_sign_screen_import_and_save_signature(self): 0, 0, ) + self self.manager.transition.direction = "right" - self.manager.current = "scan" + self.manager.current = "scan-import-save-signature" def on_press_back_main(self): From f31fa9835b499853ab361e351283be29c8eb674d Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Mon, 16 Oct 2023 16:00:18 -0300 Subject: [PATCH 030/104] moved some files to refactor file's tree --- src/callbacks.py | 36 +++++---- src/processingutils.py | 62 -------------- src/screens/scan.py | 14 ++-- src/utils/hash.py | 13 ++- src/utils/log.py | 1 - src/{pemutils.py => utils/pem.py} | 17 +--- src/{qrutils.py => utils/qr.py} | 25 ------ .../signandverify.py} | 5 -- src/{videoutils.py => utils/video.py} | 80 ++++++++++--------- 9 files changed, 77 insertions(+), 176 deletions(-) delete mode 100644 src/processingutils.py rename src/{pemutils.py => utils/pem.py} (76%) rename src/{qrutils.py => utils/qr.py} (69%) rename src/{signandverifyutils.py => utils/signandverify.py} (97%) rename src/{videoutils.py => utils/video.py} (69%) diff --git a/src/callbacks.py b/src/callbacks.py index 756290c..75b863e 100644 --- a/src/callbacks.py +++ b/src/callbacks.py @@ -7,12 +7,12 @@ import argparse from constants import KSIGNER_VERSION -from hashutils import open_and_hash_file, save_hashed_file -from logutils import verbose_log -from pemutils import create_public_key_certificate -from qrutils import make_qr_code -from signandverifyutils import verify -from videoutils import scan_and_save_signature, scan_public_key +from utils.hash import open_and_hash_file, save_hashed_file +from utils.log import logger +from utils.pem import create_public_key_certificate +from utils.qr import make_qr_code +from utils.signandverify import verify +from utils.video import scan_and_save_signature, scan_public_key def on_version(parser: argparse.ArgumentParser): @@ -52,33 +52,37 @@ def on_sign(parser: argparse.ArgumentParser): # If the signergn command was given if args.command == "sign" and args.file_to_sign is not None: # read file - data = open_and_hash_file(path=args.file_to_sign, verbose=args.verbose) + + logger("DEBUG", f"opening {args.file_to_sign}") + data = open_and_hash_file(path=args.file_to_sign) # Saves a hash file - save_hashed_file(data=data, path=args.file_to_sign, verbose=args.verbose) + logger("DEBUG", f"saving {args.file_to_sign}.sha256.txt") + save_hashed_file(data=data, path=args.file_to_sign) # Shows some message - verbose_log("INFO", "To sign this file with Krux: ") - verbose_log("INFO", " (a) load a 24 words key;") - verbose_log("INFO", " (b) use the Sign->Message feature;") - verbose_log("INFO", " (c) and scan this QR code below.") + print("") + print("To sign this file with Krux: ") + print(" (a) load a 12/24 words key with or without password;") + print(" (b) use the Sign->Message feature;") + print(" (c) and scan this QR code below.") + print("") # Prints the QR code + logger("DEBUG", f"Adding (data={data})") __qrcode__ = make_qr_code(data=data, verbose=args.verbose) - print(f"\n{__qrcode__}") + print(f"{__qrcode__}") # Scans the signature QR code scan_and_save_signature( is_normalized=args.is_normalized, is_gray_scale=args.is_gray_scale, - verbose=args.verbose, ) # Scans the public KeyboardInterruptardInterrupt pubkey = scan_public_key( is_normalized=args.is_normalized, is_gray_scale=args.is_gray_scale, - verbose=args.verbose, ) # Create PEM data @@ -88,7 +92,6 @@ def on_sign(parser: argparse.ArgumentParser): pubkey=pubkey, uncompressed=args.uncompressed_pub_key, owner=args.file_owner, - verbose=args.verbose, ) @@ -113,7 +116,6 @@ def on_verify(parser: argparse.ArgumentParser): filename=args.verify_file, pubkey=args.pub_file, sigfile=args.sig_file, - verbose=args.verbose, ) # If command was not found else: diff --git a/src/processingutils.py b/src/processingutils.py deleted file mode 100644 index 2f9173b..0000000 --- a/src/processingutils.py +++ /dev/null @@ -1,62 +0,0 @@ -""" -processingutils.py - -video post-processing utils, -if necessary -""" - -####################### -# Third party libraries -####################### -import cv2 - -################# -# Local libraries -################# -from logutils import verbose_log - - -def normalization_transform(**kwargs): - """ " - Apply Gray scale on frames - - Kwargs - :param frame - The frame which will be applyed the transformation - :param verbose - Apply verbose messages - """ - frame = kwargs.get("frame") - verbose = kwargs.get("verbose") - - # Cameras have different configurations - # and behaviours, so try apply some normalization - # @see https://stackoverflow.com/questions/61016954/ - # controlling-contrast-and-brightness-of-video-stream-in-opencv-and-python - cv2.normalize(frame, frame, 0, 255, cv2.NORM_MINMAX) - - # Verbose some data - if verbose: - verbose_log("INFO", f"normalized (frame={frame})") - - -def gray_transform(**kwargs): - """ " - Apply Gray scale on frames - - Kwargs - :param ret - :param frame - The frame which will be applyed the transformation - :param verbose - Apply verbose messages - """ - frame = kwargs.get("frame") - verbose = kwargs.get("verbose") - - # Convert frame to grayscale - frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) - - # verbose_loge some data - if verbose: - verbose_log("INFO", f"gray scale (frame={frame})") diff --git a/src/screens/scan.py b/src/screens/scan.py index d4e6ac9..c96eb67 100644 --- a/src/screens/scan.py +++ b/src/screens/scan.py @@ -173,8 +173,6 @@ def set_label_desc(self): ScanScreen._chunk_str(self.scan_steps[f"{self.manager.current}-datas"][i], 32) )) - print(messages) - self._label_desc = Label( text="\n".join([ messages[0][0] + messages[0][1], @@ -253,10 +251,10 @@ def _decode_qrcode(self, *args): self.scan_steps[f"{self.manager.current}-datas"][self._step] = scanned_data # Change - self._step += 1 + #self._step += 1 - if (self._step > 1): - Clock.unschedule(self._decode_qrcode, 1) - self._zbarcam.stop() # stop zbarcam - self._zbarcam.ids['xcamera']._camera._device.release() - self._back_to_signscreen() \ No newline at end of file + #if (self._step > 1): + Clock.unschedule(self._decode_qrcode, 1) + self._zbarcam.stop() # stop zbarcam + self._zbarcam.ids['xcamera']._camera._device.release() + #self._back_to_signscreen() \ No newline at end of file diff --git a/src/utils/hash.py b/src/utils/hash.py index 17e914b..bfed660 100644 --- a/src/utils/hash.py +++ b/src/utils/hash.py @@ -28,7 +28,9 @@ def open_and_hash_file(**kwargs) -> str: return hashlib.sha256(_bytes).hexdigest() except FileNotFoundError as exc: - raise FileNotFoundError(f"Unable to read target file: {__filename__}") from exc + raise FileNotFoundError( + f"Unable to read target file: {__filename__}" + ) from exc def save_hashed_file(**kwargs): @@ -49,5 +51,10 @@ def save_hashed_file(**kwargs): __hash_file__ = f"{__path__}.sha256sum.txt" - with open(__hash_file__, mode="w", encoding="utf-8") as hash_file: - hash_file.write(f"{__data__} {__hash_file__}") + try: + with open(__hash_file__, mode="w", encoding="utf-8") as hash_file: + hash_file.write(f"{__data__} {__hash_file__}") + except FileNotFoundError as exc: + raise FileNotFoundError( + f"Unable to read target file: {__hash_file__}" + ) from exc \ No newline at end of file diff --git a/src/utils/log.py b/src/utils/log.py index b60bfc7..5f61fe7 100644 --- a/src/utils/log.py +++ b/src/utils/log.py @@ -118,7 +118,6 @@ def now() -> str: return time.strftime("%X %x %Z") - def logger(level, message): """ Prints verbose data preceded by logger level diff --git a/src/pemutils.py b/src/utils/pem.py similarity index 76% rename from src/pemutils.py rename to src/utils/pem.py index ce150c5..6663a2d 100644 --- a/src/pemutils.py +++ b/src/utils/pem.py @@ -18,8 +18,6 @@ ################# from constants import KSIGNER_COMPRESSED_PUBKEY_PREPEND from constants import KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND -from logutils import verbose_log - def create_public_key_certificate(**kwargs): """ @@ -42,28 +40,20 @@ def create_public_key_certificate(**kwargs): hex_pubkey = kwargs.get("pubkey") uncompressed = kwargs.get("uncompressed") owner = kwargs.get("owner") - verbose = kwargs.get("verbose") # Choose if will be compressed or uncompressed if uncompressed: - if verbose: - verbose_log("INFO", "Creating uncompressed public key certificate") __public_key_data__ = f"{KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND}{hex_pubkey}" else: - if verbose: - verbose_log("INFO", "Creating compressed public key certificate") __public_key_data__ = f"{KSIGNER_COMPRESSED_PUBKEY_PREPEND}{hex_pubkey}" # Convert pubkey data to bytes __public_key_data_bytes__ = bytes.fromhex(__public_key_data__) - if verbose: - verbose_log("INFO", f"pubkey bytes: {__public_key_data_bytes__}") + print(__public_key_data_bytes__) # Decode to utf8 __public_key_data_utf8__ = __public_key_data_bytes__.decode("utf-8") - if verbose: - verbose_log("INFO", f"pubkey utf8: {__public_key_data_utf8__}") # Encode to formated base64 __pem_pub_key__ = "\n".join( @@ -74,12 +64,7 @@ def create_public_key_certificate(**kwargs): ] ) - if verbose: - verbose_log("INFO", __pem_pub_key__) - __pem_key_file__ = f"{owner}.pem" - if verbose: - verbose_log("INFO", f"Saving public key file: {__pem_key_file__}") with open(file=__pem_key_file__, mode="w", encoding="utf-8") as pem_file: pem_file.write(__pem_pub_key__) diff --git a/src/qrutils.py b/src/utils/qr.py similarity index 69% rename from src/qrutils.py rename to src/utils/qr.py index bdb180d..6f9a2ae 100644 --- a/src/qrutils.py +++ b/src/utils/qr.py @@ -13,10 +13,6 @@ ####################### from qrcode import QRCode -################# -# Local libraries -################# -from logutils import verbose_log def make_qr_code(**kwargs) -> str: """ @@ -29,21 +25,10 @@ def make_qr_code(**kwargs) -> str: Apply verbose or not """ qr_data = kwargs.get("data") - verbose = kwargs.get("verbose") - qr_code = QRCode() - - if verbose: - verbose_log("INFO", f"Adding (data={qr_data})") - qr_code.add_data(qr_data) - - if verbose: - verbose_log("INFO", "Converting data to ascii") - qr_string = StringIO() qr_code.print_ascii(out=qr_string, invert=True) - return qr_string.getvalue() @@ -58,17 +43,7 @@ def make_qr_code_image(**kwargs) -> str: Apply verbose or not """ qr_data = kwargs.get("data") - verbose = kwargs.get("verbose") - qr_code = QRCode() - - if verbose: - verbose_log("INFO", f"Adding (data={qr_data})") - qr_code.add_data(qr_data) - - if verbose: - verbose_log("INFO", "Creating image") - qr_image = qr_code.make_image() return qr_image diff --git a/src/signandverifyutils.py b/src/utils/signandverify.py similarity index 97% rename from src/signandverifyutils.py rename to src/utils/signandverify.py index 8cddbeb..398ec0a 100644 --- a/src/signandverifyutils.py +++ b/src/utils/signandverify.py @@ -32,11 +32,6 @@ #################### import subprocess -################# -# Local libraries -################# -from logutils import verbose_log - def verify_openssl_command(**kwargs) -> str: """ diff --git a/src/videoutils.py b/src/utils/video.py similarity index 69% rename from src/videoutils.py rename to src/utils/video.py index e5f7999..7476449 100644 --- a/src/videoutils.py +++ b/src/utils/video.py @@ -19,10 +19,43 @@ ################# # Local libraries ################# -from logutils import verbose_log, now -from processingutils import normalization_transform -from processingutils import gray_transform +from utils.log import now +def normalization_transform(**kwargs): + """ " + Apply Gray scale on frames + + Kwargs + :param frame + The frame which will be applyed the transformation + :param verbose + Apply verbose messages + """ + frame = kwargs.get("frame") + + # Cameras have different configurations + # and behaviours, so try apply some normalization + # @see https://stackoverflow.com/questions/61016954/ + # controlling-contrast-and-brightness-of-video-stream-in-opencv-and-python + cv2.normalize(frame, frame, 0, 255, cv2.NORM_MINMAX) + + # Verbose some data + +def gray_transform(**kwargs): + """ " + Apply Gray scale on frames + + Kwargs + :param ret + :param frame + The frame which will be applyed the transformation + :param verbose + Apply verbose messages + """ + frame = kwargs.get("frame") + + # Convert frame to grayscale + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) def scan(**kwargs) -> str: """ @@ -43,10 +76,7 @@ def scan(**kwargs) -> str: is_normalized = kwargs.get("is_normalized") is_gray_scale = kwargs.get("is_gray_scale") - verbose_log("INFO", "Opening camera") vid = cv2.VideoCapture(0) - - verbose_log("INFO", "Starting detection") detector = cv2.QRCodeDetector() qr_data = None @@ -67,44 +97,20 @@ def scan(**kwargs) -> str: # Detect qrcode qr_data, _bbox, _straight_qrcode = detector.detectAndDecode(frame) - # Verbose some data - if verbose: - verbose_log("INFO", f"reading (qr_data={qr_data})") - verbose_log("INFO", f"reading (_bbox={_bbox}") - verbose_log("INFO", f"reading (_straight_qrcode={_straight_qrcode})") - # Verify null data - if verbose: - verbose_log("INFO", f"len(qr_data) = {len(qr_data)}") - if len(qr_data) > 0: break # Display the resulting frame - if verbose: - verbose_log("INFO", f"Showing (frame={frame})") - - # Show image cv2.imshow("frame", frame) # the 'q' button is set as the # quitting button you may use any # desired button of your choice if cv2.waitKey(1) & 0xFF == ord("q"): - if verbose: - verbose_log("INFO", "quiting QRCode detection...") break - # After the loop release the cap object - if verbose: - verbose_log("INFO", "Releasing video...") - vid.release() - - # Destroy all the windows - if verbose: - verbose_log("INFO", "Destroying all ksigner windows...") - cv2.destroyAllWindows() return qr_data @@ -123,22 +129,19 @@ def scan_and_save_signature(**kwargs): """ is_normalized = kwargs.get("is_normalized") is_gray_scale = kwargs.get("is_gray_scale") - verbose = kwargs.get("verbose") filename = kwargs.get("filename") _ = input(f"[{now()}] Press enter to scan signature") signature = scan( - is_normalized=is_normalized, is_gray_scale=is_gray_scale, verbose=verbose + is_normalized=is_normalized, + is_gray_scale=is_gray_scale, ) # Encode data binary_signature = base64.b64decode(signature.encode()) - if verbose: - verbose_log("INFO", f"Signature: {binary_signature}") # Saves a signature signature_file = f"{filename}.sig" - verbose_log("INFO", f"Saving a signature file: {signature_file}") with open(signature_file, "wb") as sig_file: sig_file.write(binary_signature) @@ -158,12 +161,11 @@ def scan_public_key(**kwargs) -> str: is_gray_scale = kwargs.get("is_gray_scale") verbose = kwargs.get("verbose") + _ = input(f"[{now()}] Press enter to scan public key") public_key = scan( - is_normalized=is_normalized, is_gray_scale=is_gray_scale, verbose=verbose + is_normalized=is_normalized, + is_gray_scale=is_gray_scale, ) - if verbose: - verbose_log("INFO", f"Public key: {public_key}") - return public_key From c26c5f763bb5106c74e566dc373ba7689e472bb5 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Tue, 17 Oct 2023 07:51:21 -0300 Subject: [PATCH 031/104] added separate scans for each signature and public key --- src/ksigner-gui.py | 4 +++ src/ksigner.kv | 7 ++--- src/screens/scan.py | 68 +++++++++++++++++---------------------------- src/screens/sign.py | 34 +++++++++++++++++++++++ 4 files changed, 66 insertions(+), 47 deletions(-) diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index df6da4d..00d651a 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -75,6 +75,10 @@ def build(self): logger("DEBUG", "KsignerApp: Adding ") screen_manager.add_widget(ScanScreen(name="scan-import-save-signature")) + + logger("DEBUG", "KsignerApp: Adding ") + screen_manager.add_widget(ScanScreen(name="scan-import-save-public-key")) + return screen_manager if __name__ == "__main__": diff --git a/src/ksigner.kv b/src/ksigner.kv index c5297a6..568992d 100644 --- a/src/ksigner.kv +++ b/src/ksigner.kv @@ -81,15 +81,14 @@ rectangle: self.x, self.y, self.width, self.height Button: + id: sign_screen_import_and_save_public_key text: 'Import & save public-key' font_size: root.height // 25 font_name: 'terminus.ttf' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 - on_press: - self.background_color = (.5, .5, .5, .5) - on_release: - self.background_color = (0, 0, 0, 0) + on_press: root.on_press_sign_screen_import_and_save_public_key() + on_release: root.on_release_sign_screen_import_and_save_public_key() canvas.before: Color: rgba: 1, 1, 1, 1 diff --git a/src/screens/scan.py b/src/screens/scan.py index c96eb67..c020619 100644 --- a/src/screens/scan.py +++ b/src/screens/scan.py @@ -78,24 +78,6 @@ class ScanScreen(Screen): to set the default position on Screen """ - scan_steps = ObjectProperty({ - "scan-import-save-signature-warnings": ( - "\n".join(["Step (1):", "", "Scan the signed message"]), - "\n".join(["Step (2):", "", "Scan the hexadecimal public key"]) - ), - "scan-import-save-signature-labels": ( - "Scanned signature: ", - "Scanned public key: " - ), - "scan-import-save-signature-datas": ( - None, - None - ) - }) - """ - Scan steps messages to help user - """ - def __init__(self, **kwargs): super().__init__(**kwargs) @@ -105,9 +87,6 @@ def __init__(self, **kwargs): self._box_layout = None self._zbarcam = None - # Setup message steps dynamically on :data:`self._label_warn.text` - self._step = 0 - # Keyboard bindings for close ScanScreen self._keyboard = Window.request_keyboard(self._keyboard_closed, self, 'text') if self._keyboard.widget: @@ -140,8 +119,21 @@ def set_label_warn(self): Sets and add Label Widget that warn user about the what to do on ScanScreen """ + if self.manager.current == "scan-import-save-signature": + text = "\n".join([ + "(a) Scan the signed message;", + "(b) click on scren or press one of 'esc|enter|backspace|left button' to proceed" + ]) + elif self.manager.current == "scan-import-save-public-key": + text = "\n".join([ + "(a) Scan the hexadecimal public key;", + "(b) click on scren or press one of 'esc|enter|backspace|left button' to proceed" + ]) + else: + raise Exception(f"Invalid screen: {self.manager.current}") + self._label_warn = Label( - text=self.scan_steps[f"{self.manager.current}-warnings"][self._step], + text=text, font_size=Window.height // 35, font_name="terminus.ttf", halign="center", @@ -166,19 +158,16 @@ def set_label_desc(self): Sets and add Label Widget that describe the qrcode's data to ScanScreen """ - messages = [] - for i in range(2): - messages.append(( - self.scan_steps[f"{self.manager.current}-labels"][i], - ScanScreen._chunk_str(self.scan_steps[f"{self.manager.current}-datas"][i], 32) - )) + if self.manager.current == "scan-import-save-signature": + text = "Signed message: ", + elif self.manager.current == "scan-import-save-public-key": + text = "Public key: " + else: + raise Exception(f"Invalid screen: {self.manager.current}") + self._label_desc = Label( - text="\n".join([ - messages[0][0] + messages[0][1], - "", - messages[1][0] + messages[1][1] - ]), + text=text, font_size=Window.height // 50, font_name="terminus.ttf", halign="center", @@ -245,16 +234,9 @@ def _decode_qrcode(self, *args): logger("DEBUG", "ScanScreen: waiting for qrcode") if len(self._zbarcam.symbols) > 0: scanned_data = self._zbarcam.symbols[0].data.decode("UTF-8") + self._label_desc += ScanScreen._chunk_str(scanned_data, 12) + logger("DEBUG", f"ScanScreen: captured '{scanned_data}'") - - # Now dinamically set the properly data - self.scan_steps[f"{self.manager.current}-datas"][self._step] = scanned_data - - # Change - #self._step += 1 - - #if (self._step > 1): Clock.unschedule(self._decode_qrcode, 1) self._zbarcam.stop() # stop zbarcam - self._zbarcam.ids['xcamera']._camera._device.release() - #self._back_to_signscreen() \ No newline at end of file + self._zbarcam.ids['xcamera']._camera._device.release() \ No newline at end of file diff --git a/src/screens/sign.py b/src/screens/sign.py index 8034f93..6459cc6 100644 --- a/src/screens/sign.py +++ b/src/screens/sign.py @@ -135,6 +135,40 @@ def on_release_sign_screen_import_and_save_signature(self): self.manager.transition.direction = "right" self.manager.current = "scan-import-save-signature" + def on_press_sign_screen_import_and_save_public_key(self): + """ + on_press_import_and_save_public_key + + - change background color of button to (.5,.5,.5,.5), + giving a visual effect of 'pressed' + """ + logger("DEBUG", "SignScreen: pressed") + self.ids.sign_screen_import_and_save_public_key.background_color = ( + 0.5, + 0.5, + 0.5, + 0.5 + ) + + def on_release_sign_screen_import_and_save_public_key(self): + """ + on_release_sign_screen_import_and_save_public_key + + - change background color of button to (0, 0, 0, 0), + giving a visual effect of 'pressed' + - go to ScanScreen + """ + logger("DEBUG", "SignScreen: released") + self.ids.sign_screen_import_and_save_public_key.background_color = ( + 0, + 0, + 0, + 0, + ) + self + self.manager.transition.direction = "right" + self.manager.current = "scan-import-save-signature" + def on_press_back_main(self): """ From 7fb60e89ca64f1ff33264109f022be07016c9b7a Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Tue, 17 Oct 2023 08:04:25 -0300 Subject: [PATCH 032/104] linted some srcs --- src/ksigner-gui.py | 6 ++- src/screens/qrcode.py | 51 +++++++++++++------------ src/screens/scan.py | 76 +++++++++++++++++++------------------- src/screens/sign.py | 39 +++++++++++++------ src/utils/hash.py | 9 ++--- src/utils/log.py | 62 +++++++++++++++---------------- src/utils/pem.py | 1 + src/utils/signandverify.py | 4 -- src/utils/video.py | 5 ++- 9 files changed, 131 insertions(+), 122 deletions(-) diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index 00d651a..73a4eb3 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -41,6 +41,7 @@ from screens.qrcode import QRCodeScreen from screens.scan import ScanScreen + class KSignerApp(App): """ KSignerApp is the Root widget @@ -72,15 +73,16 @@ def build(self): logger("DEBUG", "KsignerApp: Adding ") screen_manager.add_widget(QRCodeScreen(name="qrcode")) - + logger("DEBUG", "KsignerApp: Adding ") screen_manager.add_widget(ScanScreen(name="scan-import-save-signature")) logger("DEBUG", "KsignerApp: Adding ") screen_manager.add_widget(ScanScreen(name="scan-import-save-public-key")) - + return screen_manager + if __name__ == "__main__": app = KSignerApp() app.run() diff --git a/src/screens/qrcode.py b/src/screens/qrcode.py index 5066b91..4fbda5c 100644 --- a/src/screens/qrcode.py +++ b/src/screens/qrcode.py @@ -44,6 +44,7 @@ from kivy.clock import Clock from kivy.core.window import Window from kivy.uix.image import Image + # pylint: disable=no-name-in-module from kivy.graphics.texture import Texture from kivy.uix.label import Label @@ -130,19 +131,19 @@ class QRCodeScreen(Screen): :data:`ìmage_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, to set the default position on Screen """ - + label_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.125}) """ :data:`label_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, to set the default position on Screen """ - + warn_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.9}) """ :data:`warn_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, to set the default position on Screen """ - + def __init__(self, **kwargs): super().__init__(**kwargs) self._label_warn = None @@ -150,7 +151,7 @@ def __init__(self, **kwargs): self._qrcode = None self._qrtexture = None self._img = None - self._keyboard = Window.request_keyboard(self._keyboard_closed, self, 'text') + self._keyboard = Window.request_keyboard(self._keyboard_closed, self, "text") if self._keyboard.widget: logger("WARNING", "QRCodeScreen: This widget is a VKeyboard object") # which you can use @@ -187,21 +188,23 @@ def set_image(self): self.add_widget(self._img) logger("INFO", "QRCodeScreen: added") - + def set_label_warn(self): """ Sets and add Label Widget that warn user about the what to do on QRCodeScreen """ self._label_warn = Label( - text="\n".join([ - "[b]To sign this file with Krux:[/b]", - "", - " (a) load a 12/24 words key, with or without BIP39 password;", - " (b) use the Sign -> Message feature;", - " (c) scan this QR code below;", - " (d) click on screen or type one of 'esc|backspace|enter|left' keys to proceed." - ]), + text="\n".join( + [ + "[b]To sign this file with Krux:[/b]", + "", + " (a) load a 12/24 words key, with or without BIP39 password;", + " (b) use the Sign -> Message feature;", + " (c) scan this QR code below;", + " (d) click on screen or type one of 'esc|backspace|enter|left' keys to proceed.", + ] + ), font_size=Window.height // 35, font_name="terminus.ttf", halign="center", @@ -211,7 +214,7 @@ def set_label_warn(self): ) self.add_widget(self._label_warn) logger("INFO", "QRCodeScreen: added") - + def set_label_desc(self): """ Sets and add Label Widget that describe the qrcode's @@ -242,10 +245,10 @@ def generate_qrcode(self): ) self._qrcode.add_data(self.code) logger("DEBUG", "QRCodeScreen: data added") - + self._qrcode.make(fit=True) self._update_texture() - + def _create_texture(self, k, dt): logger("DEBUG", "QRCodeScreen: creating") self._qrtexture = Texture.create(size=(k, k), colorfmt="rgb") @@ -264,11 +267,7 @@ def _update_texture(self): Clock.schedule_once(partial(self._create_texture, k), -1) _color = self.fill_color[:] - color = ( - int(_color[0] * 255), - int(_color[1] * 255), - int(_color[2] * 255) - ) + color = (int(_color[0] * 255), int(_color[1] * 255), int(_color[2] * 255)) # used bytearray for python 3.5 eliminates need for btext buff = bytearray() @@ -310,20 +309,20 @@ def _keyboard_closed(self): logger("WARNING", "QRCodeScreen: keyboard have been closed") self._keyboard.unbind(on_key_down=self._on_keyboard_down) self._keyboard = None - + def _on_keyboard_down(self, keyboard, keycode, text, modifiers): # Keycode is composed of an integer + a string # If we hit escape, release the keyboard - if keycode[1] == 'escape': + if keycode[1] == "escape": self._back_to_signscreen() - elif keycode[1] == 'enter': + elif keycode[1] == "enter": self._back_to_signscreen() - elif keycode[1] == 'left': + elif keycode[1] == "left": self._back_to_signscreen() - elif keycode[1] == 'backspace': + elif keycode[1] == "backspace": self._back_to_signscreen() else: logger("WARNING", f"QRCodeScreen: key '{keycode[1]}' not implemented") diff --git a/src/screens/scan.py b/src/screens/scan.py index c020619..a9a6b93 100644 --- a/src/screens/scan.py +++ b/src/screens/scan.py @@ -53,13 +53,13 @@ class ScanScreen(Screen): """ Class responsible to scan qrcodes. """ - + fill_color = ListProperty((1, 1, 1, 1)) """ :data:`background_color` is a tuple describing the color of background defined at :class:`~qrcode.QRCode` """ - + label_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.125}) """ :data:`label_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, @@ -71,7 +71,7 @@ class ScanScreen(Screen): :data:`label_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, to set the default position on Screen """ - + warn_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 1}) """ :data:`warn_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, @@ -80,15 +80,15 @@ class ScanScreen(Screen): def __init__(self, **kwargs): super().__init__(**kwargs) - - #Widgets - self._label_warn = None + + # Widgets + self._label_warn = None self._label_desc = None self._box_layout = None self._zbarcam = None # Keyboard bindings for close ScanScreen - self._keyboard = Window.request_keyboard(self._keyboard_closed, self, 'text') + self._keyboard = Window.request_keyboard(self._keyboard_closed, self, "text") if self._keyboard.widget: logger("WARNING", "QRCodeScreen: This widget is a VKeyboard object") # which you can use @@ -104,7 +104,7 @@ def on_pre_enter(self, *args): self.set_label_warn() self.set_zbarcam() self.set_label_desc() - + def set_box_layout(self): """ Sets and add BoxLayout Widget that wrap @@ -113,36 +113,40 @@ def set_box_layout(self): self._box_layout = BoxLayout(orientation="vertical") self.add_widget(self._box_layout) logger("DEBUG", "ScanScreen: added") - + def set_label_warn(self): """ Sets and add Label Widget that warn user about the what to do on ScanScreen """ if self.manager.current == "scan-import-save-signature": - text = "\n".join([ - "(a) Scan the signed message;", - "(b) click on scren or press one of 'esc|enter|backspace|left button' to proceed" - ]) + text = "\n".join( + [ + "(a) Scan the signed message;", + "(b) click on scren or press one of 'esc|enter|backspace|left button' to proceed", + ] + ) elif self.manager.current == "scan-import-save-public-key": - text = "\n".join([ - "(a) Scan the hexadecimal public key;", - "(b) click on scren or press one of 'esc|enter|backspace|left button' to proceed" - ]) + text = "\n".join( + [ + "(a) Scan the hexadecimal public key;", + "(b) click on scren or press one of 'esc|enter|backspace|left button' to proceed", + ] + ) else: raise Exception(f"Invalid screen: {self.manager.current}") - + self._label_warn = Label( text=text, font_size=Window.height // 35, font_name="terminus.ttf", halign="center", color=self.fill_color, - markup=True + markup=True, ) logger("INFO", "ScanScreen: added to ") self._box_layout.add_widget(self._label_warn) - + def set_zbarcam(self): """ Sets and add ZBarCam Widget that describe the qrcode's @@ -152,7 +156,7 @@ def set_zbarcam(self): self._box_layout.add_widget(self._zbarcam) logger("INFO", "ScanScreen: added to ") Clock.schedule_interval(self._decode_qrcode, 1) - + def set_label_desc(self): """ Sets and add Label Widget that describe the qrcode's @@ -160,12 +164,12 @@ def set_label_desc(self): """ if self.manager.current == "scan-import-save-signature": - text = "Signed message: ", + text = ("Signed message: ",) elif self.manager.current == "scan-import-save-public-key": text = "Public key: " else: raise Exception(f"Invalid screen: {self.manager.current}") - + self._label_desc = Label( text=text, font_size=Window.height // 50, @@ -185,25 +189,25 @@ def _back_to_signscreen(self): logger("DEBUG", "ScanScreen: Redirecting to ") self.manager.transition.direction = "left" self.manager.current = "sign" - + def _keyboard_closed(self): logger("WARNING", "ScanScreen: keyboard have been closed") self._keyboard.unbind(on_key_down=self._on_keyboard_down) self._keyboard = None - + def _on_keyboard_down(self, keyboard, keycode, text, modifiers): # Keycode is composed of an integer + a string # If we hit escape, release the keyboard - if keycode[1] == 'escape': + if keycode[1] == "escape": self._back_to_signscreen() - elif keycode[1] == 'enter': + elif keycode[1] == "enter": self._back_to_signscreen() - elif keycode[1] == 'left': + elif keycode[1] == "left": self._back_to_signscreen() - elif keycode[1] == 'backspace': + elif keycode[1] == "backspace": self._back_to_signscreen() else: logger("WARNING", f"ScanScreen: key '{keycode[1]}' not implemented") @@ -216,13 +220,11 @@ def _chunk_str(msg, size): Split a big string in multiple lines; Use with sha256 or signature strings. """ - if (not msg): + if not msg: return "None" else: - return "\n".join([ - msg[i:i+size] for i in range(0, len(msg), size) - ]) - + return "\n".join([msg[i : i + size] for i in range(0, len(msg), size)]) + def _decode_qrcode(self, *args): """ When camera capture the QRCode, @@ -235,8 +237,8 @@ def _decode_qrcode(self, *args): if len(self._zbarcam.symbols) > 0: scanned_data = self._zbarcam.symbols[0].data.decode("UTF-8") self._label_desc += ScanScreen._chunk_str(scanned_data, 12) - + logger("DEBUG", f"ScanScreen: captured '{scanned_data}'") Clock.unschedule(self._decode_qrcode, 1) - self._zbarcam.stop() # stop zbarcam - self._zbarcam.ids['xcamera']._camera._device.release() \ No newline at end of file + self._zbarcam.stop() # stop zbarcam + self._zbarcam.ids["xcamera"]._camera._device.release() diff --git a/src/screens/sign.py b/src/screens/sign.py index 6459cc6..b998999 100644 --- a/src/screens/sign.py +++ b/src/screens/sign.py @@ -29,6 +29,7 @@ ##################### from kivy.uix.screenmanager import Screen from kivy.uix.popup import Popup + # pylint: disable=no-name-in-module from kivy.properties import StringProperty @@ -105,7 +106,7 @@ def on_release_sign_screen_load_file_and_export_hash_qrcode(self): logger("DEBUG", "SignScreen: opening") self._popup.open() - + def on_press_sign_screen_import_and_save_signature(self): """ on_press_import_and_save_signature @@ -113,9 +114,17 @@ def on_press_sign_screen_import_and_save_signature(self): - change background color of button to (.5,.5,.5,.5), giving a visual effect of 'pressed' """ - logger("DEBUG", "SignScreen: pressed") - self.ids.sign_screen_import_and_save_signature.background_color = (0.5, 0.5, 0.5, 0.5) - + logger( + "DEBUG", + "SignScreen: pressed", + ) + self.ids.sign_screen_import_and_save_signature.background_color = ( + 0.5, + 0.5, + 0.5, + 0.5, + ) + def on_release_sign_screen_import_and_save_signature(self): """ on_release_sign_screen_import_and_save_signature @@ -124,7 +133,10 @@ def on_release_sign_screen_import_and_save_signature(self): giving a visual effect of 'pressed' - go to ScanScreen """ - logger("DEBUG", "SignScreen: released") + logger( + "DEBUG", + "SignScreen: released", + ) self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = ( 0, 0, @@ -142,14 +154,17 @@ def on_press_sign_screen_import_and_save_public_key(self): - change background color of button to (.5,.5,.5,.5), giving a visual effect of 'pressed' """ - logger("DEBUG", "SignScreen: pressed") + logger( + "DEBUG", + "SignScreen: pressed", + ) self.ids.sign_screen_import_and_save_public_key.background_color = ( 0.5, 0.5, 0.5, - 0.5 + 0.5, ) - + def on_release_sign_screen_import_and_save_public_key(self): """ on_release_sign_screen_import_and_save_public_key @@ -158,7 +173,10 @@ def on_release_sign_screen_import_and_save_public_key(self): giving a visual effect of 'pressed' - go to ScanScreen """ - logger("DEBUG", "SignScreen: released") + logger( + "DEBUG", + "SignScreen: released", + ) self.ids.sign_screen_import_and_save_public_key.background_color = ( 0, 0, @@ -169,7 +187,6 @@ def on_release_sign_screen_import_and_save_public_key(self): self.manager.transition.direction = "right" self.manager.current = "scan-import-save-signature" - def on_press_back_main(self): """ on_press_back_main @@ -216,5 +233,3 @@ def on_submit_file(self, *args): logger("DEBUG", "SignScreen: Redirecting to ") self.manager.transition.direction = "left" self.manager.current = "qrcode" - - diff --git a/src/utils/hash.py b/src/utils/hash.py index bfed660..2c1b572 100644 --- a/src/utils/hash.py +++ b/src/utils/hash.py @@ -9,6 +9,7 @@ #################### import hashlib + def open_and_hash_file(**kwargs) -> str: """ " Read file from --file argument on `sign` command and return its hash @@ -28,9 +29,7 @@ def open_and_hash_file(**kwargs) -> str: return hashlib.sha256(_bytes).hexdigest() except FileNotFoundError as exc: - raise FileNotFoundError( - f"Unable to read target file: {__filename__}" - ) from exc + raise FileNotFoundError(f"Unable to read target file: {__filename__}") from exc def save_hashed_file(**kwargs): @@ -55,6 +54,4 @@ def save_hashed_file(**kwargs): with open(__hash_file__, mode="w", encoding="utf-8") as hash_file: hash_file.write(f"{__data__} {__hash_file__}") except FileNotFoundError as exc: - raise FileNotFoundError( - f"Unable to read target file: {__hash_file__}" - ) from exc \ No newline at end of file + raise FileNotFoundError(f"Unable to read target file: {__hash_file__}") from exc diff --git a/src/utils/log.py b/src/utils/log.py index 5f61fe7..bf6250c 100644 --- a/src/utils/log.py +++ b/src/utils/log.py @@ -10,13 +10,11 @@ WARNING, ERROR, CRITICAL, - Formatter, - StreamHandler, basicConfig, info, debug, warning, - error + error, ) import time @@ -28,6 +26,7 @@ class Colors: see https://gist.github.com/rene-d/9e584a7dd2935d0f461904b9f2950007 """ + BLACK = "\033[0;30m" RED = "\033[0;31m" GREEN = "\033[0;32m" @@ -73,7 +72,7 @@ def log(level: int) -> str: Get a level and convert into formated color. Supported levels are those from :mod:`logging` module - + - :const:`logging.NOTSET` - :const:`logging.DEBUG` - :const:`logging.INFO` @@ -87,34 +86,31 @@ def log(level: int) -> str: Returns ------- - *str*: The formated color with level name + *str*: The formated color with level name """ if level == NOTSET: return f"{Colors.BOLD}{Colors.GREEN}INFO{Colors.END}" - elif level == DEBUG: + if level == DEBUG: return f"{Colors.BOLD}{Colors.BLUE}DEBUG{Colors.END}" - - elif level == INFO: + + if level == INFO: return f"{Colors.BOLD}{Colors.GREEN}INFO{Colors.END}" - - elif level == WARNING: + + if level == WARNING: return f"{Colors.BOLD}{Colors.YELLOW}WARNING{Colors.END}" - - elif level == ERROR: + + if level == ERROR: return f"{Colors.BOLD}{Colors.BROWN}ERROR{Colors.END}" - - elif level == CRITICAL: + + if level == CRITICAL: return f"{Colors.BOLD}{Colors.RED}CRITICAL{Colors.END}" -class KSignerFormatter(Formatter): - def format(self, record): - colored = Colors.log(record.levelno) - return _fmt.format(record) - def now() -> str: - """Return some formated time""" + """ + Return some formated time + """ return time.strftime("%X %x %Z") @@ -122,7 +118,7 @@ def logger(level, message): """ Prints verbose data preceded by logger level and current asctime - + Example: -------- @@ -139,15 +135,15 @@ def logger(level, message): """ basicConfig(format="[%(colored)s ] %(channel)s %(asctime)s %(message)s") - - if (level == "INFO"): - info(message, extra={'colored': INFO }) - - if (level == "DEBUG"): - debug(message, extra={'colored': DEBUG }) - - if (level == "WARNING"): - warning(message, extra={'colored': WARNING }) - - if (level == "ERROR"): - error(message, extra={'colored': ERROR }) + + if level == "INFO": + info(message, extra={"colored": INFO}) + + if level == "DEBUG": + debug(message, extra={"colored": DEBUG}) + + if level == "WARNING": + warning(message, extra={"colored": WARNING}) + + if level == "ERROR": + error(message, extra={"colored": ERROR}) diff --git a/src/utils/pem.py b/src/utils/pem.py index 6663a2d..a7b6882 100644 --- a/src/utils/pem.py +++ b/src/utils/pem.py @@ -19,6 +19,7 @@ from constants import KSIGNER_COMPRESSED_PUBKEY_PREPEND from constants import KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND + def create_public_key_certificate(**kwargs): """ Create public key certifficate file (.pem) diff --git a/src/utils/signandverify.py b/src/utils/signandverify.py index 398ec0a..f99cb20 100644 --- a/src/utils/signandverify.py +++ b/src/utils/signandverify.py @@ -78,19 +78,15 @@ def verify(**kwargs): Apply verbose or no """ - verbose_log("INFO", "Verifying signature:") file2verify = kwargs.get("filename") pubkey_file = kwargs.get("pubkey") sig_file = kwargs.get("sigfile") - verbose = kwargs.get("verbose") try: __command__ = verify_openssl_command( file=file2verify, pubkey=pubkey_file, signature=sig_file ) - if verbose: - verbose_log("INFO", __command__) subprocess.run(__command__, check=True, shell=True) except subprocess.CalledProcessError as __exc__: raise subprocess.CalledProcessError( diff --git a/src/utils/video.py b/src/utils/video.py index 7476449..bf270b6 100644 --- a/src/utils/video.py +++ b/src/utils/video.py @@ -21,6 +21,7 @@ ################# from utils.log import now + def normalization_transform(**kwargs): """ " Apply Gray scale on frames @@ -41,6 +42,7 @@ def normalization_transform(**kwargs): # Verbose some data + def gray_transform(**kwargs): """ " Apply Gray scale on frames @@ -57,6 +59,7 @@ def gray_transform(**kwargs): # Convert frame to grayscale frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + def scan(**kwargs) -> str: """ Opens a scan window and uses cv2 to detect @@ -159,8 +162,6 @@ def scan_public_key(**kwargs) -> str: """ is_normalized = kwargs.get("is_normalized") is_gray_scale = kwargs.get("is_gray_scale") - verbose = kwargs.get("verbose") - _ = input(f"[{now()}] Press enter to scan public key") public_key = scan( From 05f8c8c3ff7aa4bb4bf38a4f1741e07a29f8bdb9 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Tue, 17 Oct 2023 22:37:00 -0300 Subject: [PATCH 033/104] fixed logger level for DEBUG on src/ksigner-cli.py --- src/callbacks.py | 122 ----------------------- src/cli/on.py | 18 ++++ src/cli/signer.py | 191 +++++++++++++++++++++++++++++++++++++ src/cli/verifyer.py | 143 +++++++++++++++++++++++++++ src/ksigner-cli.py | 77 ++++++++------- src/utils/hash.py | 35 +------ src/utils/log.py | 66 ++++--------- src/utils/pem.py | 29 +----- src/utils/signandverify.py | 2 +- src/utils/video.py | 114 +++++----------------- 10 files changed, 443 insertions(+), 354 deletions(-) delete mode 100644 src/callbacks.py create mode 100644 src/cli/on.py create mode 100644 src/cli/signer.py create mode 100644 src/cli/verifyer.py diff --git a/src/callbacks.py b/src/callbacks.py deleted file mode 100644 index 75b863e..0000000 --- a/src/callbacks.py +++ /dev/null @@ -1,122 +0,0 @@ -""" -callback.py - -Functions to be used during `sign` (on_sign function) -and `verify` (on_verify) operations. -""" - -import argparse -from constants import KSIGNER_VERSION -from utils.hash import open_and_hash_file, save_hashed_file -from utils.log import logger -from utils.pem import create_public_key_certificate -from utils.qr import make_qr_code -from utils.signandverify import verify -from utils.video import scan_and_save_signature, scan_public_key - - -def on_version(parser: argparse.ArgumentParser): - """ - Show version - """ - args = parser.parse_args() - if args.version: - print(KSIGNER_VERSION) - - -def on_sign(parser: argparse.ArgumentParser): - """ - onSign is executed when `sign` command is called: - - (1) Read a file; - (2) Save in a .sha256.txt file; - (3) Requires the user loads a xpriv key on his/her - device: - (a) load a 12/24 words key; - (b) with or without BIP39 password; - (4) sign a message: - (a) once loaded the xpriv key, user goes - to Sign > Message feature on his/her device - (b) show a qrcode on device; - (c) this function will generate a qrcode on computer; - (d) once shown, the user will be prompted to scan it with device; - (d) once scanned, the device will show some qrcodes: - (i) the signature as a qrcode; - (ii) the public key; - (e) once above qrcodes are scanned, the computer - will generate a publickey certificate, in a compressed - or uncompressed format, in name of an owner. - """ - args = parser.parse_args() - - # If the signergn command was given - if args.command == "sign" and args.file_to_sign is not None: - # read file - - logger("DEBUG", f"opening {args.file_to_sign}") - data = open_and_hash_file(path=args.file_to_sign) - - # Saves a hash file - logger("DEBUG", f"saving {args.file_to_sign}.sha256.txt") - save_hashed_file(data=data, path=args.file_to_sign) - - # Shows some message - print("") - print("To sign this file with Krux: ") - print(" (a) load a 12/24 words key with or without password;") - print(" (b) use the Sign->Message feature;") - print(" (c) and scan this QR code below.") - print("") - - # Prints the QR code - logger("DEBUG", f"Adding (data={data})") - __qrcode__ = make_qr_code(data=data, verbose=args.verbose) - print(f"{__qrcode__}") - - # Scans the signature QR code - scan_and_save_signature( - is_normalized=args.is_normalized, - is_gray_scale=args.is_gray_scale, - ) - - # Scans the public KeyboardInterruptardInterrupt - pubkey = scan_public_key( - is_normalized=args.is_normalized, - is_gray_scale=args.is_gray_scale, - ) - - # Create PEM data - # Save PEM data to a file - # with filename as owner's name - create_public_key_certificate( - pubkey=pubkey, - uncompressed=args.uncompressed_pub_key, - owner=args.file_owner, - ) - - -def on_verify(parser: argparse.ArgumentParser): - """ - onVerify is executed when `verify` command is called - - Args: - :param parser - the argument parser instance - """ - args = parser.parse_args() - - # Else if the verify command was given - if ( - args.command == "verify" - and args.verify_file is not None - and args.sig_file is not None - and args.pub_file is not None - ): - verify( - filename=args.verify_file, - pubkey=args.pub_file, - sigfile=args.sig_file, - ) - # If command was not found - else: - parser.print_help() diff --git a/src/cli/on.py b/src/cli/on.py new file mode 100644 index 0000000..09dd11a --- /dev/null +++ b/src/cli/on.py @@ -0,0 +1,18 @@ + + +class Verify: + + + def verify(self): + """ + onVerify is executed when `verify` command is called + + Args: + :param parser + the argument parser instance + """ + verify_file( + filename=args.verify_file, + pubkey=args.pub_file, + sigfile=args.sig_file, + ) diff --git a/src/cli/signer.py b/src/cli/signer.py new file mode 100644 index 0000000..2e73617 --- /dev/null +++ b/src/cli/signer.py @@ -0,0 +1,191 @@ +""" +signer.py + +Functions to be used during `sign` (sign function) +and `verify` (on_verify) operations. +""" +from utils.log import build_logger +import hashlib + +from utils.pem import create_public_key_certificate +from utils.qr import make_qr_code +from utils.video import scan_signature, scan_public_key + + +class Signer: + """ + Signer is the class + that manages the `sign` command + + Workflow: + + (1) Read a file; + (2) Save in a .sha256.txt file; + (3) Requires the user loads a xpriv key on his/her device: + (a) load a 12/24 words key; + (b) with or without BIP39 password; + (4) sign a message: + (a) once loaded the xpriv key, user goes + to Sign > Message feature on his/her device + (b) show a qrcode on device; + (c) this function will generate a qrcode on computer; + (d) once shown, the user will be prompted to scan it with device; + (e) once scanned, the device will show some qrcodes: + (i) the signature as a qrcode; + (ii) the public key; + (f) once above qrcodes are scanned, the computer + will generate a publickey certificate, in a compressed + or uncompressed format, in name of an owner. + """ + + def __init__(self, **kwargs): + self.file = kwargs.get('file') + self.owner = kwargs.get('owner') + self.uncompressed = kwargs.get('uncompressed') + self.log = build_logger(__name__, kwargs.get('loglevel')) + + def sign(self): + self._show_warning_messages() + data = self._hash_file() + self._save_hash_file(data) + self._print_qrcode(data) + self._make_sig() + + def _show_warning_messages(self): + """ + Shows warning messages before hash + """ + self.log.debug('Showing warning messages to sign') + + # Shows some message + print("") + print("To sign this file with Krux: ") + print(" (a) load a 12/24 words key with or without password;") + print(" (b) use the Sign->Message feature;") + print(" (c) and scan this QR code below.") + print("") + + def _hash_file(self) -> str: + """ + Creates a hash file before sign + """ + self.log.debug(f'Opening {self.file}') + + try: + with open(self.file, "rb") as f_sig: + self.log.debug('Reading bytes...') + _bytes = f_sig.read() + + self.log.debug('Hashing...') + data = hashlib.sha256(_bytes).hexdigest() + + self.log.debug(f'Hash (data={data})') + return data + + except FileNotFoundError as exc: + message = f'Unable to read target file: {self.file}' + numeric_level = getattr(logging, loglevel.upper(), None) + if numeric_level == logging.NOTSET: + raise FileNotFoundError(message) from exc + else: + logging.error(message) + + return open_and_hash_file(path=self.file) + + def _save_hash_file(self, data): + """ + Save the hash file in sha256sum format + """ + # Saves a hash file + try: + __hash_file__ = f"{self.file}.sha256sum.txt" + self.log.debug(f'Saving {self.file}.sha256.txt') + + with open(__hash_file__, mode="w", encoding="utf-8") as hash_file: + content = f'{data} {self.file}' + + self.log.debug(f'Saving content (data={content}') + hash_file.write(content) + + self.log.debug(f'{__hash_file__} saved') + + except Exception as exc: + message = f'Unknow error on saving {__hash_file__}' + numeric_level = getattr(logging, loglevel.upper(), None) + if numeric_level == logging.NOTSET: + raise Exception(message) from exc + else: + logging.error(message) + + def _print_qrcode(self, data): + """ + Print QRCode to console + """ + # Prints the QR code + self.log.debug(f"Creating QRCode (data={data})") + __qrcode__ = make_qr_code(data=data) + print(f"{__qrcode__}") + + def _make_sig(self): + """ + Make signature file from scanning qrcode + """ + # Scans the signature QR code + self.log.debug('Creating signature') + signature = scan_signature() + + # Saves a signature + signature_file = f"{self.file}.sig" + self.log.debug(f'Saving {signature_file}') + + try: + with open(signature_file, "wb") as sig_file: + sig_file.write(binary_signature) + self.log.debug(f"Signature saved on {signature_file}") + + except Exception as exc: + message = f'Unknow error on saving {__hash_file__}' + numeric_level = getattr(logging, loglevel.upper(), None) + if numeric_level == logging.NOTSET: + raise Exception(message) from exc + else: + logging.error(message) + + def _make_pubkey_certificate(self): + """ + Make public key file from scanning qrcode + """ + # Scans the public KeyboardInterruptardInterrupt + self.log.debug('Creating public key') + pubkey = scan_public_key() + + # Create PEM data + # Save PEM data to a file + # with filename as owner's name + hex_pubkey = hex_pubkey.upper() + + # Choose if will be compressed or uncompressed + if uncompressed: + __public_key_data__ = f"{KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND}{hex_pubkey}" + else: + __public_key_data__ = f"{KSIGNER_COMPRESSED_PUBKEY_PREPEND}{hex_pubkey}" + + # Convert pubkey data to bytes + __public_key_data_bytes__ = bytes.fromhex(__public_key_data__) + __public_key_data_b64__ = base64.b64encode(__public_key_data_bytes__) + __public_key_data_b64__ = __public_key_data_b64__.decode("utf8") + __public_key_name__ = f'{self.owner}.pem' + + try: + with open(__public_key__name, 'wb') as pb_file: + self.log.debug(f'Saving {__public_key_name__}') + pb_file.write(__public_key_data_b64__) + self.log.debug(f'{__public_key_name__} saved') + + except Exception as exc: + message = f'Unknow error on saving {__hash_file__}' + numeric_level = getattr(logging, loglevel.upper(), None) + if numeric_level == logging.NOTSET: + raise Exception(message) from exc + else: + logging.error(message) diff --git a/src/cli/verifyer.py b/src/cli/verifyer.py new file mode 100644 index 0000000..6bfa319 --- /dev/null +++ b/src/cli/verifyer.py @@ -0,0 +1,143 @@ +""" +signer.py + +Functions to be used during `sign` (on_sign function) +and `verify` (on_verify) operations. +""" + +from utils.hash import open_and_hash_file +from utils.pem import create_public_key_certificate +from utils.qr import make_qr_code +from utils.signandverify import verify_file +from utils.video import scan_signature, scan_public_key + + +class Signer: + """ + Signer is the class + that manages the `sign` command + + Workflow: + + (1) Read a file; + (2) Save in a .sha256.txt file; + (3) Requires the user loads a xpriv key on his/her device: + (a) load a 12/24 words key; + (b) with or without BIP39 password; + (4) sign a message: + (a) once loaded the xpriv key, user goes + to Sign > Message feature on his/her device + (b) show a qrcode on device; + (c) this function will generate a qrcode on computer; + (d) once shown, the user will be prompted to scan it with device; + (e) once scanned, the device will show some qrcodes: + (i) the signature as a qrcode; + (ii) the public key; + (f) once above qrcodes are scanned, the computer + will generate a publickey certificate, in a compressed + or uncompressed format, in name of an owner. + """ + + def __init__(self, **kwargs): + self.file = kwargs.get('file') + self.owner = kwargs.get('owner') + self.uncompressed = kwargs.get('uncompressed') + + def sign(self): + self._show_warning_messages() + data = self._hash_file() + self._save_hash_file(data) + self._print_qrcode(data) + self._make_sig() + + def _show_warning_messages(self): + """ + Shows warning messages before hash + """ + logger("DEBUG", "cli:sign", "Showing warning messages to sign") + + # Shows some message + print("") + print("To sign this file with Krux: ") + print(" (a) load a 12/24 words key with or without password;") + print(" (b) use the Sign->Message feature;") + print(" (c) and scan this QR code below.") + print("") + + def _hash_file(self) -> str: + """ + Creates a hash file before sign + """ + logger("DEBUG", "cli:sign", f"Opening {self.file}") + return open_and_hash_file(path=self.file) + + def _save_hash_file(self, data): + """ + Save the hash file in sha256sum format + """ + # Saves a hash file + logger("INFO", "cli:sign", f"Saving {self.file}.sha256.txt") + __hash_file__ = f"{self.file}.sha256sum.txt" + with open(__hash_file__, mode="w", encoding="utf-8") as hash_file: + hash_file.write(f"{data} {file_to_sign}") + + def _print_qrcode(self, data): + """ + Print QRCode to console + """ + # Prints the QR code + logger("DEBUG", "cli:sign", f"Adding (data={data})") + __qrcode__ = make_qr_code(data=data, verbose=args.verbose) + print(f"{__qrcode__}") + + + def _make_sig(self): + """ + Do signature, public key and public key certificates + """ + # Scans the signature QR code + logger("INFO", "cli:sign", "Creating signature") + signature = scan_signature() + + # Saves a signature + signature_file = f"{self.file}.sig" + with open(signature_file, "wb") as sig_file: + sig_file.write(binary_signature) + logger("INFO", "cli:sign", f"Signature save on {self.owner}.sig") + + # Scans the public KeyboardInterruptardInterrupt + pubkey = scan_public_key() + + # Create PEM data + # Save PEM data to a file + # with filename as owner's name + pem = create_public_key_certificate( + pubkey=pubkey, + uncompressed=uncompreesed, + owner=file_owner, + ) + + __pem_key_file__ = f"{args.file_owner}.pem" + + with open(file=__pem_key_file__, mode="w", encoding="utf-8") as pem_file: + pem_file.write(pem) + logger("INFO", "cli:sign", f"Public key certificate saved as '{__pem_key_file__}'") + + + +class Verify: + + + def verify(self): + """ + onVerify is executed when `verify` command is called + + Args: + :param parser + the argument parser instance + """ + verify_file( + filename=args.verify_file, + pubkey=args.pub_file, + sigfile=args.sig_file, + ) diff --git a/src/ksigner-cli.py b/src/ksigner-cli.py index e878be4..8e488cf 100644 --- a/src/ksigner-cli.py +++ b/src/ksigner-cli.py @@ -37,12 +37,17 @@ # Standart libraries #################### import argparse +import sys ################# # Local libraries ################# -import callbacks -from constants import KSIGNER_CLI_DESCRIPTION +from constants import ( + KSIGNER_VERSION, + KSIGNER_CLI_DESCRIPTION +) +from utils.log import build_logger +from cli.signer import Signer ################ # Command parser @@ -53,48 +58,35 @@ # Version parser.add_argument( - "-v", "--version", action="store_true", help="shows version", default=False -) - -# Verbose messages -parser.add_argument( - "-V", - "--verbose", - dest="verbose", - action="store_true", - help="verbose output (default: False)", - default=False, -) - -# Capture pos-processing camera flags -parser.add_argument( - "-n", - "--normalize", - dest="is_normalized", + "-v", + "--version", action="store_true", - help="normalizes the image of camera (default: False)", - default=False, + help="shows version", + default=False ) +# Verbose messages parser.add_argument( - "-g", - "--gray-scale", - dest="is_gray_scale", - action="store_true", - help="apply gray-scale filter on camera's image (default: False)", - default=False, + "-l", + "--log", + dest="loglevel", + help="log output (info|warning|debug|error, defaults to 'info')", + default='info', ) subparsers = parser.add_subparsers(help="sub-command help", dest="command") # Sign command signer = subparsers.add_parser("sign", help="sign a file") -signer.add_argument("-f", "--file", dest="file_to_sign", help="path to file to sign") +signer.add_argument( + "-f", + "--file", + help="path to file to sign" +) signer.add_argument( "-o", "--owner", - dest="file_owner", help="the owner's name of public key certificate, i.e, the .pem file (default: 'pubkey')", default="pubkey", ) @@ -102,7 +94,6 @@ signer.add_argument( "-u", "--uncompressed", - dest="uncompressed_pub_key", action="store_true", help="flag to create a uncompreesed public key (default: False)", ) @@ -115,7 +106,25 @@ ) verifier.add_argument("-p", "--pub-file", dest="pub_file", help="path to pubkey file") + if __name__ == "__main__": - callbacks.on_version(parser) - callbacks.on_sign(parser) - callbacks.on_verify(parser) + # parse arguments + args = parser.parse_args() + log = build_logger(__name__, args.loglevel) + + # on --version + if args.version: + print(KSIGNER_VERSION) + + elif args.command == None: + parser.print_help() + + elif args.command == 'sign': + log.debug('Starting signer') + signer = Signer( + file=args.file, + owner=args.owner, + uncompressed=args.uncompressed, + loglevel=args.loglevel + ) + signer.sign() \ No newline at end of file diff --git a/src/utils/hash.py b/src/utils/hash.py index 2c1b572..76837cf 100644 --- a/src/utils/hash.py +++ b/src/utils/hash.py @@ -7,9 +7,9 @@ #################### # Standard libraries #################### +import logging import hashlib - def open_and_hash_file(**kwargs) -> str: """ " Read file from --file argument on `sign` command and return its hash @@ -22,36 +22,3 @@ def open_and_hash_file(**kwargs) -> str: """ __filename__ = kwargs.get("path") - try: - with open(__filename__, "rb") as f_to_be_sig: - _bytes = f_to_be_sig.read() # read file as bytes - - return hashlib.sha256(_bytes).hexdigest() - - except FileNotFoundError as exc: - raise FileNotFoundError(f"Unable to read target file: {__filename__}") from exc - - -def save_hashed_file(**kwargs): - """ - Appends '.sha256.txt' to `**kwargs` - and creates its hashed file with `data` content - - Kwargs: - :param data - The data to hashed - :param path - The .sha256.txt - :param verbose - Apply verbose or not - """ - __data__ = kwargs.get("data") - __path__ = kwargs.get("path") - - __hash_file__ = f"{__path__}.sha256sum.txt" - - try: - with open(__hash_file__, mode="w", encoding="utf-8") as hash_file: - hash_file.write(f"{__data__} {__hash_file__}") - except FileNotFoundError as exc: - raise FileNotFoundError(f"Unable to read target file: {__hash_file__}") from exc diff --git a/src/utils/log.py b/src/utils/log.py index bf6250c..61037f6 100644 --- a/src/utils/log.py +++ b/src/utils/log.py @@ -1,24 +1,12 @@ """ -logutils.py +log.py simple log utilities """ -from logging import ( - NOTSET, - DEBUG, - INFO, - WARNING, - ERROR, - CRITICAL, - basicConfig, - info, - debug, - warning, - error, -) +import logging +import sys import time - # pylint: disable=too-few-public-methods class Colors: """ @@ -88,9 +76,6 @@ def log(level: int) -> str: ------- *str*: The formated color with level name """ - if level == NOTSET: - return f"{Colors.BOLD}{Colors.GREEN}INFO{Colors.END}" - if level == DEBUG: return f"{Colors.BOLD}{Colors.BLUE}DEBUG{Colors.END}" @@ -114,36 +99,27 @@ def now() -> str: return time.strftime("%X %x %Z") -def logger(level, message): +def build_logger(name: str, level: str): """ - Prints verbose data preceded by logger level - and current asctime - - Example: - -------- - - ```bash - >>> from utils import logger - >>> logger.info('Hello world') - [INFO ] 08:08:08 8/8/88 -08 :: Hello World - ``` - - Parameters - ---------- - :param:`mes - the message to be verbose + Setup logger + :param: + level: could be one of `info`, `warning`, + `error` or `critical` """ - basicConfig(format="[%(colored)s ] %(channel)s %(asctime)s %(message)s") - - if level == "INFO": - info(message, extra={"colored": INFO}) + # Setup logger + numeric_level = getattr(logging, level.upper(), None) + if not isinstance(numeric_level, int): + raise ValueError('Invalid log level: %s' % loglevel) - if level == "DEBUG": - debug(message, extra={"colored": DEBUG}) + log_format = logging.Formatter('[%(levelname)s] [%(asctime)s] - %(message)s') + log = logging.getLogger(name) + log.setLevel(numeric_level) - if level == "WARNING": - warning(message, extra={"colored": WARNING}) + # writing to stdout + handler = logging.StreamHandler(sys.stdout) + handler.setLevel(numeric_level) + handler.setFormatter(log_format) + log.addHandler(handler) - if level == "ERROR": - error(message, extra={"colored": ERROR}) + return log \ No newline at end of file diff --git a/src/utils/pem.py b/src/utils/pem.py index a7b6882..a3d32f8 100644 --- a/src/utils/pem.py +++ b/src/utils/pem.py @@ -33,7 +33,7 @@ def create_public_key_certificate(**kwargs): Owner of public key certificate :is_normalized Apply or not normalization on image - :is_gray_scale + :issubclass_gray_scale Apply or not gray scale on image :param verbose Apply verbose or not @@ -42,30 +42,3 @@ def create_public_key_certificate(**kwargs): uncompressed = kwargs.get("uncompressed") owner = kwargs.get("owner") - # Choose if will be compressed or uncompressed - if uncompressed: - __public_key_data__ = f"{KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND}{hex_pubkey}" - - else: - __public_key_data__ = f"{KSIGNER_COMPRESSED_PUBKEY_PREPEND}{hex_pubkey}" - - # Convert pubkey data to bytes - __public_key_data_bytes__ = bytes.fromhex(__public_key_data__) - - print(__public_key_data_bytes__) - # Decode to utf8 - __public_key_data_utf8__ = __public_key_data_bytes__.decode("utf-8") - - # Encode to formated base64 - __pem_pub_key__ = "\n".join( - [ - "-----BEGIN PUBLIC KEY-----", - base64.b64encode(__public_key_data_utf8__), - "-----END PUBLIC KEY-----", - ] - ) - - __pem_key_file__ = f"{owner}.pem" - - with open(file=__pem_key_file__, mode="w", encoding="utf-8") as pem_file: - pem_file.write(__pem_pub_key__) diff --git a/src/utils/signandverify.py b/src/utils/signandverify.py index f99cb20..e8e337f 100644 --- a/src/utils/signandverify.py +++ b/src/utils/signandverify.py @@ -63,7 +63,7 @@ def verify_openssl_command(**kwargs) -> str: ) -def verify(**kwargs): +def verify_file(**kwargs): """ Uses openssl to verify the signature and public key diff --git a/src/utils/video.py b/src/utils/video.py index bf270b6..2c6cd94 100644 --- a/src/utils/video.py +++ b/src/utils/video.py @@ -10,6 +10,7 @@ # Standard libraries #################### import base64 +import logging ####################### # Thrid party libraries @@ -21,45 +22,6 @@ ################# from utils.log import now - -def normalization_transform(**kwargs): - """ " - Apply Gray scale on frames - - Kwargs - :param frame - The frame which will be applyed the transformation - :param verbose - Apply verbose messages - """ - frame = kwargs.get("frame") - - # Cameras have different configurations - # and behaviours, so try apply some normalization - # @see https://stackoverflow.com/questions/61016954/ - # controlling-contrast-and-brightness-of-video-stream-in-opencv-and-python - cv2.normalize(frame, frame, 0, 255, cv2.NORM_MINMAX) - - # Verbose some data - - -def gray_transform(**kwargs): - """ " - Apply Gray scale on frames - - Kwargs - :param ret - :param frame - The frame which will be applyed the transformation - :param verbose - Apply verbose messages - """ - frame = kwargs.get("frame") - - # Convert frame to grayscale - frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) - - def scan(**kwargs) -> str: """ Opens a scan window and uses cv2 to detect @@ -75,33 +37,27 @@ def scan(**kwargs) -> str: :param verbose Apply or not verify """ - verbose = kwargs.get("versbose") - is_normalized = kwargs.get("is_normalized") - is_gray_scale = kwargs.get("is_gray_scale") - + logging.debug('Starting OpenCV capture') vid = cv2.VideoCapture(0) - detector = cv2.QRCodeDetector() + logging.debug('Starting OpenSV QRCode detector') + detector = cv2.QRCodeDetector() qr_data = None + while True: # Capture the video frame by frame # use some dummy vars (__+[a-zA-Z0-9]*?$) # to avoid the W0612 'Unused variable' pylint message - _ret, frame = vid.read() + logging.debug('Waiting for data...') - # Apply some normalization if wanted - if is_normalized: - normalization_transform(frame=frame, verbose=verbose) - - # Apply gray scale if wanted - if is_gray_scale: - gray_transform(frame=frame) + _ret, frame = vid.read() # Detect qrcode qr_data, _bbox, _straight_qrcode = detector.detectAndDecode(frame) # Verify null data if len(qr_data) > 0: + logging.debug('QRCode detected') break # Display the resulting frame @@ -111,62 +67,40 @@ def scan(**kwargs) -> str: # quitting button you may use any # desired button of your choice if cv2.waitKey(1) & 0xFF == ord("q"): + logging.debug("Key 'q' pressed: exiting") break + logging.debug('Releasing video') vid.release() + + logging.debug('Destroying video window') cv2.destroyAllWindows() return qr_data -def scan_and_save_signature(**kwargs): +def scan_signature(): """ Scan with camera the generated signatue - - Kwargs: - :is_normalized - Apply normalization on video - :is_gray_scale - Apply some gray scale on video - :param verbose """ - is_normalized = kwargs.get("is_normalized") - is_gray_scale = kwargs.get("is_gray_scale") - filename = kwargs.get("filename") - - _ = input(f"[{now()}] Press enter to scan signature") - signature = scan( - is_normalized=is_normalized, - is_gray_scale=is_gray_scale, - ) - + + _ = input(f"Press enter to scan signature") + signature = scan() + # Encode data - binary_signature = base64.b64decode(signature.encode()) - - # Saves a signature - signature_file = f"{filename}.sig" - with open(signature_file, "wb") as sig_file: - sig_file.write(binary_signature) + logging.debug('Encoding signature') + data = signature.encode() + + logging.debug(f'Signature (data={data})') + return data def scan_public_key(**kwargs) -> str: """ Scan with camera the generated public key - - Kwargs: - :is_normalized - Apply or not normalization on image - :is_gray_scale - Apply or not gray scale on image - :param verbose """ - is_normalized = kwargs.get("is_normalized") - is_gray_scale = kwargs.get("is_gray_scale") - _ = input(f"[{now()}] Press enter to scan public key") - public_key = scan( - is_normalized=is_normalized, - is_gray_scale=is_gray_scale, - ) + public_key = scan() + logging.debug(f'Public Key (data={public_key})') return public_key From 66ee8531b669294a3c67fe2d38a86853f6954b25 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Sun, 22 Oct 2023 10:43:50 -0300 Subject: [PATCH 034/104] added scanner class on cli module --- src/cli/scanner.py | 105 ++++++++++++++++++++++++++++++++++ src/cli/signer.py | 60 +++++++++++++------ src/utils/video.py | 139 ++++++++++++++++++++++----------------------- 3 files changed, 217 insertions(+), 87 deletions(-) create mode 100644 src/cli/scanner.py diff --git a/src/cli/scanner.py b/src/cli/scanner.py new file mode 100644 index 0000000..0fa3630 --- /dev/null +++ b/src/cli/scanner.py @@ -0,0 +1,105 @@ +""" +scanner.py + +some video utilities to scan qrcodes. +""" +#################### +# Standard libraries +#################### +import base64 +import logging + +####################### +# Thrid party libraries +####################### +import cv2 + +################# +# Local libraries +################# +from utils.log import now +from utils.log import build_logger + +class Scanner: + """ + Scanner is the cli utility to scan + Signature and PublicKey + """ + def __init__(self, **kwargs): + loglevel = kwargs.get('loglevel') + self.log = build_logger(__name__, loglevel) + + def _scan(self) -> str: + """ + Opens a scan window and uses cv2 to detect + and decode a QR code, returning its data. + Can be applyed some normalization + or gray scale + """ + self.log.debug('Starting OpenCV capture') + vid = cv2.VideoCapture(0) + + self.log.debug('Starting OpenSV QRCode detector') + detector = cv2.QRCodeDetector() + + qr_data = None + + while True: + # Capture the video frame by frame + # use some dummy vars (__+[a-zA-Z0-9]*?$) + # to avoid the W0612 'Unused variable' pylint message + self.log.debug('Waiting for data...') + + _ret, frame = vid.read() + + # delattrtect qrcode + qr_data, _bbox, _straight_qrcode = detector.detectAndDecode(frame) + + # Verify null data + if len(qr_data) > 0: + self.log.debug('QRCode detected') + break + + # Display the resulting frame + cv2.imshow("frame", frame) + + # the 'q' button is set as the + # quitting button you may use any + # desired button of your choice + if cv2.waitKey(1) & 0xFF == ord("q"): + self.log.debug("Key 'q' pressed: exiting") + break + + self.log.debug('Releasing video') + vid.release() + + self.log.debug('Destroying video window') + cv2.destroyAllWindows() + + return qr_data + + def scan_signature(self) -> str: + """ + Scan with camera the generated signatue + """ + + _ = input(f"Press enter to scan signature") + signature = self._scan() + + # Encode data + self.log.debug('Encoding signature') + data = str.encode(signature) + + self.log.debug(f'Signature (data={data})') + return data + + + def scan_public_key(self) -> str: + """ + Scan with camera the generated public key + """ + _ = input(f"[{now()}] Press enter to scan public key") + public_key = self._scan() + + self.log.debug(f'Public Key (data={public_key})') + return public_key diff --git a/src/cli/signer.py b/src/cli/signer.py index 2e73617..e5f16c6 100644 --- a/src/cli/signer.py +++ b/src/cli/signer.py @@ -4,12 +4,20 @@ Functions to be used during `sign` (sign function) and `verify` (on_verify) operations. """ -from utils.log import build_logger import hashlib - +import base64 + +################# +# Local libraries +################# +from constants import ( + KSIGNER_COMPRESSED_PUBKEY_PREPEND, + KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND +) +from utils.log import build_logger from utils.pem import create_public_key_certificate from utils.qr import make_qr_code -from utils.video import scan_signature, scan_public_key +from cli.scanner import Scanner class Signer: @@ -42,14 +50,18 @@ def __init__(self, **kwargs): self.file = kwargs.get('file') self.owner = kwargs.get('owner') self.uncompressed = kwargs.get('uncompressed') - self.log = build_logger(__name__, kwargs.get('loglevel')) + loglevel = kwargs.get('loglevel') + self.log = build_logger(__name__, loglevel) + self.scanner = Scanner(loglevel=loglevel) + def sign(self): self._show_warning_messages() data = self._hash_file() self._save_hash_file(data) self._print_qrcode(data) self._make_sig() + self._make_pubkey_certificate() def _show_warning_messages(self): """ @@ -104,7 +116,7 @@ def _save_hash_file(self, data): with open(__hash_file__, mode="w", encoding="utf-8") as hash_file: content = f'{data} {self.file}' - self.log.debug(f'Saving content (data={content}') + self.log.debug(f'{__hash_file__} content (data={content})') hash_file.write(content) self.log.debug(f'{__hash_file__} saved') @@ -126,13 +138,13 @@ def _print_qrcode(self, data): __qrcode__ = make_qr_code(data=data) print(f"{__qrcode__}") - def _make_sig(self): + def _make_sig(self): """ Make signature file from scanning qrcode """ # Scans the signature QR code self.log.debug('Creating signature') - signature = scan_signature() + signature = self.scanner.scan_signature() # Saves a signature signature_file = f"{self.file}.sig" @@ -140,7 +152,7 @@ def _make_sig(self): try: with open(signature_file, "wb") as sig_file: - sig_file.write(binary_signature) + sig_file.write(signature) self.log.debug(f"Signature saved on {signature_file}") except Exception as exc: @@ -156,34 +168,48 @@ def _make_pubkey_certificate(self): Make public key file from scanning qrcode """ # Scans the public KeyboardInterruptardInterrupt - self.log.debug('Creating public key') - pubkey = scan_public_key() + self.log.debug('Creating public key certificate') + pubkey = self.scanner.scan_public_key() # Create PEM data # Save PEM data to a file # with filename as owner's name - hex_pubkey = hex_pubkey.upper() - # Choose if will be compressed or uncompressed - if uncompressed: - __public_key_data__ = f"{KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND}{hex_pubkey}" + if self.uncompressed: + self.log.debug('Make it uncompressed key') + __public_key_data__ = "".join([ + KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND, + pubkey.upper() + ]) else: - __public_key_data__ = f"{KSIGNER_COMPRESSED_PUBKEY_PREPEND}{hex_pubkey}" + self.log.debug('Make it compressed key') + __public_key_data__ = "".join([ + KSIGNER_COMPRESSED_PUBKEY_PREPEND, + pubkey.upper() + ]) # Convert pubkey data to bytes + self.log.debug('Converting public key to bytes') __public_key_data_bytes__ = bytes.fromhex(__public_key_data__) + + self.log.debug('Encoding bytes to base64 format') __public_key_data_b64__ = base64.b64encode(__public_key_data_bytes__) + + self.log.debug('Decoding bas64 to utf8') __public_key_data_b64__ = __public_key_data_b64__.decode("utf8") + + self.log.debug(f'b64 (data={__public_key_data_b64__})') + __public_key_name__ = f'{self.owner}.pem' try: - with open(__public_key__name, 'wb') as pb_file: + with open(__public_key_name__, 'wb') as pb_file: self.log.debug(f'Saving {__public_key_name__}') pb_file.write(__public_key_data_b64__) self.log.debug(f'{__public_key_name__} saved') except Exception as exc: - message = f'Unknow error on saving {__hash_file__}' + message = f'Unknow error on saving {__public_key_name__}' numeric_level = getattr(logging, loglevel.upper(), None) if numeric_level == logging.NOTSET: raise Exception(message) from exc diff --git a/src/utils/video.py b/src/utils/video.py index 2c6cd94..53c4a0b 100644 --- a/src/utils/video.py +++ b/src/utils/video.py @@ -1,10 +1,7 @@ """ -videoutils.py +scanner.py -some video utilities to scan and post processing -images. - -TODO: unify processingutils.py to this file? +some video utilities to scan qrcodes. """ #################### # Standard libraries @@ -21,86 +18,88 @@ # Local libraries ################# from utils.log import now +from utils.log import build_logger -def scan(**kwargs) -> str: +class Scanner: """ - Opens a scan window and uses cv2 to detect - and decode a QR code, returning its data. - Can be applyed some normalization - or gray scale - - Kwargs: - :is_normalized - Apply some normalization - :is_gray_scale - Apply some gray scale - :param verbose - Apply or not verify + Scanner is the cli utility to scan + Signature and PublicKey """ - logging.debug('Starting OpenCV capture') - vid = cv2.VideoCapture(0) - - logging.debug('Starting OpenSV QRCode detector') - detector = cv2.QRCodeDetector() - qr_data = None + def __init__(self, **kwargs): + loglevel = kwargs.get('loglevel') + self.log = build_logger(__name__, loglevel) + + def _scan(self) -> str: + """ + Opens a scan window and uses cv2 to detect + and decode a QR code, returning its data. + Can be applyed some normalization + or gray scale + """ + self.log.debug('Starting OpenCV capture') + vid = cv2.VideoCapture(0) + + self.log.debug('Starting OpenSV QRCode detector') + detector = cv2.QRCodeDetector() - while True: - # Capture the video frame by frame - # use some dummy vars (__+[a-zA-Z0-9]*?$) - # to avoid the W0612 'Unused variable' pylint message - logging.debug('Waiting for data...') - - _ret, frame = vid.read() + qr_data = None + + while True: + # Capture the video frame by frame + # use some dummy vars (__+[a-zA-Z0-9]*?$) + # to avoid the W0612 'Unused variable' pylint message + self.log.debug('Waiting for data...') - # Detect qrcode - qr_data, _bbox, _straight_qrcode = detector.detectAndDecode(frame) + _ret, frame = vid.read() - # Verify null data - if len(qr_data) > 0: - logging.debug('QRCode detected') - break + # delattrtect qrcode + qr_data, _bbox, _straight_qrcode = detector.detectAndDecode(frame) - # Display the resulting frame - cv2.imshow("frame", frame) + # Verify null data + if len(qr_data) > 0: + self.log.debug('QRCode detected') + break - # the 'q' button is set as the - # quitting button you may use any - # desired button of your choice - if cv2.waitKey(1) & 0xFF == ord("q"): - logging.debug("Key 'q' pressed: exiting") - break + # Display the resulting frame + cv2.imshow("frame", frame) - logging.debug('Releasing video') - vid.release() + # the 'q' button is set as the + # quitting button you may use any + # desired button of your choice + if cv2.waitKey(1) & 0xFF == ord("q"): + self.log.debug("Key 'q' pressed: exiting") + break - logging.debug('Destroying video window') - cv2.destroyAllWindows() + self.log.debug('Releasing video') + vid.release() - return qr_data + self.log.debug('Destroying video window') + cv2.destroyAllWindows() + return qr_data -def scan_signature(): - """ - Scan with camera the generated signatue - """ - - _ = input(f"Press enter to scan signature") - signature = scan() + def scan_signature(): + """ + Scan with camera the generated signatue + """ - # Encode data - logging.debug('Encoding signature') - data = signature.encode() + _ = input(f"Press enter to scan signature") + signature = self.scan() - logging.debug(f'Signature (data={data})') - return data + # Encode data + self.log.debug('Encoding signature') + data = str.encode(signature) + self.log.debug(f'Signature (data={data})') + return data -def scan_public_key(**kwargs) -> str: - """ - Scan with camera the generated public key - """ - _ = input(f"[{now()}] Press enter to scan public key") - public_key = scan() - logging.debug(f'Public Key (data={public_key})') - return public_key + def scan_public_key(**kwargs) -> str: + """ + Scan with camera the generated public key + """ + _ = input(f"[{now()}] Press enter to scan public key") + public_key = self.scan() + + self.log.debug(f'Public Key (data={public_key})') + return public_key From 0b155decd6048a76dfdacf48a48807e003df4053 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Sun, 22 Oct 2023 22:15:25 -0300 Subject: [PATCH 035/104] Linted many files --- .gitignore | 2 + .pylintrc | 3 +- src/cli/on.py | 18 --- src/cli/scanner.py | 60 +++++---- src/cli/signer.py | 235 +++++++++++++++-------------------- src/cli/verifyer.py | 200 +++++++++++------------------ src/ksigner-cli.py | 57 ++++++--- src/ksigner-gui.py | 21 ++-- src/screens/actioner.py | 142 +++++++++++++++++++++ src/screens/main.py | 15 ++- src/screens/qrcode.py | 115 ++++------------- src/screens/scan.py | 135 ++++---------------- src/screens/sign.py | 53 ++++---- src/screens/verify.py | 12 +- src/{ => utils}/constants.py | 0 src/utils/hash.py | 24 ---- src/utils/log.py | 29 ++--- src/utils/pem.py | 44 ------- src/utils/signandverify.py | 94 -------------- src/utils/video.py | 105 ---------------- 20 files changed, 508 insertions(+), 856 deletions(-) delete mode 100644 src/cli/on.py create mode 100644 src/screens/actioner.py rename src/{ => utils}/constants.py (100%) delete mode 100644 src/utils/hash.py delete mode 100644 src/utils/pem.py delete mode 100644 src/utils/signandverify.py delete mode 100644 src/utils/video.py diff --git a/.gitignore b/.gitignore index e96bd6e..af25a52 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ build dist *.spec *.sha256*.txt +*.sig +*.log src/**/__pycache__ \ No newline at end of file diff --git a/.pylintrc b/.pylintrc index 582a0a5..cd7c638 100644 --- a/.pylintrc +++ b/.pylintrc @@ -25,7 +25,8 @@ clear-cache-post-run=no # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may # run arbitrary code. -extension-pkg-allow-list= +# see https://github.com/pylint-dev/pylint/issues/1524#issuecomment-1214435049 +extension-pkg-allow-list=kivy.properties, # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may diff --git a/src/cli/on.py b/src/cli/on.py deleted file mode 100644 index 09dd11a..0000000 --- a/src/cli/on.py +++ /dev/null @@ -1,18 +0,0 @@ - - -class Verify: - - - def verify(self): - """ - onVerify is executed when `verify` command is called - - Args: - :param parser - the argument parser instance - """ - verify_file( - filename=args.verify_file, - pubkey=args.pub_file, - sigfile=args.sig_file, - ) diff --git a/src/cli/scanner.py b/src/cli/scanner.py index 0fa3630..d785e49 100644 --- a/src/cli/scanner.py +++ b/src/cli/scanner.py @@ -1,14 +1,29 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-2023 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. """ scanner.py some video utilities to scan qrcodes. """ -#################### -# Standard libraries -#################### -import base64 -import logging - ####################### # Thrid party libraries ####################### @@ -20,13 +35,15 @@ from utils.log import now from utils.log import build_logger + class Scanner: """ Scanner is the cli utility to scan Signature and PublicKey """ + def __init__(self, **kwargs): - loglevel = kwargs.get('loglevel') + loglevel = kwargs.get("loglevel") self.log = build_logger(__name__, loglevel) def _scan(self) -> str: @@ -36,19 +53,19 @@ def _scan(self) -> str: Can be applyed some normalization or gray scale """ - self.log.debug('Starting OpenCV capture') + self.log.debug("Starting OpenCV capture") vid = cv2.VideoCapture(0) - self.log.debug('Starting OpenSV QRCode detector') + self.log.debug("Starting OpenSV QRCode detector") detector = cv2.QRCodeDetector() - + qr_data = None - + while True: # Capture the video frame by frame # use some dummy vars (__+[a-zA-Z0-9]*?$) # to avoid the W0612 'Unused variable' pylint message - self.log.debug('Waiting for data...') + self.log.debug("Waiting for data...") _ret, frame = vid.read() @@ -57,7 +74,7 @@ def _scan(self) -> str: # Verify null data if len(qr_data) > 0: - self.log.debug('QRCode detected') + self.log.debug("QRCode detected") break # Display the resulting frame @@ -70,10 +87,10 @@ def _scan(self) -> str: self.log.debug("Key 'q' pressed: exiting") break - self.log.debug('Releasing video') + self.log.debug("Releasing video") vid.release() - self.log.debug('Destroying video window') + self.log.debug("Destroying video window") cv2.destroyAllWindows() return qr_data @@ -82,18 +99,17 @@ def scan_signature(self) -> str: """ Scan with camera the generated signatue """ - - _ = input(f"Press enter to scan signature") + + _ = input("Press enter to scan signature") signature = self._scan() - + # Encode data - self.log.debug('Encoding signature') + self.log.debug("Encoding signature") data = str.encode(signature) - self.log.debug(f'Signature (data={data})') + self.log.debug("Signature (data=%s)", data) return data - def scan_public_key(self) -> str: """ Scan with camera the generated public key @@ -101,5 +117,5 @@ def scan_public_key(self) -> str: _ = input(f"[{now()}] Press enter to scan public key") public_key = self._scan() - self.log.debug(f'Public Key (data={public_key})') + self.log.debug("Public Key (data={%s})", public_key) return public_key diff --git a/src/cli/signer.py b/src/cli/signer.py index e5f16c6..59da9fa 100644 --- a/src/cli/signer.py +++ b/src/cli/signer.py @@ -4,18 +4,20 @@ Functions to be used during `sign` (sign function) and `verify` (on_verify) operations. """ +#################### +# Standard libraries +#################### import hashlib import base64 ################# # Local libraries ################# -from constants import ( +from utils.constants import ( KSIGNER_COMPRESSED_PUBKEY_PREPEND, - KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND + KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND, ) -from utils.log import build_logger -from utils.pem import create_public_key_certificate +from utils.log import build_logger from utils.qr import make_qr_code from cli.scanner import Scanner @@ -24,51 +26,50 @@ class Signer: """ Signer is the class that manages the `sign` command - - Workflow: - - (1) Read a file; - (2) Save in a .sha256.txt file; - (3) Requires the user loads a xpriv key on his/her device: - (a) load a 12/24 words key; - (b) with or without BIP39 password; - (4) sign a message: - (a) once loaded the xpriv key, user goes - to Sign > Message feature on his/her device - (b) show a qrcode on device; - (c) this function will generate a qrcode on computer; - (d) once shown, the user will be prompted to scan it with device; - (e) once scanned, the device will show some qrcodes: - (i) the signature as a qrcode; - (ii) the public key; - (f) once above qrcodes are scanned, the computer - will generate a publickey certificate, in a compressed - or uncompressed format, in name of an owner. """ - + def __init__(self, **kwargs): - self.file = kwargs.get('file') - self.owner = kwargs.get('owner') - self.uncompressed = kwargs.get('uncompressed') - - loglevel = kwargs.get('loglevel') - self.log = build_logger(__name__, loglevel) - self.scanner = Scanner(loglevel=loglevel) - + self.file = kwargs.get("file") + self.owner = kwargs.get("owner") + self.uncompressed = kwargs.get("uncompressed") + + self.loglevel = kwargs.get("loglevel") + self.log = build_logger(__name__, self.loglevel) + self.scanner = Scanner(loglevel=self.loglevel) + def sign(self): + """ + (1) Read a file; + (2) Save in a .sha256.txt file; + (3) Requires the user loads a xpriv key on his/her device: + (a) load a 12/24 words key; + (b) with or without BIP39 password; + (4) sign a message: + (a) once loaded the xpriv key, user goes + to Sign > Message feature on his/her device + (b) show a qrcode on device; + (c) this function will generate a qrcode on computer; + (d) once shown, the user will be prompted to scan it with device; + (e) once scanned, the device will show some qrcodes: + (i) the signature as a qrcode; + (ii) the public key; + (f) once above qrcodes are scanned, the computer + will generate a publickey certificate, in a compressed + or uncompressed format, in name of an owner. + """ self._show_warning_messages() - data = self._hash_file() - self._save_hash_file(data) + data = self.hash_file() + self.save_hash_file(data) self._print_qrcode(data) - self._make_sig() - self._make_pubkey_certificate() + sig = self.scan_sig() + self.save_signature(sig) def _show_warning_messages(self): """ Shows warning messages before hash """ - self.log.debug('Showing warning messages to sign') - + self.log.debug("Showing warning messages to sign") + # Shows some message print("") print("To sign this file with Krux: ") @@ -77,98 +78,69 @@ def _show_warning_messages(self): print(" (c) and scan this QR code below.") print("") - def _hash_file(self) -> str: + def hash_file(self) -> str: """ Creates a hash file before sign - """ - self.log.debug(f'Opening {self.file}') - - try: - with open(self.file, "rb") as f_sig: - self.log.debug('Reading bytes...') - _bytes = f_sig.read() - - self.log.debug('Hashing...') - data = hashlib.sha256(_bytes).hexdigest() - - self.log.debug(f'Hash (data={data})') - return data - - except FileNotFoundError as exc: - message = f'Unable to read target file: {self.file}' - numeric_level = getattr(logging, loglevel.upper(), None) - if numeric_level == logging.NOTSET: - raise FileNotFoundError(message) from exc - else: - logging.error(message) - - return open_and_hash_file(path=self.file) - - def _save_hash_file(self, data): + """ + self.log.debug("Opening %s", self.file) + + with open(self.file, "rb") as f_sig: + self.log.debug("Reading bytes...") + _bytes = f_sig.read() + self.log.debug("Hashing...") + data = hashlib.sha256(_bytes).hexdigest() + self.log.debug("Hash (data=%s)", data) + return data + + def save_hash_file(self, data): """ Save the hash file in sha256sum format """ # Saves a hash file - try: - __hash_file__ = f"{self.file}.sha256sum.txt" - self.log.debug(f'Saving {self.file}.sha256.txt') - - with open(__hash_file__, mode="w", encoding="utf-8") as hash_file: - content = f'{data} {self.file}' - - self.log.debug(f'{__hash_file__} content (data={content})') - hash_file.write(content) - - self.log.debug(f'{__hash_file__} saved') - - except Exception as exc: - message = f'Unknow error on saving {__hash_file__}' - numeric_level = getattr(logging, loglevel.upper(), None) - if numeric_level == logging.NOTSET: - raise Exception(message) from exc - else: - logging.error(message) + __hash_file__ = f"{self.file}.sha256sum.txt" + self.log.debug("Saving %s", __hash_file__) + + with open(__hash_file__, mode="w", encoding="utf-8") as hash_file: + content = f"{data} {self.file}" + self.log.debug("%s content (data=%s)", __hash_file__, content) + hash_file.write(content) + self.log.debug("%s saved", __hash_file__) def _print_qrcode(self, data): """ Print QRCode to console """ # Prints the QR code - self.log.debug(f"Creating QRCode (data={data})") + self.log.debug("Creating QRCode (data=%s)", data) __qrcode__ = make_qr_code(data=data) print(f"{__qrcode__}") - def _make_sig(self): + def scan_sig(self): """ Make signature file from scanning qrcode """ # Scans the signature QR code - self.log.debug('Creating signature') - signature = self.scanner.scan_signature() - + self.log.debug("Creating signature") + return self.scanner.scan_signature() + + def save_signature(self, signature): + """ + Save the signature data into file + """ # Saves a signature signature_file = f"{self.file}.sig" - self.log.debug(f'Saving {signature_file}') + self.log.debug("Saving %s", signature_file) - try: - with open(signature_file, "wb") as sig_file: - sig_file.write(signature) - self.log.debug(f"Signature saved on {signature_file}") - - except Exception as exc: - message = f'Unknow error on saving {__hash_file__}' - numeric_level = getattr(logging, loglevel.upper(), None) - if numeric_level == logging.NOTSET: - raise Exception(message) from exc - else: - logging.error(message) + with open(signature_file, "wb") as sig_file: + sig_file.write(signature) + self.log.debug("Signature saved on %s", signature_file) - def _make_pubkey_certificate(self): + def make_pubkey_certificate(self): """ - Make public key file from scanning qrcode + Make public key file from scanning qrcode """ # Scans the public KeyboardInterruptardInterrupt - self.log.debug('Creating public key certificate') + self.log.debug("Creating public key certificate") pubkey = self.scanner.scan_public_key() # Create PEM data @@ -176,42 +148,31 @@ def _make_pubkey_certificate(self): # with filename as owner's name # Choose if will be compressed or uncompressed if self.uncompressed: - self.log.debug('Make it uncompressed key') - __public_key_data__ = "".join([ - KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND, - pubkey.upper() - ]) + self.log.debug("Make it uncompressed key") + __public_key_data__ = "".join( + [KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND, pubkey.upper()] + ) else: - self.log.debug('Make it compressed key') - __public_key_data__ = "".join([ - KSIGNER_COMPRESSED_PUBKEY_PREPEND, - pubkey.upper() - ]) + self.log.debug("Make it compressed key") + __public_key_data__ = "".join( + [KSIGNER_COMPRESSED_PUBKEY_PREPEND, pubkey.upper()] + ) # Convert pubkey data to bytes - self.log.debug('Converting public key to bytes') + self.log.debug("Converting public key to bytes") __public_key_data_bytes__ = bytes.fromhex(__public_key_data__) - - self.log.debug('Encoding bytes to base64 format') + + self.log.debug("Encoding bytes to base64 format") __public_key_data_b64__ = base64.b64encode(__public_key_data_bytes__) - - self.log.debug('Decoding bas64 to utf8') + + self.log.debug("Decoding bas64 to utf8") __public_key_data_b64__ = __public_key_data_b64__.decode("utf8") - self.log.debug(f'b64 (data={__public_key_data_b64__})') - - __public_key_name__ = f'{self.owner}.pem' - - try: - with open(__public_key_name__, 'wb') as pb_file: - self.log.debug(f'Saving {__public_key_name__}') - pb_file.write(__public_key_data_b64__) - self.log.debug(f'{__public_key_name__} saved') - - except Exception as exc: - message = f'Unknow error on saving {__public_key_name__}' - numeric_level = getattr(logging, loglevel.upper(), None) - if numeric_level == logging.NOTSET: - raise Exception(message) from exc - else: - logging.error(message) + self.log.debug("b64 (data=%s)", __public_key_data_b64__) + + __public_key_name__ = f"{self.owner}.pem" + + with open(__public_key_name__, "wb") as pb_file: + self.log.debug("Saving %s", __public_key_name__) + pb_file.write(__public_key_data_b64__) + self.log.debug("%s saved", __public_key_name__) diff --git a/src/cli/verifyer.py b/src/cli/verifyer.py index 6bfa319..c0d8e75 100644 --- a/src/cli/verifyer.py +++ b/src/cli/verifyer.py @@ -1,143 +1,87 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-2023 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. """ -signer.py +verifyer.py -Functions to be used during `sign` (on_sign function) -and `verify` (on_verify) operations. +functions that use openssl as a wrapper +to verify signatures + +TODO: replace for pyca/cryptography or pyOpenSSL """ -from utils.hash import open_and_hash_file -from utils.pem import create_public_key_certificate -from utils.qr import make_qr_code -from utils.signandverify import verify_file -from utils.video import scan_signature, scan_public_key +#################### +# Standart libraries +#################### +import subprocess +import logging +################# +# Local libraries +################# +from utils.log import build_logger -class Signer: +class Verifyer: """ - Signer is the class - that manages the `sign` command - - Workflow: - - (1) Read a file; - (2) Save in a .sha256.txt file; - (3) Requires the user loads a xpriv key on his/her device: - (a) load a 12/24 words key; - (b) with or without BIP39 password; - (4) sign a message: - (a) once loaded the xpriv key, user goes - to Sign > Message feature on his/her device - (b) show a qrcode on device; - (c) this function will generate a qrcode on computer; - (d) once shown, the user will be prompted to scan it with device; - (e) once scanned, the device will show some qrcodes: - (i) the signature as a qrcode; - (ii) the public key; - (f) once above qrcodes are scanned, the computer - will generate a publickey certificate, in a compressed - or uncompressed format, in name of an owner. + Verifyer is the class + that manages the `verify` verify_openssl_command + with given :param:`file`, :param:`pubkey` and + :param:`signature` """ - - def __init__(self, **kwargs): - self.file = kwargs.get('file') - self.owner = kwargs.get('owner') - self.uncompressed = kwargs.get('uncompressed') - - def sign(self): - self._show_warning_messages() - data = self._hash_file() - self._save_hash_file(data) - self._print_qrcode(data) - self._make_sig() - - def _show_warning_messages(self): - """ - Shows warning messages before hash - """ - logger("DEBUG", "cli:sign", "Showing warning messages to sign") - - # Shows some message - print("") - print("To sign this file with Krux: ") - print(" (a) load a 12/24 words key with or without password;") - print(" (b) use the Sign->Message feature;") - print(" (c) and scan this QR code below.") - print("") - - def _hash_file(self) -> str: - """ - Creates a hash file before sign - """ - logger("DEBUG", "cli:sign", f"Opening {self.file}") - return open_and_hash_file(path=self.file) - - def _save_hash_file(self, data): - """ - Save the hash file in sha256sum format - """ - # Saves a hash file - logger("INFO", "cli:sign", f"Saving {self.file}.sha256.txt") - __hash_file__ = f"{self.file}.sha256sum.txt" - with open(__hash_file__, mode="w", encoding="utf-8") as hash_file: - hash_file.write(f"{data} {file_to_sign}") - - def _print_qrcode(self, data): - """ - Print QRCode to console - """ - # Prints the QR code - logger("DEBUG", "cli:sign", f"Adding (data={data})") - __qrcode__ = make_qr_code(data=data, verbose=args.verbose) - print(f"{__qrcode__}") + def __init__(self, **kwargs): + self.file = kwargs.get("file") + self.pubkey = kwargs.get("pubkey") + self.signature = kwargs.get("signature") + self.loglevel = kwargs.get("loglevel") + self.log = build_logger(__name__, self.loglevel) - def _make_sig(self): + def make_openssl_command(self) -> str: """ - Do signature, public key and public key certificates + Create the properly openssl command to verify """ - # Scans the signature QR code - logger("INFO", "cli:sign", "Creating signature") - signature = scan_signature() - - # Saves a signature - signature_file = f"{self.file}.sig" - with open(signature_file, "wb") as sig_file: - sig_file.write(binary_signature) - logger("INFO", "cli:sign", f"Signature save on {self.owner}.sig") - - # Scans the public KeyboardInterruptardInterrupt - pubkey = scan_public_key() - - # Create PEM data - # Save PEM data to a file - # with filename as owner's name - pem = create_public_key_certificate( - pubkey=pubkey, - uncompressed=uncompreesed, - owner=file_owner, - ) - - __pem_key_file__ = f"{args.file_owner}.pem" - - with open(file=__pem_key_file__, mode="w", encoding="utf-8") as pem_file: - pem_file.write(pem) - logger("INFO", "cli:sign", f"Public key certificate saved as '{__pem_key_file__}'") - - - -class Verify: - + return " ".join( + [ + f"openssl sha256 <{self.file} -binary", + "|", + f"openssl pkeyutl -verify -pubin -inkey {self.pubkey}", + f"-sigfile {self.signature}", + ] + ) def verify(self): """ - onVerify is executed when `verify` command is called - - Args: - :param parser - the argument parser instance - """ - verify_file( - filename=args.verify_file, - pubkey=args.pub_file, - sigfile=args.sig_file, - ) + Uses openssl to verify the signature and public key + """ + try: + self.log.debug("Verifyer: Creating openssl command") + __command__ = self.make_openssl_command() + self.log.debug("Verifyer: Running '%s'", __command__) + subprocess.run(__command__, check=True, shell=True) + self.log.debug("Verifyer: verified") + except subprocess.CalledProcessError as exc: + message = "Invalid command" + numeric_level = getattr(logging, self.loglevel.upper(), None) + if not numeric_level == logging.NOTSET: + self.log.error("%s: %s", message, __command__) + else: + raise subprocess.CalledProcessError(message, cmd=__command__) from exc + \ No newline at end of file diff --git a/src/ksigner-cli.py b/src/ksigner-cli.py index 8e488cf..0b772e3 100644 --- a/src/ksigner-cli.py +++ b/src/ksigner-cli.py @@ -19,7 +19,6 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. - """ This python script is a tool to create air-gapped signatures of files using Krux. The script can also convert hex publics exported from Krux to PEM public keys so @@ -37,17 +36,17 @@ # Standart libraries #################### import argparse -import sys ################# # Local libraries ################# -from constants import ( +from utils.constants import ( KSIGNER_VERSION, KSIGNER_CLI_DESCRIPTION ) from utils.log import build_logger -from cli.signer import Signer +from cli.signer import Signer +from cli.verifyer import Verifyer ################ # Command parser @@ -58,11 +57,7 @@ # Version parser.add_argument( - "-v", - "--version", - action="store_true", - help="shows version", - default=False + "-v", "--version", action="store_true", help="shows version", default=False ) # Verbose messages @@ -71,9 +66,10 @@ "--log", dest="loglevel", help="log output (info|warning|debug|error, defaults to 'info')", - default='info', + default="info", ) +# Subparsers: sign and verify subparsers = parser.add_subparsers(help="sub-command help", dest="command") # Sign command @@ -83,14 +79,12 @@ "--file", help="path to file to sign" ) - signer.add_argument( "-o", "--owner", help="the owner's name of public key certificate, i.e, the .pem file (default: 'pubkey')", default="pubkey", ) - signer.add_argument( "-u", "--uncompressed", @@ -100,31 +94,54 @@ # Verify command verifier = subparsers.add_parser("verify", help="verify signature") -verifier.add_argument("-f", "--file", dest="verify_file", help="path to file to verify") verifier.add_argument( - "-s", "--sig-file", dest="sig_file", help="path to signature file" + "-f", + "--file", + help="path to file to verify" +) +verifier.add_argument( + "-s", + "--sig-file", + dest="sig_file", + help="path to signature file" +) +verifier.add_argument( + "-p", + "--pub-file", + dest="pub_file", + help="path to pubkey file" ) -verifier.add_argument("-p", "--pub-file", dest="pub_file", help="path to pubkey file") if __name__ == "__main__": # parse arguments args = parser.parse_args() log = build_logger(__name__, args.loglevel) - + # on --version if args.version: print(KSIGNER_VERSION) - elif args.command == None: + elif args.command is None: parser.print_help() - elif args.command == 'sign': - log.debug('Starting signer') + elif args.command == "sign": + log.debug("Starting signer") signer = Signer( file=args.file, owner=args.owner, uncompressed=args.uncompressed, + loglevel=args.loglevel, + ) + signer.sign() + signer.make_pubkey_certificate() + + elif args.command == "verify": + log.debug("Starting verifyer") + verifyer = Verifyer( + file=args.file, + pubkey=args.pub_key, + signature=args.sig_file, loglevel=args.loglevel ) - signer.sign() \ No newline at end of file + verifyer.verify() diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index 73a4eb3..5c44ecf 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -34,7 +34,7 @@ ################# # Local libraries ################# -from utils.log import logger +from utils.log import build_logger from screens.main import MainScreen from screens.sign import SignScreen from screens.verify import VerifyScreen @@ -59,25 +59,28 @@ def build(self): - verify; - TODO: others """ - logger("DEBUG", "KSignerApp: Creating ScreenManager") + loglevel = "debug" + logger = build_logger(__name__, loglevel) + + logger.debug("KSignerApp: Creating ScreenManager") screen_manager = ScreenManager() - logger("DEBUG", "KsignerApp: Adding ") - screen_manager.add_widget(MainScreen(name="main")) + logger.debug("KsignerApp: Adding ") + screen_manager.add_widget(MainScreen(name="main", loglevel=loglevel)) - logger("DEBUG", "KsignerApp: Adding ") + logger.debug("KsignerApp: Adding ") screen_manager.add_widget(SignScreen(name="sign")) - logger("DEBUG", "KsignerApp: Adding ") + logger.debug("KsignerApp: Adding ") screen_manager.add_widget(VerifyScreen(name="verify")) - logger("DEBUG", "KsignerApp: Adding ") + logger.debug("KsignerApp: Adding ") screen_manager.add_widget(QRCodeScreen(name="qrcode")) - logger("DEBUG", "KsignerApp: Adding ") + logger.debug("KsignerApp: Adding ") screen_manager.add_widget(ScanScreen(name="scan-import-save-signature")) - logger("DEBUG", "KsignerApp: Adding ") + logger.debug("KsignerApp: Adding ") screen_manager.add_widget(ScanScreen(name="scan-import-save-public-key")) return screen_manager diff --git a/src/screens/actioner.py b/src/screens/actioner.py new file mode 100644 index 0000000..5f767a2 --- /dev/null +++ b/src/screens/actioner.py @@ -0,0 +1,142 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-2023 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +""" +actioner.py + +Implements an inherited kivy.uix.screenmanager.Screen +to be subclassed on qrcody.py and scan.py +""" + +################ +# Kivy libraries +################ +from kivy.core.window import Window +from kivy.uix.label import Label +from kivy.uix.screenmanager import Screen +from kivy.properties import ListProperty, ObjectProperty + +################# +# Local libraries +################# +from utils.log import build_logger + + +class ActionerScreen(Screen): + """ + Class responsible to scan qrcodes. + """ + + fill_color = ListProperty((1, 1, 1, 1)) + """ + :data:`background_color` is a tuple describing the color of background + defined at :class:`~qrcode.QRCode` + """ + + label_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.125}) + """ + :data:`label_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, + to set the default position on Screen + """ + + warn_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 1}) + """ + :data:`warn_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, + to set the default position on Screen + """ + + def __init__(self, **kwargs): + self.loglevel = kwargs.pop("loglevel") + super().__init__(**kwargs) + + # Widgets + self._label_warn = None + self._label_desc = None + self.loglevel = kwargs.get("loglevel") + self.log = build_logger(__name__, self.loglevel) + # Keyboard bindings for close ScanScreen + self._keyboard = Window.request_keyboard(self._keyboard_closed, self, "text") + if self._keyboard.widget: + self.log.warning("ActionerScreen: This widget is a VKeyboard object") + self._keyboard.bind(on_key_down=self._on_keyboard_down) + + def _make_label_warn(self, text): + return Label( + text=text, + font_size=Window.height // 35, + font_name="terminus.ttf", + halign="center", + color=self.fill_color, + markup=True, + pos_hint=self.warn_pos_hint, + ) + + def _make_label_desc(self, text): + return Label( + text=text, + font_size=Window.height // 35, + font_name="terminus.ttf", + halign="center", + color=self.fill_color, + markup=True, + pos_hint=self.label_pos_hint, + ) + + def _back_to_signscreen(self): + """ + Back to SignScreen + """ + self.log.info("ActionerScreen: Redirecting to ") + self.manager.transition.direction = "left" + self.manager.current = "sign" + + def _keyboard_closed(self): + self.log.info("ActionerScreen: keyboard have been closed") + self._keyboard.unbind(on_key_down=self._on_keyboard_down) + self._keyboard = None + + # pylint: disable=unused-argument + def _on_keyboard_down(self, keyboard, keycode, text, modifiers): + # Keycode is composed of an integer + a string + # If we hit escape, release the keyboard + if keycode[1] == "escape": + self._back_to_signscreen() + + elif keycode[1] == "enter": + self._back_to_signscreen() + + elif keycode[1] == "left": + self._back_to_signscreen() + + elif keycode[1] == "backspace": + self._back_to_signscreen() + else: + self.log.warning("ActionerScreen: key '%s' not implemented", keycode[1]) + + return True + + @staticmethod + def _chunk_str(msg, size): + """ + Split a big string in multiple lines; + Use with sha256 or signature strings. + """ + return "\n".join([msg[i : i + size] for i in range(0, len(msg), size)]) diff --git a/src/screens/main.py b/src/screens/main.py index bd20649..45e0435 100644 --- a/src/screens/main.py +++ b/src/screens/main.py @@ -33,7 +33,7 @@ ################# # Local libraries ################# -from utils.log import logger +from utils.log import build_logger class MainScreen(Screen): @@ -44,6 +44,11 @@ class MainScreen(Screen): :class:`screens.VerifyScreen`. """ + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.loglevel = kwargs.get("loglevel") + self.log = build_logger(__name__, self.loglevel) + def on_press_sign_button(self): """ on_press_sign_button @@ -51,7 +56,7 @@ def on_press_sign_button(self): - change background color of button to (.5,.5,.5,.5), giving a visual effect of 'pressed' """ - logger("DEBUG", "MainScreen: clicked") + self.log.debug("MainScreen: clicked") self.ids.main_screen_sign_button.background_color = (0.5, 0.5, 0.5, 0.5) def on_release_sign_button(self): @@ -62,7 +67,7 @@ def on_release_sign_button(self): giving a visual effect of 'unpressed' - make a screen transition to SignScreen """ - logger("DEBUG", "MainScreen: released") + self.log.debug("MainScreen: released") self.ids.main_screen_sign_button.background_color = (0, 0, 0, 0) self.manager.transition.direction = "left" self.manager.current = "sign" @@ -74,7 +79,7 @@ def on_press_verify_button(self): - change background color of button to (.5,.5,.5,.5), giving a visual effect of 'pressed' """ - logger("DEBUG", "MainScreen: clicked") + self.log.debug("MainScreen: clicked") self.ids.main_screen_verify_button.background_color = (0.5, 0.5, 0.5, 0.5) def on_release_verify_button(self): @@ -85,7 +90,7 @@ def on_release_verify_button(self): giving a visual effect of 'unpressed' - make a screen transition to VerifyScreen """ - logger("DEBUG", "MainScreen: released") + self.log.debug("MainScreen: released") self.ids.main_screen_verify_button.background_color = (0, 0, 0, 0) self.manager.transition.direction = "left" self.manager.current = "verify" diff --git a/src/screens/qrcode.py b/src/screens/qrcode.py index 4fbda5c..83b1fce 100644 --- a/src/screens/qrcode.py +++ b/src/screens/qrcode.py @@ -47,8 +47,6 @@ # pylint: disable=no-name-in-module from kivy.graphics.texture import Texture -from kivy.uix.label import Label -from kivy.uix.screenmanager import Screen from kivy.properties import ( StringProperty, NumericProperty, @@ -59,10 +57,10 @@ ################# # Local libraries ################# -from utils.log import logger +from screens.actioner import ActionerScreen - -class QRCodeScreen(Screen): +# pylint: disable=too-many-instance-attributes +class QRCodeScreen(ActionerScreen): """ Class responsible to display qrcodes. @@ -112,12 +110,6 @@ class QRCodeScreen(Screen): defined at :class:`~qrcode.QRCode` """ - fill_color = ListProperty((1, 1, 1, 1)) - """ - :data:`background_color` is a tuple describing the color of background - defined at :class:`~qrcode.QRCode` - """ - loading_image = StringProperty("data/images/image-loading.gif") """ Intermediate image to be displayed while the widget ios being loaded. @@ -132,32 +124,11 @@ class QRCodeScreen(Screen): to set the default position on Screen """ - label_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.125}) - """ - :data:`label_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, - to set the default position on Screen - """ - - warn_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.9}) - """ - :data:`warn_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, - to set the default position on Screen - """ - def __init__(self, **kwargs): super().__init__(**kwargs) - self._label_warn = None - self._label_desc = None self._qrcode = None self._qrtexture = None self._img = None - self._keyboard = Window.request_keyboard(self._keyboard_closed, self, "text") - if self._keyboard.widget: - logger("WARNING", "QRCodeScreen: This widget is a VKeyboard object") - # which you can use - # to change the keyboard layout. - passss - self._keyboard.bind(on_key_down=self._on_keyboard_down) def on_pre_enter(self, *args): """ @@ -187,56 +158,43 @@ def set_image(self): ) self.add_widget(self._img) - logger("INFO", "QRCodeScreen: added") + self.log.info("QRCodeScreen: added") def set_label_warn(self): """ Sets and add Label Widget that warn user about the what to do on QRCodeScreen """ - self._label_warn = Label( - text="\n".join( + self._label_warn = self._make_label_warn( + "\n".join( [ "[b]To sign this file with Krux:[/b]", "", " (a) load a 12/24 words key, with or without BIP39 password;", " (b) use the Sign -> Message feature;", " (c) scan this QR code below;", - " (d) click on screen or type one of 'esc|backspace|enter|left' keys to proceed.", + " (d) click on screen or type one of " + + "'esc|backspace|enter|left' keys to proceed.", ] ), - font_size=Window.height // 35, - font_name="terminus.ttf", - halign="center", - color=self.fill_color, - markup=True, - pos_hint=self.warn_pos_hint, ) self.add_widget(self._label_warn) - logger("INFO", "QRCodeScreen: added") + self.log.info("QRCodeScreen: added") def set_label_desc(self): """ Sets and add Label Widget that describe the qrcode's data to QRCodeScreen """ - self._label_desc = Label( - text=self.text, - font_size=Window.height // 35, - font_name="terminus.ttf", - halign="center", - color=self.fill_color, - markup=True, - pos_hint=self.label_pos_hint, - ) + self._label_desc = self._make_label_desc(self.text) self.add_widget(self._label_desc) - logger("INFO", "QRCodeScreen: added") + self.log.info("QRCodeScreen: added") def generate_qrcode(self): """ Setup QRCode """ - logger("INFO", "QRCodeScreen: Creating") + self.log("QRCodeScreen: Creating") self._qrcode = QRCode( version=self.version, error_correction=self.ecc, @@ -244,13 +202,14 @@ def generate_qrcode(self): border=self.border_size, ) self._qrcode.add_data(self.code) - logger("DEBUG", "QRCodeScreen: data added") + self.log("QRCodeScreen: data added") self._qrcode.make(fit=True) self._update_texture() - def _create_texture(self, k, dt): - logger("DEBUG", "QRCodeScreen: creating") + # pylint: disable=unused-argument + def _create_texture(self, k, delta): + self.log.info("QRCodeScreen: creating") self._qrtexture = Texture.create(size=(k, k), colorfmt="rgb") # don't interpolate texture self._qrtexture.min_filter = "nearest" @@ -259,11 +218,11 @@ def _create_texture(self, k, dt): def _update_texture(self): matrix = self._qrcode.get_matrix() k = len(matrix) - logger("DEBUG", f"QRCodeScreen: ={k}") + self.log.info("QRCodeScreen: =%s", k) # create the texture in main UI thread otherwise # this will lead to memory corruption - logger("DEBUG", "QRCodeScreen: in mainUI Thread") + self.log.info("QRCodeScreen: in mainUI Thread") Clock.schedule_once(partial(self._create_texture, k), -1) _color = self.fill_color[:] @@ -279,14 +238,14 @@ def _update_texture(self): # join not necessary when using a byte array # buff =''.join(map(chr, buff)) # update texture in UI thread. - logger("DEBUG", "QRCodeScreen: Blitting buffer in ") + self.log.info("QRCodeScreen: Blitting buffer in ") Clock.schedule_once(lambda dt: self._upd_texture(buff)) def _upd_texture(self, buff): texture = self._qrtexture if not texture: - logger("WARNING", "QRCodeScreen: Texture hasn't been created") + self.log.warning("QRCodeScreen: Texture hasn't been created") Clock.schedule_once(lambda dt: self._upd_texture(buff)) return @@ -295,36 +254,4 @@ def _upd_texture(self, buff): self._img.anim_delay = -1 self._img.texture = texture self._img.canvas.ask_update() - logger("DEBUG", "QRCodeScreen: updated") - - def _back_to_signscreen(self): - """ - Back to SignScreen - """ - logger("DEBUG", "QRCodeScreen: Redirecting to ") - self.manager.transition.direction = "right" - self.manager.current = "sign" - - def _keyboard_closed(self): - logger("WARNING", "QRCodeScreen: keyboard have been closed") - self._keyboard.unbind(on_key_down=self._on_keyboard_down) - self._keyboard = None - - def _on_keyboard_down(self, keyboard, keycode, text, modifiers): - # Keycode is composed of an integer + a string - # If we hit escape, release the keyboard - if keycode[1] == "escape": - self._back_to_signscreen() - - elif keycode[1] == "enter": - self._back_to_signscreen() - - elif keycode[1] == "left": - self._back_to_signscreen() - - elif keycode[1] == "backspace": - self._back_to_signscreen() - else: - logger("WARNING", f"QRCodeScreen: key '{keycode[1]}' not implemented") - - return True + self.log.info("QRCodeScreen: updated") diff --git a/src/screens/scan.py b/src/screens/scan.py index a9a6b93..8acf46b 100644 --- a/src/screens/scan.py +++ b/src/screens/scan.py @@ -31,39 +31,19 @@ ################ from kivy.clock import Clock from kivy.core.window import Window -from kivy.uix.label import Label from kivy.uix.boxlayout import BoxLayout -from kivy.uix.screenmanager import Screen -from kivy.properties import ( - StringProperty, - NumericProperty, - ListProperty, - ObjectProperty, -) +from kivy.properties import ObjectProperty from kivy_garden.zbarcam import ZBarCam -from pyzbar.pyzbar import ZBarSymbol ################# # Local libraries ################# -from utils.log import logger +from screens.actioner import ActionerScreen -class ScanScreen(Screen): +class ScanScreen(ActionerScreen): """ - Class responsible to scan qrcodes. - """ - - fill_color = ListProperty((1, 1, 1, 1)) - """ - :data:`background_color` is a tuple describing the color of background - defined at :class:`~qrcode.QRCode` - """ - - label_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.125}) - """ - :data:`label_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, - to set the default position on Screen + Class to implement a scanner widget """ zbar_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.5}) @@ -72,28 +52,16 @@ class ScanScreen(Screen): to set the default position on Screen """ - warn_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 1}) - """ - :data:`warn_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, - to set the default position on Screen - """ - def __init__(self, **kwargs): super().__init__(**kwargs) # Widgets - self._label_warn = None - self._label_desc = None self._box_layout = None self._zbarcam = None - # Keyboard bindings for close ScanScreen self._keyboard = Window.request_keyboard(self._keyboard_closed, self, "text") if self._keyboard.widget: - logger("WARNING", "QRCodeScreen: This widget is a VKeyboard object") - # which you can use - # to change the keyboard layout. - pass + self.log.warning("QRCodeScreen: This widget is a VKeyboard object") self._keyboard.bind(on_key_down=self._on_keyboard_down) def on_pre_enter(self, *args): @@ -112,7 +80,7 @@ def set_box_layout(self): """ self._box_layout = BoxLayout(orientation="vertical") self.add_widget(self._box_layout) - logger("DEBUG", "ScanScreen: added") + self.log.info("ScanScreen: added") def set_label_warn(self): """ @@ -123,28 +91,21 @@ def set_label_warn(self): text = "\n".join( [ "(a) Scan the signed message;", - "(b) click on scren or press one of 'esc|enter|backspace|left button' to proceed", + "(b) click on scren or press one of "+ + "'esc|enter|backspace|left button' to proceed", ] ) elif self.manager.current == "scan-import-save-public-key": text = "\n".join( [ "(a) Scan the hexadecimal public key;", - "(b) click on scren or press one of 'esc|enter|backspace|left button' to proceed", + "(b) click on scren or press one of "+ + "'esc|enter|backspace|left button' to proceed", ] ) - else: - raise Exception(f"Invalid screen: {self.manager.current}") - - self._label_warn = Label( - text=text, - font_size=Window.height // 35, - font_name="terminus.ttf", - halign="center", - color=self.fill_color, - markup=True, - ) - logger("INFO", "ScanScreen: added to ") + + self._label_warn = self._make_label_warn(text) + self.log.info("ScanScreen: added to ") self._box_layout.add_widget(self._label_warn) def set_zbarcam(self): @@ -154,7 +115,7 @@ def set_zbarcam(self): """ self._zbarcam = ZBarCam() self._box_layout.add_widget(self._zbarcam) - logger("INFO", "ScanScreen: added to ") + self.log.info("ScanScreen: added to ") Clock.schedule_interval(self._decode_qrcode, 1) def set_label_desc(self): @@ -167,78 +128,28 @@ def set_label_desc(self): text = ("Signed message: ",) elif self.manager.current == "scan-import-save-public-key": text = "Public key: " - else: - raise Exception(f"Invalid screen: {self.manager.current}") - - self._label_desc = Label( - text=text, - font_size=Window.height // 50, - font_name="terminus.ttf", - halign="center", - color=self.fill_color, - markup=True, - pos_hint=self.label_pos_hint, - ) - self._box_layout.add_widget(self._label_desc) - logger("INFO", "ScanScreen: added to ") - - def _back_to_signscreen(self): - """ - Back to SignScreen - """ - logger("DEBUG", "ScanScreen: Redirecting to ") - self.manager.transition.direction = "left" - self.manager.current = "sign" - - def _keyboard_closed(self): - logger("WARNING", "ScanScreen: keyboard have been closed") - self._keyboard.unbind(on_key_down=self._on_keyboard_down) - self._keyboard = None - - def _on_keyboard_down(self, keyboard, keycode, text, modifiers): - # Keycode is composed of an integer + a string - # If we hit escape, release the keyboard - if keycode[1] == "escape": - self._back_to_signscreen() - - elif keycode[1] == "enter": - self._back_to_signscreen() - elif keycode[1] == "left": - self._back_to_signscreen() - - elif keycode[1] == "backspace": - self._back_to_signscreen() - else: - logger("WARNING", f"ScanScreen: key '{keycode[1]}' not implemented") - - return True - - @staticmethod - def _chunk_str(msg, size): - """ - Split a big string in multiple lines; - Use with sha256 or signature strings. - """ - if not msg: - return "None" - else: - return "\n".join([msg[i : i + size] for i in range(0, len(msg), size)]) + self._label_desc = self._make_label_desc(text) + self._box_layout.add_widget(self._label_desc) + self.log.info("ScanScreen: added to ") + # pylint: disable=unused-argument def _decode_qrcode(self, *args): """ When camera capture the QRCode, :data:`zbarcam.symbols` will be filled; When it occurs, stop scanning - @see https://stackoverflow.com/questions/73067952/kivy-load-camera-zbarscan-on-click-button/73077097#73077097 + @see https://stackoverflow.com/questions/ + 73067952/kivy-load-camera-zbarscan-on-click-button/73077097#73077097 """ - logger("DEBUG", "ScanScreen: waiting for qrcode") + self.log.info("ScanScreen: waiting for qrcode") if len(self._zbarcam.symbols) > 0: scanned_data = self._zbarcam.symbols[0].data.decode("UTF-8") self._label_desc += ScanScreen._chunk_str(scanned_data, 12) - logger("DEBUG", f"ScanScreen: captured '{scanned_data}'") + self.log.debug("ScanScreen: captured '%s'", scanned_data) Clock.unschedule(self._decode_qrcode, 1) self._zbarcam.stop() # stop zbarcam + # pylint: disable=protected-access self._zbarcam.ids["xcamera"]._camera._device.release() diff --git a/src/screens/sign.py b/src/screens/sign.py index b998999..4b21282 100644 --- a/src/screens/sign.py +++ b/src/screens/sign.py @@ -36,8 +36,8 @@ ################# # Local libraries ################# -from utils.log import logger -from utils.hash import open_and_hash_file +from utils.log import build_logger +from cli.signer import Signer from filechooser import LoadDialog @@ -66,6 +66,8 @@ def __init__(self, **kwargs): self.file_input = StringProperty("") self.file_content = StringProperty("") self.file_hash = StringProperty("") + self.loglevel = kwargs.get("loglevel") + self.log = build_logger(__name__, self.loglevel) def on_press_sign_screen_load_file_and_export_hash_qrcode(self): """ @@ -74,8 +76,7 @@ def on_press_sign_screen_load_file_and_export_hash_qrcode(self): - change background color of button to (.5,.5,.5,.5), giving a visual effect of 'pressed' """ - logger( - "DEBUG", + self.log.info( "SignScreen: clicked", ) self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = ( @@ -93,8 +94,7 @@ def on_release_sign_screen_load_file_and_export_hash_qrcode(self): giving a visual effect of 'unpressed' - open the FileChooser popup """ - logger( - "DEBUG", + self.log.info( "SignScreen: released", ) self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = ( @@ -104,7 +104,7 @@ def on_release_sign_screen_load_file_and_export_hash_qrcode(self): 0, ) - logger("DEBUG", "SignScreen: opening") + self.log.info("SignScreen: opening") self._popup.open() def on_press_sign_screen_import_and_save_signature(self): @@ -114,8 +114,7 @@ def on_press_sign_screen_import_and_save_signature(self): - change background color of button to (.5,.5,.5,.5), giving a visual effect of 'pressed' """ - logger( - "DEBUG", + self.log.info( "SignScreen: pressed", ) self.ids.sign_screen_import_and_save_signature.background_color = ( @@ -133,8 +132,7 @@ def on_release_sign_screen_import_and_save_signature(self): giving a visual effect of 'pressed' - go to ScanScreen """ - logger( - "DEBUG", + self.log.info( "SignScreen: released", ) self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = ( @@ -143,7 +141,6 @@ def on_release_sign_screen_import_and_save_signature(self): 0, 0, ) - self self.manager.transition.direction = "right" self.manager.current = "scan-import-save-signature" @@ -154,8 +151,7 @@ def on_press_sign_screen_import_and_save_public_key(self): - change background color of button to (.5,.5,.5,.5), giving a visual effect of 'pressed' """ - logger( - "DEBUG", + self.log.info( "SignScreen: pressed", ) self.ids.sign_screen_import_and_save_public_key.background_color = ( @@ -173,8 +169,7 @@ def on_release_sign_screen_import_and_save_public_key(self): giving a visual effect of 'pressed' - go to ScanScreen """ - logger( - "DEBUG", + self.log.info( "SignScreen: released", ) self.ids.sign_screen_import_and_save_public_key.background_color = ( @@ -183,7 +178,6 @@ def on_release_sign_screen_import_and_save_public_key(self): 0, 0, ) - self self.manager.transition.direction = "right" self.manager.current = "scan-import-save-signature" @@ -194,7 +188,7 @@ def on_press_back_main(self): - change background color of button to (.5,.5,.5,.5), giving a visual effect of 'pressed' """ - logger("DEBUG", "SignScreen: pressed") + self.log.info("SignScreen: pressed") self.ids.sign_screen_back.background_color = (0.5, 0.5, 0.5, 0.5) def on_release_back_main(self): @@ -205,7 +199,7 @@ def on_release_back_main(self): giving a visual effect of 'pressed' - go back to MainScreen """ - logger("DEBUG", "SignScreen: released") + self.log.info("SignScreen: released") self.ids.sign_screen_back.background_color = (0, 0, 0, 0) self.manager.transition.direction = "right" self.manager.current = "main" @@ -218,18 +212,27 @@ def on_submit_file(self, *args): a given file and redirect to QRCodeScreen """ self.file_input = args[1][0] - logger("DEBUG", f"SignScreen: loading {self.file_input}") - - self.file_hash = open_and_hash_file(path=self.file_input, verbose=True) + self.log.info("SignScreen: loading %s", self.file_input) + + # Use cli.signer module + # to implement signature on GUI + signer = Signer( + file=self.file_input, + owner=self.file_input, + uncompressed=False, + loglevel=self.loglevel + ) + self.file_hash = signer.hash_file() + signer.save_hash_file(self.file_hash) - logger("DEBUG", "SignScreen: closed") + self.log.info("SignScreen: closed") self._popup.dismiss() - logger("DEBUG", "SignScreen: Caching filename and hash to ") + self.log.info("SignScreen: Caching filename and hash to ") qrcodescreen = self.manager.get_screen("qrcode") qrcodescreen.text = f"[b]{self.file_input}[/b]\n\n[b]{self.file_hash}[/b]" qrcodescreen.code = self.file_hash - logger("DEBUG", "SignScreen: Redirecting to ") + self.log.info("SignScreen: Redirecting to ") self.manager.transition.direction = "left" self.manager.current = "qrcode" diff --git a/src/screens/verify.py b/src/screens/verify.py index 78bcda9..137ab02 100644 --- a/src/screens/verify.py +++ b/src/screens/verify.py @@ -34,8 +34,7 @@ ################# # Local libraries ################# -from utils.log import logger - +from utils.log import build_logger class VerifyScreen(Screen): """ @@ -50,6 +49,11 @@ class VerifyScreen(Screen): - Verify signature """ + def __init__(self, **kwargs): + self.loglevel = kwargs.pop("loglevel") + super().__init__(**kwargs) + self.log = build_logger(__name__, self.loglevel) + def on_press_verify_screen_load_file_button(self): """ on_press_verify_screen_load_file_button @@ -57,7 +61,7 @@ def on_press_verify_screen_load_file_button(self): - change background color of button to (.5,.5,.5,.5), giving a visual effect of 'pressed' """ - logger("INFO", " clicked") + self.log.info(" clicked") self.ids.verify_screen_load_file_button.background_color = (0.5, 0.5, 0.5, 0.5) def on_release_verify_screen_load_file_button(self): @@ -68,5 +72,5 @@ def on_release_verify_screen_load_file_button(self): giving a visual effect of 'unpressed' - make a screen transition to SignScreen """ - logger("INFO", " released") + self.log.info(" released") self.ids.verify_screen_load_file_button.background_color = (0, 0, 0, 0) diff --git a/src/constants.py b/src/utils/constants.py similarity index 100% rename from src/constants.py rename to src/utils/constants.py diff --git a/src/utils/hash.py b/src/utils/hash.py deleted file mode 100644 index 76837cf..0000000 --- a/src/utils/hash.py +++ /dev/null @@ -1,24 +0,0 @@ -""" -hashutils.py - -Utility for create and save -files in sha256sum format -""" -#################### -# Standard libraries -#################### -import logging -import hashlib - -def open_and_hash_file(**kwargs) -> str: - """ " - Read file from --file argument on `sign` command and return its hash - - Kwargs: - :param path - The path of file to be hashed - :param verbose - Apply verbose or not - """ - __filename__ = kwargs.get("path") - diff --git a/src/utils/log.py b/src/utils/log.py index 61037f6..bc50033 100644 --- a/src/utils/log.py +++ b/src/utils/log.py @@ -7,6 +7,7 @@ import sys import time + # pylint: disable=too-few-public-methods class Colors: """ @@ -76,19 +77,19 @@ def log(level: int) -> str: ------- *str*: The formated color with level name """ - if level == DEBUG: + if level == logging.DEBUG: return f"{Colors.BOLD}{Colors.BLUE}DEBUG{Colors.END}" - if level == INFO: + if level == logging.INFO: return f"{Colors.BOLD}{Colors.GREEN}INFO{Colors.END}" - if level == WARNING: + if level == logging.WARNING: return f"{Colors.BOLD}{Colors.YELLOW}WARNING{Colors.END}" - if level == ERROR: + if level == logging.ERROR: return f"{Colors.BOLD}{Colors.BROWN}ERROR{Colors.END}" - if level == CRITICAL: + if level == logging.CRITICAL: return f"{Colors.BOLD}{Colors.RED}CRITICAL{Colors.END}" @@ -110,16 +111,16 @@ def build_logger(name: str, level: str): # Setup logger numeric_level = getattr(logging, level.upper(), None) if not isinstance(numeric_level, int): - raise ValueError('Invalid log level: %s' % loglevel) + raise ValueError(f"Invalid log level: {numeric_level}") - log_format = logging.Formatter('[%(levelname)s] [%(asctime)s] - %(message)s') - log = logging.getLogger(name) - log.setLevel(numeric_level) + log_format = logging.Formatter("[%(levelname)s] [%(asctime)s] - %(message)s") + log = logging.getLogger(name) + log.setLevel(numeric_level) - # writing to stdout - handler = logging.StreamHandler(sys.stdout) - handler.setLevel(numeric_level) - handler.setFormatter(log_format) + # writing to stdout + handler = logging.StreamHandler(sys.stdout) + handler.setLevel(numeric_level) + handler.setFormatter(log_format) log.addHandler(handler) - return log \ No newline at end of file + return log diff --git a/src/utils/pem.py b/src/utils/pem.py deleted file mode 100644 index a3d32f8..0000000 --- a/src/utils/pem.py +++ /dev/null @@ -1,44 +0,0 @@ -""" -pemutils.py - -Utility for create public key certificates (aka .pem files), -in uncompressed or compressed formats - -@see src/constants.py::KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND -@see src/constants.py::KSIGNER_COMPRESSED_PUBKEY_PREPEND -""" - -#################### -# Stardard libraries -#################### -import base64 - -################# -# Local libraries -################# -from constants import KSIGNER_COMPRESSED_PUBKEY_PREPEND -from constants import KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND - - -def create_public_key_certificate(**kwargs): - """ - Create public key certifficate file (.pem) - - Kwargs: - :param pubkey - The generated public key - :param uncompressed - Flag to create a uncompressed public key certificate - :param owner - Owner of public key certificate - :is_normalized - Apply or not normalization on image - :issubclass_gray_scale - Apply or not gray scale on image - :param verbose - Apply verbose or not - """ - hex_pubkey = kwargs.get("pubkey") - uncompressed = kwargs.get("uncompressed") - owner = kwargs.get("owner") - diff --git a/src/utils/signandverify.py b/src/utils/signandverify.py deleted file mode 100644 index e8e337f..0000000 --- a/src/utils/signandverify.py +++ /dev/null @@ -1,94 +0,0 @@ -# The MIT License (MIT) - -# Copyright (c) 2021-2023 Krux contributors - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. - -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -""" -signandverify.py - -functions that use openssl as a wrapper -to verify signatures - -TODO: replace for pyca/cryptography or pyOpenSSL -""" -#################### -# Standart libraries -#################### -import subprocess - - -def verify_openssl_command(**kwargs) -> str: - """ - Create the properly openssl command - to verify, for given: - - - A `signature` to verify the `file` agains `pubkey` - - Kwargs: - :param file - The `file` to be verified - :param pubkey - The `pubkey` file path to certifacate - :param signature - The `signature` to verify the `file` - against its `signature` - """ - file2verify = kwargs.get("file") - pubkey = kwargs.get("pubkey") - sig = kwargs.get("signature") - - return " ".join( - [ - f"openssl sha256 <{file2verify} -binary", - "|", - f"openssl pkeyutl -verify -pubin -inkey {pubkey}", - f"-sigfile {sig}", - ] - ) - - -def verify_file(**kwargs): - """ - Uses openssl to verify the signature and public key - - Kwargs: - :param filename - The path of file to be veryfied - :param pubkey - The path of file that be used to verify `filename` - :param sigfile - The path of signature file that will be used to verify `filename` - :param verbose - Apply verbose or no - - """ - - file2verify = kwargs.get("filename") - pubkey_file = kwargs.get("pubkey") - sig_file = kwargs.get("sigfile") - - try: - __command__ = verify_openssl_command( - file=file2verify, pubkey=pubkey_file, signature=sig_file - ) - subprocess.run(__command__, check=True, shell=True) - except subprocess.CalledProcessError as __exc__: - raise subprocess.CalledProcessError( - "Invalid command", cmd=__command__ - ) from __exc__ diff --git a/src/utils/video.py b/src/utils/video.py deleted file mode 100644 index 53c4a0b..0000000 --- a/src/utils/video.py +++ /dev/null @@ -1,105 +0,0 @@ -""" -scanner.py - -some video utilities to scan qrcodes. -""" -#################### -# Standard libraries -#################### -import base64 -import logging - -####################### -# Thrid party libraries -####################### -import cv2 - -################# -# Local libraries -################# -from utils.log import now -from utils.log import build_logger - -class Scanner: - """ - Scanner is the cli utility to scan - Signature and PublicKey - """ - def __init__(self, **kwargs): - loglevel = kwargs.get('loglevel') - self.log = build_logger(__name__, loglevel) - - def _scan(self) -> str: - """ - Opens a scan window and uses cv2 to detect - and decode a QR code, returning its data. - Can be applyed some normalization - or gray scale - """ - self.log.debug('Starting OpenCV capture') - vid = cv2.VideoCapture(0) - - self.log.debug('Starting OpenSV QRCode detector') - detector = cv2.QRCodeDetector() - - qr_data = None - - while True: - # Capture the video frame by frame - # use some dummy vars (__+[a-zA-Z0-9]*?$) - # to avoid the W0612 'Unused variable' pylint message - self.log.debug('Waiting for data...') - - _ret, frame = vid.read() - - # delattrtect qrcode - qr_data, _bbox, _straight_qrcode = detector.detectAndDecode(frame) - - # Verify null data - if len(qr_data) > 0: - self.log.debug('QRCode detected') - break - - # Display the resulting frame - cv2.imshow("frame", frame) - - # the 'q' button is set as the - # quitting button you may use any - # desired button of your choice - if cv2.waitKey(1) & 0xFF == ord("q"): - self.log.debug("Key 'q' pressed: exiting") - break - - self.log.debug('Releasing video') - vid.release() - - self.log.debug('Destroying video window') - cv2.destroyAllWindows() - - return qr_data - - def scan_signature(): - """ - Scan with camera the generated signatue - """ - - _ = input(f"Press enter to scan signature") - signature = self.scan() - - # Encode data - self.log.debug('Encoding signature') - data = str.encode(signature) - - self.log.debug(f'Signature (data={data})') - return data - - - def scan_public_key(**kwargs) -> str: - """ - Scan with camera the generated public key - """ - _ = input(f"[{now()}] Press enter to scan public key") - public_key = self.scan() - - self.log.debug(f'Public Key (data={public_key})') - return public_key From 74012307b31fbfd62c1b843e62af6d564db53b17 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Mon, 23 Oct 2023 08:58:56 -0300 Subject: [PATCH 036/104] Updated README with informations about zbar dependencies --- README.md | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1f680c5..63820d6 100644 --- a/README.md +++ b/README.md @@ -38,14 +38,47 @@ managed by [poetry](https://python-poetry.org/) #### Install poetry and dependencies +Install [python-poetry](https://python-poetry.org/docs/) + +*Linux*: + +- pip: `pip install poetry` +- debian-like: `sudo apt-get -y install python3-poetry` +- archlinux-like: `sudo pacman -S python-poetry` +- fedora: `sudo dnf -y install poetry` + +*MacOS* (TODO) +*Windows* (TODO) + +##### Install pyzbar dependency + +Before proceed you will need to install a dependency for pyzbar; in linux +it's `libzbar0` (see [this](https://stackoverflow.com/questions/63217735/import-pyzbar-pyzbar-unable-to-find-zbar-shared-library#63223900)): + +*Linux*: + +- debian-like: `sudo apt-get install -y libzbar0` +- archlinux-like: `sudo pacman -S zbar` +- fedora: `sudo dnf -y install zbar-libs` + +*MacOS* + ```bash -pip install poetry -poetry install +mkdir ~/lib +ln -s $(brew --prefix zbar)/lib/libzbar.dylib ~/lib/libzbar.dylib ``` +*Windows* (TODO) + +#### Install poetry dependencies + This will also install all development tools so that you can run pylint, format code with black, and build an agnostic OS executable. +```bash +poetry install +``` + #### Update lock file if already has one Use this everytime you want to add a dependency. From ac55c64997cb7e898e52fc2507829c08b7eaf4ba Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Mon, 23 Oct 2023 13:22:11 -0300 Subject: [PATCH 037/104] added a superclass LoggedScreen --- src/ksigner-gui.py | 34 ++++++++++---------------- src/screens/actioner.py | 10 +++----- src/screens/logscreen.py | 52 ++++++++++++++++++++++++++++++++++++++++ src/screens/main.py | 16 +++---------- src/screens/qrcode.py | 4 ++-- src/screens/sign.py | 7 ++---- src/screens/verify.py | 17 +++---------- src/utils/log.py | 2 +- 8 files changed, 78 insertions(+), 64 deletions(-) create mode 100644 src/screens/logscreen.py diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index 5c44ecf..b141a45 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -60,32 +60,22 @@ def build(self): - TODO: others """ loglevel = "debug" - logger = build_logger(__name__, loglevel) - logger.debug("KSignerApp: Creating ScreenManager") screen_manager = ScreenManager() - - logger.debug("KsignerApp: Adding ") - screen_manager.add_widget(MainScreen(name="main", loglevel=loglevel)) - - logger.debug("KsignerApp: Adding ") - screen_manager.add_widget(SignScreen(name="sign")) - - logger.debug("KsignerApp: Adding ") - screen_manager.add_widget(VerifyScreen(name="verify")) - - logger.debug("KsignerApp: Adding ") - screen_manager.add_widget(QRCodeScreen(name="qrcode")) - - logger.debug("KsignerApp: Adding ") - screen_manager.add_widget(ScanScreen(name="scan-import-save-signature")) - - logger.debug("KsignerApp: Adding ") - screen_manager.add_widget(ScanScreen(name="scan-import-save-public-key")) - + screens = ( + MainScreen(name="main", loglevel=loglevel), + SignScreen(name="sign", loglevel=loglevel), + VerifyScreen(name="verify", loglevel=loglevel), + QRCodeScreen(name="qrcode", loglevel=loglevel), + ScanScreen(name="scan-import-save-signature", loglevel=loglevel), + ScanScreen(name="scan-import-save-public-key", loglevel=loglevel) + ) + + for i in range(len(screens)): + screen_manager.add_widget(screens[i]) + return screen_manager - if __name__ == "__main__": app = KSignerApp() app.run() diff --git a/src/screens/actioner.py b/src/screens/actioner.py index 5f767a2..07c8003 100644 --- a/src/screens/actioner.py +++ b/src/screens/actioner.py @@ -31,16 +31,14 @@ ################ from kivy.core.window import Window from kivy.uix.label import Label -from kivy.uix.screenmanager import Screen from kivy.properties import ListProperty, ObjectProperty ################# # Local libraries ################# -from utils.log import build_logger +from screens.logscreen import LoggedScreen - -class ActionerScreen(Screen): +class ActionerScreen(LoggedScreen): """ Class responsible to scan qrcodes. """ @@ -64,14 +62,12 @@ class ActionerScreen(Screen): """ def __init__(self, **kwargs): - self.loglevel = kwargs.pop("loglevel") super().__init__(**kwargs) # Widgets self._label_warn = None self._label_desc = None - self.loglevel = kwargs.get("loglevel") - self.log = build_logger(__name__, self.loglevel) + # Keyboard bindings for close ScanScreen self._keyboard = Window.request_keyboard(self._keyboard_closed, self, "text") if self._keyboard.widget: diff --git a/src/screens/logscreen.py b/src/screens/logscreen.py new file mode 100644 index 0000000..a4fc1d9 --- /dev/null +++ b/src/screens/logscreen.py @@ -0,0 +1,52 @@ + +# The MIT License (MIT) + +# Copyright (c) 2021-2023 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +""" +logscreen.py + +Implements an inherited kivy.uix.screenmanager.Screen +with inner logger. Use it as super class +""" + +####################### +# Third party libraries +####################### +from kivy.uix.screenmanager import Screen + +################# +# Local libraries +################# +from utils.log import build_logger + + +class LoggedScreen(Screen): + """ + MainScreen + + Class to manage :mod:`screens` :class:`screens.SignScreen` and + :class:`screens.VerifyScreen`. + """ + + def __init__(self, **kwargs): + self.loglevel = kwargs.pop("loglevel") + super().__init__(**kwargs) + self.log = build_logger(__name__, self.loglevel) diff --git a/src/screens/main.py b/src/screens/main.py index 45e0435..2d59339 100644 --- a/src/screens/main.py +++ b/src/screens/main.py @@ -22,21 +22,16 @@ """ mainscreen.py -Implements an inherited kivy.uix.screenmanager.Screen +Implements an inherited screens.logscreen.LoggedScreen """ -####################### -# Third party libraries -####################### -from kivy.uix.screenmanager import Screen - ################# # Local libraries ################# -from utils.log import build_logger +from screens.logscreen import LoggedScreen -class MainScreen(Screen): +class MainScreen(LoggedScreen): """ MainScreen @@ -44,11 +39,6 @@ class MainScreen(Screen): :class:`screens.VerifyScreen`. """ - def __init__(self, **kwargs): - super().__init__(**kwargs) - self.loglevel = kwargs.get("loglevel") - self.log = build_logger(__name__, self.loglevel) - def on_press_sign_button(self): """ on_press_sign_button diff --git a/src/screens/qrcode.py b/src/screens/qrcode.py index 83b1fce..cfac1dc 100644 --- a/src/screens/qrcode.py +++ b/src/screens/qrcode.py @@ -194,7 +194,7 @@ def generate_qrcode(self): """ Setup QRCode """ - self.log("QRCodeScreen: Creating") + self.log.info("QRCodeScreen: Creating") self._qrcode = QRCode( version=self.version, error_correction=self.ecc, @@ -202,7 +202,7 @@ def generate_qrcode(self): border=self.border_size, ) self._qrcode.add_data(self.code) - self.log("QRCodeScreen: data added") + self.log.info("QRCodeScreen: data added") self._qrcode.make(fit=True) self._update_texture() diff --git a/src/screens/sign.py b/src/screens/sign.py index 4b21282..10ec133 100644 --- a/src/screens/sign.py +++ b/src/screens/sign.py @@ -27,7 +27,6 @@ ##################### # Thirparty libraries ##################### -from kivy.uix.screenmanager import Screen from kivy.uix.popup import Popup # pylint: disable=no-name-in-module @@ -36,12 +35,12 @@ ################# # Local libraries ################# -from utils.log import build_logger +from screens.logscreen import LoggedScreen from cli.signer import Signer from filechooser import LoadDialog -class SignScreen(Screen): +class SignScreen(LoggedScreen): """ SignScreen @@ -66,8 +65,6 @@ def __init__(self, **kwargs): self.file_input = StringProperty("") self.file_content = StringProperty("") self.file_hash = StringProperty("") - self.loglevel = kwargs.get("loglevel") - self.log = build_logger(__name__, self.loglevel) def on_press_sign_screen_load_file_and_export_hash_qrcode(self): """ diff --git a/src/screens/verify.py b/src/screens/verify.py index 137ab02..f4a08e6 100644 --- a/src/screens/verify.py +++ b/src/screens/verify.py @@ -25,18 +25,12 @@ Implements an inherited kivy.uix.screenmanager.Screen for verify signature options """ - -###################### -# Thirdparty libraries -###################### -from kivy.uix.screenmanager import Screen - ################# # Local libraries ################# -from utils.log import build_logger +from screens.logscreen import LoggedScreen -class VerifyScreen(Screen): +class VerifyScreen(LoggedScreen): """ VerifyScreen @@ -48,12 +42,7 @@ class VerifyScreen(Screen): - Load publickey - Verify signature """ - - def __init__(self, **kwargs): - self.loglevel = kwargs.pop("loglevel") - super().__init__(**kwargs) - self.log = build_logger(__name__, self.loglevel) - + def on_press_verify_screen_load_file_button(self): """ on_press_verify_screen_load_file_button diff --git a/src/utils/log.py b/src/utils/log.py index bc50033..b38d7de 100644 --- a/src/utils/log.py +++ b/src/utils/log.py @@ -113,7 +113,7 @@ def build_logger(name: str, level: str): if not isinstance(numeric_level, int): raise ValueError(f"Invalid log level: {numeric_level}") - log_format = logging.Formatter("[%(levelname)s] [%(asctime)s] - %(message)s") + log_format = logging.Formatter("[%(levelname)s ] [%(name)s ] - %(message)s") log = logging.getLogger(name) log.setLevel(numeric_level) From b367b994f78fd3cf2440523ea24c0a8c015c2e32 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Mon, 23 Oct 2023 17:35:21 -0300 Subject: [PATCH 038/104] fixed 'sign' command on cli --- src/cli/signer.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/cli/signer.py b/src/cli/signer.py index 59da9fa..a8ca19d 100644 --- a/src/cli/signer.py +++ b/src/cli/signer.py @@ -161,18 +161,19 @@ def make_pubkey_certificate(self): # Convert pubkey data to bytes self.log.debug("Converting public key to bytes") __public_key_data_bytes__ = bytes.fromhex(__public_key_data__) - + self.log.debug("pubkey data bytes: %s", __public_key_data_bytes__) + self.log.debug("Encoding bytes to base64 format") __public_key_data_b64__ = base64.b64encode(__public_key_data_bytes__) - + self.log.debug("encoded base64 pubkey: %s", __public_key_data_b64__) + self.log.debug("Decoding bas64 to utf8") - __public_key_data_b64__ = __public_key_data_b64__.decode("utf8") - - self.log.debug("b64 (data=%s)", __public_key_data_b64__) + __public_key_data_b64_utf8__ = __public_key_data_b64__.decode("utf8") + self.log.debug("decoded base64 utf8: %s", __public_key_data_b64_utf8__) __public_key_name__ = f"{self.owner}.pem" - with open(__public_key_name__, "wb") as pb_file: + with open(__public_key_name__, mode="w", encoding="utf-8") as pb_file: self.log.debug("Saving %s", __public_key_name__) - pb_file.write(__public_key_data_b64__) + pb_file.write(str(__public_key_data_b64_utf8__)) self.log.debug("%s saved", __public_key_name__) From f71970e6d989dc7e2c61ff727c34cfb812df4a74 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Tue, 24 Oct 2023 08:21:42 -0300 Subject: [PATCH 039/104] fixed CLI signer and verifyer --- .gitignore | 1 + src/cli/scanner.py | 6 ++---- src/cli/signer.py | 14 ++++++++++++-- src/cli/verifyer.py | 16 ++++++++-------- src/ksigner-cli.py | 11 ++++++----- 5 files changed, 29 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index af25a52..dbbaed0 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ dist *.sha256*.txt *.sig *.log +*.pem src/**/__pycache__ \ No newline at end of file diff --git a/src/cli/scanner.py b/src/cli/scanner.py index d785e49..b568508 100644 --- a/src/cli/scanner.py +++ b/src/cli/scanner.py @@ -105,10 +105,8 @@ def scan_signature(self) -> str: # Encode data self.log.debug("Encoding signature") - data = str.encode(signature) - - self.log.debug("Signature (data=%s)", data) - return data + self.log.debug("Signature (data=%s)", signature) + return signature def scan_public_key(self) -> str: """ diff --git a/src/cli/signer.py b/src/cli/signer.py index a8ca19d..e7b1a0a 100644 --- a/src/cli/signer.py +++ b/src/cli/signer.py @@ -129,10 +129,14 @@ def save_signature(self, signature): """ # Saves a signature signature_file = f"{self.file}.sig" + + # encode signature to binary format + binary_signature = base64.b64decode(signature.encode()) + self.log.debug("Saving %s", signature_file) with open(signature_file, "wb") as sig_file: - sig_file.write(signature) + sig_file.write(binary_signature) self.log.debug("Signature saved on %s", signature_file) def make_pubkey_certificate(self): @@ -171,9 +175,15 @@ def make_pubkey_certificate(self): __public_key_data_b64_utf8__ = __public_key_data_b64__.decode("utf8") self.log.debug("decoded base64 utf8: %s", __public_key_data_b64_utf8__) + formated_pubkey = "\n".join([ + "-----BEGIN PUBLIC KEY-----", + __public_key_data_b64_utf8__, + "-----END PUBLIC KEY-----" + ]) + self.log.debug("formated pubkey: %s", formated_pubkey) __public_key_name__ = f"{self.owner}.pem" with open(__public_key_name__, mode="w", encoding="utf-8") as pb_file: self.log.debug("Saving %s", __public_key_name__) - pb_file.write(str(__public_key_data_b64_utf8__)) + pb_file.write(formated_pubkey) self.log.debug("%s saved", __public_key_name__) diff --git a/src/cli/verifyer.py b/src/cli/verifyer.py index c0d8e75..d539f38 100644 --- a/src/cli/verifyer.py +++ b/src/cli/verifyer.py @@ -58,6 +58,8 @@ def make_openssl_command(self) -> str: """ Create the properly openssl command to verify """ + + self.log.debug("Verifyer: Creating openssl command") return " ".join( [ f"openssl sha256 <{self.file} -binary", @@ -65,23 +67,21 @@ def make_openssl_command(self) -> str: f"openssl pkeyutl -verify -pubin -inkey {self.pubkey}", f"-sigfile {self.signature}", ] + ) - def verify(self): + def verify(self, command): """ Uses openssl to verify the signature and public key """ try: - self.log.debug("Verifyer: Creating openssl command") - __command__ = self.make_openssl_command() - self.log.debug("Verifyer: Running '%s'", __command__) - subprocess.run(__command__, check=True, shell=True) - self.log.debug("Verifyer: verified") + self.log.debug("Verifyer: Running '%s'", command) + subprocess.run(command, check=True, shell=True) except subprocess.CalledProcessError as exc: message = "Invalid command" numeric_level = getattr(logging, self.loglevel.upper(), None) if not numeric_level == logging.NOTSET: - self.log.error("%s: %s", message, __command__) + self.log.error("%s: %s", message, command) else: - raise subprocess.CalledProcessError(message, cmd=__command__) from exc + raise subprocess.CalledProcessError(message, cmd=command) from exc \ No newline at end of file diff --git a/src/ksigner-cli.py b/src/ksigner-cli.py index 0b772e3..bcffd96 100644 --- a/src/ksigner-cli.py +++ b/src/ksigner-cli.py @@ -102,13 +102,11 @@ verifier.add_argument( "-s", "--sig-file", - dest="sig_file", help="path to signature file" ) verifier.add_argument( "-p", "--pub-file", - dest="pub_file", help="path to pubkey file" ) @@ -117,7 +115,7 @@ # parse arguments args = parser.parse_args() log = build_logger(__name__, args.loglevel) - + log.debug(args) # on --version if args.version: print(KSIGNER_VERSION) @@ -127,6 +125,8 @@ elif args.command == "sign": log.debug("Starting signer") + + # first sign signer = Signer( file=args.file, owner=args.owner, @@ -140,8 +140,9 @@ log.debug("Starting verifyer") verifyer = Verifyer( file=args.file, - pubkey=args.pub_key, + pubkey=args.pub_file, signature=args.sig_file, loglevel=args.loglevel ) - verifyer.verify() + command = verifyer.make_openssl_command() + verifyer.verify(command) From 16c5ef6a02498fad2370722f45f8c98e580388c4 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Wed, 25 Oct 2023 22:14:05 -0300 Subject: [PATCH 040/104] added subclassing of files, with more modular code added kivy.logger to cli added ActionerScreen, with abstract behaviours added getsome.info module to dynamic inspection of which class is called (useful for logs) --- src/cli/actioner.py | 64 ++++++++++++ src/cli/getsome.py | 79 ++++++++++++++ src/cli/scanner.py | 29 +++--- src/cli/signer.py | 89 ++++++++-------- src/cli/verifyer.py | 39 +++---- src/ksigner-cli.py | 43 ++------ src/ksigner-gui.py | 33 +++--- src/screens/actioner.py | 149 +++++++++++++++++++++----- src/screens/logscreen.py | 29 +++++- src/screens/main.py | 31 +++--- src/screens/qrcode.py | 5 +- src/screens/scan.py | 8 +- src/screens/sign.py | 218 +++++++++++++++++---------------------- src/screens/verify.py | 3 +- src/utils/constants.py | 16 +-- 15 files changed, 518 insertions(+), 317 deletions(-) create mode 100644 src/cli/actioner.py create mode 100644 src/cli/getsome.py diff --git a/src/cli/actioner.py b/src/cli/actioner.py new file mode 100644 index 0000000..66f294b --- /dev/null +++ b/src/cli/actioner.py @@ -0,0 +1,64 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-2023 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +""" +actioner.py + +Implements an abstract class with the kivy.logger.Logger +to be used with Signer and Verifyer +""" +#################### +# Standard libraries +#################### +import os +import inspect + +####################### +# Third party libraries +####################### +from kivy.logger import Logger, LOG_LEVELS + +################# +# Local libraries +################# +from cli.getsome import info + + +class Actioner: + + def __init__(self, **kwargs): + if (os.environ.get('LOG_LEVEL')): + self.loglevel = LOG_LEVELS[os.environ["LOG_LEVEL"]] + else: + self.loglevel = LOG_LEVELS["info"] + Logger.setLevel(self.loglevel) + + def info(self, msg): + Logger.info("%s: %s", info().strip(), msg) + + def debug(self, msg): + Logger.debug("%s: %s", info().strip(), msg) + + def warning(self, msg): + Logger.warning("%s: %s", info().strip(), msg) + + def error(msg, *args): + Logger.error("%s: %s", info().strip(), msg) diff --git a/src/cli/getsome.py b/src/cli/getsome.py new file mode 100644 index 0000000..8060a8a --- /dev/null +++ b/src/cli/getsome.py @@ -0,0 +1,79 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-2023 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +""" +getsome.py + +Check whether the calling function is really a method defined in a class +""" + +import inspect + +def info(): + """ + we can loop through the self's MRO and try to find the method that called us. + see htps://stackoverflow.com/questions/53153075/get-a-class-name-of-calling-method + """ + # get the call frame of the calling method + frame = inspect.currentframe().f_back + try: + # find the name of the first variable in the calling + # function - which is hopefully the "self" + codeobj = frame.f_code + try: + self_name = codeobj.co_varnames[0] + except IndexError: + return None + + # try to access the caller's "self" + try: + self_obj = frame.f_locals[self_name] + except KeyError: + return None + + # check if the calling function is really a method + self_type = type(self_obj) + func_name = codeobj.co_name + + # iterate through all classes in the MRO + for cls in self_type.__mro__: + # see if this class has a method with the name + # we're looking for + try: + method = vars(cls)[func_name] + except KeyError: + continue + + # unwrap the method just in case there are any decorators + try: + method = inspect.unwrap(method) + except ValueError: + pass + + # see if this is the method that called us + if getattr(method, '__code__', None) is codeobj: + return self_type.__name__ + + # if we didn't find a matching method, return None + return None + finally: + # make sure to clean up the frame at the end to avoid ref cycles + del frame diff --git a/src/cli/scanner.py b/src/cli/scanner.py index b568508..67ff410 100644 --- a/src/cli/scanner.py +++ b/src/cli/scanner.py @@ -33,19 +33,14 @@ # Local libraries ################# from utils.log import now -from utils.log import build_logger +from cli.actioner import Actioner - -class Scanner: +class Scanner(Actioner): """ Scanner is the cli utility to scan Signature and PublicKey """ - def __init__(self, **kwargs): - loglevel = kwargs.get("loglevel") - self.log = build_logger(__name__, loglevel) - def _scan(self) -> str: """ Opens a scan window and uses cv2 to detect @@ -53,10 +48,10 @@ def _scan(self) -> str: Can be applyed some normalization or gray scale """ - self.log.debug("Starting OpenCV capture") + self.debug("Starting OpenCV capture") vid = cv2.VideoCapture(0) - self.log.debug("Starting OpenSV QRCode detector") + self.debug("Starting OpenSV QRCode detector") detector = cv2.QRCodeDetector() qr_data = None @@ -65,7 +60,7 @@ def _scan(self) -> str: # Capture the video frame by frame # use some dummy vars (__+[a-zA-Z0-9]*?$) # to avoid the W0612 'Unused variable' pylint message - self.log.debug("Waiting for data...") + self.warning("Waiting for data...") _ret, frame = vid.read() @@ -74,7 +69,7 @@ def _scan(self) -> str: # Verify null data if len(qr_data) > 0: - self.log.debug("QRCode detected") + self.debug("QRCode detected") break # Display the resulting frame @@ -84,13 +79,13 @@ def _scan(self) -> str: # quitting button you may use any # desired button of your choice if cv2.waitKey(1) & 0xFF == ord("q"): - self.log.debug("Key 'q' pressed: exiting") + self.debug("Key 'q' pressed: exiting") break - self.log.debug("Releasing video") + self.debug("Releasing video") vid.release() - self.log.debug("Destroying video window") + self.debug("Destroying video window") cv2.destroyAllWindows() return qr_data @@ -104,8 +99,8 @@ def scan_signature(self) -> str: signature = self._scan() # Encode data - self.log.debug("Encoding signature") - self.log.debug("Signature (data=%s)", signature) + self.debug("Encoding signature") + self.debug("Signature (data=%s)" % signature) return signature def scan_public_key(self) -> str: @@ -115,5 +110,5 @@ def scan_public_key(self) -> str: _ = input(f"[{now()}] Press enter to scan public key") public_key = self._scan() - self.log.debug("Public Key (data={%s})", public_key) + self.debug("Public Key (data={%s})" % public_key) return public_key diff --git a/src/cli/signer.py b/src/cli/signer.py index e7b1a0a..9d69ebd 100644 --- a/src/cli/signer.py +++ b/src/cli/signer.py @@ -17,12 +17,11 @@ KSIGNER_COMPRESSED_PUBKEY_PREPEND, KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND, ) -from utils.log import build_logger from utils.qr import make_qr_code +from cli.actioner import Actioner from cli.scanner import Scanner - -class Signer: +class Signer(Actioner): """ Signer is the class that manages the `sign` command @@ -32,10 +31,7 @@ def __init__(self, **kwargs): self.file = kwargs.get("file") self.owner = kwargs.get("owner") self.uncompressed = kwargs.get("uncompressed") - - self.loglevel = kwargs.get("loglevel") - self.log = build_logger(__name__, self.loglevel) - self.scanner = Scanner(loglevel=self.loglevel) + self.scanner = Scanner() def sign(self): """ @@ -57,6 +53,7 @@ def sign(self): will generate a publickey certificate, in a compressed or uncompressed format, in name of an owner. """ + self._show_warning_messages() data = self.hash_file() self.save_hash_file(data) @@ -68,28 +65,26 @@ def _show_warning_messages(self): """ Shows warning messages before hash """ - self.log.debug("Showing warning messages to sign") + self.debug("Showing warning messages to sign") # Shows some message - print("") - print("To sign this file with Krux: ") - print(" (a) load a 12/24 words key with or without password;") - print(" (b) use the Sign->Message feature;") - print(" (c) and scan this QR code below.") - print("") + self.info("To sign this file with Krux: ") + self.info(" (a) load a 12/24 words key with or without password;") + self.info(" (b) use the Sign->Message feature;") + self.info(" (c) and scan this QR code below.") def hash_file(self) -> str: """ Creates a hash file before sign """ - self.log.debug("Opening %s", self.file) + self.debug("Opening %s" % self.file) with open(self.file, "rb") as f_sig: - self.log.debug("Reading bytes...") + self.debug("Reading bytes...") _bytes = f_sig.read() - self.log.debug("Hashing...") + self.debug("Hashing...") data = hashlib.sha256(_bytes).hexdigest() - self.log.debug("Hash (data=%s)", data) + self.debug("Hash (data=%s)" % data) return data def save_hash_file(self, data): @@ -98,20 +93,20 @@ def save_hash_file(self, data): """ # Saves a hash file __hash_file__ = f"{self.file}.sha256sum.txt" - self.log.debug("Saving %s", __hash_file__) + self.debug("Saving %s" % __hash_file__) with open(__hash_file__, mode="w", encoding="utf-8") as hash_file: content = f"{data} {self.file}" - self.log.debug("%s content (data=%s)", __hash_file__, content) + self.debug("%s content (data=%s)" % (__hash_file__, content)) hash_file.write(content) - self.log.debug("%s saved", __hash_file__) + self.debug("%s saved" % __hash_file__) def _print_qrcode(self, data): """ Print QRCode to console """ # Prints the QR code - self.log.debug("Creating QRCode (data=%s)", data) + self.debug("Creating QRCode (data=%s)" % data) __qrcode__ = make_qr_code(data=data) print(f"{__qrcode__}") @@ -120,7 +115,7 @@ def scan_sig(self): Make signature file from scanning qrcode """ # Scans the signature QR code - self.log.debug("Creating signature") + self.debug("Creating signature") return self.scanner.scan_signature() def save_signature(self, signature): @@ -132,19 +127,19 @@ def save_signature(self, signature): # encode signature to binary format binary_signature = base64.b64decode(signature.encode()) - - self.log.debug("Saving %s", signature_file) + + self.debug("Saving %s" % signature_file) with open(signature_file, "wb") as sig_file: sig_file.write(binary_signature) - self.log.debug("Signature saved on %s", signature_file) + self.debug("Signature saved on %s" % signature_file) def make_pubkey_certificate(self): """ Make public key file from scanning qrcode """ # Scans the public KeyboardInterruptardInterrupt - self.log.debug("Creating public key certificate") + self.debug("Creating public key certificate") pubkey = self.scanner.scan_public_key() # Create PEM data @@ -152,38 +147,40 @@ def make_pubkey_certificate(self): # with filename as owner's name # Choose if will be compressed or uncompressed if self.uncompressed: - self.log.debug("Make it uncompressed key") + self.debug("Make it uncompressed key") __public_key_data__ = "".join( [KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND, pubkey.upper()] ) else: - self.log.debug("Make it compressed key") + self.debug("Make it compressed key") __public_key_data__ = "".join( [KSIGNER_COMPRESSED_PUBKEY_PREPEND, pubkey.upper()] ) # Convert pubkey data to bytes - self.log.debug("Converting public key to bytes") + self.debug("Converting public key to bytes") __public_key_data_bytes__ = bytes.fromhex(__public_key_data__) - self.log.debug("pubkey data bytes: %s", __public_key_data_bytes__) - - self.log.debug("Encoding bytes to base64 format") + self.debug("pubkey data bytes: %s" % __public_key_data_bytes__) + + self.debug("Encoding bytes to base64 format") __public_key_data_b64__ = base64.b64encode(__public_key_data_bytes__) - self.log.debug("encoded base64 pubkey: %s", __public_key_data_b64__) - - self.log.debug("Decoding bas64 to utf8") + self.debug("encoded base64 pubkey: %s" % __public_key_data_b64__) + + self.debug("Decoding bas64 to utf8") __public_key_data_b64_utf8__ = __public_key_data_b64__.decode("utf8") - self.log.debug("decoded base64 utf8: %s", __public_key_data_b64_utf8__) - - formated_pubkey = "\n".join([ - "-----BEGIN PUBLIC KEY-----", - __public_key_data_b64_utf8__, - "-----END PUBLIC KEY-----" - ]) - self.log.debug("formated pubkey: %s", formated_pubkey) + self.debug("decoded base64 utf8: %s" % __public_key_data_b64_utf8__) + + formated_pubkey = "\n".join( + [ + "-----BEGIN PUBLIC KEY-----", + __public_key_data_b64_utf8__, + "-----END PUBLIC KEY-----", + ] + ) + self.debug("formated pubkey: %s" % formated_pubkey) __public_key_name__ = f"{self.owner}.pem" with open(__public_key_name__, mode="w", encoding="utf-8") as pb_file: - self.log.debug("Saving %s", __public_key_name__) + self.debug("Saving %s" % __public_key_name__) pb_file.write(formated_pubkey) - self.log.debug("%s saved", __public_key_name__) + self.debug("%s saved" % __public_key_name__) diff --git a/src/cli/verifyer.py b/src/cli/verifyer.py index d539f38..7a4879c 100644 --- a/src/cli/verifyer.py +++ b/src/cli/verifyer.py @@ -32,18 +32,17 @@ # Standart libraries #################### import subprocess -import logging ################# # Local libraries ################# -from utils.log import build_logger +from cli.actioner import Actioner -class Verifyer: +class Verifyer(Actioner): """ Verifyer is the class that manages the `verify` verify_openssl_command - with given :param:`file`, :param:`pubkey` and + with given :param:`file`, :param:`pubkey` and :param:`signature` """ @@ -51,37 +50,29 @@ def __init__(self, **kwargs): self.file = kwargs.get("file") self.pubkey = kwargs.get("pubkey") self.signature = kwargs.get("signature") - self.loglevel = kwargs.get("loglevel") - self.log = build_logger(__name__, self.loglevel) def make_openssl_command(self) -> str: """ Create the properly openssl command to verify """ - - self.log.debug("Verifyer: Creating openssl command") + + self.debug("Verifyer: Creating openssl command") return " ".join( - [ - f"openssl sha256 <{self.file} -binary", - "|", - f"openssl pkeyutl -verify -pubin -inkey {self.pubkey}", - f"-sigfile {self.signature}", - ] - - ) + [ + f"openssl sha256 <{self.file} -binary", + "|", + f"openssl pkeyutl -verify -pubin -inkey {self.pubkey}", + f"-sigfile {self.signature}", + ] + ) def verify(self, command): """ Uses openssl to verify the signature and public key """ try: - self.log.debug("Verifyer: Running '%s'", command) + self.debug("Verifyer: Running '%s'" % command) subprocess.run(command, check=True, shell=True) except subprocess.CalledProcessError as exc: - message = "Invalid command" - numeric_level = getattr(logging, self.loglevel.upper(), None) - if not numeric_level == logging.NOTSET: - self.log.error("%s: %s", message, command) - else: - raise subprocess.CalledProcessError(message, cmd=command) from exc - \ No newline at end of file + error = subprocess.CalledProcessError(message, cmd=command) + self.error("Invalid command: %s" % error) diff --git a/src/ksigner-cli.py b/src/ksigner-cli.py index bcffd96..e53671e 100644 --- a/src/ksigner-cli.py +++ b/src/ksigner-cli.py @@ -40,10 +40,7 @@ ################# # Local libraries ################# -from utils.constants import ( - KSIGNER_VERSION, - KSIGNER_CLI_DESCRIPTION -) +from utils.constants import KSIGNER_VERSION, KSIGNER_CLI_DESCRIPTION from utils.log import build_logger from cli.signer import Signer from cli.verifyer import Verifyer @@ -72,11 +69,11 @@ # Subparsers: sign and verify subparsers = parser.add_subparsers(help="sub-command help", dest="command") -# Sign command +# Sign compilemmand signer = subparsers.add_parser("sign", help="sign a file") signer.add_argument( - "-f", - "--file", + "-f", + "--file", help="path to file to sign" ) signer.add_argument( @@ -94,28 +91,15 @@ # Verify command verifier = subparsers.add_parser("verify", help="verify signature") -verifier.add_argument( - "-f", - "--file", - help="path to file to verify" -) -verifier.add_argument( - "-s", - "--sig-file", - help="path to signature file" -) -verifier.add_argument( - "-p", - "--pub-file", - help="path to pubkey file" -) +verifier.add_argument("-f", "--file", help="path to file to verify") +verifier.add_argument("-s", "--sig-file", help="path to signature file") +verifier.add_argument("-p", "--pub-file", help="path to pubkey file") if __name__ == "__main__": # parse arguments args = parser.parse_args() - log = build_logger(__name__, args.loglevel) - log.debug(args) + # on --version if args.version: print(KSIGNER_VERSION) @@ -124,25 +108,20 @@ parser.print_help() elif args.command == "sign": - log.debug("Starting signer") - # first sign signer = Signer( file=args.file, owner=args.owner, - uncompressed=args.uncompressed, - loglevel=args.loglevel, + uncompressed=args.uncompressed ) signer.sign() signer.make_pubkey_certificate() elif args.command == "verify": - log.debug("Starting verifyer") verifyer = Verifyer( file=args.file, pubkey=args.pub_file, signature=args.sig_file, - loglevel=args.loglevel ) - command = verifyer.make_openssl_command() - verifyer.verify(command) + COMMAND = verifyer.make_openssl_command() + verifyer.verify(COMMAND) diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index b141a45..648c34d 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -25,16 +25,19 @@ A simple Graphical User Interface built with kivy """ +import os + ####################### # Third party libraries ####################### from kivy.app import App +from kivy.logger import Logger from kivy.uix.screenmanager import ScreenManager ################# # Local libraries ################# -from utils.log import build_logger +from screens.logscreen import get_some_info from screens.main import MainScreen from screens.sign import SignScreen from screens.verify import VerifyScreen @@ -46,7 +49,7 @@ class KSignerApp(App): """ KSignerApp is the Root widget """ - + def build(self): """ build @@ -59,23 +62,27 @@ def build(self): - verify; - TODO: others """ - loglevel = "debug" - + Logger.info("%s: %s", get_some_info(), "Starting ksigner") screen_manager = ScreenManager() screens = ( - MainScreen(name="main", loglevel=loglevel), - SignScreen(name="sign", loglevel=loglevel), - VerifyScreen(name="verify", loglevel=loglevel), - QRCodeScreen(name="qrcode", loglevel=loglevel), - ScanScreen(name="scan-import-save-signature", loglevel=loglevel), - ScanScreen(name="scan-import-save-public-key", loglevel=loglevel) + MainScreen(name="main"), + SignScreen(name="sign"), + VerifyScreen(name="verify"), + QRCodeScreen(name="qrcode"), + ScanScreen(name="scan-import-save-signature"), + ScanScreen(name="scan-import-save-public-key"), ) - for i in range(len(screens)): - screen_manager.add_widget(screens[i]) - + for screen in screens: + Logger.debug("%s: adding screnn '%s'", get_some_info(), screen.name) + screen_manager.add_widget(screen) + return screen_manager + if __name__ == "__main__": + if os.environ.get('LOG_LEVEL') != None: + loglevel = KSignerApp() + app = KSignerApp() app.run() diff --git a/src/screens/actioner.py b/src/screens/actioner.py index 07c8003..0f22d82 100644 --- a/src/screens/actioner.py +++ b/src/screens/actioner.py @@ -25,10 +25,12 @@ Implements an inherited kivy.uix.screenmanager.Screen to be subclassed on qrcody.py and scan.py """ +import inspect ################ # Kivy libraries ################ +from kivy.logger import Logger from kivy.core.window import Window from kivy.uix.label import Label from kivy.properties import ListProperty, ObjectProperty @@ -38,6 +40,7 @@ ################# from screens.logscreen import LoggedScreen + class ActionerScreen(LoggedScreen): """ Class responsible to scan qrcodes. @@ -61,56 +64,141 @@ class ActionerScreen(LoggedScreen): to set the default position on Screen """ + base_label_kwargs = ObjectProperty({ + "font_size": Window.height // 35, + "font_name": "terminus.ttf", + "halign": "center", + "markup": True + }) + def __init__(self, **kwargs): super().__init__(**kwargs) # Widgets self._label_warn = None self._label_desc = None - + # Keyboard bindings for close ScanScreen self._keyboard = Window.request_keyboard(self._keyboard_closed, self, "text") - if self._keyboard.widget: - self.log.warning("ActionerScreen: This widget is a VKeyboard object") self._keyboard.bind(on_key_down=self._on_keyboard_down) - def _make_label_warn(self, text): - return Label( - text=text, - font_size=Window.height // 35, - font_name="terminus.ttf", - halign="center", - color=self.fill_color, - markup=True, - pos_hint=self.warn_pos_hint, + + def _set_background(self, **kwargs): + name = kwargs.get("name") + id = kwargs.get("id") + r = kwargs.get("r") + g = kwargs.get("g") + b = kwargs.get("b") + a = kwargs.get("a") + + # Log first + msg = f" {id}.background_color=({r},{g},{b},{a})" + self.debug(msg) + + # set after + widget = self.ids[id] + widget.background_color = (r, g, b, a) + + def _set_transition(self, **kwargs): + direction = kwargs.get("direction") + msg = " manager.transition.direction=%s" % direction + self.debug(msg) + self.manager.transition.direction = direction + + def _set_current(self, **kwargs): + screen = kwargs.get("screen") + msg = " manager.current=%s" % screen + self.debug(msg) + self.manager.current = "sign" + + + def _on_press(self, **kwargs): + """ + General on_press method to change + background of buttons, based on + id of widget + + Kwargs: + ------- + :param:`id` the kivy id of widget + """ + id = kwargs.get("id") + msg = f" clicked" + self.info(msg) + self._set_background( + name=self.name, + id=id, + r=0.5, + g=0.5, + b=0.5, + a=0.5 ) - def _make_label_desc(self, text): - return Label( - text=text, - font_size=Window.height // 35, - font_name="terminus.ttf", - halign="center", - color=self.fill_color, - markup=True, - pos_hint=self.label_pos_hint, + def _on_release(self, **kwargs): + """ + General on_release method to change + background of buttons and redirection + of actions, based on id of widget + + Kwargs: + ------- + :param:`id` the kivy id of widget + """ + id = kwargs.get("id") + msg = f" released" + self._set_background( + name=self.name, + id=id, + r=0, + b=0, + g=0, + a=0 ) + def _make_label(self, **kwargs): + """ + Build a label + + Kwargs: + ------- + :param text + :param type can be 'description' or 'warning' + """ + self.info("building '%s' label='%s'", text) + text = kwargs.get("text") + type = kwargs.get("type") + __kwargs__ = self.base_label_kwargs.deepcopy() + __kwargs__["text"] = text + __kwargs__["color"] = self.fill_color + + if (type == "description"): + __kwargs__["pos_hint"] = self.label_pos_hint + + elif (type == "warning"): + __kwargs__["pos_hint"] = self.warn_pos_hint + + else: + raise ValueError("Invalid type '%s'" % type) + + msg = "label args: %s" % __kwargs__ + self.debug(msg) + return Label(**__kwargs__) + def _back_to_signscreen(self): """ Back to SignScreen """ - self.log.info("ActionerScreen: Redirecting to ") - self.manager.transition.direction = "left" - self.manager.current = "sign" + self._set_transition(direction="left") + self._set_current(screen="sign") def _keyboard_closed(self): - self.log.info("ActionerScreen: keyboard have been closed") + self.debug("closing keyboard") self._keyboard.unbind(on_key_down=self._on_keyboard_down) self._keyboard = None # pylint: disable=unused-argument def _on_keyboard_down(self, keyboard, keycode, text, modifiers): + Logger.info("%s pressed", keycode[1]) # Keycode is composed of an integer + a string # If we hit escape, release the keyboard if keycode[1] == "escape": @@ -125,14 +213,19 @@ def _on_keyboard_down(self, keyboard, keycode, text, modifiers): elif keycode[1] == "backspace": self._back_to_signscreen() else: - self.log.warning("ActionerScreen: key '%s' not implemented", keycode[1]) - + self.warning( + "key '%s' isnt implemented", + keycode[1] + ) + return True - @staticmethod def _chunk_str(msg, size): """ Split a big string in multiple lines; Use with sha256 or signature strings. """ + + _msg = "chunking %s to substrings with len=%s" % (msg, size) + self.debug(_msg) return "\n".join([msg[i : i + size] for i in range(0, len(msg), size)]) diff --git a/src/screens/logscreen.py b/src/screens/logscreen.py index a4fc1d9..1988968 100644 --- a/src/screens/logscreen.py +++ b/src/screens/logscreen.py @@ -1,4 +1,3 @@ - # The MIT License (MIT) # Copyright (c) 2021-2023 Krux contributors @@ -26,17 +25,22 @@ Implements an inherited kivy.uix.screenmanager.Screen with inner logger. Use it as super class """ +#################### +# Standard libraries +#################### +import os +import inspect ####################### # Third party libraries ####################### +from kivy.logger import Logger, LOG_LEVELS from kivy.uix.screenmanager import Screen ################# # Local libraries ################# -from utils.log import build_logger - +from cli.getsome import info class LoggedScreen(Screen): """ @@ -47,6 +51,21 @@ class LoggedScreen(Screen): """ def __init__(self, **kwargs): - self.loglevel = kwargs.pop("loglevel") super().__init__(**kwargs) - self.log = build_logger(__name__, self.loglevel) + if (os.environ.get('LOG_LEVEL')): + self.loglevel = LOG_LEVELS[os.environ["LOG_LEVEL"]] + else: + self.loglevel = LOG_LEVELS["info"] + Logger.setLevel(self.loglevel) + + def info(self, msg): + Logger.info("%s: %s", info().strip(), msg) + + def debug(self, msg): + Logger.debug("%s: %s", info().strip(), msg) + + def warning(self, msg): + Logger.warning("%s: %s", info().strip(), msg) + + def error(msg, *args): + Logger.error("%s: %s", info().strip(), msg) diff --git a/src/screens/main.py b/src/screens/main.py index 2d59339..9706df4 100644 --- a/src/screens/main.py +++ b/src/screens/main.py @@ -28,10 +28,11 @@ ################# # Local libraries ################# -from screens.logscreen import LoggedScreen +from screens.actioner import ActionerScreen +# pylint: disable=no-name-in-module +from kivy.properties import StringProperty, ListProperty - -class MainScreen(LoggedScreen): +class MainScreen(ActionerScreen): """ MainScreen @@ -39,6 +40,8 @@ class MainScreen(LoggedScreen): :class:`screens.VerifyScreen`. """ + name = StringProperty("main") + def on_press_sign_button(self): """ on_press_sign_button @@ -46,8 +49,7 @@ def on_press_sign_button(self): - change background color of button to (.5,.5,.5,.5), giving a visual effect of 'pressed' """ - self.log.debug("MainScreen: clicked") - self.ids.main_screen_sign_button.background_color = (0.5, 0.5, 0.5, 0.5) + self._on_press(id="main_screen_sign_button") def on_release_sign_button(self): """ @@ -57,10 +59,9 @@ def on_release_sign_button(self): giving a visual effect of 'unpressed' - make a screen transition to SignScreen """ - self.log.debug("MainScreen: released") - self.ids.main_screen_sign_button.background_color = (0, 0, 0, 0) - self.manager.transition.direction = "left" - self.manager.current = "sign" + self._on_release(id="main_screen_sign_button") + self._set_transition(direction="left") + self._set_current(screen="sign") def on_press_verify_button(self): """ @@ -69,9 +70,8 @@ def on_press_verify_button(self): - change background color of button to (.5,.5,.5,.5), giving a visual effect of 'pressed' """ - self.log.debug("MainScreen: clicked") - self.ids.main_screen_verify_button.background_color = (0.5, 0.5, 0.5, 0.5) - + self._on_press(id="main_screen_verify_button") + def on_release_verify_button(self): """ on_release_verify_button @@ -80,7 +80,6 @@ def on_release_verify_button(self): giving a visual effect of 'unpressed' - make a screen transition to VerifyScreen """ - self.log.debug("MainScreen: released") - self.ids.main_screen_verify_button.background_color = (0, 0, 0, 0) - self.manager.transition.direction = "left" - self.manager.current = "verify" + self._on_release(id="main_screen_verify_button") + self._set_transition(direction="left") + self._set_current(screen="verify") diff --git a/src/screens/qrcode.py b/src/screens/qrcode.py index cfac1dc..bd2b9e6 100644 --- a/src/screens/qrcode.py +++ b/src/screens/qrcode.py @@ -59,6 +59,7 @@ ################# from screens.actioner import ActionerScreen + # pylint: disable=too-many-instance-attributes class QRCodeScreen(ActionerScreen): """ @@ -173,8 +174,8 @@ def set_label_warn(self): " (a) load a 12/24 words key, with or without BIP39 password;", " (b) use the Sign -> Message feature;", " (c) scan this QR code below;", - " (d) click on screen or type one of " + - "'esc|backspace|enter|left' keys to proceed.", + " (d) click on screen or type one of " + + "'esc|backspace|enter|left' keys to proceed.", ] ), ) diff --git a/src/screens/scan.py b/src/screens/scan.py index 8acf46b..d9c9af3 100644 --- a/src/screens/scan.py +++ b/src/screens/scan.py @@ -91,16 +91,16 @@ def set_label_warn(self): text = "\n".join( [ "(a) Scan the signed message;", - "(b) click on scren or press one of "+ - "'esc|enter|backspace|left button' to proceed", + "(b) click on scren or press one of " + + "'esc|enter|backspace|left button' to proceed", ] ) elif self.manager.current == "scan-import-save-public-key": text = "\n".join( [ "(a) Scan the hexadecimal public key;", - "(b) click on scren or press one of "+ - "'esc|enter|backspace|left button' to proceed", + "(b) click on scren or press one of " + + "'esc|enter|backspace|left button' to proceed", ] ) diff --git a/src/screens/sign.py b/src/screens/sign.py index 10ec133..7cc25b5 100644 --- a/src/screens/sign.py +++ b/src/screens/sign.py @@ -30,17 +30,18 @@ from kivy.uix.popup import Popup # pylint: disable=no-name-in-module -from kivy.properties import StringProperty +from kivy.properties import StringProperty, ListProperty +from kivy.logger import LOG_LEVELS ################# # Local libraries ################# -from screens.logscreen import LoggedScreen +from screens.actioner import ActionerScreen from cli.signer import Signer from filechooser import LoadDialog -class SignScreen(LoggedScreen): +class SignScreen(ActionerScreen): """ SignScreen @@ -52,6 +53,31 @@ class SignScreen(LoggedScreen): - Back: `__on_release__` method """ + file_input = StringProperty("") + """ + The input file to be hashed + """ + + file_content = StringProperty("") + """ + The content of file input to be hashed + """ + + file_hash = StringProperty("") + """ + The hash of file input + """ + + name = StringProperty("sign") + """ + The screen's name + """ + + popup_size_hint = ListProperty((0.9, 0.9)) + """ + Relative size of file popup + """ + def __init__(self, **kwargs): super().__init__(**kwargs) self._content = LoadDialog( @@ -60,176 +86,126 @@ def __init__(self, **kwargs): on_submit=self.on_submit_file, ) self._popup = Popup( - title="Load a file", content=self._content, size_hint=(0.9, 0.9) + title="Load a file", + content=self._content, + size_hint=self.popup_size_hint ) - self.file_input = StringProperty("") - self.file_content = StringProperty("") - self.file_hash = StringProperty("") + def on_press_sign_screen_load_file_and_export_hash_qrcode(self): """ - on_press_sign_screen_load_file_and_export_hash_qrcode - - - change background color of button to (.5,.5,.5,.5), - giving a visual effect of 'pressed' + Change background color of + :data:`sign_screen_load_file_and_export_hash_qrcode` widget """ - self.log.info( - "SignScreen: clicked", - ) - self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = ( - 0.5, - 0.5, - 0.5, - 0.5, - ) - + self._on_press(id="sign_screen_load_file_and_export_hash_qrcode") + def on_release_sign_screen_load_file_and_export_hash_qrcode(self): """ - on_release_sign_screen_load_file_and_export_hash_qrcode - - - change background color of button to (0, 0, 0, 0), - giving a visual effect of 'unpressed' - - open the FileChooser popup + Change background of + :data:`sign_screen_load_file_and_export_hash_qrcode` widget + and open popup to choose file """ - self.log.info( - "SignScreen: released", - ) - self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = ( - 0, - 0, - 0, - 0, - ) - - self.log.info("SignScreen: opening") + self._on_release(id="sign_screen_load_file_and_export_hash_qrcode") + self.info("opening ") self._popup.open() def on_press_sign_screen_import_and_save_signature(self): """ - on_press_import_and_save_signature - - - change background color of button to (.5,.5,.5,.5), - giving a visual effect of 'pressed' + Change background of + :data:`sign_screen_import_and_save_signature` widget """ - self.log.info( - "SignScreen: pressed", - ) - self.ids.sign_screen_import_and_save_signature.background_color = ( - 0.5, - 0.5, - 0.5, - 0.5, - ) + self._on_press(id="sign_screen_import_and_save_signature") def on_release_sign_screen_import_and_save_signature(self): """ - on_release_sign_screen_import_and_save_signature - - - change background color of button to (0, 0, 0, 0), - giving a visual effect of 'pressed' - - go to ScanScreen + Change background of + :data:`sign_screen_import_and_save_signature` widget + and redirects to :data:`scan-import-save-signature` + screen """ - self.log.info( - "SignScreen: released", - ) - self.ids.sign_screen_load_file_and_export_hash_qrcode.background_color = ( - 0, - 0, - 0, - 0, - ) - self.manager.transition.direction = "right" - self.manager.current = "scan-import-save-signature" + self._on_release(id="sign_screen_import_and_save_signature") + self._set_transition(direction="right") + self._set_current(screen="scan-import-save-signature") def on_press_sign_screen_import_and_save_public_key(self): """ - on_press_import_and_save_public_key - - - change background color of button to (.5,.5,.5,.5), - giving a visual effect of 'pressed' - """ - self.log.info( - "SignScreen: pressed", - ) - self.ids.sign_screen_import_and_save_public_key.background_color = ( - 0.5, - 0.5, - 0.5, - 0.5, - ) + Change background of + :data:`sign_screen_import_and_save_public_key` widget + """ + self._on_press(id="sign_screen_import_and_save_public_key") def on_release_sign_screen_import_and_save_public_key(self): """ - on_release_sign_screen_import_and_save_public_key - - - change background color of button to (0, 0, 0, 0), - giving a visual effect of 'pressed' - - go to ScanScreen + Change background of + :data:`sign_screen_import_and_save_public_key` widget + and redirects to :data:`scan-import-save-public-key` + screen """ - self.log.info( - "SignScreen: released", - ) - self.ids.sign_screen_import_and_save_public_key.background_color = ( - 0, - 0, - 0, - 0, - ) - self.manager.transition.direction = "right" - self.manager.current = "scan-import-save-signature" + self._on_release(id="sign_screen_import_and_save_public_key") + self._set_transition(direction="right") + self._set_current(screen="scan-import-save-public-key") def on_press_back_main(self): """ - on_press_back_main - - - change background color of button to (.5,.5,.5,.5), - giving a visual effect of 'pressed' + Change background of + :data:`sign_screen_back` widget """ - self.log.info("SignScreen: pressed") - self.ids.sign_screen_back.background_color = (0.5, 0.5, 0.5, 0.5) + self._on_press(id="sign_screen_back") def on_release_back_main(self): """ + Change background of + :data:`sign_screen_back` widget on_release_back_main - - - change background color of button to (.5,.5,.5,.5), - giving a visual effect of 'pressed' - - go back to MainScreen """ - self.log.info("SignScreen: released") - self.ids.sign_screen_back.background_color = (0, 0, 0, 0) - self.manager.transition.direction = "right" - self.manager.current = "main" + self._on_release(id="sign_screen_back") + self._set_transition(direction="left") + self._set_current(screen="main") def on_submit_file(self, *args): """ - on_submit_file - - Call `open_and_hash_file` to open, read and hash (sha256sum) - a given file and redirect to QRCodeScreen + Call :class:`Signer` to open, read and hash + (sha256sum) a given file and redirect to QRCodeScreen """ + # cache file input self.file_input = args[1][0] - self.log.info("SignScreen: loading %s", self.file_input) + msg = " loading %s", self.file_input + self.info(msg) # Use cli.signer module # to implement signature on GUI + if (self.loglevel == LOG_LEVELS["debug"]): + loglevel = "debug" + elif (self.loglevel == LOG_LEVELS["warning"]): + loglevel = "warning" + elif (self.loglevel == LOG_LEVELS["error"]): + loglevel = "error" + else: + loglevel = "info" + signer = Signer( file=self.file_input, owner=self.file_input, uncompressed=False, - loglevel=self.loglevel + loglevel=loglevel, ) + + # Saves the hash in a .sha256sum file self.file_hash = signer.hash_file() signer.save_hash_file(self.file_hash) - self.log.info("SignScreen: closed") + # Close the popup + msg = "Closing " + self.info(msg) self._popup.dismiss() - self.log.info("SignScreen: Caching filename and hash to ") + # Cache qrcode data + msg = "Caching filename and hash to " + self.info(msg) qrcodescreen = self.manager.get_screen("qrcode") qrcodescreen.text = f"[b]{self.file_input}[/b]\n\n[b]{self.file_hash}[/b]" qrcodescreen.code = self.file_hash - self.log.info("SignScreen: Redirecting to ") - self.manager.transition.direction = "left" - self.manager.current = "qrcode" + # Change the screen + self._set_transition(direction="left") + self._set_current(screen="qrcode") diff --git a/src/screens/verify.py b/src/screens/verify.py index f4a08e6..585a767 100644 --- a/src/screens/verify.py +++ b/src/screens/verify.py @@ -30,6 +30,7 @@ ################# from screens.logscreen import LoggedScreen + class VerifyScreen(LoggedScreen): """ VerifyScreen @@ -42,7 +43,7 @@ class VerifyScreen(LoggedScreen): - Load publickey - Verify signature """ - + def on_press_verify_screen_load_file_button(self): """ on_press_verify_screen_load_file_button diff --git a/src/utils/constants.py b/src/utils/constants.py index 7ca61b3..ab3b391 100644 --- a/src/utils/constants.py +++ b/src/utils/constants.py @@ -45,17 +45,17 @@ KSIGNER_VERSION = "0.0.1-alpha-0" KSIGNER_UNCOMPRESSED_PUBKEY_PREPEND = "3056301006072A8648CE3D020106052B8104000A034200" KSIGNER_COMPRESSED_PUBKEY_PREPEND = "3036301006072A8648CE3D020106052B8104000A032200" -KSIGNER_CLI_DESCRIPTION = "".join( +KSIGNER_CLI_DESCRIPTION = " ".join( [ - "This python script is a tool to create air-gapped signatures of files using Krux. ", - "The script can also convert hex publics exported from Krux to PEM public keys so ", - "signatures can be verified using openssl.", + "This python script is a tool to create air-gapped signatures of files using Krux,", + "converting hexadecimal public keys exported from Krux to public key certificates in", + "base64 format, in a way that signatures can be verified using openssl.", ] ) -KSIGNER_GUI_DESCRIPTION = "".join( +KSIGNER_GUI_DESCRIPTION = " ".join( [ - "This is a GUI tool to create air-gapped signatures of files using Krux. ", - "The script can also convert hex publics exported from Krux to PEM public keys so ", - "signatures can be verified using openssl.", + "This is a kivy tool to create air-gapped signatures of files using Krux,", + "converting hexadecimal public keys exported from Krux to public key certificates in", + "base64 format, in a way that signatures can be verified using openssl.", ] ) From 0ce75d711f9e166172ef1cf6cba465733f088b76 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Thu, 26 Oct 2023 10:30:44 -0300 Subject: [PATCH 041/104] Fixed loggers and subclasses in some screens --- src/ksigner-gui.py | 9 ++--- src/screens/actioner.py | 34 ++++++---------- src/screens/main.py | 6 +-- src/screens/qrcode.py | 87 ++++++++++++++++++++++------------------- src/screens/sign.py | 5 +-- 5 files changed, 65 insertions(+), 76 deletions(-) diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index 648c34d..28572e4 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -37,7 +37,7 @@ ################# # Local libraries ################# -from screens.logscreen import get_some_info +from cli.getsome import info from screens.main import MainScreen from screens.sign import SignScreen from screens.verify import VerifyScreen @@ -62,7 +62,7 @@ def build(self): - verify; - TODO: others """ - Logger.info("%s: %s", get_some_info(), "Starting ksigner") + Logger.info("%s: %s", info(), "Starting ksigner") screen_manager = ScreenManager() screens = ( MainScreen(name="main"), @@ -74,15 +74,12 @@ def build(self): ) for screen in screens: - Logger.debug("%s: adding screnn '%s'", get_some_info(), screen.name) + Logger.debug("%s: adding screnn '%s'", info(), screen.name) screen_manager.add_widget(screen) return screen_manager if __name__ == "__main__": - if os.environ.get('LOG_LEVEL') != None: - loglevel = KSignerApp() - app = KSignerApp() app.run() diff --git a/src/screens/actioner.py b/src/screens/actioner.py index 0f22d82..ab933ed 100644 --- a/src/screens/actioner.py +++ b/src/screens/actioner.py @@ -58,18 +58,18 @@ class ActionerScreen(LoggedScreen): to set the default position on Screen """ - warn_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 1}) + warn_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.9}) """ :data:`warn_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, to set the default position on Screen """ - base_label_kwargs = ObjectProperty({ + base_label_kwargs = { "font_size": Window.height // 35, "font_name": "terminus.ttf", "halign": "center", "markup": True - }) + } def __init__(self, **kwargs): super().__init__(**kwargs) @@ -99,18 +99,14 @@ def _set_background(self, **kwargs): widget = self.ids[id] widget.background_color = (r, g, b, a) - def _set_transition(self, **kwargs): + def _set_screen(self, **kwargs): + name = kwargs.get("name") direction = kwargs.get("direction") - msg = " manager.transition.direction=%s" % direction - self.debug(msg) - self.manager.transition.direction = direction - - def _set_current(self, **kwargs): - screen = kwargs.get("screen") - msg = " manager.current=%s" % screen - self.debug(msg) - self.manager.current = "sign" + print(self.manager.screen_names) + self.debug("Switching to screen='%s' by direction='%s'" % (name, direction)) + self.manager.transition.direction = direction + self.manager.current = name def _on_press(self, **kwargs): """ @@ -164,10 +160,11 @@ def _make_label(self, **kwargs): :param text :param type can be 'description' or 'warning' """ - self.info("building '%s' label='%s'", text) + text = kwargs.get("text") type = kwargs.get("type") - __kwargs__ = self.base_label_kwargs.deepcopy() + self.info("building '%s' label='%s'" % (type, text)) + __kwargs__ = self.base_label_kwargs __kwargs__["text"] = text __kwargs__["color"] = self.fill_color @@ -184,13 +181,6 @@ def _make_label(self, **kwargs): self.debug(msg) return Label(**__kwargs__) - def _back_to_signscreen(self): - """ - Back to SignScreen - """ - self._set_transition(direction="left") - self._set_current(screen="sign") - def _keyboard_closed(self): self.debug("closing keyboard") self._keyboard.unbind(on_key_down=self._on_keyboard_down) diff --git a/src/screens/main.py b/src/screens/main.py index 9706df4..3e727b9 100644 --- a/src/screens/main.py +++ b/src/screens/main.py @@ -60,8 +60,7 @@ def on_release_sign_button(self): - make a screen transition to SignScreen """ self._on_release(id="main_screen_sign_button") - self._set_transition(direction="left") - self._set_current(screen="sign") + self._set_screen(name="sign", direction="left") def on_press_verify_button(self): """ @@ -81,5 +80,4 @@ def on_release_verify_button(self): - make a screen transition to VerifyScreen """ self._on_release(id="main_screen_verify_button") - self._set_transition(direction="left") - self._set_current(screen="verify") + self._set_screen(name="verify", direction="left") diff --git a/src/screens/qrcode.py b/src/screens/qrcode.py index bd2b9e6..a7eaba5 100644 --- a/src/screens/qrcode.py +++ b/src/screens/qrcode.py @@ -144,73 +144,78 @@ def on_touch_down(self, touch): """ Event fired when user clicked and release the left mouse button (or the touchable screen) - """ - self._back_to_signscreen() + """ + self._set_screen(name="sign", direction="right") def set_image(self): """ Sets and add Image Widget to QRCodeScreen """ - self._img = Image( - pos_hint=self.image_pos_hint, - allow_stretch=True, - size_hint=(None, None), - size=(Window.height * 0.60, Window.height * 0.6), - ) - + kwargs = { + "pos_hint": self.image_pos_hint, + "allow_stretch": True, + "size_hint": (None, None), + "size": (Window.height * 0.60, Window.height * 0.6) + } + self._img = Image(**kwargs) self.add_widget(self._img) - self.log.info("QRCodeScreen: added") - + self.info("QRCodeScreen: added") + self.debug(kwargs) + def set_label_warn(self): """ Sets and add Label Widget that warn user about the what to do on QRCodeScreen """ - self._label_warn = self._make_label_warn( - "\n".join( - [ - "[b]To sign this file with Krux:[/b]", - "", - " (a) load a 12/24 words key, with or without BIP39 password;", - " (b) use the Sign -> Message feature;", - " (c) scan this QR code below;", - " (d) click on screen or type one of " - + "'esc|backspace|enter|left' keys to proceed.", - ] - ), + text = "\n".join( + [ + "[b]To sign this file with Krux:[/b]", + "", + " (a) load a 12/24 words key, with or without BIP39 password;", + " (b) use the Sign -> Message feature;", + " (c) scan this QR code below;", + " (d) click on screen or type one of " + + "'esc|backspace|enter|left' keys to proceed.", + ] ) + + self._label_warn = self._make_label(text=text,type="warning") self.add_widget(self._label_warn) - self.log.info("QRCodeScreen: added") + self.info(" added") def set_label_desc(self): """ Sets and add Label Widget that describe the qrcode's data to QRCodeScreen """ - self._label_desc = self._make_label_desc(self.text) + self._label_desc = self._make_label(text=self.text, type="description") self.add_widget(self._label_desc) - self.log.info("QRCodeScreen: added") + self.info(" added") def generate_qrcode(self): """ Setup QRCode """ - self.log.info("QRCodeScreen: Creating") - self._qrcode = QRCode( - version=self.version, - error_correction=self.ecc, - box_size=self.box_size, - border=self.border_size, - ) + self.info("Creating qrcode") + kwargs = { + "version": self.version, + "error_correction": self.ecc, + "box_size": self.box_size, + "border": self.border_size, + } + self.debug(kwargs) + self._qrcode = QRCode(**kwargs) self._qrcode.add_data(self.code) - self.log.info("QRCodeScreen: data added") - + self.debug("QRCode data added") + self._qrcode.make(fit=True) + self.debug("QRCode fit=True") + self._update_texture() # pylint: disable=unused-argument def _create_texture(self, k, delta): - self.log.info("QRCodeScreen: creating") + self.info("QRCodeScreen: creating") self._qrtexture = Texture.create(size=(k, k), colorfmt="rgb") # don't interpolate texture self._qrtexture.min_filter = "nearest" @@ -219,11 +224,11 @@ def _create_texture(self, k, delta): def _update_texture(self): matrix = self._qrcode.get_matrix() k = len(matrix) - self.log.info("QRCodeScreen: =%s", k) + self.debug("=%s" % k) # create the texture in main UI thread otherwise # this will lead to memory corruption - self.log.info("QRCodeScreen: in mainUI Thread") + self.debug(" in mainUI Thread") Clock.schedule_once(partial(self._create_texture, k), -1) _color = self.fill_color[:] @@ -239,14 +244,14 @@ def _update_texture(self): # join not necessary when using a byte array # buff =''.join(map(chr, buff)) # update texture in UI thread. - self.log.info("QRCodeScreen: Blitting buffer in ") + self.debug("Blitting buffer in ") Clock.schedule_once(lambda dt: self._upd_texture(buff)) def _upd_texture(self, buff): texture = self._qrtexture if not texture: - self.log.warning("QRCodeScreen: Texture hasn't been created") + self.warning("Texture hasn't been created") Clock.schedule_once(lambda dt: self._upd_texture(buff)) return @@ -255,4 +260,4 @@ def _upd_texture(self, buff): self._img.anim_delay = -1 self._img.texture = texture self._img.canvas.ask_update() - self.log.info("QRCodeScreen: updated") + self.debug(" updated") diff --git a/src/screens/sign.py b/src/screens/sign.py index 7cc25b5..36fa251 100644 --- a/src/screens/sign.py +++ b/src/screens/sign.py @@ -169,7 +169,7 @@ def on_submit_file(self, *args): """ # cache file input self.file_input = args[1][0] - msg = " loading %s", self.file_input + msg = " loading %s" % self.file_input self.info(msg) # Use cli.signer module @@ -207,5 +207,4 @@ def on_submit_file(self, *args): qrcodescreen.code = self.file_hash # Change the screen - self._set_transition(direction="left") - self._set_current(screen="qrcode") + self._set_screen(name="qrcode", direction="left") From 7a819919a4b9dc87f1003057574180fb3a470f44 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Fri, 27 Oct 2023 20:35:18 -0300 Subject: [PATCH 042/104] added cache system to share key/values between Screens TODO: fix the 2 consecutive usage of xcamera FIX: xcamera.kv is loaded multiples times, having unwanted behaviors --- src/cli/getsome.py | 14 +++-- src/cli/signer.py | 22 +++++-- src/ksigner-gui.py | 18 ++++-- src/ksigner.kv | 27 ++++----- src/screens/actioner.py | 41 +++++++------ src/screens/cacher.py | 79 ++++++++++++++++++++++++ src/screens/logscreen.py | 22 ++++--- src/screens/qrcode.py | 24 +++++--- src/screens/scan.py | 128 +++++++++++++++------------------------ src/screens/sign.py | 119 +++++++++++++----------------------- 10 files changed, 272 insertions(+), 222 deletions(-) create mode 100644 src/screens/cacher.py diff --git a/src/cli/getsome.py b/src/cli/getsome.py index 8060a8a..1495fc0 100644 --- a/src/cli/getsome.py +++ b/src/cli/getsome.py @@ -27,10 +27,14 @@ import inspect + def info(): """ - we can loop through the self's MRO and try to find the method that called us. - see htps://stackoverflow.com/questions/53153075/get-a-class-name-of-calling-method + we can loop through the self's + MRO and try to find the method + that called us. + see htps://stackoverflow.com/questions/ + 53153075/get-a-class-name-of-calling-method """ # get the call frame of the calling method frame = inspect.currentframe().f_back @@ -52,7 +56,6 @@ def info(): # check if the calling function is really a method self_type = type(self_obj) func_name = codeobj.co_name - # iterate through all classes in the MRO for cls in self_type.__mro__: # see if this class has a method with the name @@ -70,8 +73,9 @@ def info(): # see if this is the method that called us if getattr(method, '__code__', None) is codeobj: - return self_type.__name__ - + name = self_type.__name__ + return name + # if we didn't find a matching method, return None return None finally: diff --git a/src/cli/signer.py b/src/cli/signer.py index 9d69ebd..c11f8d3 100644 --- a/src/cli/signer.py +++ b/src/cli/signer.py @@ -25,6 +25,14 @@ class Signer(Actioner): """ Signer is the class that manages the `sign` command + + Kwargs: + ------- + :param:`file` the file to be signer + :param:`owner` the owner of file + :param:`uncompressed` if the file will use + uncompressed format for public files + """ def __init__(self, **kwargs): @@ -141,11 +149,15 @@ def make_pubkey_certificate(self): # Scans the public KeyboardInterruptardInterrupt self.debug("Creating public key certificate") pubkey = self.scanner.scan_public_key() - - # Create PEM data - # Save PEM data to a file - # with filename as owner's name - # Choose if will be compressed or uncompressed + self.save_pubkey_certificate(pubkey) + + def save_pubkey_certificate(self, pubkey): + """ + Create and save PEM data to a file + with filename as owner's name + + Choose if will be compressed or uncompressed + """ if self.uncompressed: self.debug("Make it uncompressed key") __public_key_data__ = "".join( diff --git a/src/ksigner-gui.py b/src/ksigner-gui.py index 28572e4..d22abd0 100644 --- a/src/ksigner-gui.py +++ b/src/ksigner-gui.py @@ -33,6 +33,7 @@ from kivy.app import App from kivy.logger import Logger from kivy.uix.screenmanager import ScreenManager +from kivy.cache import Cache ################# # Local libraries @@ -62,19 +63,26 @@ def build(self): - verify; - TODO: others """ - Logger.info("%s: %s", info(), "Starting ksigner") + cache_name = "ksigner" + cache_args = { "limit": 10, "timeout": 300 } + + Cache.register(cache_name, **cache_args) + + msg = "%s: %s" % (info(), "Starting ksigner") + Logger.info(msg) screen_manager = ScreenManager() screens = ( MainScreen(name="main"), SignScreen(name="sign"), VerifyScreen(name="verify"), - QRCodeScreen(name="qrcode"), - ScanScreen(name="scan-import-save-signature"), - ScanScreen(name="scan-import-save-public-key"), + QRCodeScreen(name="export-sha256"), + ScanScreen(name="import-signature"), + ScanScreen(name="import-public-key"), ) for screen in screens: - Logger.debug("%s: adding screnn '%s'", info(), screen.name) + msg = "%s: adding screen '%s'" % (info(), screen.name) + Logger.debug(msg) screen_manager.add_widget(screen) return screen_manager diff --git a/src/ksigner.kv b/src/ksigner.kv index 568992d..01511d1 100644 --- a/src/ksigner.kv +++ b/src/ksigner.kv @@ -48,14 +48,14 @@ rows: 4 Button: - id: sign_screen_load_file_and_export_hash_qrcode - text: 'Load file & export hash QRCode' + id: export_sha256_message + text: "Export sha256sum's message" font_size: root.height // 25 font_name: 'terminus.ttf' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 - on_press: root.on_press_sign_screen_load_file_and_export_hash_qrcode() - on_release: root.on_release_sign_screen_load_file_and_export_hash_qrcode() + on_press: root.on_press_export_sha256_message() + on_release: root.on_release_export_sha256_message() canvas.before: Color: rgba: 1, 1, 1, 1 @@ -64,15 +64,14 @@ rectangle: self.x, self.y, self.width, self.height Button: - id: sign_screen_import_and_save_signature - text: 'Import & save signature' + id: import_signature_message + text: "Import signature's message" font_size: root.height // 25 font_name: 'terminus.ttf' - font_size: '20sp' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 - on_press: root.on_press_sign_screen_import_and_save_signature() - on_release:root.on_release_sign_screen_import_and_save_signature() + on_press: root.on_press_import_signature_message() + on_release:root.on_release_import_signature_message() canvas.before: Color: rgba: 1, 1, 1, 1 @@ -81,14 +80,14 @@ rectangle: self.x, self.y, self.width, self.height Button: - id: sign_screen_import_and_save_public_key - text: 'Import & save public-key' + id: import_publickey_message + text: 'Import public-key message' font_size: root.height // 25 font_name: 'terminus.ttf' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 - on_press: root.on_press_sign_screen_import_and_save_public_key() - on_release: root.on_release_sign_screen_import_and_save_public_key() + on_press: root.on_press_import_publickey_message() + on_release: root.on_release_import_publickey_message() canvas.before: Color: rgba: 1, 1, 1, 1 @@ -231,7 +230,7 @@ : - id: qrcode + id: export-sha256 # QRCodeWidget: # id: qrcode_data diff --git a/src/screens/actioner.py b/src/screens/actioner.py index ab933ed..067baff 100644 --- a/src/screens/actioner.py +++ b/src/screens/actioner.py @@ -100,6 +100,15 @@ def _set_background(self, **kwargs): widget.background_color = (r, g, b, a) def _set_screen(self, **kwargs): + """ + Change to some screen registered on + screenmanager. + + Kwargs: + ------- + :param:`name` of registered screen + :param:`direction` of transiction + """ name = kwargs.get("name") direction = kwargs.get("direction") print(self.manager.screen_names) @@ -188,29 +197,25 @@ def _keyboard_closed(self): # pylint: disable=unused-argument def _on_keyboard_down(self, keyboard, keycode, text, modifiers): - Logger.info("%s pressed", keycode[1]) # Keycode is composed of an integer + a string # If we hit escape, release the keyboard - if keycode[1] == "escape": - self._back_to_signscreen() - - elif keycode[1] == "enter": - self._back_to_signscreen() - - elif keycode[1] == "left": - self._back_to_signscreen() - - elif keycode[1] == "backspace": - self._back_to_signscreen() - else: - self.warning( - "key '%s' isnt implemented", - keycode[1] - ) + # for key in ["escape"] + if keycode[1] == "enter": + self.info("%s pressed" % keycode[1]) + if self.manager.current == "sign": + self._set_screen(name="main", direction="left") + elif self.manager.current == "export-sha256": + self._set_screen(name="sign", direction="left") + elif self.manager.current == "import-signature": + self._set_screen(name="sign", direction="left") + elif self.manager.current == "import-public-key": + self._set_screen(name="sign", direction="left") + else: + self.warning("key '%s' isnt implemented" % keycode[1]) return True - def _chunk_str(msg, size): + def _chunk_str(self, msg, size): """ Split a big string in multiple lines; Use with sha256 or signature strings. diff --git a/src/screens/cacher.py b/src/screens/cacher.py new file mode 100644 index 0000000..fc72b34 --- /dev/null +++ b/src/screens/cacher.py @@ -0,0 +1,79 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-2023 Krux contributors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +""" +signscreen.py + +An inherited implementations of kivy.uix.screenmanager Screen +""" +##################### +# Thirparty libraries +from kivy.logger import Logger, LOG_LEVELS +from kivy.cache import Cache +from cli.getsome import info + + +class LoggedCache: + """ + Class to joint :class:`Cache` with :class:`Logger` + features + """ + + def __init__(self, **kwargs): + super().__init__(**kwargs) + if (os.environ.get('LOG_LEVEL')): + loglevel = LOG_LEVELS[os.environ["LOG_LEVEL"]] + else: + loglevel = LOG_LEVELS["info"] + Logger.setLevel(self.loglevel) + + @staticmethod + def register(name, **kwargs): + """ + Do the same as :method:`register` from :class:`Cache`, + with logs + """ + dicts = dict(kwargs) + Logger.debug("%s: '%s' setup: %s" % ("LoggedCache", name, dicts)) + Cache.register(name, **kwargs) + Logger.info("%s: '%s' registered" % ("LoggedCache", name)) + + @staticmethod + def append(reg, key, value): + Logger.debug("%s: Saving %s->%s=%s" % ( + "LoggedCache", + reg, + key, + value + )) + Cache.append(reg, key, value) + + @staticmethod + def get(reg, key): + value = Cache.get(reg, key) + Logger.debug("%s: Getting %s->%s=%s" % ( + "LoggedCache", + reg, + key, + value + )) + return value + diff --git a/src/screens/logscreen.py b/src/screens/logscreen.py index 1988968..bd79bcf 100644 --- a/src/screens/logscreen.py +++ b/src/screens/logscreen.py @@ -42,6 +42,7 @@ ################# from cli.getsome import info + class LoggedScreen(Screen): """ MainScreen @@ -57,15 +58,18 @@ def __init__(self, **kwargs): else: self.loglevel = LOG_LEVELS["info"] Logger.setLevel(self.loglevel) - - def info(self, msg): - Logger.info("%s: %s", info().strip(), msg) + + def _create_msg(self, msg): + return "%s: %s" % (info(), msg) + def info(self, msg): + Logger.info(self._create_msg(msg)) + def debug(self, msg): - Logger.debug("%s: %s", info().strip(), msg) - + Logger.debug(self._create_msg(msg)) + def warning(self, msg): - Logger.warning("%s: %s", info().strip(), msg) - - def error(msg, *args): - Logger.error("%s: %s", info().strip(), msg) + Logger.warning(self._create_msg(msg)) + + def error(self, msg): + Logger.error(self._create_msg(msg)) diff --git a/src/screens/qrcode.py b/src/screens/qrcode.py index a7eaba5..b1aaf2d 100644 --- a/src/screens/qrcode.py +++ b/src/screens/qrcode.py @@ -58,6 +58,7 @@ # Local libraries ################# from screens.actioner import ActionerScreen +from screens.cacher import LoggedCache # pylint: disable=too-many-instance-attributes @@ -174,8 +175,7 @@ def set_label_warn(self): " (a) load a 12/24 words key, with or without BIP39 password;", " (b) use the Sign -> Message feature;", " (c) scan this QR code below;", - " (d) click on screen or type one of " - + "'esc|backspace|enter|left' keys to proceed.", + " (d) click on screen or type 'enter'" ] ) @@ -188,7 +188,15 @@ def set_label_desc(self): Sets and add Label Widget that describe the qrcode's data to QRCodeScreen """ - self._label_desc = self._make_label(text=self.text, type="description") + file_input = LoggedCache.get("ksigner", "file_input") + hash_file = LoggedCache.get("ksigner", "hash_file") + hash = LoggedCache.get("ksigner", "hash") + text = "\n".join([ + f"File input: {file_input}", + f"File hash: {hash_file}", + f"\n{hash}" + ]) + self._label_desc = self._make_label(text=text, type="description") self.add_widget(self._label_desc) self.info(" added") @@ -203,14 +211,12 @@ def generate_qrcode(self): "box_size": self.box_size, "border": self.border_size, } - self.debug(kwargs) + + # add data + data = LoggedCache.get("ksigner", "hash") self._qrcode = QRCode(**kwargs) - self._qrcode.add_data(self.code) - self.debug("QRCode data added") - + self._qrcode.add_data(data) self._qrcode.make(fit=True) - self.debug("QRCode fit=True") - self._update_texture() # pylint: disable=unused-argument diff --git a/src/screens/scan.py b/src/screens/scan.py index d9c9af3..3865494 100644 --- a/src/screens/scan.py +++ b/src/screens/scan.py @@ -34,11 +34,14 @@ from kivy.uix.boxlayout import BoxLayout from kivy.properties import ObjectProperty from kivy_garden.zbarcam import ZBarCam +from kivy.lang import Builder ################# # Local libraries ################# from screens.actioner import ActionerScreen +from cli.signer import Signer +from screens.cacher import LoggedCache class ScanScreen(ActionerScreen): @@ -48,7 +51,8 @@ class ScanScreen(ActionerScreen): zbar_pos_hint = ObjectProperty({"center_x": 0.5, "center_y": 0.5}) """ - :data:`label_pos_hint` is a :class:`~kivy.properties.ObjectProperty`, + :data:`label_pos_hint` is a + :class:`~kivy.properties.ObjectProperty`, to set the default position on Screen """ @@ -58,98 +62,62 @@ def __init__(self, **kwargs): # Widgets self._box_layout = None self._zbarcam = None - # Keyboard bindings for close ScanScreen - self._keyboard = Window.request_keyboard(self._keyboard_closed, self, "text") - if self._keyboard.widget: - self.log.warning("QRCodeScreen: This widget is a VKeyboard object") - self._keyboard.bind(on_key_down=self._on_keyboard_down) def on_pre_enter(self, *args): """ Event fired when the screen is about to be used: the entering animation is started. """ - self.set_box_layout() - self.set_label_warn() - self.set_zbarcam() - self.set_label_desc() - - def set_box_layout(self): - """ - Sets and add BoxLayout Widget that wrap - all needed widgets - """ - self._box_layout = BoxLayout(orientation="vertical") - self.add_widget(self._box_layout) - self.log.info("ScanScreen: added") - - def set_label_warn(self): - """ - Sets and add Label Widget that warn user about - the what to do on ScanScreen - """ - if self.manager.current == "scan-import-save-signature": - text = "\n".join( - [ - "(a) Scan the signed message;", - "(b) click on scren or press one of " - + "'esc|enter|backspace|left button' to proceed", - ] - ) - elif self.manager.current == "scan-import-save-public-key": - text = "\n".join( - [ - "(a) Scan the hexadecimal public key;", - "(b) click on scren or press one of " - + "'esc|enter|backspace|left button' to proceed", - ] - ) - - self._label_warn = self._make_label_warn(text) - self.log.info("ScanScreen: added to ") - self._box_layout.add_widget(self._label_warn) - - def set_zbarcam(self): - """ - Sets and add ZBarCam Widget that describe the qrcode's - data to ScanScreen - """ self._zbarcam = ZBarCam() - self._box_layout.add_widget(self._zbarcam) - self.log.info("ScanScreen: added to ") + self.add_widget(self._zbarcam) + self.info(" added") Clock.schedule_interval(self._decode_qrcode, 1) - def set_label_desc(self): - """ - Sets and add Label Widget that describe the qrcode's - data to ScanScreen - """ - - if self.manager.current == "scan-import-save-signature": - text = ("Signed message: ",) - elif self.manager.current == "scan-import-save-public-key": - text = "Public key: " - - self._label_desc = self._make_label_desc(text) - self._box_layout.add_widget(self._label_desc) - self.log.info("ScanScreen: added to ") - # pylint: disable=unused-argument def _decode_qrcode(self, *args): """ - When camera capture the QRCode, - :data:`zbarcam.symbols` will be filled; - When it occurs, stop scanning - - @see https://stackoverflow.com/questions/ - 73067952/kivy-load-camera-zbarscan-on-click-button/73077097#73077097 + When camera capture the QRCode, :data:`zbarcam.symbols` + will be feeded to :class:`Signer` and saved as `.sig` + or `.pem` files. When it occurs, stop scanning """ - self.log.info("ScanScreen: waiting for qrcode") + self.warning("Waiting for qrcode") if len(self._zbarcam.symbols) > 0: scanned_data = self._zbarcam.symbols[0].data.decode("UTF-8") - self._label_desc += ScanScreen._chunk_str(scanned_data, 12) - - self.log.debug("ScanScreen: captured '%s'", scanned_data) - Clock.unschedule(self._decode_qrcode, 1) + self.info("captured '%s'" % scanned_data) + + # Get cached data + file_input = LoggedCache.get("ksigner", "file_input") + owner = LoggedCache.get("ksigner", "owner") + + if self.manager.current == "import-signature": + self.warning("Saving signature") + signer = Signer( + file=file_input, + owner=owner, + uncompressed=False + ) + + signer.save_signature(scanned_data) + + elif self.manager.current == "import-public-key": + self.warning("Saving publickey certificate") + signer = Signer( + file=file_input, + owner=owner, + uncompressed=False + ) + signer.save_pubkey_certificate(scanned_data) + + else: + self.warning("Invalid screen '%s'" % self.manager.screen) + + self.debug("Stopping ") self._zbarcam.stop() # stop zbarcam + + self.debug("Releasing device") + # pylint: disable=protected-access - self._zbarcam.ids["xcamera"]._camera._device.release() + self._zbarcam.ids.xcamera._camera._device.release() + self._zbarcam.ids.xcamera._camera = None + self.debug("Unscheduling QRCode decodification") + Clock.unschedule(self._decode_qrcode, 1) + self._set_screen(name="sign", direction="right") \ No newline at end of file diff --git a/src/screens/sign.py b/src/screens/sign.py index 36fa251..6e6ce0e 100644 --- a/src/screens/sign.py +++ b/src/screens/sign.py @@ -37,6 +37,7 @@ # Local libraries ################# from screens.actioner import ActionerScreen +from screens.cacher import LoggedCache from cli.signer import Signer from filechooser import LoadDialog @@ -52,22 +53,7 @@ class SignScreen(ActionerScreen): - Import & save publickey: `TODO`; - Back: `__on_release__` method """ - - file_input = StringProperty("") - """ - The input file to be hashed - """ - - file_content = StringProperty("") - """ - The content of file input to be hashed - """ - - file_hash = StringProperty("") - """ - The hash of file input - """ - + name = StringProperty("sign") """ The screen's name @@ -91,59 +77,49 @@ def __init__(self, **kwargs): size_hint=self.popup_size_hint ) - - def on_press_sign_screen_load_file_and_export_hash_qrcode(self): + def on_press_export_sha256_message(self): """ - Change background color of - :data:`sign_screen_load_file_and_export_hash_qrcode` widget + Change background color of :data:`export_sha256_message` widget """ - self._on_press(id="sign_screen_load_file_and_export_hash_qrcode") + self._on_press(id="export_sha256_message") - def on_release_sign_screen_load_file_and_export_hash_qrcode(self): + def on_release_export_sha256_message(self): """ - Change background of - :data:`sign_screen_load_file_and_export_hash_qrcode` widget + Change background of :data:`export_sha256_message` widget and open popup to choose file """ - self._on_release(id="sign_screen_load_file_and_export_hash_qrcode") + self._on_release(id="export_sha256_message") self.info("opening ") self._popup.open() - def on_press_sign_screen_import_and_save_signature(self): + def on_press_import_signature_message(self): """ - Change background of - :data:`sign_screen_import_and_save_signature` widget + Change background of :data:`import_signature_message` widget """ - self._on_press(id="sign_screen_import_and_save_signature") + self._on_press(id="import_signature_message") - def on_release_sign_screen_import_and_save_signature(self): + def on_release_import_signature_message(self): """ - Change background of - :data:`sign_screen_import_and_save_signature` widget - and redirects to :data:`scan-import-save-signature` - screen + Change background of :data:`import_signature_message` widget + and redirects to :data:`import_signature_message` screen """ - self._on_release(id="sign_screen_import_and_save_signature") - self._set_transition(direction="right") - self._set_current(screen="scan-import-save-signature") + self._on_release(id="import_signature_message") + self._set_screen(name="import-signature", direction="right") - def on_press_sign_screen_import_and_save_public_key(self): + def on_press_import_publickey_message(self): """ Change background of - :data:`sign_screen_import_and_save_public_key` widget + :data:`import_publickey_message` widget """ - self._on_press(id="sign_screen_import_and_save_public_key") + self._on_press(id="import_publickey_message") - def on_release_sign_screen_import_and_save_public_key(self): + def on_release_import_publickey_message(self): """ - Change background of - :data:`sign_screen_import_and_save_public_key` widget - and redirects to :data:`scan-import-save-public-key` - screen + Change background of :data:`import_publickey_message` widget + and redirects to :data:`import-public-key` screen """ - self._on_release(id="sign_screen_import_and_save_public_key") - self._set_transition(direction="right") - self._set_current(screen="scan-import-save-public-key") + self._on_release(id="import_publickey_message") + self._set_screen(name="import-public-key", direction="right") def on_press_back_main(self): """ @@ -159,8 +135,7 @@ def on_release_back_main(self): on_release_back_main """ self._on_release(id="sign_screen_back") - self._set_transition(direction="left") - self._set_current(screen="main") + self._set_screen(name="main", direction="right") def on_submit_file(self, *args): """ @@ -168,43 +143,33 @@ def on_submit_file(self, *args): (sha256sum) a given file and redirect to QRCodeScreen """ # cache file input - self.file_input = args[1][0] - msg = " loading %s" % self.file_input + LoggedCache.append("ksigner", "file_input", args[1][0]) + LoggedCache.append("ksigner", "owner", args[1][0]) + file_input = LoggedCache.get("ksigner", "file_input") + owner = LoggedCache.get("ksigner", "owner") + + msg = " loading %s" % file_input self.info(msg) - # Use cli.signer module - # to implement signature on GUI - if (self.loglevel == LOG_LEVELS["debug"]): - loglevel = "debug" - elif (self.loglevel == LOG_LEVELS["warning"]): - loglevel = "warning" - elif (self.loglevel == LOG_LEVELS["error"]): - loglevel = "error" - else: - loglevel = "info" - signer = Signer( - file=self.file_input, - owner=self.file_input, + file=file_input, + owner=owner, uncompressed=False, - loglevel=loglevel, ) - # Saves the hash in a .sha256sum file - self.file_hash = signer.hash_file() - signer.save_hash_file(self.file_hash) + # Cache the hash in a .sha256sum file + hash = signer.hash_file() + LoggedCache.append("ksigner", "hash", hash) + + # Cache the hashed file + hash_file = f"{file_input}.sha256sum.txt" + LoggedCache.append("ksigner", "hash_file", hash_file) + signer.save_hash_file(hash_file) # Close the popup msg = "Closing " self.info(msg) self._popup.dismiss() - # Cache qrcode data - msg = "Caching filename and hash to " - self.info(msg) - qrcodescreen = self.manager.get_screen("qrcode") - qrcodescreen.text = f"[b]{self.file_input}[/b]\n\n[b]{self.file_hash}[/b]" - qrcodescreen.code = self.file_hash - # Change the screen - self._set_screen(name="qrcode", direction="left") + self._set_screen(name="export-sha256", direction="left") From 340f6d96d1fe9403d7cefa3721afd2ea8bb17c30 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Sun, 29 Oct 2023 13:28:34 -0300 Subject: [PATCH 043/104] Fixed release of camera to scan signature and scan pubkey --- src/screens/scan.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/screens/scan.py b/src/screens/scan.py index 3865494..d54d2a6 100644 --- a/src/screens/scan.py +++ b/src/screens/scan.py @@ -25,10 +25,13 @@ Implements an inherited kivy.uix.screenmanager.Screen for scan QRCodes """ +import sys +import os ################ # Kivy libraries ################ +from kivy.lang import Builder from kivy.clock import Clock from kivy.core.window import Window from kivy.uix.boxlayout import BoxLayout @@ -110,14 +113,27 @@ def _decode_qrcode(self, *args): else: self.warning("Invalid screen '%s'" % self.manager.screen) - self.debug("Stopping ") - self._zbarcam.stop() # stop zbarcam - - self.debug("Releasing device") - # pylint: disable=protected-access - self._zbarcam.ids.xcamera._camera._device.release() - self._zbarcam.ids.xcamera._camera = None + self.debug("Unscheduling QRCode decodification") Clock.unschedule(self._decode_qrcode, 1) - self._set_screen(name="sign", direction="right") \ No newline at end of file + + self.debug("Releasing device") + self._zbarcam.ids.xcamera._camera._device.release() + + self.debug("Stopping ") + self._zbarcam.stop() # stop zbarcam + + # unload zbarcam.kv file + mod_path = os.path.dirname(sys.modules['kivy_garden.zbarcam'].__file__) + zbar_kv_path = os.path.join(mod_path, 'zbarcam.kv') + self.debug("Unloading '%s'" % zbar_kv_path) + Builder.unload_file(zbar_kv_path) + + # unload xcamera.kv file + mod_path = os.path.dirname(sys.modules['kivy_garden.xcamera'].__file__) + xcam_kv_path = os.path.join(mod_path, 'xcamera.kv') + self.debug("Unloading '%s'" % xcam_kv_path) + Builder.unload_file(xcam_kv_path) + + self._set_screen(name="sign", direction="right") From 8174aa8567975808095971e154d3113731a2bd83 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Sun, 29 Oct 2023 19:38:19 -0300 Subject: [PATCH 044/104] refactored some code and added popup to choose a file to be verified on VerifyScreen --- src/ksigner.kv | 8 ++--- src/screens/verify.py | 71 ++++++++++++++++++++++++++++++++----------- 2 files changed, 58 insertions(+), 21 deletions(-) diff --git a/src/ksigner.kv b/src/ksigner.kv index 01511d1..364c566 100644 --- a/src/ksigner.kv +++ b/src/ksigner.kv @@ -120,13 +120,13 @@ Button: id: verify_screen_load_file_button - text: 'Load file' + text: 'Load file to be verified' font_size: root.height // 25 font_name: 'terminus.ttf' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 - on_press: root.on_press_verify_screen_load_file_button() - on_release: root.on_release_verify_screen_load_file_button() + on_press: root.on_press_load_file() + on_release: root.on_release_load_file() canvas.before: Color: rgba: 1, 1, 1, 1 @@ -243,4 +243,4 @@ # halign: 'center' # color: 1, 1, 1 # background_color: 0, 0, 0 -# markup: True \ No newline at end of file +# markup: True diff --git a/src/screens/verify.py b/src/screens/verify.py index 585a767..db4d796 100644 --- a/src/screens/verify.py +++ b/src/screens/verify.py @@ -25,13 +25,21 @@ Implements an inherited kivy.uix.screenmanager.Screen for verify signature options """ +####################### +# Third party libraries +####################### +from kivy.uix.popup import Popup +# pylint: disable=no-name-in-module +from kivy.properties import StringProperty, ListProperty + ################# # Local libraries ################# -from screens.logscreen import LoggedScreen - +from screens.actioner import ActionerScreen +from screens.cacher import LoggedCache +from filechooser import LoadDialog -class VerifyScreen(LoggedScreen): +class VerifyScreen(ActionerScreen): """ VerifyScreen @@ -44,23 +52,52 @@ class VerifyScreen(LoggedScreen): - Verify signature """ - def on_press_verify_screen_load_file_button(self): - """ - on_press_verify_screen_load_file_button + name = StringProperty("sign") + """ + The screen's name + """ - - change background color of button to (.5,.5,.5,.5), - giving a visual effect of 'pressed' + popup_size_hint = ListProperty((0.9, 0.9)) + """ + Relative size of file popup + """ + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self._load_file_dialog = LoadDialog( + load=LoadDialog.load, + cancel=lambda: self._load_file_popup.dismiss, + on_submit=self.on_submit_file_to_be_verified, + ) + self._load_file_popup = Popup( + title="Load a file to be verified", + content=self._load_file_dialog, + size_hint=self.popup_size_hint + ) + + def on_press_load_file(self): + """ + Change background color of :data:`verify_screen_load_file_button` widget """ - self.log.info(" clicked") - self.ids.verify_screen_load_file_button.background_color = (0.5, 0.5, 0.5, 0.5) + self._on_press(id="verify_screen_load_file_button") - def on_release_verify_screen_load_file_button(self): + def on_release_load_file(self): """ - on_release_verify_screen_load_file_button + Change background of :data:`verifu_screen_load_file_button` widget + and open popup to choose file + """ + self._on_release(id="verify_screen_load_file_button") + self.info("opening ") + self._load_file_popup.open() - - change background color of button to (0, 0, 0, 0), - giving a visual effect of 'unpressed' - - make a screen transition to SignScreen + def on_submit_file_to_be_verified(self, *args): """ - self.log.info(" released") - self.ids.verify_screen_load_file_button.background_color = (0, 0, 0, 0) + Cache file name to be verified + """ + # cache file input + LoggedCache.append("ksigner", "file_input", args[1][0]) + + # Close the popup + msg = "Closing " + self.info(msg) + self._load_file_popup.dismiss() From b68fe7b7caba5ce25f1e29fbab36317cf1baaeef Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Sun, 29 Oct 2023 20:57:18 -0300 Subject: [PATCH 045/104] fixed verify process on VerifyScreen, from selecting files and verification --- src/cli/verifyer.py | 9 ++- src/ksigner.kv | 21 +++---- src/screens/verify.py | 140 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+), 13 deletions(-) diff --git a/src/cli/verifyer.py b/src/cli/verifyer.py index 7a4879c..86f120d 100644 --- a/src/cli/verifyer.py +++ b/src/cli/verifyer.py @@ -72,7 +72,14 @@ def verify(self, command): """ try: self.debug("Verifyer: Running '%s'" % command) - subprocess.run(command, check=True, shell=True) + result = subprocess.run( + command, + check=True, + shell=True, + capture_output=True, + text=True + ) + return (str(result.stdout), str(result.stderr)) except subprocess.CalledProcessError as exc: error = subprocess.CalledProcessError(message, cmd=command) self.error("Invalid command: %s" % error) diff --git a/src/ksigner.kv b/src/ksigner.kv index 364c566..071d074 100644 --- a/src/ksigner.kv +++ b/src/ksigner.kv @@ -135,15 +135,14 @@ rectangle: self.x, self.y, self.width, self.height Button: + id: verify_screen_load_signature text: 'Load Signature' font_size: root.height // 25 font_name: 'terminus.ttf' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 - on_press: - self.background_color = (.5, .5, .5, .5) - on_release: - self.background_color = (0, 0, 0, 0) + on_press: root.on_press_load_signature() + on_release: root.on_release_load_signature() canvas.before: Color: rgba: 1, 1, 1, 1 @@ -152,15 +151,14 @@ rectangle: self.x, self.y, self.width, self.height Button: + id: verify_screen_load_pubkey text: 'Load public-key' font_size: root.height // 25 font_name: 'terminus.ttf' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 - on_press: - self.background_color = (.5, .5, .5, .5) - on_release: - self.background_color = (0, 0, 0, 0) + on_press: root.on_press_load_pubkey() + on_release: root.on_release_load_pubkey() canvas.before: Color: rgba: 1, 1, 1, 1 @@ -169,15 +167,14 @@ rectangle: self.x, self.y, self.width, self.height Button: + id: verify_screen_verification text: 'Verify signature' font_size: root.height // 25 font_name: 'terminus.ttf' background_color: 0, 0, 0, 0, color: 1, 1, 1, 1 - on_press: - self.background_color = (.5, .5, .5, .5) - on_release: - self.background_color = (0, 0, 0, 0) + on_press: root.on_press_verify() + on_release: root.on_release_verify() canvas.before: Color: rgba: 1, 1, 1, 1 diff --git a/src/screens/verify.py b/src/screens/verify.py index db4d796..5f1f096 100644 --- a/src/screens/verify.py +++ b/src/screens/verify.py @@ -29,12 +29,16 @@ # Third party libraries ####################### from kivy.uix.popup import Popup +from kivy.uix.button import Button +from kivy.uix.label import Label +from kivy.uix.boxlayout import BoxLayout # pylint: disable=no-name-in-module from kivy.properties import StringProperty, ListProperty ################# # Local libraries ################# +from cli.verifyer import Verifyer from screens.actioner import ActionerScreen from screens.cacher import LoggedCache from filechooser import LoadDialog @@ -64,6 +68,8 @@ class VerifyScreen(ActionerScreen): def __init__(self, **kwargs): super().__init__(**kwargs) + + # File to be verified LoadDialog and Popup self._load_file_dialog = LoadDialog( load=LoadDialog.load, cancel=lambda: self._load_file_popup.dismiss, @@ -74,7 +80,31 @@ def __init__(self, **kwargs): content=self._load_file_dialog, size_hint=self.popup_size_hint ) + + # Signature's file to be verified LoadDialog and Popup + self._load_signature_dialog = LoadDialog( + load=LoadDialog.load, + cancel=lambda: self._load_signature_popup.dismiss, + on_submit=self.on_submit_signature + ) + self._load_signature_popup = Popup( + title="Load the signature's file to be verified", + content=self._load_signature_dialog, + size_hint=self.popup_size_hint + ) + # Public key certificate's file to be verified LoadDialog and Popup + self._load_pubkey_dialog = LoadDialog( + load=LoadDialog.load, + cancel=lambda: self._load_pubkey_popup.dismiss, + on_submit=self.on_submit_pubkey + ) + self._load_pubkey_popup = Popup( + title="Load the public-key certificate's file to be verified", + content=self._load_pubkey_dialog, + size_hint=self.popup_size_hint + ) + def on_press_load_file(self): """ Change background color of :data:`verify_screen_load_file_button` widget @@ -101,3 +131,113 @@ def on_submit_file_to_be_verified(self, *args): msg = "Closing " self.info(msg) self._load_file_popup.dismiss() + + def on_press_load_signature(self): + """ + Change background color of :data:`verify_screen_load_signature` widget + """ + self._on_press(id="verify_screen_load_signature") + + def on_release_load_signature(self): + """ + Change background of :data:`verify_screen_load_signature` widget + and open popup to choose file + """ + self._on_release(id="verify_screen_load_signature") + self.info("opening ") + self._load_signature_popup.open() + + def on_submit_signature(self, *args): + """ + Cache signature's file be verified + """ + # cache file input + LoggedCache.append("ksigner", "signature", args[1][0]) + + # Close the popup + msg = "Closing " + self.info(msg) + self._load_signature_popup.dismiss() + + def on_press_load_pubkey(self): + """ + Change background color of :data:`verify_screen_load_pubkey` widget + """ + self._on_press(id="verify_screen_load_pubkey") + + def on_release_load_pubkey(self): + """ + Change background of :data:`verify_screen_load_pubkey` widget + and open popup to choose file + """ + self._on_release(id="verify_screen_load_pubkey") + self.info("opening ") + self._load_pubkey_popup.open() + + def on_submit_pubkey(self, *args): + """ + Cache public key certificate's file be verified + """ + # cache file input + LoggedCache.append("ksigner", "pubkey", args[1][0]) + + # Close the popup + msg = "Closing " + self.info(msg) + self._load_pubkey_popup.dismiss() + + def on_press_verify(self): + """ + Change background color of :data:`verify_screen_verification` widget + """ + self._on_press(id="verify_screen_verification") + + def on_release_verify(self): + """ + Change background of :data:`verify_screen_verification` widget + and open popup to choose file + """ + self._on_release(id="verify_screen_verification") + + # Get caches + file = LoggedCache.get("ksigner", "file_input") + sig = LoggedCache.get("ksigner", "signature") + pub = LoggedCache.get("ksigner", "pubkey") + + # Verify + self.debug("Building verification") + verifyer = Verifyer( + file=file, + signature=sig, + pubkey=pub + ) + + command = verifyer.make_openssl_command() + result = verifyer.verify(command) + self.debug("verification result: %s" % result[0]) + + # Verification popup + self.debug("Creating for ") + self._verification_box_popup = BoxLayout(orientation='vertical') + + self.debug("Adding