Skip to content

Commit 588f3ae

Browse files
committed
return error if our own site_id is passed
Signed-off-by: Somtochi Onyekwere <[email protected]>
1 parent 9e81127 commit 588f3ae

File tree

3 files changed

+28
-14
lines changed

3 files changed

+28
-14
lines changed

core/rs/core/src/db_version.rs

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ pub fn insert_db_version(
202202
insert_db_vrsn: i64,
203203
) -> Result<(), ResultCode> {
204204
unsafe {
205+
// we can get a more recent db_versio
205206
let mut last_db_versions: mem::ManuallyDrop<Box<BTreeMap<Vec<u8>, i64>>> =
206207
mem::ManuallyDrop::new(Box::from_raw(
207208
(*ext_data).lastDbVersions as *mut BTreeMap<Vec<u8>, i64>,
@@ -215,7 +216,16 @@ pub fn insert_db_version(
215216
}
216217

217218
// ensure the site_id exists in the crsql_site_id table
218-
let _ = get_or_set_site_ordinal(ext_data, insert_site_id)?;
219+
let ordinal = get_or_set_site_ordinal(ext_data, insert_site_id)?;
220+
if ordinal == 0 {
221+
// we manage our own db_version internally but only error if we get a bigger db_version
222+
// cause we can get our own rows from other nodes but the version should never be greater than our own.
223+
let db_version = (*ext_data).dbVersion;
224+
if insert_db_vrsn > db_version {
225+
return Err(ResultCode::ERROR);
226+
}
227+
return Ok(());
228+
}
219229

220230
let bind_result = (*ext_data)
221231
.pSetDbVersionStmt
@@ -248,11 +258,10 @@ pub unsafe fn get_or_set_site_ordinal(
248258
ext_data: *mut crsql_ExtData,
249259
site_id: &[u8],
250260
) -> Result<i64, ResultCode> {
251-
let bind_result = (*ext_data).pSelectSiteIdOrdinalStmt.bind_blob(
252-
1,
253-
site_id,
254-
sqlite::Destructor::STATIC,
255-
);
261+
let bind_result =
262+
(*ext_data)
263+
.pSelectSiteIdOrdinalStmt
264+
.bind_blob(1, site_id, sqlite::Destructor::STATIC);
256265

257266
if let Err(rc) = bind_result {
258267
reset_cached_stmt((*ext_data).pSelectSiteIdOrdinalStmt)?;
@@ -269,11 +278,10 @@ pub unsafe fn get_or_set_site_ordinal(
269278
reset_cached_stmt((*ext_data).pSelectSiteIdOrdinalStmt)?;
270279
// site id had no ordinal yet.
271280
// set one and return the ordinal.
272-
let bind_result = (*ext_data).pSetSiteIdOrdinalStmt.bind_blob(
273-
1,
274-
site_id,
275-
sqlite::Destructor::STATIC,
276-
);
281+
let bind_result =
282+
(*ext_data)
283+
.pSetSiteIdOrdinalStmt
284+
.bind_blob(1, site_id, sqlite::Destructor::STATIC);
277285

278286
if let Err(rc) = bind_result {
279287
reset_cached_stmt((*ext_data).pSetSiteIdOrdinalStmt)?;
@@ -301,4 +309,4 @@ pub unsafe fn get_or_set_site_ordinal(
301309
return Err(rc);
302310
}
303311
}
304-
}
312+
}

py/correctness/tests/test_cl_triggers.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
from pprint import pprint
1818
import pytest
1919

20-
def create_db():
21-
c = connect(":memory:")
20+
def create_db(db_file=None):
21+
if db_file is None:
22+
db_file = ":memory:"
23+
c = connect(db_file)
2224
c.execute("CREATE TABLE foo (a INTEGER PRIMARY KEY NOT NULL, b INTEGER) STRICT;")
2325
c.execute("SELECT crsql_as_crr('foo')")
2426
c.commit()

py/correctness/tests/test_dbversion.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,5 +239,9 @@ def test_site_id_ordinal_is_set_and_updated():
239239
c1.execute("SELECT crsql_set_db_version(?, ?)", (bytes(other_site_id), 2))
240240
assert c1.execute("SELECT db_version from crsql_db_versions where site_id = ?", (bytes(other_site_id),)).fetchone()[0] == 5
241241

242+
# setting our own site_id should error
243+
with pytest.raises(sqlite3.Error):
244+
c1.execute("SELECT crsql_set_db_version(?, ?)", (bytes(c1_site_id), 6))
245+
242246
close(c1)
243247
close(c2)

0 commit comments

Comments
 (0)