Top.Mail.Ru
  • CMS «GIRVAS»

    Ein flexibles und kostenloses Content-Management-System, mit dem Sie eine Website für jede Branche erstellen können.

    Mit uns einfacher!

  • Absolut kostenlos

    Hören Sie auf, alte und kostenpflichtige Verwaltungssysteme zu verwenden! Die Ära der neuen Lösungen ist angebrochen – wählen Sie «GIRVAS»!

  • Karelische Lösung

    «GIRVAS» wurde in der Republik Karelien entwickelt und ist im Register der russischen Software des Ministeriums für digitale Entwicklung der Russischen Föderation eingetragen (Registrierungsnummer Nr. 25012 vom 27.11.2024).

0.4.0 „Segezha“

Version von CMS „GIRVAS“ vom 3. Oktober 2026 in der Entwicklungsphase „Segezha“.

Letzte Änderungen

QueryBuilder: Unterstützung für JOIN, CASE-Ausdrücke und Indizes

Umgesetzt:

  • Enum IndexType mit Indexarten hinzugefügt (BTREE, HASH, GIST, GIN, SPGIST, BRIN, FULLTEXT)
  • Klasse ClauseJoin für JOINs in SELECT hinzugefügt (INNER, LEFT, RIGHT, FULL)
  • Adaptive Generierung von JOIN-Bedingungen für MySQL und PostgreSQL umgesetzt
  • Klasse CaseExpression zum Aufbau von CASE-Ausdrücken hinzugefügt
  • Methoden whenJsonLike() und whenJsonArrayContains() für die JSON-Suche umgesetzt
  • Statische Methode CaseExpression::sum() hinzugefügt
  • Factory-Methode createCase() in QueryBuilder hinzugefügt
  • Klasse StatementCreateIndex für CREATE INDEX hinzugefügt
  • Klasse StatementDropIndex für DROP INDEX hinzugefügt
  • Unterstützung für UNIQUE, CONCURRENTLY, IF NOT EXISTS/IF EXISTS, partielle Indizes mit WHERE umgesetzt
  • Methoden setStatementCreateIndex() und setStatementDropIndex() hinzugefügt
  • In EntryCategory Caching initialisierter Daten hinzugefügt

Behoben:

  • Escaping von CASE-Ausdrücken in addSelections() für PostgreSQL

SQL-Dialekte: Unterstützung für MySQL und PostgreSQL auf Kernel-Ebene

Umgesetzt:

  • Abstrakte Klasse Dialect und Implementierungen PostgreSql, MySql
  • Factory DialectFactory
  • Logische Typen (id, bigint, integer, boolean, string, string:N, text, json, timestamp)
  • JSON-Methoden (jsonExtractBoolean, jsonExtractInt, jsonBuildObject, jsonMergePatch, jsonMergePatches, jsonObjectMergeKey, jsonLike, jsonArrayContainsLike)
  • Datumsmethoden (extractYearFromUnixTimestamp, extractMonthFromUnixTimestamp)
  • Methoden LIKE, IN, LIMIT/OFFSET, getLastInsertedIDCondition
  • Fähigkeitsmethoden (supportsInsertReturning, supportsConcurrently, supportsIfNotExistsForIndex, supportsPartialIndex, supportsDropIndexConcurrently, supportsDropIndexIfExists, supportsIndexType, requiresUsingClause, supportsDefault)
  • Alle Statements auf den Dialekt umgestellt (CreateTable, CreateIndex, DropIndex, Insert, Select, Update, Delete)
  • Alle Clauses auf den Dialekt umgestellt (Returning, From, Join, Where, OrderBy, Limit, Set)
  • Installer angepasst: 22 Tabellen, 64 Indizes, createIndexSafe()
  • Geschäftslogik auf den Dialekt umgestellt (13 Dateien: Entry, Entries, EntryCategory, EntriesCategories, EntryComment, EntryComments, User, Users, UserGroup, UsersGroups, PageStatic, PageStatic/Version, Pages)

152-FZ: vollständige technische Abdeckung auf Kernel-Ebene

Umgesetzt:

  • Protokollierung aller Aktionen mit personenbezogenen Daten (Einträge, Seiten, Medien, Benutzer, Kategorien, Auswahlen, Formulare, Blöcke, Kommentare, Gruppen, Feeds, CMS-Einstellungen)
  • Protokollierung des Zugriffs auf personenbezogene Daten (Benutzerkarte, Benutzerliste, fremdes Profil, Anmeldung/Abmeldung, Formularversand, Einsicht in Protokolle, Liste der Einwilligungen)
  • Protokollierung der CMS-Einstellungen mit Erfassung nur tatsächlich geänderter Felder
  • Versionierung juristischer Dokumente (Tabelle pages_static_versions, Klasse PageStatic\Version, UI der Administrationsoberfläche, Lesen von ?version=X.Y im Frontend)
  • Erfassung von Einwilligungen in dynamischen Formularen (Klasse User\Consent, Feldtyp consent, Bindung an Dokument und Version)
  • Erfassung von Einwilligungen bei der Registrierung (UserConsent::giveBatch)
  • Widerruf der Einwilligung im Benutzerprofil (Handler api/user/patch.handler.php, UI „Meine Einwilligungen“)
  • Anzeige und Verwaltung von Einwilligungen in der Administrationsoberfläche (/admin/usersConsents, Recht PERMISSION_ADMIN_USERS_CONSENTS_MANAGEMENT)
  • CSV-Export von Einwilligungen (14 Spalten, BOM für Excel)
  • Export von Betroffenen-Daten nach Art. 14 (ZIP: profile.json, consents.csv, reports.csv, manifest.json)
  • Schutz vor IP-Adressfälschung (Client::getRealIPAddress, vertrauenswürdige Proxys, CIDR-Prüfung IPv4/IPv6)
  • Anonymisierung personenbezogener Daten nach Art. 5 (Klasse User\Anonymizer, User::isAnonymized, Handler /handler/user/anonymize)
  • Rotation von Protokollen nach Art. 5 (Tabelle reports_archive, Klasse Reports\Rotator, cron/rotateReports.php, UI unter /admin/settings/security)
  • Cookie-Banner für alle Besucher (einschließlich anonymer Nutzer) mit Erfassung der Einwilligung und Schutz vor Duplikaten
  • Einstellung security_legal_documents in der Administrationsoberfläche (Auswahl juristischer Dokumente)
  • Mehrsprachigkeit der Berichte (entryTitles, pageTitles, categoryTitles u. a. nach Locales)

OAuth-Provider: Serverseite

Umgesetzt:

  • Drei Tabellen: oauth_clients, oauth_auth_codes, oauth_access_tokens
  • Klassen Client, AuthCode, Token in core/PHPLibrary/OAuth/
  • Endpunkte /handler/oauth/authorize (GET/POST) und /handler/oauth/token (POST)
  • Unterstützung der Grants authorization_code und refresh_token
  • Obligatorische PKCE-Unterstützung (S256)
  • Strikte Validierung von redirect_uri (exakte Übereinstimmung, Verbot von Nicht-HTTP-Schemata)
  • Einmalige Autorisierungscodes mit TTL von 60 Sekunden
  • Rotation von Refresh-Tokens bei jeder Aktualisierung
  • Hashing von client_secret über BCrypt (cost=12)
  • Verifizierung von Clients durch einen Administrator vor der Gewährung des Zugriffs
  • Limits für die Anzahl der Tokens pro Anwendung
  • Ausschluss der CSRF-Prüfung für /handler/oauth/* (Protokollanforderung)
  • CLI-Test oauth_test.php (11 Prüfungen) und HTTP-Test oauth_http_test.sh (vollständiger Zyklus)

Behoben:

  • RegenerateSecret() speicherte das neue Secret nicht
  • Leerer scope beim Refresh-Token

Mehrsprachigkeit der Website-Einstellungen

Umgesetzt:

  • JSON-Speicherung der Einstellungen nach Locales (base_site_title, seo_site_description, seo_site_keywords)
  • Helfer getAdminLocaleName und getLocalizedSettingValue
  • Unterstützung von drei Lesformaten: neues JSON, alte flache Liste, alte flache Zeichenkette
  • Automatische Migration alter Daten beim ersten Speichern
  • Trennung von Admin- und öffentlicher Locale (Configurator::getSiteTitle/Description/Keywords)
  • UI: Locale-Select im Kopfbereich der Einstellungsseite, verstecktes Feld _settings_locale

Behoben:

  • Fehler mit der Ausgabe von „Array“ in Titel/Beschreibung/Schlüsselwörtern nach dem ersten Speichern
  • Fehler mit der seltenen Unmöglichkeit, Locale-Daten zu erhalten

Automatische Erstellung von Indizes bei der CMS-Installation

Umgesetzt:

  • Block zur Indexerstellung in Installationsschritt 6 nach der Tabellengenerierung hinzugefügt
  • Indizes für die Tabellen entries, entries_categories, entries_comments, pages_static
  • Indizes für die Tabellen users, users_sessions, forms_data, web_channels, metrics
  • Eindeutige Indizes auf name, login, email
  • Für PostgreSQL wurden GIN-Indizes auf JSONB-Feldern und ein partieller Index für veröffentlichte Einträge hinzugefügt
  • Alle Indizes werden mit IF NOT EXISTS erstellt; Fehler werden protokolliert, ohne die Installation abzubrechen

Administrationsoberfläche: Suche und Sortierung

Umgesetzt:

  • Suche und Sortierung in 10 Bereichen: users, usersGroups, usersConsents, entries, pages, entriesCategories, entriesComments, entriesSamples, forms, contentBlocks
  • GET-Parameter ?value=... und ?sort=... aus einer Whitelist
  • Beibehaltung der Parameter in der Paginierung (buildQueryString + startPart)
  • UI: Choices + Input + Button im Container #E8548530785
  • Methoden getAll($searchValue, $sortRule) und getCountTotal($searchValue) in Repositories
  • 6 Sortierregeln (nach Erstellungs-/Aktualisierungsdatum ↑↓, alphabetisch ↑↓)

Behoben:

  • Fehler in Users::getCountByGroupID() — überflüssiges AND im MySQL-Zweig
  • Adaptives Quoting von Spalten für PostgreSQL

Yandex.Metrica

Umgesetzt:

  • Einstellung seo_code_yandex_metrika (nur numerische ID)
  • Feld unter /admin/settings/seo
  • Einfügen des Metrica-Skripts und <noscript> in <head> (Theme default)
  • Doppelte Validierung: preg_replace("/\D/", "") beim Speichern, ctype_digit() bei der Ausgabe
  • Einfügen über createTextNode + appendChild (sonst bricht saveHTML() das Inline-Skript)

Sonstiges

Behoben:

  • Cookie-Banner wurde erneut angezeigt, wenn das Cookie allowCookies vorhanden war
  • Batch-Insert bei MySQL mit innodb_autoinc_lock_mode = 2
  • Leck sensibler Felder in der Debug-Ausgabe

Vorherige Version: 0.3.0 „Shuya“

Übersetzungen

Kommentare

Zu diesem Beitrag gibt es keine Kommentare.