From 859d67627b32e255aa32587d0a02288e3eb20cfc Mon Sep 17 00:00:00 2001 From: Locness Date: Fri, 5 May 2023 19:37:59 +0200 Subject: [PATCH 1/2] :bricks: Patch Capacitor de Fetch et XMLHttpRequest pour contourner restrictions CORS --- capacitor.config.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/capacitor.config.ts b/capacitor.config.ts index 5f931c3..358fca1 100755 --- a/capacitor.config.ts +++ b/capacitor.config.ts @@ -19,6 +19,11 @@ const config: CapacitorConfig = { Keyboard: { resize: KeyboardResize.Ionic, }, + "CapacitorHttp": { + // https://capacitorjs.com/docs/apis/http#configuration + // patch Fetch and XHR to use native libs without CORS restrictions + "enabled": true + } }, /* server: { url: "http://192.168.1.22:8100", From c11f91a94af98dda45813c70155f49424c151dcb Mon Sep 17 00:00:00 2001 From: Locness Date: Fri, 5 May 2023 19:40:27 +0200 Subject: [PATCH 2/2] :recycle: Ajout variable globale pour URL CORS ou vide si plateforme native --- src/functions/fetch/GetHomeworks.js | 2 +- src/functions/fetch/GetNews.js | 2 +- src/functions/fetch/GetTimetable.js | 2 +- src/functions/fetch/GetUserData.js | 4 ++-- src/main.ts | 4 ++++ src/views/login/pronote/SchoolSelection.vue | 5 +++-- src/views/login/skolengo/LoginForm.vue | 5 +++-- src/views/settings/LogView.vue | 3 ++- 8 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/functions/fetch/GetHomeworks.js b/src/functions/fetch/GetHomeworks.js index f21e43c..685b0fe 100755 --- a/src/functions/fetch/GetHomeworks.js +++ b/src/functions/fetch/GetHomeworks.js @@ -40,7 +40,7 @@ async function getSkolengoHomeWork(dateFrom, dateTo, forceReload) { try { const token = localStorage.getItem('token'); const ent = localStorage.getItem('ent'); - const etudiant = new Kdecole(token, ApiVersion[ent], 0, 'https://cors.api.getpapillon.xyz/' + ApiUrl[ent]) + const etudiant = new Kdecole(token, ApiVersion[ent], 0, app.config.globalProperties.$proxyPrefix + ApiUrl[ent]) console.log("[REQUEST] [HOMEWORK] Requesting homeworks...") const taf = await etudiant.getTravailAFaire(undefined, new Date(dateFrom)) diff --git a/src/functions/fetch/GetNews.js b/src/functions/fetch/GetNews.js index 1b1fd29..f5ced2a 100755 --- a/src/functions/fetch/GetNews.js +++ b/src/functions/fetch/GetNews.js @@ -23,7 +23,7 @@ async function getNews(forceReload) { function getSkolengoNews(forceReload) { const token = localStorage.getItem('token'); const ent = localStorage.getItem('ent'); - const etudiant = new Kdecole(token, ApiVersion[ent], 0, 'https://cors.api.getpapillon.xyz/' + ApiUrl[ent]) + const etudiant = new Kdecole(token, ApiVersion[ent], 0, app.config.globalProperties.$proxyPrefix + ApiUrl[ent]) let newsCache = localStorage.getItem('NewsCache'); if (newsCache != null && !forceReload) { diff --git a/src/functions/fetch/GetTimetable.js b/src/functions/fetch/GetTimetable.js index 3c929dc..bceefa2 100755 --- a/src/functions/fetch/GetTimetable.js +++ b/src/functions/fetch/GetTimetable.js @@ -48,7 +48,7 @@ function getSkolengoTimetable(date, forceReload) { resolve(constructSkolengoTimetable(timetable?.listeSeances || [])); }); } else { - const user = new Kdecole(token, ApiVersion[ent], 0, 'https://cors.api.getpapillon.xyz/' + ApiUrl[ent]) + const user = new Kdecole(token, ApiVersion[ent], 0, app.config.globalProperties.$proxyPrefix + ApiUrl[ent]) return user.getCalendrier().then(calendrier => { if (calendrier.cdtOuvert === false) throw new Error("Le calendrier n'est pas ouvert.") diff --git a/src/functions/fetch/GetUserData.js b/src/functions/fetch/GetUserData.js index c0027c7..dad0cd4 100755 --- a/src/functions/fetch/GetUserData.js +++ b/src/functions/fetch/GetUserData.js @@ -38,7 +38,7 @@ async function getSkolengoUser(force) { resolve(constructSkolengoUser(user)); }); } else { - const etudiant = new Kdecole(token, ApiVersion[ent], 0, 'https://cors.api.getpapillon.xyz/' + ApiUrl[ent]) + const etudiant = new Kdecole(token, ApiVersion[ent], 0, app.config.globalProperties.$proxyPrefix + ApiUrl[ent]) return etudiant.getInfoUtilisateur().then(infoUser => { localStorage.setItem('avatarCache', 'data:image/png;base64,' + defaultAvatar); const user = constructSkolengoUser(infoUser) @@ -114,7 +114,7 @@ async function getPronoteUser(force) { return constructPronoteUser(user); } // download avatar - let url = `https://cors.api.getpapillon.xyz/` + avatar; + let url = app.config.globalProperties.$proxyPrefix + avatar; axios.get(url, {responseType: 'blob'}) .then((response) => { // get blob diff --git a/src/main.ts b/src/main.ts index ff6f2f1..5f1af2b 100755 --- a/src/main.ts +++ b/src/main.ts @@ -8,6 +8,8 @@ import VueLazyload from "vue-lazyload"; import { IonicVue } from '@ionic/vue'; +import { Capacitor } from '@capacitor/core'; + /* Core CSS required for Ionic components to work properly */ import '@ionic/vue/css/core.css'; @@ -45,3 +47,5 @@ router.isReady().then(() => { // Global vars in Vue app.config.globalProperties.$rn = new Date; app.config.globalProperties.$api = localStorage.getItem('customApiUrl') || "https://api.getpapillon.xyz"; + +app.config.globalProperties.$proxyPrefix = Capacitor.isNativePlatform() ? "" : "https://cors.api.getpapillon.xyz/"; diff --git a/src/views/login/pronote/SchoolSelection.vue b/src/views/login/pronote/SchoolSelection.vue index 558d7fe..eecdba3 100755 --- a/src/views/login/pronote/SchoolSelection.vue +++ b/src/views/login/pronote/SchoolSelection.vue @@ -6,9 +6,10 @@ import axios from 'axios'; import { App } from '@capacitor/app'; - + import { linkOutline, linkSharp, qrCodeOutline, qrCodeSharp, schoolOutline, schoolSharp, businessOutline, businessSharp, navigateOutline, navigateSharp, personCircleOutline, personCircleSharp, serverOutline, serverSharp } from 'ionicons/icons'; + import {app} from '@/main.ts' import displayToast from '@/functions/utils/displayToast.js'; import { fetchDaysOffAndHolidays } from '@/functions/utils/datetimePicker.js'; @@ -176,7 +177,7 @@ this.terms = postal; this.isLoading = true; - axios.get('https://cors.api.getpapillon.xyz/https://positionstack.com/geo_api.php?query=france+' + postal, { + axios.get(app.config.globalProperties.$proxyPrefix + 'https://positionstack.com/geo_api.php?query=france+' + postal, { headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE,PATCH,OPTIONS', diff --git a/src/views/login/skolengo/LoginForm.vue b/src/views/login/skolengo/LoginForm.vue index 1ef5b78..87ebec2 100755 --- a/src/views/login/skolengo/LoginForm.vue +++ b/src/views/login/skolengo/LoginForm.vue @@ -22,6 +22,7 @@ import { serverSharp } from 'ionicons/icons'; +import {app} from '@/main.ts' import displayToast from '@/functions/utils/displayToast.js'; import {ApiUrl, ApiVersion, ApiName, Kdecole} from 'kdecole-api' @@ -105,7 +106,7 @@ export default defineComponent({ loading.present(); if (password.length === 125) { - const user = new Kdecole(password, ApiVersion[ent], 0, 'https://cors.api.getpapillon.xyz/' + ApiUrl[ent]) + const user = new Kdecole(password, ApiVersion[ent], 0, app.config.globalProperties.$proxyPrefix + ApiUrl[ent]) user.starting().then(() => { localStorage.token = password localStorage.loggedIn = true @@ -117,7 +118,7 @@ export default defineComponent({ displayToast.presentError(`${e.message}`, "danger", e) }) } else { - Kdecole.login(username, password, ApiVersion[ent], 'https://cors.api.getpapillon.xyz/' + ApiUrl[ent]).then(token => { + Kdecole.login(username, password, ApiVersion[ent], app.config.globalProperties.$proxyPrefix + ApiUrl[ent]).then(token => { localStorage.token = token localStorage.loggedIn = true localStorage.loginService = "skolengo"; diff --git a/src/views/settings/LogView.vue b/src/views/settings/LogView.vue index dc7958e..fe390cd 100755 --- a/src/views/settings/LogView.vue +++ b/src/views/settings/LogView.vue @@ -26,6 +26,7 @@ IonSearchbar } from '@ionic/vue'; + import {app} from '@/main.ts' import PapillonBackButton from '@/components/PapillonBackButton.vue'; @@ -162,7 +163,7 @@ displayToast.presentNativeToast("Préparation des logs..."); // Post logs to hastebin (https://logs.getpapillon.xyz) - let response = await fetch("https://cors.api.getpapillon.xyz/https://logs.getpapillon.xyz/documents", { + let response = await fetch(app.config.globalProperties.$proxyPrefix + "https://logs.getpapillon.xyz/documents", { method: "POST", body: this.logs.map(log => { return `[${log.type}] - ${log.date.replace('T', ' ')} - ${log.message}`; }).join("\n") });