Top.Mail.Ru
  • CMS «GIRVAS»

    Un sistema di gestione dei contenuti flessibile e gratuito, che consente di creare un sito di qualsiasi tipologia.

    Con noi è più facile!

  • Assolutamente gratuito

    Basta usare sistemi di gestione vecchi e a pagamento! È giunta l'era delle nuove soluzioni - scegliete «GIRVAS»!

  • Soluzione careliana

    «GIRVAS» è stato sviluppato nella Repubblica di Carelia ed è iscritto nel Registro del software russo del Ministero dello sviluppo digitale della Federazione Russa (numero di registrazione n. 25012 del 27.11.2024).

0.4.0 «Segezha»

Versione di CMS «GIRVAS» del 3 ottobre 2026 nella fase di sviluppo «Segezha».

Ultime modifiche

QueryBuilder: supporto per JOIN, espressioni CASE e indici

Implementato:

  • Aggiunto l"Enum IndexType con i tipi di indice (BTREE, HASH, GIST, GIN, SPGIST, BRIN, FULLTEXT)
  • Aggiunta la classe ClauseJoin per i JOIN in SELECT (INNER, LEFT, RIGHT, FULL)
  • Implementata la generazione adattiva delle condizioni JOIN per MySQL e PostgreSQL
  • Aggiunta la classe CaseExpression per costruire espressioni CASE
  • Implementati i metodi whenJsonLike() e whenJsonArrayContains() per la ricerca JSON
  • Aggiunto il metodo statico CaseExpression::sum()
  • Aggiunto il metodo factory createCase() in QueryBuilder
  • Aggiunta la classe StatementCreateIndex per CREATE INDEX
  • Aggiunta la classe StatementDropIndex per DROP INDEX
  • Implementato il supporto per UNIQUE, CONCURRENTLY, IF NOT EXISTS/IF EXISTS, indici parziali con WHERE
  • Aggiunti i metodi setStatementCreateIndex() e setStatementDropIndex()
  • Aggiunta la cache dei dati inizializzati in EntryCategory

Corretto:

  • Escaping delle espressioni CASE in addSelections() per PostgreSQL

Dialetti SQL: supporto per MySQL e PostgreSQL a livello di core

Implementato:

  • Classe astratta Dialect e implementazioni PostgreSql, MySql
  • Factory DialectFactory
  • Tipi logici (id, bigint, integer, boolean, string, string:N, text, json, timestamp)
  • Metodi JSON (jsonExtractBoolean, jsonExtractInt, jsonBuildObject, jsonMergePatch, jsonMergePatches, jsonObjectMergeKey, jsonLike, jsonArrayContainsLike)
  • Metodi per le date (extractYearFromUnixTimestamp, extractMonthFromUnixTimestamp)
  • Metodi LIKE, IN, LIMIT/OFFSET, getLastInsertedIDCondition
  • Metodi di capacità (supportsInsertReturning, supportsConcurrently, supportsIfNotExistsForIndex, supportsPartialIndex, supportsDropIndexConcurrently, supportsDropIndexIfExists, supportsIndexType, requiresUsingClause, supportsDefault)
  • Tutti gli Statement trasferiti sul dialetto (CreateTable, CreateIndex, DropIndex, Insert, Select, Update, Delete)
  • Tutti i Clause trasferiti sul dialetto (Returning, From, Join, Where, OrderBy, Limit, Set)
  • Installer adattato: 22 tabelle, 64 indici, createIndexSafe()
  • Logica di business trasferita sul dialetto (13 file: Entry, Entries, EntryCategory, EntriesCategories, EntryComment, EntryComments, User, Users, UserGroup, UsersGroups, PageStatic, PageStatic/Version, Pages)

152-FZ: copertura tecnica completa a livello di core

Implementato:

  • Logging di tutte le azioni sui dati personali (voci, pagine, media, utenti, categorie, selezioni, moduli, blocchi, commenti, gruppi, feed, impostazioni CMS)
  • Logging dell"accesso ai dati personali (scheda utente, elenco utenti, profilo altrui, login/logout, invio moduli, visualizzazione log, elenco consensi)
  • Logging delle impostazioni CMS con registrazione solo dei campi effettivamente modificati
  • Versionamento dei documenti legali (tabella pages_static_versions, classe PageStatic\Version, UI del pannello di amministrazione, lettura di ?version=X.Y sul frontend)
  • Registrazione dei consensi nei moduli dinamici (classe User\Consent, tipo di campo consent, associazione a documento e versione)
  • Registrazione dei consensi durante la registrazione (UserConsent::giveBatch)
  • Revoca del consenso nel profilo utente (handler api/user/patch.handler.php, UI «I miei consensi»)
  • Visualizzazione e gestione dei consensi nel pannello di amministrazione (/admin/usersConsents, permesso PERMISSION_ADMIN_USERS_CONSENTS_MANAGEMENT)
  • Esportazione CSV dei consensi (14 colonne, BOM per Excel)
  • Esportazione dei dati dell"interessato ai sensi dell"art. 14 (ZIP: profile.json, consents.csv, reports.csv, manifest.json)
  • Protezione dalla falsificazione dell"indirizzo IP (Client::getRealIPAddress, proxy attendibili, verifica CIDR IPv4/IPv6)
  • Anonimizzazione dei dati personali ai sensi dell"art. 5 (classe User\Anonymizer, User::isAnonymized, handler /handler/user/anonymize)
  • Rotazione dei log ai sensi dell"art. 5 (tabella reports_archive, classe Reports\Rotator, cron/rotateReports.php, UI su /admin/settings/security)
  • Banner cookie per tutti i visitatori (inclusi gli anonimi) con registrazione del consenso e protezione dai duplicati
  • Impostazione security_legal_documents nel pannello di amministrazione (selezione dei documenti legali)
  • Multilingua dei report (entryTitles, pageTitles, categoryTitles ecc. per locale)

Provider OAuth: parte server

Implementato:

  • Tre tabelle: oauth_clients, oauth_auth_codes, oauth_access_tokens
  • Classi Client, AuthCode, Token in core/PHPLibrary/OAuth/
  • Endpoint /handler/oauth/authorize (GET/POST) e /handler/oauth/token (POST)
  • Supporto ai grant authorization_code e refresh_token
  • Supporto obbligatorio di PKCE (S256)
  • Validazione rigorosa di redirect_uri (corrispondenza esatta, divieto di schemi non HTTP)
  • Codici di autorizzazione monouso con TTL di 60 secondi
  • Rotazione dei refresh token a ogni aggiornamento
  • Hashing di client_secret tramite BCrypt (cost=12)
  • Verifica dei client da parte di un amministratore prima della concessione dell"accesso
  • Limiti al numero di token per applicazione
  • Esclusione della verifica CSRF per /handler/oauth/* (requisito del protocollo)
  • Test CLI oauth_test.php (11 controlli) e test HTTP oauth_http_test.sh (ciclo completo)

Corretto:

  • RegenerateSecret() non salvava il nuovo secret
  • Scope vuoto nel refresh token

Multilingua delle impostazioni del sito

Implementato:

  • Archiviazione JSON delle impostazioni per locale (base_site_title, seo_site_description, seo_site_keywords)
  • Helper getAdminLocaleName e getLocalizedSettingValue
  • Supporto a tre formati di lettura: nuovo JSON, vecchio elenco piatto, vecchia stringa piatta
  • Migrazione automatica dei vecchi dati al primo salvataggio
  • Separazione della locale amministrativa e pubblica (Configurator::getSiteTitle/Description/Keywords)
  • UI: select della locale nell"intestazione della pagina delle impostazioni, campo nascosto _settings_locale

Corretto:

  • Bug con la visualizzazione di «Array» nel titolo/descrizione/parole chiave dopo il primo salvataggio
  • Bug con la rara impossibilità di ottenere i dati della locale

Creazione automatica degli indici durante l"installazione del CMS

Implementato:

  • Aggiunto un blocco di creazione degli indici al passaggio 6 dell"installazione dopo la generazione delle tabelle
  • Indici per le tabelle entries, entries_categories, entries_comments, pages_static
  • Indici per le tabelle users, users_sessions, forms_data, web_channels, metrics
  • Indici univoci su name, login, email
  • Per PostgreSQL aggiunti indici GIN sui campi JSONB e un indice parziale per le voci pubblicate
  • Tutti gli indici sono creati con IF NOT EXISTS; gli errori vengono registrati senza interrompere l"installazione

Pannello di amministrazione: ricerca e ordinamento

Implementato:

  • Ricerca e ordinamento in 10 sezioni: users, usersGroups, usersConsents, entries, pages, entriesCategories, entriesComments, entriesSamples, forms, contentBlocks
  • Parametri GET ?value=... e ?sort=... da whitelist
  • Conservazione dei parametri nella paginazione (buildQueryString + startPart)
  • UI: Choices + Input + Button nel contenitore #E8548530785
  • Metodi getAll($searchValue, $sortRule) e getCountTotal($searchValue) nei repository
  • 6 regole di ordinamento (per data di creazione/aggiornamento ↑↓, in ordine alfabetico ↑↓)

Corretto:

  • Bug in Users::getCountByGroupID() — AND superfluo nel ramo MySQL
  • Quoting adattivo delle colonne per PostgreSQL

Yandex.Metrica

Implementato:

  • Impostazione seo_code_yandex_metrika (solo ID numerico)
  • Campo su /admin/settings/seo
  • Inserimento dello script Metrica e di <noscript> in <head> (tema default)
  • Doppia validazione: preg_replace("/\D/", "") al salvataggio, ctype_digit() in output
  • Inserimento tramite createTextNode + appendChild (altrimenti saveHTML() rompe lo script inline)

Altro

Corretto:

  • Il banner cookie veniva mostrato di nuovo in presenza del cookie allowCookies
  • Inserimento batch su MySQL con innodb_autoinc_lock_mode = 2
  • Perdita di campi sensibili nell"output di debug

Versione precedente: 0.3.0 «Shuya»

Traduzioni

Commenti

Non ci sono commenti a questo articolo.