From 69abf2d73870344725c34ea0c9e711ac30905611 Mon Sep 17 00:00:00 2001
From: Florent <florent@MacBook-Air-de-neogeo.local>
Date: Fri, 26 Nov 2021 09:03:18 +0100
Subject: [PATCH] add axios interceptor for csrf token

---
 src/assets/js/map-util.js             |  8 +-----
 src/axios-client.js                   | 35 +++++++++++++++++++++++++++
 src/services/map-api.js               |  7 +-----
 src/services/project-api.js           |  7 +-----
 src/store/index.js                    | 33 ++++++++++++-------------
 src/store/modules/feature.js          | 12 ++++-----
 src/store/modules/feature_type.js     | 12 ++++-----
 src/store/modules/map.js              | 12 ++++-----
 src/views/feature/Feature_detail.vue  | 12 ++++-----
 src/views/feature/Feature_edit.vue    | 12 ++++-----
 src/views/feature/Feature_list.vue    | 12 ++++-----
 src/views/project/Project_detail.vue  | 12 ++++-----
 src/views/project/Project_edit.vue    | 12 ++++-----
 src/views/project/Project_members.vue |  8 +-----
 14 files changed, 103 insertions(+), 91 deletions(-)
 create mode 100644 src/axios-client.js

diff --git a/src/assets/js/map-util.js b/src/assets/js/map-util.js
index 8b6ed9b8..594050a5 100644
--- a/src/assets/js/map-util.js
+++ b/src/assets/js/map-util.js
@@ -4,15 +4,9 @@
 import L from "leaflet"
 import "leaflet/dist/leaflet.css";
 import flip from '@turf/flip'
-import axios from "axios"
+import axios from '@/axios-client.js';
 import "leaflet.vectorgrid";
 
-axios.defaults.headers.common['X-CSRFToken'] = (name => {
-  var re = new RegExp(name + "=([^;]+)");
-  var value = re.exec(document.cookie);
-  return (value != null) ? unescape(value[1]) : null;
-})('csrftoken');
-
 import { FillSymbolizer, PointSymbolizer, LineSymbolizer } from "@/assets/js/vector_tile_fix.js";
 
 let map;
diff --git a/src/axios-client.js b/src/axios-client.js
new file mode 100644
index 00000000..fa6b3d95
--- /dev/null
+++ b/src/axios-client.js
@@ -0,0 +1,35 @@
+import axios from 'axios';
+
+axios.defaults.withCredentials = true;
+
+// Add a request interceptor
+axios.interceptors.request.use(function (config) {
+
+  config.headers['X-CSRFToken'] = (name => {
+    const re = new RegExp(name + "=([^;]+)");
+    const value = re.exec(document.cookie);
+    return (value != null) ? unescape(value[1]) : null;
+  })('csrftoken');
+
+  return config;
+
+  }, function (error) {
+    return Promise.reject(error);
+  });
+
+// Add a response interceptor
+axios.interceptors.response.use(function (response) {
+
+  response.headers['X-CSRFToken'] = (name => {
+    const re = new RegExp(name + "=([^;]+)");
+    const value = re.exec(document.cookie);
+    return (value != null) ? unescape(value[1]) : null;
+  })('csrftoken');
+
+  return response;
+
+  }, function (error) {
+    return Promise.reject(error);
+  });
+
+export default axios;
\ No newline at end of file
diff --git a/src/services/map-api.js b/src/services/map-api.js
index fa4c5ddb..f4b8f45e 100644
--- a/src/services/map-api.js
+++ b/src/services/map-api.js
@@ -1,11 +1,6 @@
-import axios from 'axios';
+import axios from '@/axios-client.js';
 import store from '../store';
 
-axios.defaults.headers.common['X-CSRFToken'] = (name => {
-  var re = new RegExp(name + "=([^;]+)");
-  var value = re.exec(document.cookie);
-  return (value !== null) ? unescape(value[1]) : null;
-})('csrftoken');
 
 const baseUrl = store.state.configuration.VUE_APP_DJANGO_API_BASE;
 
diff --git a/src/services/project-api.js b/src/services/project-api.js
index b918ad22..f3d439cd 100644
--- a/src/services/project-api.js
+++ b/src/services/project-api.js
@@ -1,12 +1,7 @@
-import axios from 'axios';
+import axios from '@/axios-client.js';
 import store from '../store'
 
 
-axios.defaults.headers.common['X-CSRFToken'] = (name => {
-  var re = new RegExp(name + "=([^;]+)");
-  var value = re.exec(document.cookie);
-  return (value !== null) ? unescape(value[1]) : null;
-})('csrftoken');
 
 
 const baseUrl = store.state.configuration.VUE_APP_DJANGO_API_BASE;
diff --git a/src/store/index.js b/src/store/index.js
index 6f543f6d..326af958 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -1,5 +1,4 @@
-const axios = require("axios");
-
+import axios from '@/axios-client.js';
 import Vue from 'vue';
 import Vuex from 'vuex';
 import router from '../router'
@@ -7,26 +6,26 @@ import feature_type from "./modules/feature_type"
 import feature from "./modules/feature"
 import map from "./modules/map"
 
-axios.defaults.headers.common['X-CSRFToken'] = (name => {
-  var re = new RegExp(name + "=([^;]+)");
-  var value = re.exec(document.cookie);
-  return (value !== null) ? unescape(value[1]) : null;
-})('csrftoken');
+// axios.defaults.headers.common['X-CSRFToken'] = (name => {
+//   var re = new RegExp(name + "=([^;]+)");
+//   var value = re.exec(document.cookie);
+//   return (value !== null) ? unescape(value[1]) : null;
+// })('csrftoken');
 
 
 Vue.use(Vuex);
 
 
-axios.defaults.withCredentials = true; // * add cookies to axios
-function updateAxiosHeader() {
-  axios.defaults.headers.common['X-CSRFToken'] = (name => {
-    var re = new RegExp(name + "=([^;]+)");
-    var value = re.exec(document.cookie);
-    return (value !== null) ? unescape(value[1]) : null;
-  })('csrftoken');
-}
-// ! À vérifier s'il y a un changement de token pendant l'éxécution de l'appli
-updateAxiosHeader();
+// axios.defaults.withCredentials = true; // * add cookies to axios
+// function updateAxiosHeader() {
+//   axios.defaults.headers.common['X-CSRFToken'] = (name => {
+//     var re = new RegExp(name + "=([^;]+)");
+//     var value = re.exec(document.cookie);
+//     return (value !== null) ? unescape(value[1]) : null;
+//   })('csrftoken');
+// }
+// // ! À vérifier s'il y a un changement de token pendant l'éxécution de l'appli
+// updateAxiosHeader();
 
 const noPermissions = { "can_view_project": true, "can_create_project": false, "can_update_project": false, "can_view_feature": true, "can_view_archived_feature": true, "can_create_feature": false, "can_update_feature": false, "can_delete_feature": false, "can_publish_feature": false, "can_create_feature_type": false, "can_view_feature_type": true, "is_project_administrator": false }
 
diff --git a/src/store/modules/feature.js b/src/store/modules/feature.js
index 2b9eb239..e72e524d 100644
--- a/src/store/modules/feature.js
+++ b/src/store/modules/feature.js
@@ -1,11 +1,11 @@
-const axios = require("axios");
+import axios from '@/axios-client.js';
 import router from '../../router'
 
-axios.defaults.headers.common['X-CSRFToken'] = (name => {
-  var re = new RegExp(name + "=([^;]+)");
-  var value = re.exec(document.cookie);
-  return (value !== null) ? unescape(value[1]) : null;
-})('csrftoken');
+// axios.defaults.headers.common['X-CSRFToken'] = (name => {
+//   var re = new RegExp(name + "=([^;]+)");
+//   var value = re.exec(document.cookie);
+//   return (value !== null) ? unescape(value[1]) : null;
+// })('csrftoken');
 
 
 const feature = {
diff --git a/src/store/modules/feature_type.js b/src/store/modules/feature_type.js
index bed583d9..cfc3c0dd 100644
--- a/src/store/modules/feature_type.js
+++ b/src/store/modules/feature_type.js
@@ -1,10 +1,10 @@
-import axios from "axios"
+import axios from '@/axios-client.js';
 
-axios.defaults.headers.common['X-CSRFToken'] = (name => {
-  var re = new RegExp(name + "=([^;]+)");
-  var value = re.exec(document.cookie);
-  return (value !== null) ? unescape(value[1]) : null;
-})('csrftoken');
+// axios.defaults.headers.common['X-CSRFToken'] = (name => {
+//   var re = new RegExp(name + "=([^;]+)");
+//   var value = re.exec(document.cookie);
+//   return (value !== null) ? unescape(value[1]) : null;
+// })('csrftoken');
 
 const getColorsStyles = (customForms) => customForms.filter(customForm => customForm.options && customForm.options.length).map(el => {
   //* in dropdown, value is the name and name is the label to be displayed, could be changed...
diff --git a/src/store/modules/map.js b/src/store/modules/map.js
index c8e5ce93..b9843087 100644
--- a/src/store/modules/map.js
+++ b/src/store/modules/map.js
@@ -1,11 +1,11 @@
-const axios = require("axios");
+import axios from '@/axios-client.js';
 import { mapUtil } from "@/assets/js/map-util.js";
 
-axios.defaults.headers.common['X-CSRFToken'] = (name => {
-  var re = new RegExp(name + "=([^;]+)");
-  var value = re.exec(document.cookie);
-  return (value !== null) ? unescape(value[1]) : null;
-})('csrftoken');
+// axios.defaults.headers.common['X-CSRFToken'] = (name => {
+//   var re = new RegExp(name + "=([^;]+)");
+//   var value = re.exec(document.cookie);
+//   return (value !== null) ? unescape(value[1]) : null;
+// })('csrftoken');
 
 
 const map = {
diff --git a/src/views/feature/Feature_detail.vue b/src/views/feature/Feature_detail.vue
index 24514f13..6bb76f5b 100644
--- a/src/views/feature/Feature_detail.vue
+++ b/src/views/feature/Feature_detail.vue
@@ -351,13 +351,13 @@ import frag from "vue-frag";
 import { mapGetters, mapState } from "vuex";
 import { mapUtil } from "@/assets/js/map-util.js";
 import featureAPI from "@/services/feature-api";
-const axios = require("axios");
+import axios from '@/axios-client.js';
 
-axios.defaults.headers.common['X-CSRFToken'] = (name => {
-  var re = new RegExp(name + "=([^;]+)");
-  var value = re.exec(document.cookie);
-  return (value !== null) ? unescape(value[1]) : null;
-})('csrftoken');
+// axios.defaults.headers.common['X-CSRFToken'] = (name => {
+//   var re = new RegExp(name + "=([^;]+)");
+//   var value = re.exec(document.cookie);
+//   return (value !== null) ? unescape(value[1]) : null;
+// })('csrftoken');
 
 export default {
   name: "Feature_detail",
diff --git a/src/views/feature/Feature_edit.vue b/src/views/feature/Feature_edit.vue
index 40e10c25..42cb9d37 100644
--- a/src/views/feature/Feature_edit.vue
+++ b/src/views/feature/Feature_edit.vue
@@ -274,14 +274,14 @@ import featureAPI from "@/services/feature-api";
 import L from "leaflet";
 import "leaflet-draw";
 import { mapUtil } from "@/assets/js/map-util.js";
-const axios = require("axios");
+import axios from '@/axios-client.js';
 import flip from "@turf/flip";
 
-axios.defaults.headers.common["X-CSRFToken"] = ((name) => {
-  var re = new RegExp(name + "=([^;]+)");
-  var value = re.exec(document.cookie);
-  return value !== null ? unescape(value[1]) : null;
-})("csrftoken");
+// axios.defaults.headers.common["X-CSRFToken"] = ((name) => {
+//   var re = new RegExp(name + "=([^;]+)");
+//   var value = re.exec(document.cookie);
+//   return value !== null ? unescape(value[1]) : null;
+// })("csrftoken");
 
 export default {
   name: "Feature_edit",
diff --git a/src/views/feature/Feature_list.vue b/src/views/feature/Feature_list.vue
index 0d6f3942..d3b0e0c3 100644
--- a/src/views/feature/Feature_list.vue
+++ b/src/views/feature/Feature_list.vue
@@ -186,13 +186,13 @@ import { mapUtil } from "@/assets/js/map-util.js";
 import SidebarLayers from "@/components/map-layers/SidebarLayers";
 import FeatureListTable from "@/components/feature/FeatureListTable";
 import Dropdown from "@/components/Dropdown.vue";
-const axios = require("axios");
+import axios from '@/axios-client.js';
 
-axios.defaults.headers.common['X-CSRFToken'] = (name => {
-  var re = new RegExp(name + "=([^;]+)");
-  var value = re.exec(document.cookie);
-  return (value !== null) ? unescape(value[1]) : null;
-})('csrftoken');
+// axios.defaults.headers.common['X-CSRFToken'] = (name => {
+//   var re = new RegExp(name + "=([^;]+)");
+//   var value = re.exec(document.cookie);
+//   return (value !== null) ? unescape(value[1]) : null;
+// })('csrftoken');
 
 export default {
   name: "Feature_list",
diff --git a/src/views/project/Project_detail.vue b/src/views/project/Project_detail.vue
index e866ac9c..3a0a526e 100644
--- a/src/views/project/Project_detail.vue
+++ b/src/views/project/Project_detail.vue
@@ -531,13 +531,13 @@ import { mapUtil } from "@/assets/js/map-util.js";
 import { mapGetters, mapState } from "vuex";
 import projectAPI from "@/services/project-api";
 
-const axios = require("axios");
+import axios from '@/axios-client.js';
 
-axios.defaults.headers.common['X-CSRFToken'] = (name => {
-  var re = new RegExp(name + "=([^;]+)");
-  var value = re.exec(document.cookie);
-  return (value !== null) ? unescape(value[1]) : null;
-})('csrftoken');
+// axios.defaults.headers.common['X-CSRFToken'] = (name => {
+//   var re = new RegExp(name + "=([^;]+)");
+//   var value = re.exec(document.cookie);
+//   return (value !== null) ? unescape(value[1]) : null;
+// })('csrftoken');
 
 export default {
   name: "Project_details",
diff --git a/src/views/project/Project_edit.vue b/src/views/project/Project_edit.vue
index a8e08c5b..cb0b09e9 100644
--- a/src/views/project/Project_edit.vue
+++ b/src/views/project/Project_edit.vue
@@ -191,16 +191,16 @@
 </template>
 
 <script>
-const axios = require("axios");
+import axios from '@/axios-client.js';
 import Dropdown from "@/components/Dropdown.vue";
 
 import { mapGetters } from "vuex";
 
-axios.defaults.headers.common["X-CSRFToken"] = ((name) => {
-  var re = new RegExp(name + "=([^;]+)");
-  var value = re.exec(document.cookie);
-  return value !== null ? unescape(value[1]) : null;
-})("csrftoken");
+// axios.defaults.headers.common["X-CSRFToken"] = ((name) => {
+//   var re = new RegExp(name + "=([^;]+)");
+//   var value = re.exec(document.cookie);
+//   return value !== null ? unescape(value[1]) : null;
+// })("csrftoken");
 
 export default {
   name: "Project_edit",
diff --git a/src/views/project/Project_members.vue b/src/views/project/Project_members.vue
index 34c89ac5..9745e867 100644
--- a/src/views/project/Project_members.vue
+++ b/src/views/project/Project_members.vue
@@ -106,17 +106,11 @@
 </template>
 
 <script>
-import axios from "axios";
+import axios from '@/axios-client.js';
 import frag from "vue-frag";
 import { mapGetters } from "vuex";
 import Dropdown from "@/components/Dropdown.vue";
 
-axios.defaults.headers.common['X-CSRFToken'] = (name => {
-  var re = new RegExp(name + "=([^;]+)");
-  var value = re.exec(document.cookie);
-  return (value !== null) ? unescape(value[1]) : null;
-})('csrftoken');
-
 export default {
   name: "Project_members",
 
-- 
GitLab