Skip to content

Commit 00da49c

Browse files
authored
Pass remote encryption key if provided (#82)
depends on tursodatabase/libsql#2175
2 parents 52b6db3 + f4c67bf commit 00da49c

File tree

3 files changed

+42
-12
lines changed

3 files changed

+42
-12
lines changed

example/remote/main.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,16 @@ func run() (err error) {
2323
return fmt.Errorf("TURSO_URL environment variable not set")
2424
}
2525

26+
sep := "?"
2627
authToken := os.Getenv("TURSO_AUTH_TOKEN")
2728
if authToken != "" {
28-
dbUrl += "?authToken=" + authToken
29+
dbUrl += sep + "authToken=" + authToken
30+
sep = "&"
31+
}
32+
33+
remoteEncryptionKey := os.Getenv("TURSO_REMOTE_ENCRYPTION_KEY")
34+
if remoteEncryptionKey != "" {
35+
dbUrl += sep + "remoteEncryptionKey=" + remoteEncryptionKey
2936
}
3037

3138
// Open database connection

example/sync/main.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,19 @@ func run() (err error) {
1515
return fmt.Errorf("TURSO_URL environment variable not set")
1616
}
1717
authToken := os.Getenv("TURSO_AUTH_TOKEN")
18+
remoteEncryptionKey := os.Getenv("TURSO_REMOTE_ENCRYPTION_KEY")
1819
dir, err := os.MkdirTemp("", "libsql-*")
1920
if err != nil {
2021
return err
2122
}
2223
defer os.RemoveAll(dir)
2324

24-
connector, err := libsql.NewEmbeddedReplicaConnector(dir+"/test.db", primaryUrl, libsql.WithAuthToken(authToken))
25+
opts := []libsql.Option{libsql.WithAuthToken(authToken)}
26+
if remoteEncryptionKey != "" {
27+
opts = append(opts, libsql.WithRemoteEncryption(remoteEncryptionKey))
28+
}
29+
30+
connector, err := libsql.NewEmbeddedReplicaConnector(dir+"/test.db", primaryUrl, opts...)
2531
if err != nil {
2632
return err
2733
}
@@ -44,9 +50,14 @@ func run() (err error) {
4450
}
4551
}()
4652

53+
msg := "1. Sync with primary"
54+
if remoteEncryptionKey != "" {
55+
msg += " (encrypted db)"
56+
}
57+
4758
for {
4859
fmt.Println("What would you like to do?")
49-
fmt.Println("1. Sync with primary")
60+
fmt.Println(msg)
5061
fmt.Println("2. Select from test table")
5162
fmt.Println("3. Insert row to test table")
5263
fmt.Println("4. Exit")

libsql.go

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@ func init() {
4141
}
4242

4343
type config struct {
44-
authToken *string
45-
readYourWrites *bool
46-
encryptionKey *string
44+
authToken *string
45+
readYourWrites *bool
46+
encryptionKey *string
4747
remoteEncryptionKey *string
48-
syncInterval *time.Duration
48+
syncInterval *time.Duration
4949
}
5050

5151
type Option interface {
@@ -217,8 +217,9 @@ func (d driver) OpenConnector(dbAddress string) (sqldriver.Connector, error) {
217217
fallthrough
218218
case "libsql":
219219
authToken := u.Query().Get("authToken")
220+
remoteEncryptionKey := u.Query().Get("remoteEncryptionKey")
220221
u.RawQuery = ""
221-
return openRemoteConnector(u.String(), authToken)
222+
return openRemoteConnector(u.String(), authToken, remoteEncryptionKey)
222223
}
223224
return nil, fmt.Errorf("unsupported URL scheme: %s\nThis driver supports only URLs that start with libsql://, file:, https:// or http://", u.Scheme)
224225
}
@@ -242,8 +243,8 @@ func openLocalConnector(dbPath string) (*Connector, error) {
242243
return &Connector{nativeDbPtr: nativeDbPtr}, nil
243244
}
244245

245-
func openRemoteConnector(primaryUrl, authToken string) (*Connector, error) {
246-
nativeDbPtr, err := libsqlOpenRemote(primaryUrl, authToken)
246+
func openRemoteConnector(primaryUrl, authToken, remoteEncryptionKey string) (*Connector, error) {
247+
nativeDbPtr, err := libsqlOpenRemote(primaryUrl, authToken, remoteEncryptionKey)
247248
if err != nil {
248249
return nil, err
249250
}
@@ -346,15 +347,26 @@ func libsqlOpenLocal(dataSourceName string) (C.libsql_database_t, error) {
346347
return db, nil
347348
}
348349

349-
func libsqlOpenRemote(url, authToken string) (C.libsql_database_t, error) {
350+
func libsqlOpenRemote(url, authToken, remoteEncryptionKey string) (C.libsql_database_t, error) {
350351
connectionString := C.CString(url)
351352
defer C.free(unsafe.Pointer(connectionString))
352353
authTokenNativeString := C.CString(authToken)
353354
defer C.free(unsafe.Pointer(authTokenNativeString))
354355

356+
var remoteEncryptionKeyNativeString *C.char
357+
if remoteEncryptionKey != "" {
358+
remoteEncryptionKeyNativeString = C.CString(remoteEncryptionKey)
359+
defer C.free(unsafe.Pointer(remoteEncryptionKeyNativeString))
360+
}
361+
355362
var db C.libsql_database_t
356363
var errMsg *C.char
357-
statusCode := C.libsql_open_remote(connectionString, authTokenNativeString, &db, &errMsg)
364+
var statusCode C.int
365+
if remoteEncryptionKey == "" {
366+
statusCode = C.libsql_open_remote(connectionString, authTokenNativeString, &db, &errMsg)
367+
} else {
368+
statusCode = C.libsql_open_remote_with_remote_encryption(connectionString, authTokenNativeString, remoteEncryptionKeyNativeString, &db, &errMsg)
369+
}
358370
if statusCode != 0 {
359371
return nil, libsqlError(fmt.Sprint("failed to open remote database ", url), statusCode, errMsg)
360372
}

0 commit comments

Comments
 (0)