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:
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": [
{