diff --git a/.env.example b/.env.example index a200c81..27157f2 100644 --- a/.env.example +++ b/.env.example @@ -56,6 +56,15 @@ MINIO_PUBLIC_URL=https://media.example.com # sans audit, les vidéos publiées restent privées. # TIKTOK_SCOPES= +# ========================================== +# MENTIONS LÉGALES +# ========================================== +# Affichées sur les pages publiques /terms et /privacy, dont TikTok exige +# les URLs pour l'audit de l'application développeur. +LEGAL_COMPANY_NAME= +LEGAL_COMPANY_ADDRESS= +LEGAL_CONTACT_EMAIL= + # ========================================== # API EXTERNE # ========================================== diff --git a/server/routes.ts b/server/routes.ts index e9d29db..97804f0 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -17,6 +17,7 @@ import { reelsRouter } from "./routes/reels"; import { remotionRouter } from "./routes/remotion"; import { externalRouter } from "./routes/external"; import { tiktokRouter } from "./routes/tiktok"; +import { legalRouter } from "./routes/legal"; import { insertAudioTrackSchema } from "@shared/schema"; import * as musicMetadata from "music-metadata"; @@ -459,6 +460,9 @@ export async function registerRoutes(app: Express): Promise { // Analytics Routes app.use("/api/analytics", requireAuth, analyticsRouter); + // Pages légales publiques (exigées par TikTok pour l'audit de l'application) + app.use(legalRouter); + // TikTok Routes (OAuth multi-comptes) — avant le routeur Reels monté sur /api app.use("/api/tiktok", requireAuth, tiktokRouter); diff --git a/server/routes/legal.ts b/server/routes/legal.ts new file mode 100644 index 0000000..ea42b04 --- /dev/null +++ b/server/routes/legal.ts @@ -0,0 +1,255 @@ +/** + * Pages légales publiques (conditions d'utilisation et politique de confidentialité). + * + * TikTok exige une URL publique pour chacune lors de la création de l'application + * développeur, et les relecteurs les ouvrent réellement pendant l'audit. Elles sont + * servies en HTML depuis le serveur, sans authentification, pour rester lisibles + * même par un robot qui n'exécute pas le JavaScript du client. + * + * Les mentions de l'exploitant se configurent par variables d'environnement : + * LEGAL_COMPANY_NAME, LEGAL_COMPANY_ADDRESS, LEGAL_CONTACT_EMAIL + */ + +import { Router, Request, Response } from 'express'; + +export const legalRouter = Router(); + +function getCompanyInfo() { + return { + name: process.env.LEGAL_COMPANY_NAME || "[Raison sociale à renseigner]", + address: process.env.LEGAL_COMPANY_ADDRESS || "[Adresse à renseigner]", + email: process.env.LEGAL_CONTACT_EMAIL || "[Adresse e-mail de contact à renseigner]", + }; +} + +function escapeHtml(value: string): string { + return value + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +} + +function renderPage(title: string, body: string): string { + return ` + + + + + ${escapeHtml(title)} + + + +${body} + +`; +} + +function renderFooter(): string { + const company = getCompanyInfo(); + return ``; +} + +legalRouter.get('/terms', (_req: Request, res: Response) => { + const company = getCompanyInfo(); + + const body = ` +

Conditions d'utilisation

+

Dernière mise à jour : 11 août 2026

+ +

+ Cette application est un outil interne de gestion des réseaux sociaux exploité par + ${escapeHtml(company.name)} (« nous »). Elle permet à nos équipes de créer des vidéos et des + publications promotionnelles, puis de les diffuser sur les comptes et pages officiels de nos + magasins. +

+ +

1. Accès au service

+

+ L'accès est réservé aux personnes que nous avons expressément autorisées, au moyen d'un compte + nominatif. Chaque utilisateur est responsable de la confidentialité de ses identifiants et des + actions effectuées depuis son compte. Nous pouvons suspendre ou retirer un accès à tout moment. +

+ +

2. Comptes de réseaux sociaux connectés

+

+ L'application publie sur des comptes Facebook et TikTok qui nous appartiennent ou que nous + sommes habilités à administrer. En connectant un compte, l'utilisateur déclare disposer des + droits nécessaires pour le faire. Un compte peut être déconnecté à tout moment depuis + l'application, ou par le retrait de l'autorisation directement dans les réglages de la + plateforme concernée. +

+ +

3. Contenus publiés

+

+ Les utilisateurs restent responsables des contenus qu'ils créent et diffusent. Ces contenus + doivent respecter la loi applicable ainsi que les règles des plateformes de destination, + notamment les Conditions d'utilisation et les Règles communautaires de TikTok et de Meta. + Sont notamment proscrits les contenus dont les utilisateurs ne détiennent pas les droits, + y compris pour les images et les musiques utilisées. +

+ +

4. Disponibilité

+

+ Le service est fourni « en l'état ». Il dépend de services tiers (plateformes de publication, + hébergement, traitement vidéo) dont les interruptions ou modifications peuvent affecter son + fonctionnement. Nous ne garantissons ni une disponibilité continue, ni la publication effective + d'un contenu par une plateforme tierce, celle-ci pouvant la refuser selon ses propres règles. +

+ +

5. Responsabilité

+

+ Dans les limites permises par la loi, notre responsabilité ne saurait être engagée au titre des + dommages indirects résultant de l'utilisation du service, notamment une perte de contenu, une + publication manquée ou la suspension d'un compte par une plateforme tierce. +

+ +

6. Modification des conditions

+

+ Ces conditions peuvent être modifiées. La date de dernière mise à jour figure en tête de page. +

+ +

7. Contact

+

Pour toute question relative à ces conditions : ${escapeHtml(company.email)}

+ + ${renderFooter()}`; + + res.type('html').send(renderPage("Conditions d'utilisation", body)); +}); + +legalRouter.get('/privacy', (_req: Request, res: Response) => { + const company = getCompanyInfo(); + + const body = ` +

Politique de confidentialité

+

Dernière mise à jour : 11 août 2026

+ +

+ Cette politique décrit les données traitées par notre outil interne de gestion des réseaux + sociaux. Le responsable de traitement est ${escapeHtml(company.name)}, + ${escapeHtml(company.address)}. +

+ +

1. Données de nos utilisateurs internes

+

+ Pour chaque personne autorisée à utiliser l'outil, nous conservons un identifiant de connexion, + un mot de passe stocké sous forme chiffrée, un rôle et la liste des comptes auxquels elle a + accès. Ces données servent uniquement à l'authentification et à la gestion des droits. +

+ +

2. Données issues des comptes de réseaux sociaux connectés

+

+ Lorsqu'un compte TikTok est connecté, nous recevons de TikTok, avec l'autorisation explicite du + titulaire du compte et dans le cadre du périmètre user.info.basic : +

+ +

+ Nous procédons de manière équivalente pour les pages Facebook connectées. Nous ne collectons ni + la liste des abonnés, ni les messages privés, ni les données de navigation des visiteurs de ces + comptes. +

+ +

3. Finalités

+

+ Ces données sont utilisées exclusivement pour identifier le compte de destination dans + l'interface et y publier les vidéos et publications créées par nos équipes, immédiatement ou à + l'heure programmée. Elles ne servent à aucune autre finalité. +

+ +

4. Données que nous transmettons aux plateformes

+

+ Lors d'une publication, nous transmettons à la plateforme concernée le fichier vidéo ou image, + le texte de la publication, ainsi que les paramètres de diffusion associés (niveau de + confidentialité, autorisation des commentaires). Ces contenus sont ensuite régis par la + politique de confidentialité de la plateforme concernée. +

+ +

5. Conservation et sécurité

+ + +

6. Partage avec des tiers

+

+ Nous ne vendons ni ne louons ces données, et ne les transmettons à aucun tiers à des fins + publicitaires ou de profilage. Elles ne sont communiquées qu'aux plateformes de destination + (TikTok, Meta) dans la stricte mesure nécessaire à la publication demandée, ainsi qu'à nos + prestataires techniques d'hébergement et de traitement vidéo agissant sur nos instructions. +

+ +

7. Retirer une autorisation

+

+ Le titulaire d'un compte connecté peut retirer son autorisation à tout moment : +

+ +

+ Le retrait de l'autorisation empêche toute publication ultérieure. Il n'entraîne pas la + suppression des contenus déjà publiés sur la plateforme, qui doivent être supprimés depuis + celle-ci. +

+ +

8. Vos droits

+

+ Conformément au Règlement général sur la protection des données, vous disposez d'un droit + d'accès, de rectification, d'effacement, de limitation et de portabilité des données vous + concernant, ainsi que du droit d'introduire une réclamation auprès de la CNIL. Pour exercer ces + droits, écrivez à ${escapeHtml(company.email)}. +

+ +

9. Modification de cette politique

+

+ Cette politique peut être mise à jour. La date de dernière mise à jour figure en tête de page. +

+ + ${renderFooter()}`; + + res.type('html').send(renderPage('Politique de confidentialité', body)); +});