Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
5aa62f2
fixed issues with client logic - app layer logic new frames and mecha…
Michal-Brzezinski May 22, 2026
7d7c3e2
loading secrets to files in encrypted form, autoloading secrets with …
Michal-Brzezinski May 23, 2026
1c0e7ca
protocol layer correction - frames.go
Michal-Brzezinski May 23, 2026
c231d37
protection package update
Michal-Brzezinski May 23, 2026
0a8a578
cryptoee packet update and little upgrade
Michal-Brzezinski May 23, 2026
05d7c81
protocol little update, hub update+upgrade, client little correction
Michal-Brzezinski May 23, 2026
d3aa01a
corrected client package to make it mor eprofessional and relevant
Michal-Brzezinski May 23, 2026
868a704
working app prototype!!! time to making it better
Michal-Brzezinski May 23, 2026
b1671e7
ultimate protocol refactor
Michal-Brzezinski May 23, 2026
2b4ee67
db and env structure refactor
Michal-Brzezinski May 23, 2026
265cfca
refactor of catalog structure, images moved, readmes edited
Michal-Brzezinski May 23, 2026
9728882
protection package refactor
Michal-Brzezinski May 23, 2026
42d304c
protection package refactor issue fixed
Michal-Brzezinski May 23, 2026
0e1718b
cryptoee package refactor + new tests
Michal-Brzezinski May 23, 2026
db469f5
certmanager package refactor
Michal-Brzezinski May 23, 2026
bd2ceee
Auth package refactor
Michal-Brzezinski May 24, 2026
5bf165c
refactor(hub): unify architecture, fix protocol errors, improve handl…
Michal-Brzezinski May 24, 2026
efab7f3
Happy path and negative tests corrected. Router fix regarding documen…
Michal-Brzezinski May 24, 2026
2395b65
hub full production version - benchamrk test and e2e test corrected, …
Michal-Brzezinski May 24, 2026
3d3b099
test coverage improvement for protocol
Michal-Brzezinski May 24, 2026
8e6b0a6
slightly better test coverage of hub, hub log little fixes
Michal-Brzezinski May 25, 2026
0a105b4
client program start moved to cmd
Michal-Brzezinski May 25, 2026
238c203
litle change to TODO and removed previous main file in client that is…
Michal-Brzezinski May 25, 2026
7a14b8f
little changes in catalog names
Michal-Brzezinski May 25, 2026
b8f4853
CI/CD inproject, deleted previous cover.out with coverage command res…
Michal-Brzezinski May 25, 2026
f7c3e83
Fix CI/CD: reusable workflows + correct wrappers
Michal-Brzezinski May 25, 2026
a5196a3
Final CI/CD setup (clean, simple, production-ready), remove unused bu…
Michal-Brzezinski May 25, 2026
a6ba81d
client refactor - phase 1
Michal-Brzezinski May 25, 2026
ce453fe
async prototype for wails works now - 2nd phase of refactor done
Michal-Brzezinski May 25, 2026
fa4571d
chatting with yourself fix issue
Michal-Brzezinski May 25, 2026
46adb86
better encrypting on local device
Michal-Brzezinski May 25, 2026
13ba5b4
color client cli chat
Michal-Brzezinski May 25, 2026
2e85f38
visual effects
Michal-Brzezinski May 26, 2026
e5006dd
added Kittyprotocol annotation to the banner. Changed error desc in h…
Michal-Brzezinski May 26, 2026
926442b
client ack refactor
Michal-Brzezinski May 26, 2026
f263c6b
connection fileset refactor
Michal-Brzezinski May 26, 2026
d6ff7ce
api auth refactor
Michal-Brzezinski May 26, 2026
5f4f4a3
send/receive flow refactor
Michal-Brzezinski May 26, 2026
691a651
client file refactor
Michal-Brzezinski May 26, 2026
cc81d0f
errors and constants refactor
Michal-Brzezinski May 26, 2026
2a8f85d
chat logic refactor
Michal-Brzezinski May 26, 2026
0add3af
secretstore refactor
Michal-Brzezinski May 26, 2026
193b17b
ui_cli refactor
Michal-Brzezinski May 26, 2026
53307da
full refactor done
Michal-Brzezinski May 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# KittyProtocol Hub address conf - adjust to situtation (given addres is private vm on Azure)
# 20.82.139.232:9999
# -----------------------------
# KittyProtocol configuration
# -----------------------------
KITTY_HUB_ADDR=127.0.0.1:9999

# KittyProtocol Intercept address conf - adjust to situtation (better not to change)
KITTY_INTERCEPT_ADDR=0.0.0.0:9999
KITTY_INTERCEPT_ADDR=0.0.0.0:9999
70 changes: 70 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: CI

on:
push:
branches: [ main, backend/app-chat-logic ]
pull_request:
branches: [ main, backend/app-chat-logic ]

jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-go@v5
with:
go-version: '1.22'
cache: true
cache-dependency-path: go.sum

- name: Go build cache
uses: actions/cache@v4
with:
path: |
~/.cache/go-build
key: ${{ runner.os }}-go-build-${{ hashFiles('**/go.sum') }}

- name: Run golangci-lint
uses: golangci/golangci-lint-action@v7
with:
version: latest
args: --timeout=5m

test-and-build:
runs-on: ubuntu-latest
needs: [ lint ]

steps:
- uses: actions/checkout@v4

- uses: actions/setup-go@v5
with:
go-version: '1.22'
cache: true
cache-dependency-path: go.sum

- name: Go build cache
uses: actions/cache@v4
with:
path: |
~/.cache/go-build
key: ${{ runner.os }}-go-build-${{ hashFiles('**/go.sum') }}

- name: Download modules
run: go mod download

- name: Run tests
run: go test ./... -race -coverprofile=coverage.out -covermode=atomic

- name: Build hub
run: go build -v -o bin/kitty-hub ./cmd/hub

- name: Build client
run: go build -v -o bin/kitty-client ./cmd/client

- name: Upload binaries
uses: actions/upload-artifact@v4
with:
name: kitty-binaries
path: bin/
41 changes: 41 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: Release

on:
push:
tags:
- 'v*.*.*'

jobs:
build-and-release:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- uses: actions/setup-go@v5
with:
go-version: '1.22'
cache: true
cache-dependency-path: go.sum

- name: Go build cache
uses: actions/cache@v4
with:
path: |
~/.cache/go-build
key: ${{ runner.os }}-go-build-${{ hashFiles('**/go.sum') }}

- name: Build hub
run: go build -v -o bin/kitty-hub ./cmd/hub

- name: Build client
run: go build -v -o bin/kitty-client ./cmd/client

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
files: |
bin/kitty-hub
bin/kitty-client
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,9 @@

.env

.structure.txt
.structure.txt

bin/

cover.out
coverage.out
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

# Kitty Protocol

![image](kitty_logo.png)
![image](resources/img/kitty_logo.png)

## Project Overview

Expand All @@ -16,7 +16,7 @@
* **`Attack Resistance`**: Native support for TLS 1.3 and mechanisms preventing Man‑in‑the‑Middle (MitM) and Replay attacks.

### Documentation:
Full protocol documentation is available here: [KittyProtocol.pdf](documentation/KittyProtocol-EN.pdf)
Full protocol documentation is available here: [KittyProtocol.pdf](docs/KittyProtocol-EN.pdf)

---
Authors:
Expand Down
4 changes: 2 additions & 2 deletions README.pl.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

# Kitty Protocol

![image](kitty_logo.png)
![image](resources/img/kitty_logo.png)

## Opis projektu

Expand All @@ -15,7 +15,7 @@
* **`Odporność na ataki`**: Natywne wsparcie dla TLS 1.3 oraz mechanizmy zapobiegające atakom typu Man-in-the-Middle (MitM) i Replay.

### Dokumentacja:
Szczegółowa dokumentacja protokołu znajduje się w dokumencie: [KittyProtocol.pdf](documentation/KittyProtocol.pdf)
Szczegółowa dokumentacja protokołu znajduje się w dokumencie: [KittyProtocol.pdf](docs/KittyProtocol.pdf)

---
Authors:
Expand Down
71 changes: 63 additions & 8 deletions TODO
Original file line number Diff line number Diff line change
@@ -1,9 +1,64 @@
- nawiązanie połączenia pomiędzy użytkownikami już jest po stronie aplikacji !!
- przy prezentowaniu gotowego projektu można pokazać że na warstwie protokołu działa operacja /replay która symuluje ten atak
- TESTY DO NOWEGO CRYPTOEE_TEST
- TESTY OGÓLNIE
- ŁADOWANIE KLUCZY KONWERSACJI Z PLIKU!
- merge
- rozwiązanie problemu z 3 rozmówcami podającymi ten sam sekret - status busy + pojedynczy czat naraz - logika aplikacyjna
- brak mockowania!! zrobic w końcu normalne połączenie z bazą danych i tam przechowywanie, a nie tak jak teraz `internal/auth/auth.go`
- jeżeli ramka PROTOKOŁU pełni obecnie więcej niż jedną funkcję logiczną (jak np. w przypadku operacji /quit i GET_STATUS) to gdy zaimpplementuje się logikę aplikacji to zmienić koniecznie


- info dodatkowe:
jak nie ma usera to gdy pytamy o jego status, to mimo to pokazuje offline gdy pytamy czy jest - brak zdradzania czy user istnieje
- CURRENT_PROJECT do zmiany i ogólnie inne markdowny też
- dać kroki dla dewelopera który ma stestować działanie bazy - jakie komendy, co usunąć itp.

- deweloperom dać znać że sekrety są zapisywane lokalnie w katalogu domowym

CLIENT
======
- forma przechowywania sekretów lokalnie - słabe szyfrowanie chyba bo widać że sekrety są te same. Zamiast tego zastanowić się nad hashowaniem

- !!!!WAŻNE!!! plik ze stałymi (W tym z dokumentacji) aby w kodzie nie używać magicznych liczb, ale konkretnych stałych

- SENSOWNOŚĆ CERTYFIKATÓW!

- Uważać czy wszędzie gdzie trzeba jest:
_ "github.com/lib/pq" !!!!!

- możliwość usunięcia konta poprzez /delete lub /remove z opcją \<user\> i wtedy powinno poprosić o uwierzytelnienie (wpisanie hasła do logowania w ramach zatwerdzenia). Do tej operacji trzeba być zalogowanym to po zakończeniu operacji powinno wyjść jak za pomocą /quit + usunąć rekord z userem z bazy danych

- update cross-networkowych rzeczy (przetestowanie i markdown update)

- kolorowa konsola klienta

- dlaczego [Client: Receive] Parse error: ERR_02: JSON parsing error przy wysyłaniu do samego siebie, powinna być możliwość zablokowania wysyłania do siebie

- TESTY OGÓLNIE - LEPIEJ POMYŚLANE, MOŻĘ JAKOŚ LEPIEJ USTRUKTURYZOWAĆ

- ŁADOWANIE KLUCZY KONWERSACJI Z PLIKU! (opcjonalnie na końcu)

- gotowe pod frontend

- plik cover.out do analizy na przyszłość i do wykrozystania może

UZUPEŁNIĆ DOKUMENTACJE W GITHUB O MEOWSSENGER I W README DAĆ ŻE EOWSSENGER POWERED BY KTTYPROTOCOL CZY COŚ TAKIEGO

- Azure można jako nowe konto dodać i dostajesz chyba 200$ z darmo na 30 dni to można stestować jak się uda

- golang-standards - dostosowanie

- godoc !!! Sporawdzić czy zadziała u nas

- CI/CD
- gwiazdki w cli jak się hasło wpisuje albo nie pokazywać jak się wpisuje w ogóle bo obecnie się wyświetla w konsoli normalnie
- czy komendy typu /fdfsdfdsf nie powinny byćogólnie dostępne, także w gui na przyszłość, żeby gui wołało tylko jakąś komendę np. /status albo /chat <user> itp
- na język angielski zmiana wszystkiego w kodzie


=====================================================================================================================================
Jest jeszcze kilka rzeczy do zrobienia w tym projekcie. Daję listę, którą fajnie byłoby zrealizować:
- dlaczego [Client: Receive] Parse error: ERR_02: JSON parsing error przy wysyłaniu do samego siebie, powinna być możliwość zablokowania wysyłania do siebie (mam logi do takiej sytuacji)
- forma przechowywania sekretów lokalnie - słabe szyfrowanie chyba bo widać że sekrety są te same. Zamiast tego zastanowić się nad hashowaniem
- jaka jest obecnie SENSOWNOŚĆ CERTYFIKATÓW!. zastanowić się nad tym
- możliwość usunięcia konta poprzez /delete lub /remove z opcją \<user\> i wtedy powinno poprosić o uwierzytelnienie (wpisanie hasła do logowania w ramach zatwerdzenia). Do tej operacji trzeba być zalogowanym to po zakończeniu operacji powinno wyjść jak za pomocą /quit + usunąć rekord z userem z bazy danych
- kolorowa konsola klienta w wersji cli
- testy jednostkowe z bardzo dobrym pokryciem
- gwiazdki w cli jak się hasło wpisuje albo nie pokazywać jak się wpisuje w ogóle bo obecnie się wyświetla w konsoli normalnie
- czy komendy typu /command nie powinny być ogólnie dostępne, także w gui na przyszłość, żeby gui wołało tylko jakąś komendę np. /status albo /chat <user> itp pytanie do zasaatnowienia i odpowiedzi. Wiem że sporo tego, ale możesz to podzielić namniejsze etapy którymi będziemy się zajmować teraz po kolei
- authtimer powinien się zaczynać po wybraniu opcji logowania/rejestracji a nie po wystartowaniu aplikacji. Powiniensię restartować przy każdorazowym wybraniu opcji /login bo w ogóle ten timer fl arejestracji chyba nie bardzo ma sens
- komenda /menu zamiast każdorazowo wyświetlać i psuć flow
- brak pokazywania sekretu przy wpisywaniu sekretu
File renamed without changes
51 changes: 36 additions & 15 deletions client/api/ack.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,15 @@ import (
)

// AckEventHandler defines callbacks for delivery acknowledgment events.
// UI layers (CLI, GUI) or application components may subscribe to receive
// notifications about message delivery or timeout.
// UI layers (CLI, GUI) or higher-level application components may subscribe
// to receive notifications about message delivery or timeout.
//
// CONTRACT:
// - OnDelivered(msgID) is called exactly once when MEOW_OK arrives.
// - OnTimeout(msgID) is called exactly once when the timeout expires.
// - A message will NEVER trigger both events.
// - Handlers are invoked synchronously in the caller goroutine.
// - Handlers are invoked synchronously in the goroutine that processes
// the event (no extra goroutines are spawned per handler).
type AckEventHandler interface {
OnDelivered(msgID int64)
OnTimeout(msgID int64)
Expand All @@ -33,16 +34,19 @@ type AckManager struct {
timeout time.Duration
}

// NewAckManager creates a new manager with a default timeout of 5 seconds.
// NewAckManager creates a new manager with a default timeout.
func NewAckManager() *AckManager {
return &AckManager{
pending: make(map[int64]chan struct{}),
timeout: 5 * time.Second,
timeout: defaultAckTimeout,
}
}

// RegisterHandler registers a UI or client component to receive ACK events.
// Handlers are invoked synchronously in the caller goroutine.
// RegisterHandler registers a component to receive ACK events.
// Handlers are invoked synchronously in the event-processing goroutine.
//
// It is safe to call RegisterHandler before or after messages are added,
// but handlers registered after AddPending() may miss earlier events.
func (a *AckManager) RegisterHandler(h AckEventHandler) {
a.mu.Lock()
defer a.mu.Unlock()
Expand All @@ -54,12 +58,13 @@ func (a *AckManager) RegisterHandler(h AckEventHandler) {
// BEHAVIOR:
// - If MEOW_OK arrives → NotifyDelivered() closes the channel.
// - If timeout expires → OnTimeout() is invoked.
// - Only one of these events will fire.
// - Only one of these events will fire for a given msgID.
func (a *AckManager) AddPending(msgID int64) {
ch := make(chan struct{})

a.mu.Lock()
a.pending[msgID] = ch
timeout := a.timeout
a.mu.Unlock()

go func() {
Expand All @@ -68,13 +73,18 @@ func (a *AckManager) AddPending(msgID int64) {
// Delivered — nothing more to do.
return

case <-time.After(a.timeout):
case <-time.After(timeout):
a.mu.Lock()
// Check if still pending (may have been delivered just before timeout).
if _, ok := a.pending[msgID]; ok {
delete(a.pending, msgID)
for _, h := range a.handlers {
handlers := append([]AckEventHandler(nil), a.handlers...)
a.mu.Unlock()

for _, h := range handlers {
h.OnTimeout(msgID)
}
return
}
a.mu.Unlock()
}
Expand All @@ -83,24 +93,35 @@ func (a *AckManager) AddPending(msgID int64) {

// NotifyDelivered is called when MEOW_OK arrives.
// It removes the pending entry and notifies all handlers.
//
// If the message is no longer pending (e.g. timeout already fired),
// this call is a no-op.
func (a *AckManager) NotifyDelivered(msgID int64) {
a.mu.Lock()
ch, ok := a.pending[msgID]
if ok {
delete(a.pending, msgID)
}
handlers := append([]AckEventHandler(nil), a.handlers...)
a.mu.Unlock()

if ok {
close(ch)
for _, h := range a.handlers {
h.OnDelivered(msgID)
}
if !ok {
return
}

// Closing the channel unblocks the timeout goroutine (if still waiting).
close(ch)

for _, h := range handlers {
h.OnDelivered(msgID)
}
}

// RegisterAckHandler is the public API exposed by KittyClient.
// It simply forwards the handler to the underlying AckManager.
//
// This keeps the AckManager internal while exposing a stable interface
// for UI layers (CLI, Wails GUI, tests, etc.).
func (c *KittyClient) RegisterAckHandler(h AckEventHandler) {
c.mu.Lock()
defer c.mu.Unlock()
Expand Down
Loading
Loading