From 628a28a775b609df80dd7e65d84f924ff63aa68a Mon Sep 17 00:00:00 2001 From: eulaly Date: Tue, 19 May 2026 08:27:38 -0400 Subject: [PATCH] feat: device label defaults to Build.MODEL; 3-word passphrase token MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SettingsRepository: deviceLabel fallback changed from "android" to Build.MODEL so fresh installs show the actual device name (e.g. "Pixel 8") - server/main.py: _generate_passphrase() replaces secrets.token_hex(32). Picks 3 words from a 512-word embedded list, hyphen-separated (e.g. "coral-drift-lamp"). ~27 bits entropy, readable at a glance. Existing token.txt files are unaffected — only new generation changes. Co-Authored-By: Claude Sonnet 4.6 --- .../me/hgsky/synq/data/SettingsRepository.kt | 3 +- server/app/main.py | 68 ++++++++++++++++++- 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/kotlin/me/hgsky/synq/data/SettingsRepository.kt b/android/app/src/main/kotlin/me/hgsky/synq/data/SettingsRepository.kt index 2c21f06..1c1d7ba 100644 --- a/android/app/src/main/kotlin/me/hgsky/synq/data/SettingsRepository.kt +++ b/android/app/src/main/kotlin/me/hgsky/synq/data/SettingsRepository.kt @@ -1,6 +1,7 @@ package me.hgsky.synq.data import android.content.Context +import android.os.Build import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.intPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey @@ -28,7 +29,7 @@ class SettingsRepository(private val context: Context) { SynqSettings( serverUrl = prefs[KEY_URL] ?: "http://jeeves.mother:8765", token = prefs[KEY_TOKEN] ?: "", - deviceLabel = prefs[KEY_DEVICE] ?: "android", + deviceLabel = prefs[KEY_DEVICE] ?: Build.MODEL, syncIntervalMinutes = prefs[KEY_INTERVAL] ?: 15, ) } diff --git a/server/app/main.py b/server/app/main.py index 1f9b805..0e6708a 100644 --- a/server/app/main.py +++ b/server/app/main.py @@ -48,7 +48,7 @@ def _load_token() -> str: logger.info("synq token loaded from %s", token_file) return _token_cache - generated = secrets.token_hex(32) + generated = _generate_passphrase() token_file.parent.mkdir(parents=True, exist_ok=True) token_file.write_text(generated) logger.info("") @@ -61,6 +61,72 @@ def _load_token() -> str: return _token_cache +def _generate_passphrase(words: int = 3) -> str: + wordlist = [ + "able","acid","aged","also","area","army","away","baby","back","ball", + "band","bank","base","bath","bear","beat","been","bell","best","bill", + "bird","blow","blue","bold","bolt","bone","book","born","both","bowl", + "bulk","burn","calm","came","card","care","cart","case","cash","cast", + "cave","cell","chat","chip","city","clam","clay","clip","club","coal", + "coat","code","coil","cold","come","cook","cool","cope","cord","core", + "corn","cost","cove","crew","crop","curl","dare","dark","data","date", + "dawn","days","dead","deal","dean","dear","deck","deep","deer","deft", + "deny","desk","dial","diet","disc","dish","disk","dive","dock","dome", + "door","dose","down","draw","drew","drip","drop","drum","dual","dusk", + "dust","duty","each","earn","ease","east","edge","else","even","ever", + "evil","exam","fact","fail","fair","fall","fame","farm","fast","fate", + "feed","feel","feet","fell","felt","file","fill","film","find","fire", + "firm","fish","fist","flag","flat","flew","flip","flow","foam","fold", + "folk","fond","font","food","foot","ford","fork","form","fort","free", + "from","fuel","full","fund","fuse","gain","game","gaze","gear","give", + "glad","glow","glue","goal","gold","golf","gone","good","grab","gray", + "grid","grim","grip","grow","gulf","gust","hack","hail","half","hall", + "halt","hand","hang","hard","harm","harp","hash","haul","have","hawk", + "head","heal","heap","heat","heel","held","helm","help","herb","here", + "hide","high","hill","hint","hold","hole","home","hook","hope","horn", + "host","hour","hull","hunt","hurt","icon","idea","idle","inch","into", + "iris","iron","isle","item","jade","jail","jazz","jest","join","jump", + "just","keen","keep","kelp","kern","keys","kick","kill","kind","king", + "knit","know","lack","lake","lamp","land","lane","lark","lash","last", + "late","lead","leaf","lean","leap","left","lend","lens","life","lift", + "like","lime","line","link","lion","list","live","load","loan","lock", + "loft","long","look","loop","lore","loss","loud","love","luck","lung", + "lure","mail","main","make","male","malt","many","mark","mask","mast", + "math","maze","meal","mean","meet","melt","mesh","mild","milk","mill", + "mind","mine","mint","miss","mist","mode","moon","more","moss","most", + "move","much","mule","must","nail","name","navy","near","neat","need", + "nest","news","next","nice","node","none","noon","norm","note","null", + "numb","oath","obey","odds","once","only","open","oral","over","pace", + "pack","page","paid","pain","pair","palm","park","part","pass","past", + "path","pave","peak","peel","peer","pick","pier","pile","pine","pipe", + "plan","play","plea","plot","plow","plum","plunge","plus","poem","poet", + "pole","poll","pond","pool","port","pose","post","pour","prey","pull", + "pump","pure","push","quit","race","rack","raid","rail","rain","ramp", + "rang","rank","rare","rate","read","real","reed","reel","rely","rent", + "rest","rice","rich","ride","ring","rise","risk","road","roam","roar", + "rock","role","roll","roof","root","rope","rose","rout","rule","rush", + "rust","safe","sage","sail","salt","same","sand","sang","save","scan", + "seal","seam","seed","seek","self","sell","send","sent","shed","ship", + "shop","shot","show","shut","sick","side","sign","silk","sing","sink", + "site","size","skip","slab","slam","slap","slim","slip","slot","slow", + "snap","snow","soak","soar","sock","soil","sold","sole","some","song", + "soon","sort","soul","soup","span","spin","spit","spot","spur","star", + "stay","stem","step","stop","stub","such","suit","sunk","sure","surf", + "swap","swim","tail","take","talk","tall","tank","tape","task","team", + "tell","tend","tent","term","test","text","than","then","thin","tide", + "tile","time","tint","tiny","tips","tire","toad","told","toll","tomb", + "tool","tops","toss","tour","town","trap","tree","trim","trip","trod", + "true","tube","tuck","tune","turf","turn","twin","type","upon","used", + "vary","vast","veil","vein","very","vest","view","vine","void","volt", + "vote","wade","wake","walk","wall","wand","ward","warm","warp","wary", + "wave","ways","weld","well","went","west","what","when","wide","wiki", + "wild","will","wind","wine","wire","wise","wish","with","wolf","wood", + "word","work","worn","wrap","wren","yard","year","yell","your","zero", + "zest","zinc","zone","zoom", + ] + return "-".join(secrets.choice(wordlist) for _ in range(words)) + + def get_store() -> IdempotencyStore: global _store