Watcha op379 browser cache storage prevents the administration interface from loading (#21)

* feat: update the skeleton provided by react-create-app
* feat: activate service worker
develop
c-cal 5 years ago committed by GitHub
parent fc5f82b1ad
commit 0d6d340936
  1. 171
      docs/TODO
  2. 30
      public/index.html
  3. BIN
      public/logo192.png
  4. BIN
      public/logo512.png
  5. 27
      public/manifest.json
  6. 14
      src/index.js
  7. 78
      src/serviceWorker.js

@ -1,171 +0,0 @@
User Admin:
Only users that are server admins can use these APIs. A user can be marked as a server admin by updating the database directly, e.g.:
UPDATE users SET admin = 1 WHERE name = '@foo:bar.com'
Create user:
Remove/deactivate user:
should we be able to hard remove (GDPR)
users:
devices
last connection
pusher
displayname
invitedby
Deactivate Account:
This API deactivates an account. It removes active access tokens, resets the password, and deletes third-party IDs (to prevent the user requesting a password reset).
The api is:
POST /_matrix/client/r0/admin/deactivate/<user_id>
including an access_token of a server admin, and an empty request body.
Destroy room:
remove all users and block access or remove all trace of room in db?
Deactivate room:
can it be reactivated?
Reset password:
Changes the password of another user.
The api is:
POST /_matrix/client/r0/admin/reset_password/<user_id>
with a body of:
{
"new_password": "<secret>"
}
including an access_token of a server admin.
Display rooms list:
Show users list:
statistics: facturation, number of messages, check by users access to active session, device, location
Hello,
pour l'interface de paramétrage / suivi pour nos intégrateurs, j'ai identifié les phases de vie / actions / infos. Pourriez-vous svp me dire si c'est complet ? dès que nous sommes alignés je fais une proposition d'IHM si ça vous va:
1/ Installation :
Nom de l’entreprise
Noms prénoms mails des participants
2/ Maintien :
Etat du serveur ok / ok
Nombre de rooms
Mémoire utilisée
Listes des users et invités
Accès aux logs ? lesquels ?
Ajouter des participants
Nom prénom mail
Supprimer des participants
Pick from list
Next step : archivage des rooms
1/ Installation :
Nom de l’entreprise
Noms prénoms mails des participants
2/ Maintien :
Etat du serveur ok / ok
Nombre de rooms
Mémoire utilisée
Listes des users et invités
Accès aux logs ? lesquels ?
Ajouter des participants
Nom prénom mail
Supprimer des participants
Pick from list
Next step : archivage des rooms
1/ Installation :
Nom de l’entreprise
Noms prénoms mails des participants
2/ Maintien :
Etat du serveur ok / ok
Nombre de rooms
Mémoire utilisée
Listes des users et invités
Accès aux logs ? lesquels ?
Ajouter des participants
Nom prénom mail
Supprimer des participants
Pick from list
Next step : archivage des rooms
Alexandre Storelli
Je verrais aussi nom du sous-domaine voulu
Du genre Bernard et Dugenou Avocats pourraient vouloir avoir bdavocats.watcha.fr
Autre item pour installation: serveur mail interne ou sendinblue
Maintien: changer l'admin
Distinction entre supprimer participant (bloquer son compte) et supprimer participant (supprimer compte et messages)
Xavier
thx Alex, je pensais que l'on figeait automatiquement le nom de domaine en faisant nomentreprise.domaineintégrateur.xx (ce peut être le nom de domaine de l'intégrateur)
merci pour les autres remarques
Alexandre Storelli
un nom d'entreprise n'est pas unique, il y a un risque de collisions. Par exemple watcha https://www.societe.com/cgi-bin/search?champs=watcha
sinon OK bien sûr pour le sous-domaine chez l'intégrateur
Xavier
Tu as raison!
pour nos intégrateurs: quel sera selon vous le serveur mail? ils utilisent le notre? on leur en déploie un?
dez je crois qu'on en avait déjà parlé
Alexandre Storelli
Et t'as des noms d'entreprises très longs, du genre https://www.societe.com/societe/picardie-maritime-habitat-fondation-paul-duclercq-005720610.html du coup il faut pouvoir choisir la façon de l'abréger
Pour les serveurs mail, on peut proposer le nôtre par défaut, et donner une option à l'intégrateur pour mettre celui qu'il souhaite (champs SMTP, port, login, mdp, protocole...)
Ce n'est pas à nous d'en déployer un à mon sens, mais c'est un truc qu'ils maîtrisent bien
Xavier
c'est pas des emmerdes en plus pour nous? (certificats, etc...) pas plus simple d'imposer le notre?
Alexandre Storelli
Ça ne me semble pas poser de souci particulier. Au contraire, vu que c'est délicat d'envoyer un mail qui n'arrive pas dans les spams depuis un canon à mail, les serveurs déjà existants des boîtes clientes feront un meilleur travail
De plus, c'est un gros argument de confidentialité pour les clients
Car on ne peut pas être sûr qu'il n'y a pas de petits malins chez SendInBlue qui lisent nos emails
Alors que sur le serveur mail de Résophone, il y a des types de résophone qui veillent au grain et ça devient leur problème, plus le nôtre
François G
+1
Xavier
c'est beau cet alignement des astres ;-)
merci à vous
Alexandre Storelli
J'ajouterais aussi un état des lieux sur la facturation, en lien avec une liste donnée de salons (si ça a lieu d'être)
Xavier
oui tu as raison: je mentionne Nombre de rooms et Mémoire utilisée mais il faut aussi le forfait en cours
Alexandre Storelli
Ah oui pardon je n'avais pas lu assez attentivement
Xavier
non non c'est très bien ça me fait penser à ajouter le forfait en cours
Alexandre Storelli
ok :)
Pour les logs, c'est dur à dire. Fournir l'intégralité des logs de nos différentes briques est un peu violent. Mais donner cet accès peut aussi être un gage de transparence et leur sous-entendre que c'est aussi à eux de les serveiller.
*surveiller
Sylvain
Cool le fix de setup account alex ca marche nickel
Alexandre Storelli
Super!
J'ai pas mal avancé sur la page du site pour les apps mobiles
Sylvain
good
Alexandre Storelli
Pour les logs, après réflexion, je suis favorable à donner l'intégralité des accès à l'intégrateur. Présenté sous forme d'onglets selon chaque thématique (serveur, conf, système...). Ça facilitera la communication entre l'intégrateur et nous s'il faut faire du debug ou analyser des attaques. François G & Sylvain quelle est votre position sur la question?
Review francois

@ -2,23 +2,19 @@
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"
name="description"
content="Watcha Administration Interface"
/>
<meta name="theme-color" content="#000000" />
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<!--
manifest.json provides metadata used when your web app is added to the
homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" />
<link
rel="stylesheet"
href="%PUBLIC_URL%/bootstrap/4.4.1/css/bootstrap.min.css"
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
crossorigin="anonymous"
/>
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
@ -28,12 +24,16 @@
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<link
rel="stylesheet"
href="%PUBLIC_URL%/bootstrap/4.4.1/css/bootstrap.min.css"
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
crossorigin="anonymous"
/>
<title>Watcha Administration</title>
</head>
<body>
<noscript>
You need to enable JavaScript to run this app.
</noscript>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<!--
This HTML file is a template.

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

@ -1,15 +1,26 @@
{
"short_name": "Watcha Admin",
"name": "Watcha Administration Application",
"name": "Watcha Administration Interface",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
}
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "logo192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "logo512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": "./index.html",
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}
}

@ -1,12 +1,20 @@
import React from "react";
import ReactDOM from "react-dom";
import registerServiceWorker from "./registerServiceWorker";
import App from "./App";
import * as serviceWorker from "./serviceWorker";
import "./i18n";
import "./index.css";
ReactDOM.render(<App />, document.getElementById("root"));
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById("root")
);
registerServiceWorker();
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.register();

@ -1,31 +1,33 @@
// In production, we register a service worker to serve assets from local cache.
// This optional code is used to register a service worker.
// register() is not called by default.
// This lets the app load faster on subsequent visits in production, and gives
// it offline capabilities. However, it also means that developers (and users)
// will only see deployed updates on the "N+1" visit to a page, since previously
// cached resources are updated in the background.
// will only see deployed updates on subsequent visits to a page, after all the
// existing tabs open on the page have been closed, since previously cached
// resources are updated in the background.
// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.
// This link also includes instructions on opting out of this behavior.
// To learn more about the benefits of this model and instructions on how to
// opt-in, read https://bit.ly/CRA-PWA
const isLocalhost = Boolean(
window.location.hostname === "localhost" ||
// [::1] is the IPv6 localhost address.
window.location.hostname === "[::1]" ||
// 127.0.0.1/8 is considered localhost for IPv4.
// 127.0.0.0/8 are considered localhost for IPv4.
window.location.hostname.match(
/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
)
);
export default function register() {
export function register(config) {
if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) {
// The URL constructor is available in all browsers that support SW.
const publicUrl = new URL(process.env.PUBLIC_URL, window.location);
const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
if (publicUrl.origin !== window.location.origin) {
// Our service worker won't work if PUBLIC_URL is on a different origin
// from what our page is served on. This might happen if a CDN is used to
// serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374
// serve assets; see https://github.com/facebook/create-react-app/issues/2374
return;
}
@ -33,46 +35,59 @@ export default function register() {
const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
if (isLocalhost) {
// This is running on localhost. Lets check if a service worker still exists or not.
checkValidServiceWorker(swUrl);
// This is running on localhost. Let's check if a service worker still exists or not.
checkValidServiceWorker(swUrl, config);
// Add some additional logging to localhost, pointing developers to the
// service worker/PWA documentation.
navigator.serviceWorker.ready.then(() => {
console.log(
"This web app is being served cache-first by a service " +
"worker. To learn more, visit https://goo.gl/SC7cgQ"
"worker. To learn more, visit https://bit.ly/CRA-PWA"
);
});
} else {
// Is not local host. Just register service worker
registerValidSW(swUrl);
// Is not localhost. Just register service worker
registerValidSW(swUrl, config);
}
});
}
}
function registerValidSW(swUrl) {
function registerValidSW(swUrl, config) {
navigator.serviceWorker
.register(swUrl)
.then(registration => {
registration.onupdatefound = () => {
const installingWorker = registration.installing;
if (installingWorker == null) {
return;
}
installingWorker.onstatechange = () => {
if (installingWorker.state === "installed") {
if (navigator.serviceWorker.controller) {
// At this point, the old content will have been purged and
// the fresh content will have been added to the cache.
// It's the perfect time to display a "New content is
// available; please refresh." message in your web app.
// At this point, the updated precached content has been fetched,
// but the previous service worker will still serve the older
// content until all client tabs are closed.
console.log(
"New content is available; please refresh."
"New content is available and will be used when all " +
"tabs for this page are closed. See https://bit.ly/CRA-PWA."
);
// Execute callback
if (config && config.onUpdate) {
config.onUpdate(registration);
}
} else {
// At this point, everything has been precached.
// It's the perfect time to display a
// "Content is cached for offline use." message.
console.log("Content is cached for offline use.");
// Execute callback
if (config && config.onSuccess) {
config.onSuccess(registration);
}
}
}
};
@ -83,15 +98,18 @@ function registerValidSW(swUrl) {
});
}
function checkValidServiceWorker(swUrl) {
function checkValidServiceWorker(swUrl, config) {
// Check if the service worker can be found. If it can't reload the page.
fetch(swUrl)
fetch(swUrl, {
headers: { "Service-Worker": "script" },
})
.then(response => {
// Ensure service worker exists, and that we really are getting a JS file.
const contentType = response.headers.get("content-type");
if (
response.status === 404 ||
response.headers.get("content-type").indexOf("javascript") ===
-1
(contentType != null &&
contentType.indexOf("javascript") === -1)
) {
// No service worker found. Probably a different app. Reload the page.
navigator.serviceWorker.ready.then(registration => {
@ -101,7 +119,7 @@ function checkValidServiceWorker(swUrl) {
});
} else {
// Service worker found. Proceed as normal.
registerValidSW(swUrl);
registerValidSW(swUrl, config);
}
})
.catch(() => {
@ -113,8 +131,12 @@ function checkValidServiceWorker(swUrl) {
export function unregister() {
if ("serviceWorker" in navigator) {
navigator.serviceWorker.ready.then(registration => {
registration.unregister();
});
navigator.serviceWorker.ready
.then(registration => {
registration.unregister();
})
.catch(error => {
console.error(error.message);
});
}
}
Loading…
Cancel
Save