From 845ce2407fb8bf9f14ab17d0d4e5fcf69c130221 Mon Sep 17 00:00:00 2001 From: Matt <1169490+caddoo@users.noreply.github.com> Date: Mon, 8 Dec 2025 17:24:49 +1300 Subject: [PATCH 1/2] Add additional check for refresh to make sure they are in the app --- plugins/CoreHome/vue/src/AjaxHelper/AjaxHelper.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/CoreHome/vue/src/AjaxHelper/AjaxHelper.ts b/plugins/CoreHome/vue/src/AjaxHelper/AjaxHelper.ts index 631426a698f..fb380a11e02 100644 --- a/plugins/CoreHome/vue/src/AjaxHelper/AjaxHelper.ts +++ b/plugins/CoreHome/vue/src/AjaxHelper/AjaxHelper.ts @@ -543,7 +543,9 @@ export default class AjaxHelper { // eslint-disable-line return; } - if (xhr.status === 401) { + const isInApp = !document.querySelector('#login_form'); + + if (xhr.status === 401 && isInApp) { Matomo.helper.refreshAfter(0); return; } From 1047257f551135c5bf50f9d76833a5d16e0f31a6 Mon Sep 17 00:00:00 2001 From: innocraft-automation Date: Mon, 8 Dec 2025 09:18:00 +0000 Subject: [PATCH 2/2] Build vue files --- plugins/CoreHome/vue/dist/CoreHome.umd.js | 3 ++- plugins/CoreHome/vue/dist/CoreHome.umd.min.js | 2 +- plugins/PrivacyManager/vue/dist/umd.metadata.json | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/CoreHome/vue/dist/CoreHome.umd.js b/plugins/CoreHome/vue/dist/CoreHome.umd.js index a8e7fb5910b..283906f16a2 100644 --- a/plugins/CoreHome/vue/dist/CoreHome.umd.js +++ b/plugins/CoreHome/vue/dist/CoreHome.umd.js @@ -1405,7 +1405,8 @@ class AjaxHelper_AjaxHelper { if (xhr.statusText === 'abort' || xhr.status === 0) { return; } - if (xhr.status === 401) { + const isInApp = !document.querySelector('#login_form'); + if (xhr.status === 401 && isInApp) { Matomo_Matomo.helper.refreshAfter(0); return; } diff --git a/plugins/CoreHome/vue/dist/CoreHome.umd.min.js b/plugins/CoreHome/vue/dist/CoreHome.umd.min.js index bec11ccfdec..3a9fcad20f1 100644 --- a/plugins/CoreHome/vue/dist/CoreHome.umd.min.js +++ b/plugins/CoreHome/vue/dist/CoreHome.umd.min.js @@ -77,7 +77,7 @@ function a(e,...t){if(!e)return"";let o=t;return 1===t.length&&t[0]&&Array.isArr * * @link https://matomo.org * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */I.updatePeriodParamsFromUrl=A.updatePeriodParamsFromUrl.bind(A);const{$:H}=window;function U(e,t){"abort"!==t&&e&&0!==e.status&&("undefined"!==typeof Piwik_Popover?Piwik_Popover.isOpen()&&e&&500===e.status?H(document.body).html(piwikHelper.escape(e.responseText)):H("#loadingError").show():console.log("Request failed: "+e.responseText))}window.globalAjaxQueue=[],window.globalAjaxQueue.active=0,window.globalAjaxQueue.clean=function(){for(let e=this.length;e>=0;e-=1)this[e]&&4!==this[e].readyState||this.splice(e,1)},window.globalAjaxQueue.push=function(...e){return this.active+=e.length,this.clean(),Array.prototype.push.call(this,...e)},window.globalAjaxQueue.abort=function(){this.forEach(e=>e&&e.abort&&e.abort()),this.splice(0,this.length),this.active=0};class q extends Error{}class W{static fetch(e,t={}){const o=new W;t.withTokenInUrl&&o.withTokenInUrl(),t.errorElement&&o.setErrorElement(t.errorElement),t.redirectOnSuccess&&o.redirectOnSuccess(!0!==t.redirectOnSuccess?t.redirectOnSuccess:void 0),o.setFormat(t.format||"json"),Array.isArray(e)?o.setBulkRequests(...e):(Object.keys(e).forEach(e=>{if(/password/i.test(e))throw new Error(`Password parameters are not allowed to be sent as GET parameter. Please send ${e} as POST parameter instead.`)}),o.addParams(Object.assign(Object.assign({module:"API",format:t.format||"json"},e),{},{segment:e.segment?encodeURIComponent(e.segment):void 0}),"get")),t.postParams&&o.addParams(t.postParams,"post"),t.headers&&(o.headers=Object.assign(Object.assign({},o.headers),t.headers));let i=!0;return"undefined"===typeof t.createErrorNotification||t.createErrorNotification||(o.useCallbackInCaseOfError(),o.setErrorCallback(null),i=!1),t.abortController&&(o.abortController=t.abortController),t.returnResponseObject&&(o.resolveWithHelper=!0),!1===t.abortable&&(o.abortable=!1),o.send().then(e=>{const t=e instanceof W?e.requestHandle.responseJSON:e,i="API.getBulkRequest"===o.postParams.method&&Array.isArray(t)?t:[t],n=i.filter(e=>"error"===e.result).map(e=>e.message);if(n.length)throw new q(n.filter(e=>e.length).join("\n"));return e}).catch(e=>{if(i||e instanceof q)throw e;let t="Something went wrong";throw 504===e.status&&(t="Request was possibly aborted"),429===e.status&&(t="Rate Limit was exceed"),new Error(t)})}static post(e,t={},o={}){return W.fetch(e,Object.assign(Object.assign({},o),{},{postParams:t}))}static oneAtATime(e,t){let o=null;return(i,n)=>(o&&o.abort(),o=new AbortController,W.post(Object.assign(Object.assign({},i),{},{method:e}),n,Object.assign(Object.assign({},t),{},{abortController:o})).finally(()=>{o=null}))}constructor(){R(this,"format","json"),R(this,"timeout",null),R(this,"callback",null),R(this,"useRegularCallbackInCaseOfError",!1),R(this,"errorCallback",void 0),R(this,"withToken",!1),R(this,"completeCallback",void 0),R(this,"getParams",{}),R(this,"getUrl","?"),R(this,"postParams",{}),R(this,"loadingElement",null),R(this,"errorElement","#ajaxError"),R(this,"headers",{"X-Requested-With":"XMLHttpRequest"}),R(this,"requestHandle",null),R(this,"abortController",null),R(this,"abortable",!0),R(this,"defaultParams",["idSite","period","date","segment"]),R(this,"resolveWithHelper",!1),this.errorCallback=U}addParams(e,t){const o="string"===typeof e?window.broadcast.getValuesFromUrl(e):e,i=["compareSegments","comparePeriods","compareDates"];Object.keys(o).forEach(e=>{let n=o[e];(-1===i.indexOf(e)||n)&&("boolean"===typeof n&&(n=n?1:0),"get"===t.toLowerCase()?this.getParams[e]=n:"post"===t.toLowerCase()&&(this.postParams[e]=n))})}withTokenInUrl(){this.withToken=!0}setUrl(e){this.addParams(broadcast.getValuesFromUrl(e),"GET")}setBulkRequests(...e){const t=e.map(e=>"string"===typeof e?e:H.param(e));this.addParams({module:"API",method:"API.getBulkRequest",urls:t,format:"json"},"post")}setTimeout(e){this.timeout=e}setCallback(e){this.callback=e}useCallbackInCaseOfError(){this.useRegularCallbackInCaseOfError=!0}redirectOnSuccess(e){this.setCallback(()=>{piwikHelper.redirect(e)})}setErrorCallback(e){this.errorCallback=e}setCompleteCallback(e){this.completeCallback=e}setFormat(e){this.format=e}setLoadingElement(e){this.loadingElement=e||"#ajaxLoadingDiv"}setErrorElement(e){e&&(this.errorElement=e)}useGETDefaultParameter(e){if(e&&this.defaultParams)for(let t=0;t{this.requestHandle&&this.requestHandle.abort()});const e=new Promise((e,t)=>{this.requestHandle.then(t=>{this.resolveWithHelper?e(this):e(t)}).fail(e=>{if(429===e.status)return console.log(`Warning: the '${H.param(this.getParams)}' request was rate limited!`),void t(e);"abort"!==e.statusText&&0!==e.status&&(401!==e.status?(console.log(`Warning: the ${H.param(this.getParams)} request failed!`),t(e)):x.helper.refreshAfter(0))})});return e}abort(){this.requestHandle&&"function"===typeof this.requestHandle.abort&&(this.requestHandle.abort(),this.requestHandle=null)}buildAjaxCall(){const e=this,t=this.mixinDefaultGetParams(this.getParams);let o=this.getUrl;"?"!==o[o.length-1]&&(o+="&"),t.segment&&(o=`${o}segment=${t.segment}&`,delete t.segment),t.date&&(o=`${o}date=${decodeURIComponent(t.date.toString())}&`,delete t.date),o+=H.param(t);const i={type:"POST",async:!0,url:o,dataType:this.format||"json",complete:this.completeCallback,headers:this.headers?this.headers:void 0,error:function(...t){e.abortable&&(window.globalAjaxQueue.active-=1),e.errorCallback&&e.errorCallback.apply(this,t)},success:(t,o,i)=>{this.loadingElement&&H(this.loadingElement).hide();const n="API.getBulkRequest"===this.postParams.method&&Array.isArray(t)?t:[t],a=n.filter(e=>"error"===e.result).map(e=>e.message).filter(e=>e.length).reduce((e,t)=>(e[t]=(e[t]||0)+1,e),{});if(a&&Object.keys(a).length&&!this.useRegularCallbackInCaseOfError){let e="";Object.keys(a).forEach(t=>{e.length&&(e+="
"),a[t]>1?e+=`${t} (${a[t]}x)`:e+=t});let t=null,o="toast";H(this.errorElement).length&&e.length&&(H(this.errorElement).show(),t=this.errorElement,o=null);const i=!document.querySelector("#login_form");if(e&&i){const i=window["require"]("piwik/UI"),n=new i.Notification;n.show(e,{placeat:t,context:"error",type:o,id:"ajaxHelper"}),n.scrollToNotification()}}else this.callback&&this.callback(t,o,i);e.abortable&&(window.globalAjaxQueue.active-=1),x.ajaxRequestFinished&&x.ajaxRequestFinished()},data:this.mixinDefaultPostParams(this.postParams),timeout:null!==this.timeout?this.timeout:void 0};return H.ajax(i)}isRequestToApiMethod(){return this.getParams&&"API"===this.getParams.module&&this.getParams.method||this.postParams&&"API"===this.postParams.module&&this.postParams.method}isWidgetizedRequest(){return"Widgetize"===broadcast.getValueFromUrl("module")}getDefaultPostParams(){return this.withToken||this.isRequestToApiMethod()||x.shouldPropagateTokenAuth?{token_auth:x.token_auth,force_api_session:broadcast.isWidgetizeRequestWithoutSession()?0:1}:{}}mixinDefaultPostParams(e){const t=this.getDefaultPostParams(),o=Object.assign(Object.assign({},t),e);return o}mixinDefaultGetParams(e){const t=_.getSearchParam("segment"),o={idSite:x.idSite?x.idSite.toString():broadcast.getValueFromUrl("idSite"),period:x.period||broadcast.getValueFromUrl("period"),segment:t},i=e;return i.token_auth&&(i.token_auth=null,delete i.token_auth),Object.keys(o).forEach(e=>{!this.useGETDefaultParameter(e)||null!==i[e]&&"undefined"!==typeof i[e]&&""!==i[e]||null!==this.postParams[e]&&"undefined"!==typeof this.postParams[e]&&""!==this.postParams[e]||!o[e]||(i[e]=o[e])}),!this.useGETDefaultParameter("date")||i.date||this.postParams.date||(i.date=x.currentDateString),i}getRequestHandle(){return this.requestHandle}}function z(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e} + */I.updatePeriodParamsFromUrl=A.updatePeriodParamsFromUrl.bind(A);const{$:H}=window;function U(e,t){"abort"!==t&&e&&0!==e.status&&("undefined"!==typeof Piwik_Popover?Piwik_Popover.isOpen()&&e&&500===e.status?H(document.body).html(piwikHelper.escape(e.responseText)):H("#loadingError").show():console.log("Request failed: "+e.responseText))}window.globalAjaxQueue=[],window.globalAjaxQueue.active=0,window.globalAjaxQueue.clean=function(){for(let e=this.length;e>=0;e-=1)this[e]&&4!==this[e].readyState||this.splice(e,1)},window.globalAjaxQueue.push=function(...e){return this.active+=e.length,this.clean(),Array.prototype.push.call(this,...e)},window.globalAjaxQueue.abort=function(){this.forEach(e=>e&&e.abort&&e.abort()),this.splice(0,this.length),this.active=0};class q extends Error{}class W{static fetch(e,t={}){const o=new W;t.withTokenInUrl&&o.withTokenInUrl(),t.errorElement&&o.setErrorElement(t.errorElement),t.redirectOnSuccess&&o.redirectOnSuccess(!0!==t.redirectOnSuccess?t.redirectOnSuccess:void 0),o.setFormat(t.format||"json"),Array.isArray(e)?o.setBulkRequests(...e):(Object.keys(e).forEach(e=>{if(/password/i.test(e))throw new Error(`Password parameters are not allowed to be sent as GET parameter. Please send ${e} as POST parameter instead.`)}),o.addParams(Object.assign(Object.assign({module:"API",format:t.format||"json"},e),{},{segment:e.segment?encodeURIComponent(e.segment):void 0}),"get")),t.postParams&&o.addParams(t.postParams,"post"),t.headers&&(o.headers=Object.assign(Object.assign({},o.headers),t.headers));let i=!0;return"undefined"===typeof t.createErrorNotification||t.createErrorNotification||(o.useCallbackInCaseOfError(),o.setErrorCallback(null),i=!1),t.abortController&&(o.abortController=t.abortController),t.returnResponseObject&&(o.resolveWithHelper=!0),!1===t.abortable&&(o.abortable=!1),o.send().then(e=>{const t=e instanceof W?e.requestHandle.responseJSON:e,i="API.getBulkRequest"===o.postParams.method&&Array.isArray(t)?t:[t],n=i.filter(e=>"error"===e.result).map(e=>e.message);if(n.length)throw new q(n.filter(e=>e.length).join("\n"));return e}).catch(e=>{if(i||e instanceof q)throw e;let t="Something went wrong";throw 504===e.status&&(t="Request was possibly aborted"),429===e.status&&(t="Rate Limit was exceed"),new Error(t)})}static post(e,t={},o={}){return W.fetch(e,Object.assign(Object.assign({},o),{},{postParams:t}))}static oneAtATime(e,t){let o=null;return(i,n)=>(o&&o.abort(),o=new AbortController,W.post(Object.assign(Object.assign({},i),{},{method:e}),n,Object.assign(Object.assign({},t),{},{abortController:o})).finally(()=>{o=null}))}constructor(){R(this,"format","json"),R(this,"timeout",null),R(this,"callback",null),R(this,"useRegularCallbackInCaseOfError",!1),R(this,"errorCallback",void 0),R(this,"withToken",!1),R(this,"completeCallback",void 0),R(this,"getParams",{}),R(this,"getUrl","?"),R(this,"postParams",{}),R(this,"loadingElement",null),R(this,"errorElement","#ajaxError"),R(this,"headers",{"X-Requested-With":"XMLHttpRequest"}),R(this,"requestHandle",null),R(this,"abortController",null),R(this,"abortable",!0),R(this,"defaultParams",["idSite","period","date","segment"]),R(this,"resolveWithHelper",!1),this.errorCallback=U}addParams(e,t){const o="string"===typeof e?window.broadcast.getValuesFromUrl(e):e,i=["compareSegments","comparePeriods","compareDates"];Object.keys(o).forEach(e=>{let n=o[e];(-1===i.indexOf(e)||n)&&("boolean"===typeof n&&(n=n?1:0),"get"===t.toLowerCase()?this.getParams[e]=n:"post"===t.toLowerCase()&&(this.postParams[e]=n))})}withTokenInUrl(){this.withToken=!0}setUrl(e){this.addParams(broadcast.getValuesFromUrl(e),"GET")}setBulkRequests(...e){const t=e.map(e=>"string"===typeof e?e:H.param(e));this.addParams({module:"API",method:"API.getBulkRequest",urls:t,format:"json"},"post")}setTimeout(e){this.timeout=e}setCallback(e){this.callback=e}useCallbackInCaseOfError(){this.useRegularCallbackInCaseOfError=!0}redirectOnSuccess(e){this.setCallback(()=>{piwikHelper.redirect(e)})}setErrorCallback(e){this.errorCallback=e}setCompleteCallback(e){this.completeCallback=e}setFormat(e){this.format=e}setLoadingElement(e){this.loadingElement=e||"#ajaxLoadingDiv"}setErrorElement(e){e&&(this.errorElement=e)}useGETDefaultParameter(e){if(e&&this.defaultParams)for(let t=0;t{this.requestHandle&&this.requestHandle.abort()});const e=new Promise((e,t)=>{this.requestHandle.then(t=>{this.resolveWithHelper?e(this):e(t)}).fail(e=>{if(429===e.status)return console.log(`Warning: the '${H.param(this.getParams)}' request was rate limited!`),void t(e);if("abort"===e.statusText||0===e.status)return;const o=!document.querySelector("#login_form");401===e.status&&o?x.helper.refreshAfter(0):(console.log(`Warning: the ${H.param(this.getParams)} request failed!`),t(e))})});return e}abort(){this.requestHandle&&"function"===typeof this.requestHandle.abort&&(this.requestHandle.abort(),this.requestHandle=null)}buildAjaxCall(){const e=this,t=this.mixinDefaultGetParams(this.getParams);let o=this.getUrl;"?"!==o[o.length-1]&&(o+="&"),t.segment&&(o=`${o}segment=${t.segment}&`,delete t.segment),t.date&&(o=`${o}date=${decodeURIComponent(t.date.toString())}&`,delete t.date),o+=H.param(t);const i={type:"POST",async:!0,url:o,dataType:this.format||"json",complete:this.completeCallback,headers:this.headers?this.headers:void 0,error:function(...t){e.abortable&&(window.globalAjaxQueue.active-=1),e.errorCallback&&e.errorCallback.apply(this,t)},success:(t,o,i)=>{this.loadingElement&&H(this.loadingElement).hide();const n="API.getBulkRequest"===this.postParams.method&&Array.isArray(t)?t:[t],a=n.filter(e=>"error"===e.result).map(e=>e.message).filter(e=>e.length).reduce((e,t)=>(e[t]=(e[t]||0)+1,e),{});if(a&&Object.keys(a).length&&!this.useRegularCallbackInCaseOfError){let e="";Object.keys(a).forEach(t=>{e.length&&(e+="
"),a[t]>1?e+=`${t} (${a[t]}x)`:e+=t});let t=null,o="toast";H(this.errorElement).length&&e.length&&(H(this.errorElement).show(),t=this.errorElement,o=null);const i=!document.querySelector("#login_form");if(e&&i){const i=window["require"]("piwik/UI"),n=new i.Notification;n.show(e,{placeat:t,context:"error",type:o,id:"ajaxHelper"}),n.scrollToNotification()}}else this.callback&&this.callback(t,o,i);e.abortable&&(window.globalAjaxQueue.active-=1),x.ajaxRequestFinished&&x.ajaxRequestFinished()},data:this.mixinDefaultPostParams(this.postParams),timeout:null!==this.timeout?this.timeout:void 0};return H.ajax(i)}isRequestToApiMethod(){return this.getParams&&"API"===this.getParams.module&&this.getParams.method||this.postParams&&"API"===this.postParams.module&&this.postParams.method}isWidgetizedRequest(){return"Widgetize"===broadcast.getValueFromUrl("module")}getDefaultPostParams(){return this.withToken||this.isRequestToApiMethod()||x.shouldPropagateTokenAuth?{token_auth:x.token_auth,force_api_session:broadcast.isWidgetizeRequestWithoutSession()?0:1}:{}}mixinDefaultPostParams(e){const t=this.getDefaultPostParams(),o=Object.assign(Object.assign({},t),e);return o}mixinDefaultGetParams(e){const t=_.getSearchParam("segment"),o={idSite:x.idSite?x.idSite.toString():broadcast.getValueFromUrl("idSite"),period:x.period||broadcast.getValueFromUrl("period"),segment:t},i=e;return i.token_auth&&(i.token_auth=null,delete i.token_auth),Object.keys(o).forEach(e=>{!this.useGETDefaultParameter(e)||null!==i[e]&&"undefined"!==typeof i[e]&&""!==i[e]||null!==this.postParams[e]&&"undefined"!==typeof this.postParams[e]&&""!==this.postParams[e]||!o[e]||(i[e]=o[e])}),!this.useGETDefaultParameter("date")||i.date||this.postParams.date||(i.date=x.currentDateString),i}getRequestHandle(){return this.requestHandle}}function z(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e} /*! * Matomo - free/libre analytics platform * diff --git a/plugins/PrivacyManager/vue/dist/umd.metadata.json b/plugins/PrivacyManager/vue/dist/umd.metadata.json index 3abfd129f0a..66244dc9003 100644 --- a/plugins/PrivacyManager/vue/dist/umd.metadata.json +++ b/plugins/PrivacyManager/vue/dist/umd.metadata.json @@ -1,7 +1,7 @@ { "dependsOn": [ "CoreHome", - "CorePluginsAdmin", - "SegmentEditor" + "SegmentEditor", + "CorePluginsAdmin" ] } \ No newline at end of file