Check client version in SyncCollectionHandler.meta
When the server sends an error response (4xx/5xx), the desktop client displays "user friendly" error messages instead of the actual response body.
This commit is contained in:
parent
0b9f30adea
commit
6b9aaa0a6c
@ -42,33 +42,6 @@ from anki.consts import REM_CARD, REM_NOTE
|
|||||||
from ankisyncd.users import SimpleUserManager, SqliteUserManager
|
from ankisyncd.users import SimpleUserManager, SqliteUserManager
|
||||||
|
|
||||||
|
|
||||||
def old_client(cv):
|
|
||||||
if not cv:
|
|
||||||
return False
|
|
||||||
|
|
||||||
note = {"alpha": 0, "beta": 0}
|
|
||||||
client, version, platform = cv.split(',')
|
|
||||||
|
|
||||||
for name in note.keys():
|
|
||||||
if name in version:
|
|
||||||
vs = version.split(name)
|
|
||||||
version = vs[0]
|
|
||||||
note[name] = int(vs[-1])
|
|
||||||
|
|
||||||
version_int = [int(x) for x in version.split('.')]
|
|
||||||
|
|
||||||
if client == 'ankidesktop':
|
|
||||||
return version_int < [2, 0, 27]
|
|
||||||
elif client == 'ankidroid':
|
|
||||||
if version_int == [2, 3]:
|
|
||||||
if note["alpha"]:
|
|
||||||
return note["alpha"] < 4
|
|
||||||
else:
|
|
||||||
return version_int < [2, 2, 3]
|
|
||||||
else: # unknown client, assume current version
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SyncCollectionHandler(anki.sync.Syncer):
|
class SyncCollectionHandler(anki.sync.Syncer):
|
||||||
operations = ['meta', 'applyChanges', 'start', 'applyGraves', 'chunk', 'applyChunk', 'sanityCheck2', 'finish']
|
operations = ['meta', 'applyChanges', 'start', 'applyGraves', 'chunk', 'applyChunk', 'sanityCheck2', 'finish']
|
||||||
@ -77,7 +50,39 @@ class SyncCollectionHandler(anki.sync.Syncer):
|
|||||||
# So that 'server' (the 3rd argument) can't get set
|
# So that 'server' (the 3rd argument) can't get set
|
||||||
anki.sync.Syncer.__init__(self, col)
|
anki.sync.Syncer.__init__(self, col)
|
||||||
|
|
||||||
def meta(self):
|
@staticmethod
|
||||||
|
def _old_client(cv):
|
||||||
|
if not cv:
|
||||||
|
return False
|
||||||
|
|
||||||
|
note = {"alpha": 0, "beta": 0, "rc": 0}
|
||||||
|
client, version, platform = cv.split(',')
|
||||||
|
|
||||||
|
for name in note.keys():
|
||||||
|
if name in version:
|
||||||
|
vs = version.split(name)
|
||||||
|
version = vs[0]
|
||||||
|
note[name] = int(vs[-1])
|
||||||
|
|
||||||
|
version_int = [int(x) for x in version.split('.')]
|
||||||
|
|
||||||
|
if client == 'ankidesktop':
|
||||||
|
return version_int < [2, 0, 27]
|
||||||
|
elif client == 'ankidroid':
|
||||||
|
if version_int == [2, 3]:
|
||||||
|
if note["alpha"]:
|
||||||
|
return note["alpha"] < 4
|
||||||
|
else:
|
||||||
|
return version_int < [2, 2, 3]
|
||||||
|
else: # unknown client, assume current version
|
||||||
|
return False
|
||||||
|
|
||||||
|
def meta(self, v=None, cv=None):
|
||||||
|
if self._old_client(cv):
|
||||||
|
return Response(status=501) # client needs upgrade
|
||||||
|
if v > SYNC_VER:
|
||||||
|
return {"cont": False, "msg": "Your client is using unsupported sync protocol ({}, supported version: {})".format(v, SYNC_VER)}
|
||||||
|
|
||||||
# Make sure the media database is open!
|
# Make sure the media database is open!
|
||||||
if self.col.media.db is None:
|
if self.col.media.db is None:
|
||||||
self.col.media.connect()
|
self.col.media.connect()
|
||||||
@ -583,16 +588,8 @@ class SyncApp:
|
|||||||
session.skey = req.POST['s']
|
session.skey = req.POST['s']
|
||||||
if 'v' in data:
|
if 'v' in data:
|
||||||
session.version = data['v']
|
session.version = data['v']
|
||||||
del data['v']
|
|
||||||
if 'cv' in data:
|
if 'cv' in data:
|
||||||
session.client_version = data['cv']
|
session.client_version = data['cv']
|
||||||
del data['cv']
|
|
||||||
|
|
||||||
if session.version < SYNC_VER or old_client(session.client_version):
|
|
||||||
return Response(status=501) # client needs upgrade
|
|
||||||
|
|
||||||
if session.version > SYNC_VER:
|
|
||||||
return Response(status=500, body="Your client is using unsupported sync protocol ({}, supported version: {})".format(session.version, SYNC_VER))
|
|
||||||
|
|
||||||
self.session_manager.save(hkey, session)
|
self.session_manager.save(hkey, session)
|
||||||
session = self.session_manager.load(hkey, self.create_session)
|
session = self.session_manager.load(hkey, self.create_session)
|
||||||
@ -605,7 +602,7 @@ class SyncApp:
|
|||||||
result = self._execute_handler_method_in_thread(url, data, session)
|
result = self._execute_handler_method_in_thread(url, data, session)
|
||||||
|
|
||||||
# If it's a complex data type, we convert it to JSON
|
# If it's a complex data type, we convert it to JSON
|
||||||
if type(result) not in (str, bytes):
|
if type(result) not in (str, bytes, Response):
|
||||||
result = json.dumps(result)
|
result = json.dumps(result)
|
||||||
|
|
||||||
if url in self.posthooks:
|
if url in self.posthooks:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user