Implement database handshake protocol in RPC layer

- Add ExpectedDB field to RPC Request
- Server validates client's expected DB matches daemon's DB
- Return clear error on mismatch with both paths
- Old clients (no ExpectedDB) still work with warning
- Add Path() method to storage.Storage interface
- Tests verify cross-database connections rejected

Prevents database pollution when client connects to wrong daemon.

Amp-Thread-ID: https://ampcode.com/threads/T-c4454192-39c6-4c67-96a9-675cbfc4db92
Co-authored-by: Amp <amp@ampcode.com>
This commit is contained in:
Steve Yegge
2025-10-21 20:35:44 -07:00
parent e1a445afd2
commit 645d268e43
6 changed files with 158 additions and 3 deletions

View File

@@ -96,9 +96,15 @@ func New(path string) (*SQLiteStorage, error) {
return nil, fmt.Errorf("failed to migrate compacted_at_commit column: %w", err)
}
// Convert to absolute path for consistency
absPath, err := filepath.Abs(path)
if err != nil {
return nil, fmt.Errorf("failed to get absolute path: %w", err)
}
return &SQLiteStorage{
db: db,
dbPath: path,
dbPath: absPath,
}, nil
}
@@ -1862,3 +1868,8 @@ func (s *SQLiteStorage) GetIssueComments(ctx context.Context, issueID string) ([
func (s *SQLiteStorage) Close() error {
return s.db.Close()
}
// Path returns the absolute path to the database file
func (s *SQLiteStorage) Path() string {
return s.dbPath
}