nakarte

Source code of https://map.sikmir.ru (fork)
git clone git://git.sikmir.ru/nakarte
Log | Files | Refs | LICENSE

commit 382d357671a8b93eb61c42a87aaf46f133905787
parent a3a1dc28b1a5fb0b8ac65657456d5738e5219948
Author: Sergej Orlov <wladimirych@gmail.com>
Date:   Wed,  7 Jan 2026 14:35:06 +0100

tracks[garmin]: remove csrf token, allow modern URLs

Diffstat:
Msrc/lib/leaflet.control.track-list/lib/services/baseService.js | 8--------
Msrc/lib/leaflet.control.track-list/lib/services/garmin.js | 46+++++-----------------------------------------
Mtest/track_load_data/testcases/garmin_connect_activity_not_exists.json | 8+++++---
Mtest/track_load_data/testcases/garmin_connect_activity_private.json | 12++++++++----
Mtest/track_load_data/testcases/garmin_connect_activity_with_title.json | 7++++---
Mtest/track_load_data/testcases/garmin_connect_activity_without_title.json | 5++++-
Mtest/track_load_data/testcases/garmin_connect_route_not_exists.json | 5++++-
Mtest/track_load_data/testcases/garmin_connect_route_private.json | 8+++++---
Mtest/track_load_data/testcases/garmin_connect_route_with_title.json | 7++++---
9 files changed, 39 insertions(+), 67 deletions(-)

diff --git a/src/lib/leaflet.control.track-list/lib/services/baseService.js b/src/lib/leaflet.control.track-list/lib/services/baseService.js @@ -17,18 +17,10 @@ class BaseService { throw new Error('Method not implemented'); } - async prepare() { - return null; - } - async geoData() { if (!this.isOurUrl()) { throw new Error('Unsupported url'); } - const error = await this.prepare(); - if (error) { - return [{name: this.origUrl, error: error}]; - } const requests = this.requestOptions().map((it) => fetch(it.url, it.options)); let responses; try { diff --git a/src/lib/leaflet.control.track-list/lib/services/garmin.js b/src/lib/leaflet.control.track-list/lib/services/garmin.js @@ -1,5 +1,4 @@ import {urlViaCorsProxy} from '~/lib/CORSProxy'; -import {fetch} from '~/lib/xhr-promise'; import BaseService from './baseService'; @@ -9,29 +8,6 @@ class GarminBase extends BaseService { isOurUrl() { return this.urlRe.test(this.origUrl); } - - async prepare() { - let response; - try { - response = await fetch(urlViaCorsProxy(this.origUrl + '?' + Date.now()), { - isResponseSuccess: (xhr) => xhr.status === 200, - }); - } catch { - return 'NETWORK'; - } - let dom; - try { - dom = new DOMParser().parseFromString(response.response, 'text/html'); - } catch { - return 'NETWORK'; - } - const token = dom.querySelector('meta[name="csrf-token"]')?.content; - if (!token) { - return 'NETWORK'; - } - this.token = token; - return null; - } } function isResponseSuccess(xhr) { @@ -39,7 +15,7 @@ function isResponseSuccess(xhr) { } class GarminRoute extends GarminBase { - urlRe = /^https?:\/\/connect\.garmin\.com\/modern\/course\/(\d+)/u; + urlRe = /^https?:\/\/connect\.garmin\.com\/(?:modern|app)\/course\/(\d+)/u; requestOptions() { const m = this.urlRe.exec(this.origUrl); @@ -48,11 +24,7 @@ class GarminRoute extends GarminBase { return [ { url: urlViaCorsProxy(`https://connect.garmin.com/gc-api/course-service/course/${trackId}`), - options: { - responseType: 'json', - headers: [['connect-csrf-token', this.token]], - isResponseSuccess, - }, + options: {responseType: 'json', isResponseSuccess}, }, ]; } @@ -94,7 +66,7 @@ class GarminRoute extends GarminBase { } class GarminActivity extends GarminBase { - urlRe = /^https?:\/\/connect\.garmin\.com\/modern\/activity\/(\d+)/u; + urlRe = /^https?:\/\/connect\.garmin\.com\/(?:modern|app)\/activity\/(\d+)/u; requestOptions() { const m = this.urlRe.exec(this.origUrl); @@ -103,19 +75,11 @@ class GarminActivity extends GarminBase { return [ { url: urlViaCorsProxy(`https://connect.garmin.com/gc-api/activity-service/activity/${trackId}`), - options: { - responseType: 'json', - headers: [['connect-csrf-token', this.token]], - isResponseSuccess, - }, + options: {responseType: 'json', isResponseSuccess}, }, { url: urlViaCorsProxy(`https://connect.garmin.com/gc-api/activity-service/activity/${trackId}/details`), - options: { - responseType: 'json', - headers: [['connect-csrf-token', this.token]], - isResponseSuccess, - }, + options: {responseType: 'json', isResponseSuccess}, }, ]; } diff --git a/test/track_load_data/testcases/garmin_connect_activity_not_exists.json b/test/track_load_data/testcases/garmin_connect_activity_not_exists.json @@ -1,4 +1,7 @@ { - "query": ["https://connect.garmin.com/modern/activity/53469008380"], + "query": [ + "https://connect.garmin.com/modern/activity/53469008380", + "https://connect.garmin.com/app/activity/53469008380" + ], "geodata": [{"error":"Garmin Connect activity does not exist"}] -} -\ No newline at end of file +} diff --git a/test/track_load_data/testcases/garmin_connect_activity_private.json b/test/track_load_data/testcases/garmin_connect_activity_private.json @@ -1,4 +1,9 @@ { - "query": ["https://connect.garmin.com/modern/activity/5346927324", "https://connect.garmin.com/modern/activity/5346934574", "https://connect.garmin.com/modern/activity/5346935811"], - "geodata": [{"error":"Garmin Connect user disabled viewing this activity"}] -} -\ No newline at end of file + "query": [ + "https://connect.garmin.com/modern/activity/5346927324", + "https://connect.garmin.com/app/activity/5346927324", + "https://connect.garmin.com/app/activity/5346934574", + "https://connect.garmin.com/app/activity/5346935811" + ], + "geodata": [{"error": "Garmin Connect user disabled viewing this activity"}] +} diff --git a/test/track_load_data/testcases/garmin_connect_activity_with_title.json b/test/track_load_data/testcases/garmin_connect_activity_with_title.json @@ -1,9 +1,10 @@ { "query": [ "https://connect.garmin.com/modern/activity/5346900838", - "https://connect.garmin.com/modern/activity/5346900838?a=1", - "http://connect.garmin.com/modern/activity/5346900838", - "https://connect.garmin.com/modern/activity/5346900838/" + "https://connect.garmin.com/app/activity/5346900838", + "https://connect.garmin.com/app/activity/5346900838?a=1", + "http://connect.garmin.com/app/activity/5346900838", + "https://connect.garmin.com/app/activity/5346900838/" ], "geodata": [ { diff --git a/test/track_load_data/testcases/garmin_connect_activity_without_title.json b/test/track_load_data/testcases/garmin_connect_activity_without_title.json @@ -1,5 +1,8 @@ { - "query": ["https://connect.garmin.com/modern/activity/5346914204"], + "query": [ + "https://connect.garmin.com/modern/activity/5346914204", + "https://connect.garmin.com/app/activity/5346914204" + ], "geodata": [ { "name": "Uncategorized", diff --git a/test/track_load_data/testcases/garmin_connect_route_not_exists.json b/test/track_load_data/testcases/garmin_connect_route_not_exists.json @@ -1,4 +1,7 @@ { - "query": ["https://connect.garmin.com/modern/course/3928338311"], + "query": [ + "https://connect.garmin.com/modern/course/3928338311", + "https://connect.garmin.com/app/course/3928338311" + ], "geodata": [{"error": "Garmin Connect route does not exist"}] } diff --git a/test/track_load_data/testcases/garmin_connect_route_private.json b/test/track_load_data/testcases/garmin_connect_route_private.json @@ -1,4 +1,7 @@ { - "query": ["https://connect.garmin.com/modern/course/39283823"], + "query": [ + "https://connect.garmin.com/modern/course/39283823", + "https://connect.garmin.com/app/course/39283823" + ], "geodata": [{"error":"Garmin Connect user disabled viewing this route"}] -} -\ No newline at end of file +} diff --git a/test/track_load_data/testcases/garmin_connect_route_with_title.json b/test/track_load_data/testcases/garmin_connect_route_with_title.json @@ -1,9 +1,10 @@ { "query": [ "https://connect.garmin.com/modern/course/39283383", - "https://connect.garmin.com/modern/course/39283383?a=1", - "http://connect.garmin.com/modern/course/39283383", - "https://connect.garmin.com/modern/course/39283383/" + "https://connect.garmin.com/app/course/39283383", + "https://connect.garmin.com/app/course/39283383?a=1", + "http://connect.garmin.com/app/course/39283383", + "https://connect.garmin.com/app/course/39283383/" ], "geodata": [ {