fix(auth): restringe workshop/mecanico solo por servidor y cookie
- Elimina el script inline que redirigia a todos los usuarios. - auth_bp.py: la respuesta de login ahora setea cookie pos_role. - app.py: before_request redirige a /pos/workshop solo cuando la cookie indica rol workshop/mechanic (no depende de JS cacheado). - login.js/login.min.js/app-init.js: sincronizan/limpian la cookie pos_role junto con el token en login y logout. Tests: 35 passed
This commit is contained in:
@@ -15,20 +15,7 @@
|
||||
<meta name="theme-color" content="#F5A623" />
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/accounting.css?v=33">
|
||||
<script id="workshop-mechanic-redirect">
|
||||
(function(){
|
||||
var t=localStorage.getItem("pos_token");
|
||||
if(!t)return;
|
||||
try{var p=JSON.parse(atob(t.split(".")[1]));var r=(p.role||"").toLowerCase();
|
||||
if((r==="workshop"||r==="mechanic")&&window.location.pathname!=="/pos/workshop"){
|
||||
if("serviceWorker" in navigator){navigator.serviceWorker.getRegistrations().then(function(rs){rs.forEach(function(reg){reg.unregister();});});}
|
||||
window.location.replace("/pos/workshop");
|
||||
}
|
||||
}catch(e){}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<link rel="stylesheet" href="/pos/static/css/accounting.css?v=33"></head>
|
||||
|
||||
<body>
|
||||
|
||||
|
||||
@@ -17,20 +17,7 @@
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
<script src="/pos/static/js/native-bridge.js" defer></script>
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/catalog.css">
|
||||
<script id="workshop-mechanic-redirect">
|
||||
(function(){
|
||||
var t=localStorage.getItem("pos_token");
|
||||
if(!t)return;
|
||||
try{var p=JSON.parse(atob(t.split(".")[1]));var r=(p.role||"").toLowerCase();
|
||||
if((r==="workshop"||r==="mechanic")&&window.location.pathname!=="/pos/workshop"){
|
||||
if("serviceWorker" in navigator){navigator.serviceWorker.getRegistrations().then(function(rs){rs.forEach(function(reg){reg.unregister();});});}
|
||||
window.location.replace("/pos/workshop");
|
||||
}
|
||||
}catch(e){}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<link rel="stylesheet" href="/pos/static/css/catalog.css"></head>
|
||||
|
||||
<body>
|
||||
|
||||
|
||||
@@ -15,20 +15,7 @@
|
||||
<meta name="theme-color" content="#F5A623" />
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/config.css?v=33">
|
||||
<script id="workshop-mechanic-redirect">
|
||||
(function(){
|
||||
var t=localStorage.getItem("pos_token");
|
||||
if(!t)return;
|
||||
try{var p=JSON.parse(atob(t.split(".")[1]));var r=(p.role||"").toLowerCase();
|
||||
if((r==="workshop"||r==="mechanic")&&window.location.pathname!=="/pos/workshop"){
|
||||
if("serviceWorker" in navigator){navigator.serviceWorker.getRegistrations().then(function(rs){rs.forEach(function(reg){reg.unregister();});});}
|
||||
window.location.replace("/pos/workshop");
|
||||
}
|
||||
}catch(e){}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<link rel="stylesheet" href="/pos/static/css/config.css?v=33"></head>
|
||||
|
||||
<body>
|
||||
|
||||
|
||||
@@ -15,20 +15,7 @@
|
||||
<meta name="theme-color" content="#F5A623" />
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/customers.css">
|
||||
<script id="workshop-mechanic-redirect">
|
||||
(function(){
|
||||
var t=localStorage.getItem("pos_token");
|
||||
if(!t)return;
|
||||
try{var p=JSON.parse(atob(t.split(".")[1]));var r=(p.role||"").toLowerCase();
|
||||
if((r==="workshop"||r==="mechanic")&&window.location.pathname!=="/pos/workshop"){
|
||||
if("serviceWorker" in navigator){navigator.serviceWorker.getRegistrations().then(function(rs){rs.forEach(function(reg){reg.unregister();});});}
|
||||
window.location.replace("/pos/workshop");
|
||||
}
|
||||
}catch(e){}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<link rel="stylesheet" href="/pos/static/css/customers.css"></head>
|
||||
|
||||
<body>
|
||||
|
||||
|
||||
@@ -15,20 +15,7 @@
|
||||
<meta name="theme-color" content="#F5A623" />
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/dashboard.css?v=33">
|
||||
<script id="workshop-mechanic-redirect">
|
||||
(function(){
|
||||
var t=localStorage.getItem("pos_token");
|
||||
if(!t)return;
|
||||
try{var p=JSON.parse(atob(t.split(".")[1]));var r=(p.role||"").toLowerCase();
|
||||
if((r==="workshop"||r==="mechanic")&&window.location.pathname!=="/pos/workshop"){
|
||||
if("serviceWorker" in navigator){navigator.serviceWorker.getRegistrations().then(function(rs){rs.forEach(function(reg){reg.unregister();});});}
|
||||
window.location.replace("/pos/workshop");
|
||||
}
|
||||
}catch(e){}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<link rel="stylesheet" href="/pos/static/css/dashboard.css?v=33"></head>
|
||||
|
||||
<body>
|
||||
|
||||
|
||||
@@ -17,20 +17,7 @@
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
<script src="/pos/static/js/native-bridge.js" defer></script>
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/diagrams.css">
|
||||
<script id="workshop-mechanic-redirect">
|
||||
(function(){
|
||||
var t=localStorage.getItem("pos_token");
|
||||
if(!t)return;
|
||||
try{var p=JSON.parse(atob(t.split(".")[1]));var r=(p.role||"").toLowerCase();
|
||||
if((r==="workshop"||r==="mechanic")&&window.location.pathname!=="/pos/workshop"){
|
||||
if("serviceWorker" in navigator){navigator.serviceWorker.getRegistrations().then(function(rs){rs.forEach(function(reg){reg.unregister();});});}
|
||||
window.location.replace("/pos/workshop");
|
||||
}
|
||||
}catch(e){}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<link rel="stylesheet" href="/pos/static/css/diagrams.css"></head>
|
||||
<body>
|
||||
<div class="app-shell">
|
||||
|
||||
|
||||
@@ -15,20 +15,7 @@
|
||||
<meta name="theme-color" content="#F5A623" />
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/fleet.css">
|
||||
<script id="workshop-mechanic-redirect">
|
||||
(function(){
|
||||
var t=localStorage.getItem("pos_token");
|
||||
if(!t)return;
|
||||
try{var p=JSON.parse(atob(t.split(".")[1]));var r=(p.role||"").toLowerCase();
|
||||
if((r==="workshop"||r==="mechanic")&&window.location.pathname!=="/pos/workshop"){
|
||||
if("serviceWorker" in navigator){navigator.serviceWorker.getRegistrations().then(function(rs){rs.forEach(function(reg){reg.unregister();});});}
|
||||
window.location.replace("/pos/workshop");
|
||||
}
|
||||
}catch(e){}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<link rel="stylesheet" href="/pos/static/css/fleet.css"></head>
|
||||
<body>
|
||||
|
||||
<div class="page-shell">
|
||||
|
||||
@@ -34,20 +34,7 @@
|
||||
.pagination button:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||
.pagination span { font-size: 13px; color: #4b5563; }
|
||||
.loading { text-align: center; padding: 40px; color: #6b7280; }
|
||||
</style>
|
||||
<script id="workshop-mechanic-redirect">
|
||||
(function(){
|
||||
var t=localStorage.getItem("pos_token");
|
||||
if(!t)return;
|
||||
try{var p=JSON.parse(atob(t.split(".")[1]));var r=(p.role||"").toLowerCase();
|
||||
if((r==="workshop"||r==="mechanic")&&window.location.pathname!=="/pos/workshop"){
|
||||
if("serviceWorker" in navigator){navigator.serviceWorker.getRegistrations().then(function(rs){rs.forEach(function(reg){reg.unregister();});});}
|
||||
window.location.replace("/pos/workshop");
|
||||
}
|
||||
}catch(e){}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
</style></head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>📊 Ventas Históricas - Atlas</h1>
|
||||
|
||||
@@ -15,20 +15,7 @@
|
||||
<meta name="theme-color" content="#F5A623" />
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/inventory.css?v=33">
|
||||
<script id="workshop-mechanic-redirect">
|
||||
(function(){
|
||||
var t=localStorage.getItem("pos_token");
|
||||
if(!t)return;
|
||||
try{var p=JSON.parse(atob(t.split(".")[1]));var r=(p.role||"").toLowerCase();
|
||||
if((r==="workshop"||r==="mechanic")&&window.location.pathname!=="/pos/workshop"){
|
||||
if("serviceWorker" in navigator){navigator.serviceWorker.getRegistrations().then(function(rs){rs.forEach(function(reg){reg.unregister();});});}
|
||||
window.location.replace("/pos/workshop");
|
||||
}
|
||||
}catch(e){}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<link rel="stylesheet" href="/pos/static/css/inventory.css?v=33"></head>
|
||||
|
||||
<body>
|
||||
|
||||
|
||||
@@ -15,20 +15,7 @@
|
||||
<meta name="theme-color" content="#F5A623" />
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/invoicing.css">
|
||||
<script id="workshop-mechanic-redirect">
|
||||
(function(){
|
||||
var t=localStorage.getItem("pos_token");
|
||||
if(!t)return;
|
||||
try{var p=JSON.parse(atob(t.split(".")[1]));var r=(p.role||"").toLowerCase();
|
||||
if((r==="workshop"||r==="mechanic")&&window.location.pathname!=="/pos/workshop"){
|
||||
if("serviceWorker" in navigator){navigator.serviceWorker.getRegistrations().then(function(rs){rs.forEach(function(reg){reg.unregister();});});}
|
||||
window.location.replace("/pos/workshop");
|
||||
}
|
||||
}catch(e){}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<link rel="stylesheet" href="/pos/static/css/invoicing.css"></head>
|
||||
|
||||
<body>
|
||||
|
||||
|
||||
@@ -15,20 +15,7 @@
|
||||
<meta name="theme-color" content="#F5A623" />
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/marketplace.css">
|
||||
<script id="workshop-mechanic-redirect">
|
||||
(function(){
|
||||
var t=localStorage.getItem("pos_token");
|
||||
if(!t)return;
|
||||
try{var p=JSON.parse(atob(t.split(".")[1]));var r=(p.role||"").toLowerCase();
|
||||
if((r==="workshop"||r==="mechanic")&&window.location.pathname!=="/pos/workshop"){
|
||||
if("serviceWorker" in navigator){navigator.serviceWorker.getRegistrations().then(function(rs){rs.forEach(function(reg){reg.unregister();});});}
|
||||
window.location.replace("/pos/workshop");
|
||||
}
|
||||
}catch(e){}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<link rel="stylesheet" href="/pos/static/css/marketplace.css"></head>
|
||||
<body>
|
||||
|
||||
<header class="page-header">
|
||||
|
||||
@@ -28,20 +28,7 @@
|
||||
.meli-config-row { display:flex;gap:var(--space-4);flex-wrap:wrap;margin-bottom:var(--space-4); }
|
||||
.meli-config-row label { display:block;font-size:var(--text-caption);color:var(--color-text-muted);margin-bottom:4px; }
|
||||
.meli-config-row input, .meli-config-row select { padding:8px 12px;border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-surface-0);color:var(--color-text-primary); }
|
||||
</style>
|
||||
<script id="workshop-mechanic-redirect">
|
||||
(function(){
|
||||
var t=localStorage.getItem("pos_token");
|
||||
if(!t)return;
|
||||
try{var p=JSON.parse(atob(t.split(".")[1]));var r=(p.role||"").toLowerCase();
|
||||
if((r==="workshop"||r==="mechanic")&&window.location.pathname!=="/pos/workshop"){
|
||||
if("serviceWorker" in navigator){navigator.serviceWorker.getRegistrations().then(function(rs){rs.forEach(function(reg){reg.unregister();});});}
|
||||
window.location.replace("/pos/workshop");
|
||||
}
|
||||
}catch(e){}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
</style></head>
|
||||
|
||||
<body>
|
||||
|
||||
|
||||
@@ -16,20 +16,7 @@
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
<script src="/pos/static/js/native-bridge.js" defer></script>
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/pos.css?v=33">
|
||||
<script id="workshop-mechanic-redirect">
|
||||
(function(){
|
||||
var t=localStorage.getItem("pos_token");
|
||||
if(!t)return;
|
||||
try{var p=JSON.parse(atob(t.split(".")[1]));var r=(p.role||"").toLowerCase();
|
||||
if((r==="workshop"||r==="mechanic")&&window.location.pathname!=="/pos/workshop"){
|
||||
if("serviceWorker" in navigator){navigator.serviceWorker.getRegistrations().then(function(rs){rs.forEach(function(reg){reg.unregister();});});}
|
||||
window.location.replace("/pos/workshop");
|
||||
}
|
||||
}catch(e){}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<link rel="stylesheet" href="/pos/static/css/pos.css?v=33"></head>
|
||||
|
||||
<body class="pos-shell" id="appBody">
|
||||
|
||||
|
||||
@@ -11,20 +11,7 @@
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-ui.css?v=33" />
|
||||
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
||||
<link rel="stylesheet" href="/pos/static/css/quotations.css">
|
||||
<script id="workshop-mechanic-redirect">
|
||||
(function(){
|
||||
var t=localStorage.getItem("pos_token");
|
||||
if(!t)return;
|
||||
try{var p=JSON.parse(atob(t.split(".")[1]));var r=(p.role||"").toLowerCase();
|
||||
if((r==="workshop"||r==="mechanic")&&window.location.pathname!=="/pos/workshop"){
|
||||
if("serviceWorker" in navigator){navigator.serviceWorker.getRegistrations().then(function(rs){rs.forEach(function(reg){reg.unregister();});});}
|
||||
window.location.replace("/pos/workshop");
|
||||
}
|
||||
}catch(e){}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<link rel="stylesheet" href="/pos/static/css/quotations.css"></head>
|
||||
<body>
|
||||
<script src="/pos/static/js/pos-utils.js?v=33" defer></script>
|
||||
<script src="/pos/static/js/i18n.js" defer></script>
|
||||
|
||||
@@ -15,20 +15,7 @@
|
||||
<meta name="theme-color" content="#F5A623" />
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/reports.css">
|
||||
<script id="workshop-mechanic-redirect">
|
||||
(function(){
|
||||
var t=localStorage.getItem("pos_token");
|
||||
if(!t)return;
|
||||
try{var p=JSON.parse(atob(t.split(".")[1]));var r=(p.role||"").toLowerCase();
|
||||
if((r==="workshop"||r==="mechanic")&&window.location.pathname!=="/pos/workshop"){
|
||||
if("serviceWorker" in navigator){navigator.serviceWorker.getRegistrations().then(function(rs){rs.forEach(function(reg){reg.unregister();});});}
|
||||
window.location.replace("/pos/workshop");
|
||||
}
|
||||
}catch(e){}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<link rel="stylesheet" href="/pos/static/css/reports.css"></head>
|
||||
|
||||
<body>
|
||||
|
||||
|
||||
@@ -49,20 +49,7 @@
|
||||
.sc-interchange-list { display:flex; flex-wrap:wrap; gap:var(--space-2); }
|
||||
.sc-interchange-chip { background:var(--color-surface-2); border:1px solid var(--color-border); border-radius:var(--radius-full); padding:2px 10px; font-size:var(--text-caption); }
|
||||
.sc-close { background:none; border:none; font-size:20px; color:var(--color-text-muted); cursor:pointer; }
|
||||
</style>
|
||||
<script id="workshop-mechanic-redirect">
|
||||
(function(){
|
||||
var t=localStorage.getItem("pos_token");
|
||||
if(!t)return;
|
||||
try{var p=JSON.parse(atob(t.split(".")[1]));var r=(p.role||"").toLowerCase();
|
||||
if((r==="workshop"||r==="mechanic")&&window.location.pathname!=="/pos/workshop"){
|
||||
if("serviceWorker" in navigator){navigator.serviceWorker.getRegistrations().then(function(rs){rs.forEach(function(reg){reg.unregister();});});}
|
||||
window.location.replace("/pos/workshop");
|
||||
}
|
||||
}catch(e){}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
</style></head>
|
||||
<body>
|
||||
|
||||
<!-- Theme bar -->
|
||||
|
||||
@@ -18,20 +18,7 @@
|
||||
<meta name="theme-color" content="#F5A623" />
|
||||
<link rel="shortcut icon" type="image/png" href="/pos/static/pwa/icon-192.png" />
|
||||
|
||||
<link rel="stylesheet" href="/pos/static/css/whatsapp.css">
|
||||
<script id="workshop-mechanic-redirect">
|
||||
(function(){
|
||||
var t=localStorage.getItem("pos_token");
|
||||
if(!t)return;
|
||||
try{var p=JSON.parse(atob(t.split(".")[1]));var r=(p.role||"").toLowerCase();
|
||||
if((r==="workshop"||r==="mechanic")&&window.location.pathname!=="/pos/workshop"){
|
||||
if("serviceWorker" in navigator){navigator.serviceWorker.getRegistrations().then(function(rs){rs.forEach(function(reg){reg.unregister();});});}
|
||||
window.location.replace("/pos/workshop");
|
||||
}
|
||||
}catch(e){}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<link rel="stylesheet" href="/pos/static/css/whatsapp.css"></head>
|
||||
<body>
|
||||
|
||||
<div class="page-shell">
|
||||
|
||||
Reference in New Issue
Block a user