Skip to content

Commit 8a23429

Browse files
committed
Refactor build script and enhance privacy policy
- Refactored the build process for browser extensions by creating a dedicated `buildForBrowser` function. - Added support for options page in both Chrome and Firefox manifests. - Introduced new options page for user preferences, including a checkbox for displaying screenshots in the popup. - Updated privacy policy documentation in both French and English to clarify data handling practices and permissions.
1 parent 60941dd commit 8a23429

9 files changed

Lines changed: 429 additions & 88 deletions

File tree

bin/build-extension.mjs

Lines changed: 70 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -7,48 +7,79 @@ const args = process.argv.slice(2);
77
const f = fileURLToPath(import.meta.url);
88
const dirname = path.dirname(f);
99

10-
args.forEach((browser) => {
11-
if (["firefox", "chrome"].includes(browser)) {
12-
fs.rmSync(`${dirname}/../dist/${browser}`, {
13-
recursive: true,
14-
force: true,
15-
});
16-
fs.mkdirSync(`${dirname}/../dist/${browser}`, { recursive: true });
17-
fs.copySync(
18-
`${dirname}/../src/manifest-${browser}.json`,
19-
`${dirname}/../dist/${browser}/manifest.json`,
20-
);
21-
fs.copySync(
22-
`${dirname}/../src/popup`,
23-
`${dirname}/../dist/${browser}/popup`,
24-
);
25-
fs.copySync(
26-
`${dirname}/../src/images`,
27-
`${dirname}/../dist/${browser}/images`,
10+
/**
11+
* @param {"firefox" | "chrome"} browser
12+
*/
13+
async function buildForBrowser(browser) {
14+
fs.rmSync(`${dirname}/../dist/${browser}`, {
15+
recursive: true,
16+
force: true,
17+
});
18+
fs.mkdirSync(`${dirname}/../dist/${browser}`, { recursive: true });
19+
fs.copySync(
20+
`${dirname}/../src/manifest-${browser}.json`,
21+
`${dirname}/../dist/${browser}/manifest.json`,
22+
);
23+
fs.copySync(`${dirname}/../src/popup`, `${dirname}/../dist/${browser}/popup`);
24+
fs.copySync(
25+
`${dirname}/../src/options`,
26+
`${dirname}/../dist/${browser}/options`,
27+
);
28+
fs.copySync(
29+
`${dirname}/../src/images`,
30+
`${dirname}/../dist/${browser}/images`,
31+
);
32+
fs.copySync(
33+
`${dirname}/../src/background`,
34+
`${dirname}/../dist/${browser}/background`,
35+
);
36+
fs.copySync(
37+
`${dirname}/../src/common.js`,
38+
`${dirname}/../dist/${browser}/common.js`,
39+
);
40+
41+
const distPath = path.resolve(`${dirname}/../dist/${browser}`);
42+
43+
await webExt.cmd.build(
44+
{
45+
sourceDir: distPath,
46+
artifactsDir: `${dirname}/../web-ext-artifacts`,
47+
overwriteDest: true,
48+
filename: `ecoindex.fr-${browser}.zip`,
49+
},
50+
{
51+
shouldExitProgram: false,
52+
},
53+
);
54+
55+
console.log("Build complete");
56+
57+
if (browser === "chrome") {
58+
console.log(
59+
"\nChrome (test local) : chrome://extensions → Mode développeur → « Charger l’extension non empaquetée ».",
2860
);
29-
fs.copySync(
30-
`${dirname}/../src/background`,
31-
`${dirname}/../dist/${browser}/background`,
61+
console.log(
62+
`Sélectionnez ce dossier (pas le .zip) :\n ${distPath}\n`,
3263
);
33-
fs.copySync(
34-
`${dirname}/../src/common.js`,
35-
`${dirname}/../dist/${browser}/common.js`,
64+
console.log(
65+
"Le fichier .zip sert au Chrome Web Store ou à une archive ; il ne convient pas au chargement non empaqueté.\n",
3666
);
67+
}
68+
}
3769

38-
webExt.cmd
39-
.build(
40-
{
41-
sourceDir: `${dirname}/../dist/${browser}`,
42-
artifactsDir: `${dirname}/../web-ext-artifacts`,
43-
overwriteDest: true,
44-
filename: `ecoindex.fr-${browser}.zip`,
45-
},
46-
{
47-
shouldExitProgram: false,
48-
},
49-
)
50-
.then(() => {
51-
console.log("Build complete");
52-
});
70+
async function main() {
71+
const browsers = args.filter((b) => ["firefox", "chrome"].includes(b));
72+
if (browsers.length === 0) {
73+
console.error("Usage: node build-extension.mjs <chrome|firefox>");
74+
process.exitCode = 1;
75+
return;
5376
}
77+
for (const browser of browsers) {
78+
await buildForBrowser(/** @type {"chrome" | "firefox"} */ (browser));
79+
}
80+
}
81+
82+
main().catch((err) => {
83+
console.error(err);
84+
process.exitCode = 1;
5485
});

doc/PRIVACY-POLICY-FR.md

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# POLITIQUE DE CONFIDENTIALITÉ DES UTILISATEURS
2+
3+
## 1. Objet
4+
5+
Les présentes Conditions Générales d’Utilisation (CGU) régissent l’utilisation de l’extension navigateur **Ecoindex Browser** (ci-après « l’Extension »).
6+
7+
L’Extension permet d’afficher le score Ecoindex d’une page web en interrogeant un service backend dédié ([Ecoindex BFF](https://github.com/cnumr/EcoIndex_BFF) which is a Ecoindex official API middleware).
8+
9+
---
10+
11+
## 2. Fonctionnement du service
12+
13+
Lorsque l’Extension est activée sur une page web :
14+
15+
- L’URL de la page courante est transmise au service backend Ecoindex BFF.
16+
- Le service vérifie si un score Ecoindex existe déjà :
17+
- en base de données, ou
18+
- dans un cache existant.
19+
20+
- Si un score existe, il est retourné immédiatement.
21+
- Si aucun score n’est disponible :
22+
- un calcul peut être effectué,
23+
- le résultat est ensuite stocké de manière sécurisée.
24+
25+
### Stockage des résultats
26+
27+
Les résultats sont stockés sous forme chiffrée selon le principe suivant :
28+
29+
- Clé : `ecoindex_sha1(url)`
30+
- Valeur : score Ecoindex associé
31+
32+
Aucune URL en clair n’est stockée dans ce mécanisme de cache.
33+
34+
### 2.1 Permissions du navigateur (transparence)
35+
36+
Le fichier manifeste de l’Extension peut contenir les déclarations suivantes, utilisées uniquement dans les conditions décrites ici :
37+
38+
```json
39+
{
40+
"permissions": ["activeTab", "storage"],
41+
"host_permissions": ["<all_urls>"]
42+
}
43+
```
44+
45+
- **`activeTab`** — Accorde un accès **temporaire** à l’onglet actif lorsque vous utilisez l’Extension (par exemple à l’ouverture de la popup). Elle sert à lire **l’URL de la page affichée** afin d’interroger le backend Ecoindex pour le résultat correspondant. Elle **ne** permet pas de lire en continu tous les onglets en arrière-plan.
46+
47+
- **`storage`** — Sert à conserver **localement sur votre appareil** des données d’Extension : préférences et état d’interface de courte durée (par exemple le badge de la barre d’outils lié à l’onglet courant). Ce stockage n’est pas utilisé pour constituer un historique de navigation exploité par des tiers.
48+
49+
- **`host_permissions` : `<all_urls>`** — Indique que l’Extension peut **s’exécuter dans le contexte des pages web sur les sites que vous visitez**. Ce schéma est en particulier nécessaire lorsque l’Extension injecte des **scripts de contenu** sur toutes les pages (par exemple pour partager du code avec la popup) ou lorsque le navigateur associe ce type d’injection à des autorisations d’hôtes larges. **Il ne s’agit pas d’un dispositif de suivi comportemental** : l’objectif reste d’obtenir l’URL de la page pour la requête Ecoindex décrite ci-dessus. Lorsque les politiques des magasins d’extensions le permettent, l’**accès réseau** au backend est limité à l’API officielle Ecoindex (`https://bff.ecoindex.fr/`) plutôt qu’à des sites arbitraires.
50+
51+
Certaines versions peuvent aussi demander la permission **`tabs`** pour que la partie « arrière-plan » réagisse aux changements d’onglet ou de chargement de page, toujours dans le même objectif (par exemple mettre à jour le badge pour l’onglet actif).
52+
53+
---
54+
55+
## 3. Données collectées
56+
57+
### 3.1 Adresse IP
58+
59+
- L’adresse IP de l’utilisateur peut être collectée **uniquement dans les logs techniques** du service backend.
60+
- Ces logs sont utilisés exclusivement à des fins de sécurité, de maintenance et de diagnostic.
61+
62+
### 3.2 URL des pages visitées
63+
64+
- L’URL de la page visitée est transmise au service afin de récupérer ou calculer le score Ecoindex.
65+
- Cette URL peut être utilisée pour générer une clé de cache (hash SHA1).
66+
67+
---
68+
69+
## 4. Confidentialité et protection des données
70+
71+
L’Extension respecte les principes suivants :
72+
73+
- **Aucun croisement des données** :
74+
- Les adresses IP et les URL ne sont pas corrélées ni stockées conjointement.
75+
76+
- **Absence de tracking** :
77+
- Les données ne sont pas utilisées à des fins d’analyse comportementale.
78+
- Aucun mécanisme de suivi utilisateur n’est implémenté.
79+
80+
- **Aucune exploitation commerciale** :
81+
- Les données ne sont pas utilisées à des fins marketing ou publicitaires.
82+
83+
- **Aucune transmission à des tiers** :
84+
- Les données collectées ne sont en aucun cas transmises à des services tiers.
85+
86+
---
87+
88+
## 5. Sécurité
89+
90+
- Les données de cache sont stockées de manière chiffrée.
91+
- Le système repose sur des mécanismes de hachage irréversible pour limiter l’exposition des URL.
92+
93+
---
94+
95+
## 6. Acceptation des conditions
96+
97+
L’installation et l’activation de l’Extension impliquent l’acceptation pleine et entière des présentes CGU, notamment en matière de traitement des données et de confidentialité.
98+
99+
---
100+
101+
## 7. Évolution des CGU
102+
103+
Ces conditions peuvent être mises à jour à tout moment. Il appartient à l’utilisateur de les consulter régulièrement.
104+
105+
---
106+
107+
## 8. Contact
108+
109+
Pour toute question relative à ces conditions ou au traitement des données, vous pouvez contacter les mainteneurs du projet.

doc/PRIVACY-POLICY.md

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,69 +12,83 @@ The Extension provides the Ecoindex score of a web page by querying a dedicated
1212

1313
When the Extension is active on a web page:
1414

15-
* The current page URL is sent to the Ecoindex BFF backend service.
16-
* The service checks whether an Ecoindex score already exists:
15+
- The current page URL is sent to the Ecoindex BFF backend service.
16+
- The service checks whether an Ecoindex score already exists:
17+
- in the database, or
18+
- in cache.
1719

18-
* in the database, or
19-
* in cache.
20-
* If a score exists, it is returned immediately.
21-
* If no score is available:
22-
23-
* it may be computed,
24-
* and then securely stored.
20+
- If a score exists, it is returned immediately.
21+
- If no score is available:
22+
- it may be computed,
23+
- and then securely stored.
2524

2625
### Result Storage
2726

2827
Results are stored in an encrypted manner using the following scheme:
2928

30-
* Key: `ecoindex_sha1(url)`
31-
* Value: associated Ecoindex data result
29+
- Key: `ecoindex_sha1(url)`
30+
- Value: associated Ecoindex data result
3231

3332
No plain-text URL is stored in this caching mechanism.
3433

34+
### 2.1 Browser permissions (transparency)
35+
36+
The extension manifest may include the following declarations and use them only as described here:
37+
38+
```json
39+
{
40+
"permissions": ["activeTab", "storage"],
41+
"host_permissions": ["<all_urls>"]
42+
}
43+
```
44+
45+
- **`activeTab`** — Grants **temporary** access to the active tab when you interact with the extension (for example when you open the toolbar popup). The extension uses this to read the **URL of the page you are viewing** so it can request the corresponding Ecoindex result from the backend. It does **not** give ongoing read access to all tabs in the background.
46+
47+
- **`storage`** — Used to keep **local data on your device**: extension preferences and short-lived UI state (for example toolbar badge information tied to the current tab). This storage is not used to build a browsing history for third parties.
48+
49+
- **`host_permissions`: `<all_urls>`** — Declares that the extension may **run in the context of web pages on any site** you visit. This pattern is required when the extension uses **content scripts** injected on all pages (for example to share helpers with the popup) or when the browser ties injection to broad host permissions. **This is not used for behavioural tracking**: the goal remains to obtain the current page URL for the Ecoindex query described above. Where store policies allow, **network** access to the backend is kept to the official Ecoindex API host (`https://bff.ecoindex.fr/`) rather than arbitrary sites.
50+
51+
Some builds may also request **`tabs`** so the background logic can react when you switch tabs or load a page, still in line with the same purpose (updating the badge for the active tab).
52+
3553
---
3654

3755
## 3. Data Collection
3856

3957
### 3.1 IP Address
4058

41-
* The user’s IP address may be collected **only within backend technical logs**.
42-
* These logs are strictly used for security, maintenance, and diagnostic purposes.
59+
- The user’s IP address may be collected **only within backend technical logs**.
60+
- These logs are strictly used for security, maintenance, and diagnostic purposes.
4361

4462
### 3.2 Visited URLs
4563

46-
* The visited page URL is transmitted to retrieve or compute the Ecoindex score.
47-
* This URL may be used to generate a cache key (SHA1 hash).
64+
- The visited page URL is transmitted to retrieve or compute the Ecoindex score.
65+
- This URL may be used to generate a cache key (SHA1 hash).
4866

4967
---
5068

5169
## 4. Privacy and Data Protection
5270

5371
The Extension follows strict privacy principles:
5472

55-
* **No data correlation**:
56-
57-
* IP addresses and visited URLs are not linked or stored together.
58-
59-
* **No tracking**:
60-
61-
* No behavioral analysis is performed.
62-
* No user tracking mechanisms are implemented.
63-
64-
* **No commercial use**:
73+
- **No data correlation**:
74+
- IP addresses and visited URLs are not linked or stored together.
6575

66-
* Data is not used for marketing or advertising purposes.
76+
- **No tracking**:
77+
- No behavioral analysis is performed.
78+
- No user tracking mechanisms are implemented.
6779

68-
* **No third-party sharing**:
80+
- **No commercial use**:
81+
- Data is not used for marketing or advertising purposes.
6982

70-
* Collected data is never shared with third-party services.
83+
- **No third-party sharing**:
84+
- Collected data is never shared with third-party services.
7185

7286
---
7387

7488
## 5. Security
7589

76-
* Cached data is stored in an encrypted format.
77-
* Irreversible hashing mechanisms are used to minimize URL exposure.
90+
- Cached data is stored in an encrypted format.
91+
- Irreversible hashing mechanisms are used to minimize URL exposure.
7892

7993
---
8094

src/manifest-chrome.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,9 @@
2323
],
2424
"host_permissions": [
2525
"https://bff.ecoindex.fr/*"
26-
]
26+
],
27+
"options_ui": {
28+
"page": "options/options.html",
29+
"open_in_tab": true
30+
}
2731
}

src/manifest-firefox.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,9 @@
2020
"https://bff.ecoindex.fr/*",
2121
"storage",
2222
"tabs"
23-
]
23+
],
24+
"options_ui": {
25+
"page": "options/options.html",
26+
"open_in_tab": true
27+
}
2428
}

0 commit comments

Comments
 (0)