Top.Mail.Ru
  • CMS «GIRVAS»

    Un système de gestion de contenu flexible et gratuit, permettant de créer un site de toute orientation.

    Plus simple avec nous !

  • Absolument gratuit

    Arrêtez d'utiliser des systèmes de gestion anciens et payants ! L'ère des nouvelles solutions est arrivée - choisissez «GIRVAS» !

  • Solution carélienne

    «GIRVAS» a été développé en République de Carélie et est inscrit au Registre des logiciels russes du Ministère du développement numérique de la Fédération de Russie (numéro d'enregistrement n° 25012 du 27.11.2024).

0.4.0 « Segezha »

Version de CMS « GIRVAS » du 3 octobre 2026 à l"étape de développement « Segezha ».

Dernières modifications

QueryBuilder : prise en charge des JOIN, des expressions CASE et des index

Implémenté :

  • Ajout de l"Enum IndexType avec les types d"index (BTREE, HASH, GIST, GIN, SPGIST, BRIN, FULLTEXT)
  • Ajout de la classe ClauseJoin pour les JOIN dans SELECT (INNER, LEFT, RIGHT, FULL)
  • Implémentation de la génération adaptative des conditions JOIN pour MySQL et PostgreSQL
  • Ajout de la classe CaseExpression pour construire des expressions CASE
  • Implémentation des méthodes whenJsonLike() et whenJsonArrayContains() pour la recherche JSON
  • Ajout de la méthode statique CaseExpression::sum()
  • Ajout de la méthode de fabrique createCase() dans QueryBuilder
  • Ajout de la classe StatementCreateIndex pour CREATE INDEX
  • Ajout de la classe StatementDropIndex pour DROP INDEX
  • Implémentation de la prise en charge de UNIQUE, CONCURRENTLY, IF NOT EXISTS/IF EXISTS, des index partiels avec WHERE
  • Ajout des méthodes setStatementCreateIndex() et setStatementDropIndex()
  • Ajout de la mise en cache des données initialisées dans EntryCategory

Corrigé :

  • Échappement des expressions CASE dans addSelections() pour PostgreSQL

Dialectes SQL : prise en charge de MySQL et PostgreSQL au niveau du noyau

Implémenté :

  • Classe abstraite Dialect et implémentations PostgreSql, MySql
  • Fabrique DialectFactory
  • Types logiques (id, bigint, integer, boolean, string, string:N, text, json, timestamp)
  • Méthodes JSON (jsonExtractBoolean, jsonExtractInt, jsonBuildObject, jsonMergePatch, jsonMergePatches, jsonObjectMergeKey, jsonLike, jsonArrayContainsLike)
  • Méthodes de date (extractYearFromUnixTimestamp, extractMonthFromUnixTimestamp)
  • Méthodes LIKE, IN, LIMIT/OFFSET, getLastInsertedIDCondition
  • Méthodes de capacités (supportsInsertReturning, supportsConcurrently, supportsIfNotExistsForIndex, supportsPartialIndex, supportsDropIndexConcurrently, supportsDropIndexIfExists, supportsIndexType, requiresUsingClause, supportsDefault)
  • Tous les Statement transférés vers le dialecte (CreateTable, CreateIndex, DropIndex, Insert, Select, Update, Delete)
  • Tous les Clause transférés vers le dialecte (Returning, From, Join, Where, OrderBy, Limit, Set)
  • Installateur adapté : 22 tables, 64 index, createIndexSafe()
  • Logique métier transférée vers le dialecte (13 fichiers : Entry, Entries, EntryCategory, EntriesCategories, EntryComment, EntryComments, User, Users, UserGroup, UsersGroups, PageStatic, PageStatic/Version, Pages)

152-FZ : couverture technique complète au niveau du noyau

Implémenté :

  • Journalisation de toutes les actions sur les données personnelles (entrées, pages, médias, utilisateurs, catégories, sélections, formulaires, blocs, commentaires, groupes, flux, paramètres CMS)
  • Journalisation de l"accès aux données personnelles (fiche utilisateur, liste des utilisateurs, profil d"autrui, connexion/déconnexion, envoi de formulaire, consultation des journaux, liste des consentements)
  • Journalisation des paramètres CMS avec enregistrement uniquement des champs réellement modifiés
  • Versionnage des documents juridiques (table pages_static_versions, classe PageStatic\Version, UI du panneau d"administration, lecture de ?version=X.Y côté frontend)
  • Enregistrement des consentements dans les formulaires dynamiques (classe User\Consent, type de champ consent, liaison au document et à la version)
  • Enregistrement des consentements lors de l"inscription (UserConsent::giveBatch)
  • Retrait du consentement dans le profil utilisateur (handler api/user/patch.handler.php, UI « Mes consentements »)
  • Consultation et gestion des consentements dans le panneau d"administration (/admin/usersConsents, droit PERMISSION_ADMIN_USERS_CONSENTS_MANAGEMENT)
  • Export CSV des consentements (14 colonnes, BOM pour Excel)
  • Export des données de la personne concernée selon l"art. 14 (ZIP : profile.json, consents.csv, reports.csv, manifest.json)
  • Protection contre la falsification de l"adresse IP (Client::getRealIPAddress, proxys de confiance, vérification CIDR IPv4/IPv6)
  • Anonymisation des données personnelles selon l"art. 5 (classe User\Anonymizer, User::isAnonymized, handler /handler/user/anonymize)
  • Rotation des journaux selon l"art. 5 (table reports_archive, classe Reports\Rotator, cron/rotateReports.php, UI à /admin/settings/security)
  • Bannière cookies pour tous les visiteurs (y compris anonymes) avec enregistrement du consentement et protection contre les doublons
  • Paramètre security_legal_documents dans le panneau d"administration (sélection des documents juridiques)
  • Multilinguisme des rapports (entryTitles, pageTitles, categoryTitles, etc. par locale)

Fournisseur OAuth : partie serveur

Implémenté :

  • Trois tables : oauth_clients, oauth_auth_codes, oauth_access_tokens
  • Classes Client, AuthCode, Token dans core/PHPLibrary/OAuth/
  • Points de terminaison /handler/oauth/authorize (GET/POST) et /handler/oauth/token (POST)
  • Prise en charge des grants authorization_code et refresh_token
  • Prise en charge obligatoire de PKCE (S256)
  • Validation stricte de redirect_uri (correspondance exacte, interdiction des schémas non HTTP)
  • Codes d"autorisation à usage unique avec TTL de 60 secondes
  • Rotation des refresh tokens à chaque actualisation
  • Hachage de client_secret via BCrypt (cost=12)
  • Vérification des clients par un administrateur avant l"octroi de l"accès
  • Limites du nombre de tokens par application
  • Exclusion de la vérification CSRF pour /handler/oauth/* (exigence du protocole)
  • Test CLI oauth_test.php (11 vérifications) et test HTTP oauth_http_test.sh (cycle complet)

Corrigé :

  • RegenerateSecret() ne sauvegardait pas le nouveau secret
  • Scope vide lors du refresh token

Multilinguisme des paramètres du site

Implémenté :

  • Stockage JSON des paramètres par locale (base_site_title, seo_site_description, seo_site_keywords)
  • Helpers getAdminLocaleName et getLocalizedSettingValue
  • Prise en charge de trois formats de lecture : nouveau JSON, ancienne liste plate, ancienne chaîne plate
  • Migration automatique des anciennes données lors de la première sauvegarde
  • Séparation de la locale d"administration et de la locale publique (Configurator::getSiteTitle/Description/Keywords)
  • UI : sélecteur de locale dans l"en-tête de la page des paramètres, champ caché _settings_locale

Corrigé :

  • Bug d"affichage de « Array » dans le titre/la description/les mots-clés après la première sauvegarde
  • Bug de rare impossibilité d"obtenir les données de locale

Création automatique des index lors de l"installation du CMS

Implémenté :

  • Ajout d"un bloc de création d"index à l"étape 6 de l"installation après la génération des tables
  • Index pour les tables entries, entries_categories, entries_comments, pages_static
  • Index pour les tables users, users_sessions, forms_data, web_channels, metrics
  • Index uniques sur name, login, email
  • Pour PostgreSQL, ajout d"index GIN sur les champs JSONB et d"un index partiel pour les entrées publiées
  • Tous les index sont créés avec IF NOT EXISTS ; les erreurs sont journalisées sans interrompre l"installation

Panneau d"administration : recherche et tri

Implémenté :

  • Recherche et tri dans 10 sections : users, usersGroups, usersConsents, entries, pages, entriesCategories, entriesComments, entriesSamples, forms, contentBlocks
  • Paramètres GET ?value=... et ?sort=... depuis une liste blanche
  • Conservation des paramètres dans la pagination (buildQueryString + startPart)
  • UI : Choices + Input + Button dans le conteneur #E8548530785
  • Méthodes getAll($searchValue, $sortRule) et getCountTotal($searchValue) dans les dépôts
  • 6 règles de tri (par date de création/mise à jour ↑↓, par ordre alphabétique ↑↓)

Corrigé :

  • Bug dans Users::getCountByGroupID() — AND superflu dans la branche MySQL
  • Citation adaptative des colonnes pour PostgreSQL

Yandex.Metrica

Implémenté :

  • Paramètre seo_code_yandex_metrika (ID numérique uniquement)
  • Champ à /admin/settings/seo
  • Insertion du script Metrica et de <noscript> dans <head> (thème default)
  • Double validation : preg_replace("/\D/", "") à la sauvegarde, ctype_digit() à l"affichage
  • Insertion via createTextNode + appendChild (sinon saveHTML() casse le script inline)

Divers

Corrigé :

  • La bannière cookies s"affichait à nouveau en présence du cookie allowCookies
  • Insertion batch sur MySQL avec innodb_autoinc_lock_mode = 2
  • Fuite de champs sensibles dans la sortie de debug

Version précédente : 0.3.0 « Shuya »

Traductions

Commentaires

Cet article n'a pas de commentaires.