feat: device label defaults to Build.MODEL; 3-word passphrase token
- 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 <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package me.hgsky.synq.data
|
package me.hgsky.synq.data
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.os.Build
|
||||||
import androidx.datastore.preferences.core.edit
|
import androidx.datastore.preferences.core.edit
|
||||||
import androidx.datastore.preferences.core.intPreferencesKey
|
import androidx.datastore.preferences.core.intPreferencesKey
|
||||||
import androidx.datastore.preferences.core.stringPreferencesKey
|
import androidx.datastore.preferences.core.stringPreferencesKey
|
||||||
@@ -28,7 +29,7 @@ class SettingsRepository(private val context: Context) {
|
|||||||
SynqSettings(
|
SynqSettings(
|
||||||
serverUrl = prefs[KEY_URL] ?: "http://jeeves.mother:8765",
|
serverUrl = prefs[KEY_URL] ?: "http://jeeves.mother:8765",
|
||||||
token = prefs[KEY_TOKEN] ?: "",
|
token = prefs[KEY_TOKEN] ?: "",
|
||||||
deviceLabel = prefs[KEY_DEVICE] ?: "android",
|
deviceLabel = prefs[KEY_DEVICE] ?: Build.MODEL,
|
||||||
syncIntervalMinutes = prefs[KEY_INTERVAL] ?: 15,
|
syncIntervalMinutes = prefs[KEY_INTERVAL] ?: 15,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ def _load_token() -> str:
|
|||||||
logger.info("synq token loaded from %s", token_file)
|
logger.info("synq token loaded from %s", token_file)
|
||||||
return _token_cache
|
return _token_cache
|
||||||
|
|
||||||
generated = secrets.token_hex(32)
|
generated = _generate_passphrase()
|
||||||
token_file.parent.mkdir(parents=True, exist_ok=True)
|
token_file.parent.mkdir(parents=True, exist_ok=True)
|
||||||
token_file.write_text(generated)
|
token_file.write_text(generated)
|
||||||
logger.info("")
|
logger.info("")
|
||||||
@@ -61,6 +61,72 @@ def _load_token() -> str:
|
|||||||
return _token_cache
|
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:
|
def get_store() -> IdempotencyStore:
|
||||||
global _store
|
global _store
|
||||||
|
|||||||
Reference in New Issue
Block a user