Skip to content

Commit e138225

Browse files
committed
Remove "legacy" credential handler
1 parent ab42cac commit e138225

3 files changed

Lines changed: 10 additions & 92 deletions

File tree

cmd/doubletake/main.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,15 @@ func main() {
8888
// 2. If saved credentials exist, load them and do pair-verify only
8989
// 3. Otherwise, do transient (ephemeral) pairing
9090
needFullPair := *forcePair || *pin != ""
91-
var savedCreds *airplay.SavedCredentials
9291

92+
credStore, err := airplay.NewCredentialStore(*credFile)
93+
if err != nil {
94+
log.Fatalf("failed to load credentials: %v", err)
95+
}
96+
97+
var savedCreds *airplay.SavedCredentials
9398
if !needFullPair {
94-
var err error
95-
savedCreds, err = airplay.LoadCredentials(*credFile)
96-
if err != nil {
97-
log.Printf("warning: failed to load credentials: %v", err)
98-
}
99+
savedCreds = credStore.Lookup(info.DeviceID)
99100
}
100101

101102
if needFullPair {
@@ -113,7 +114,7 @@ func main() {
113114
log.Fatalf("pairing failed: %v", err)
114115
}
115116
// Save credentials for next time
116-
if err := airplay.SaveCredentials(*credFile, client.PairingID, client.PairKeys.Ed25519Public, client.PairKeys.Ed25519Private); err != nil {
117+
if err := credStore.Save(info.DeviceID, client.PairingID, client.PairKeys.Ed25519Public, client.PairKeys.Ed25519Private); err != nil {
117118
log.Printf("warning: failed to save credentials: %v", err)
118119
} else {
119120
log.Printf("credentials saved to %s", *credFile)

internal/airplay/credentials.go

Lines changed: 2 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -26,56 +26,6 @@ func DefaultCredentialsPath() string {
2626
return filepath.Join(dir, "doubletake", "credentials.json")
2727
}
2828

29-
// SaveCredentials writes pairing credentials to disk (legacy single-device format).
30-
func SaveCredentials(path string, pairingID string, pub ed25519.PublicKey, priv ed25519.PrivateKey) error {
31-
creds := SavedCredentials{
32-
PairingID: pairingID,
33-
Ed25519Public: []byte(pub),
34-
Ed25519Seed: priv.Seed(),
35-
}
36-
data, err := json.MarshalIndent(creds, "", " ")
37-
if err != nil {
38-
return fmt.Errorf("marshal credentials: %w", err)
39-
}
40-
if err := os.WriteFile(path, data, 0600); err != nil {
41-
return fmt.Errorf("write credentials: %w", err)
42-
}
43-
return nil
44-
}
45-
46-
// LoadCredentials reads pairing credentials from disk.
47-
// Supports both the legacy single-device format and the multi-device map format
48-
// written by CredentialStore. Returns nil, nil if the file doesn't exist.
49-
func LoadCredentials(path string) (*SavedCredentials, error) {
50-
data, err := os.ReadFile(path)
51-
if err != nil {
52-
if os.IsNotExist(err) {
53-
return nil, nil
54-
}
55-
return nil, fmt.Errorf("read credentials: %w", err)
56-
}
57-
58-
// Try multi-device format first (map[string]*SavedCredentials)
59-
var multi map[string]*SavedCredentials
60-
if err := json.Unmarshal(data, &multi); err == nil && len(multi) > 0 {
61-
for _, creds := range multi {
62-
if creds != nil && creds.PairingID != "" {
63-
return creds, nil
64-
}
65-
}
66-
}
67-
68-
// Fall back to legacy single-device format
69-
var creds SavedCredentials
70-
if err := json.Unmarshal(data, &creds); err != nil {
71-
return nil, fmt.Errorf("unmarshal credentials: %w", err)
72-
}
73-
if creds.PairingID == "" {
74-
return nil, nil
75-
}
76-
return &creds, nil
77-
}
78-
7929
// Ed25519Keys reconstructs the key pair from saved credentials.
8030
func (c *SavedCredentials) Ed25519Keys() (ed25519.PublicKey, ed25519.PrivateKey) {
8131
if len(c.Ed25519Seed) != ed25519.SeedSize {
@@ -105,17 +55,8 @@ func NewCredentialStore(path string) (*CredentialStore, error) {
10555
}
10656
return nil, fmt.Errorf("read credential store: %w", err)
10757
}
108-
// Try multi-device format first
10958
if err := json.Unmarshal(data, &cs.devices); err != nil {
110-
// Fall back to legacy single-device format
111-
var single SavedCredentials
112-
if err2 := json.Unmarshal(data, &single); err2 != nil {
113-
return nil, fmt.Errorf("unmarshal credential store: %w", err)
114-
}
115-
// Store under empty key — will be re-keyed on first successful connect
116-
if single.PairingID != "" {
117-
cs.devices[""] = &single
118-
}
59+
return nil, fmt.Errorf("unmarshal credential store: %w", err)
11960
}
12061
return cs, nil
12162
}
@@ -124,11 +65,7 @@ func NewCredentialStore(path string) (*CredentialStore, error) {
12465
func (cs *CredentialStore) Lookup(deviceID string) *SavedCredentials {
12566
cs.mu.Lock()
12667
defer cs.mu.Unlock()
127-
if creds := cs.devices[deviceID]; creds != nil {
128-
return creds
129-
}
130-
// Check legacy empty-key entry
131-
return cs.devices[""]
68+
return cs.devices[deviceID]
13269
}
13370

13471
// Len returns the number of stored credential entries.
@@ -138,13 +75,6 @@ func (cs *CredentialStore) Len() int {
13875
return len(cs.devices)
13976
}
14077

141-
// Import adds a credential entry without persisting (used for legacy migration at startup).
142-
func (cs *CredentialStore) Import(deviceID string, creds *SavedCredentials) {
143-
cs.mu.Lock()
144-
defer cs.mu.Unlock()
145-
cs.devices[deviceID] = creds
146-
}
147-
14878
// Save stores credentials for a device and persists to disk.
14979
func (cs *CredentialStore) Save(deviceID string, pairingID string, pub ed25519.PublicKey, priv ed25519.PrivateKey) error {
15080
cs.mu.Lock()
@@ -155,10 +85,6 @@ func (cs *CredentialStore) Save(deviceID string, pairingID string, pub ed25519.P
15585
Ed25519Public: []byte(pub),
15686
Ed25519Seed: priv.Seed(),
15787
}
158-
// Remove legacy empty-key entry if we now have a proper key
159-
if deviceID != "" {
160-
delete(cs.devices, "")
161-
}
16288
return cs.persist()
16389
}
16490

internal/daemon/daemon.go

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -111,15 +111,6 @@ func New(cfg Config) (*Daemon, error) {
111111
return nil, fmt.Errorf("load credentials: %w", err)
112112
}
113113

114-
// If the credential store is empty, try importing from the legacy file
115-
if cs.Len() == 0 && cfg.CredFile != "" {
116-
legacyCreds, lerr := airplay.LoadCredentials(cfg.CredFile)
117-
if lerr == nil && legacyCreds != nil {
118-
cs.Import("", legacyCreds)
119-
log.Printf("[daemon] imported legacy credentials from %s", cfg.CredFile)
120-
}
121-
}
122-
123114
return &Daemon{
124115
cfg: cfg,
125116
state: StateIdle,

0 commit comments

Comments
 (0)