Журнал изменений

Журнал изменений

Фильтр и поиск

Всего: 1091 Доступных коммитов | Отфильтровано: 1091 Коммиты | Страница: 4 / 110
28.07.2026
Feature: mail settings, the test send and the value-driven row hook
Автор: Eduard Laas | Дата: 10:54 28.07.2026

Stage 1 batch 5 of docs/MAIL-2026.md gives the three transports a configuration and an administrator a way to prove it works before real mail depends on it. The delivery half of the subsystem is now reachable from the panel rather than from a hand-written file, and the shipped defaults keep every installation delivering through PHP mail() until someone chooses otherwise. The 26 call sites still use addMail(), so nothing an installation sends has changed.

Core changes:

  1. Configuration (config/mail.php):
  2. Ship every key the plan lists at its documented default, transport php, the site-derived and SMTP credential fields empty

    • keys are written in the order setConfigFile() writes them, since it sorts
before export and a shipped file in reading order would be rewritten by the
first save
  • the queue keys ship complete but have no control yet: a row for batch or
keep would govern machinery that arrives in stage 2
  1. Mail tab (admin/modules/config.php):
  2. getMailPanel() builds the _MAILOPT tab: transport, sender identity, SMTP, the Sendmail path, the test send, then the existing mtemp

    • getMailRow() carries the transport a row belongs to, so the value hook can
hide it for every other one
  • the password field renders empty whatever is stored, and an empty
submission keeps the stored value through the setConfigFile() merge
  • a missing openssl or a disabled proc_open is reported beside the control it
disables; neither control is removed, because a disabled field posts nothing
and the next save would silently reset it
  • save() writes config/mail.php over the stored section, so the queue keys and an unchanged password survive

    • transport and encryption accept only their listed values
    • a sender or Reply-To address that fails validation refuses the whole save
before any file is written, rather than being stored and silently stopping
delivery
  • mailtest() is the fourth operation: POST, checkSiteToken(), the recipient defaults to adminmail, and the answer is either success or the transport's own error string

    • the field carrying the password is dropped from the request first, because
Logger records every posted field with a failure entry and the button
submits the shared config form
  1. Row visibility (plugins/system/slaed.js):
  2. setFieldShows() shows a row only for named values of another control, beside the tab-index hook it complements and in the same style

    • a row is written visible and is only ever hidden, so the settings stay
reachable when the script is not
  1. Locales (admin/lang/*.php):
  2. Twenty-one constants in all six languages, reusing _USER, _PASSWORD, _NONE, _SEND and _ERROR rather than adding scoped duplicates

  3. Tests and plan (tests/Unit/MailConfigTest.php, docs/MAIL-2026.md):
  4. Five cases hold the shipped file to its key set, its defaults, its key order and its string types, so a fresh install and an upgrade cannot diverge

  5. Record the batch in Progress with its decisions, the defect found and fixed inside it and the blockers left open

Benefits:

  • Delivery can be pointed at a relay, a binary or PHP mail() from the panel, and the choice is proved by a one-click test send instead of by the next password reset that fails

  • Configuration and its writability notice live where every other config section already lives, with no new module, no new tab and no new token mechanism

  • The value-driven hook is general: any row can now depend on the value of another field, which the tab-index hook could not express

Technical notes:

  • The test send reads the stored configuration, so settings are saved and then tested; the row says so

  • An empty password field cannot clear a stored password, which is what makes it safe to render the field empty

  • Header-bound values are stored as typed and sanitised where they reach a header, since the input text filter would corrupt a sender name inside MIME

  • Without JavaScript the config module shows its first tab only, which is how every tab on that screen already behaved

Feature: SMTP transport with its dialogue and tests
Автор: Eduard Laas | Дата: 10:04 28.07.2026

Stage 1 batch 4 of docs/MAIL-2026.md adds the third and last transport, the only one carrying real protocol risk, so the eight hazards the plan names are each closed and tested here. PHP ships a socket layer but no SMTP client, and this is the one part of the subsystem written against the protocol itself. Nothing selects it yet, since config/mail.php arrives in batch 5, so every installation keeps delivering through PHP mail().

Core changes:

  1. SMTP transport (core/classes/mail.php):
  2. addSmtpMail() conducts MAIL FROM, RCPT TO, DATA and the message over one connection that is opened once and kept

    • checkSmtpLink() returns the socket it already holds unless the relay
dropped it, which is what makes a stage 2 drain one handshake per run
  • checkSmtpGreet() runs the greeting, EHLO with a HELO fallback, STARTTLS
with the second EHLO it requires, and AUTH last
  • getSmtpReply() follows continuation lines to the final one and bounds them,
since a reply read a line at a time desynchronises the whole dialogue
  • checkSmtpStep() requires the expected reply code and aborts with the
relay's own text, so no unexpected code is read as an acceptance
  • getSmtpData() ends every line with CRLF whatever the stored body uses,
doubles a leading dot and leaves the terminating sequence the only bare one
  • setSmtpText() confirms every octet left, because a half-written command
desynchronises the dialogue and a closed socket is not a delivery
  • setSmtpFail() records the phase and the code stage 2 stores in its columns
and drops the connection, so no failure path leaves a socket open
  • TLS keeps peer and peer-name verification with no option to disable it, and is refused rather than skipped when openssl is missing

  • AUTH uses a mechanism the relay advertised, PLAIN before LOGIN; neither the password nor its encoded payload reaches a failure message at any level

  • Transport dispatch (core/classes/mail.php):
  • setDelivery() gained the smtp arm beside sendmail, with PHP mail() still the default for an unset or unknown value

  • Warning capture (core/classes/mail.php):
  • setWarnCatch() and getWarnText() replace the handler pattern batch 2 and batch 3 each carried a copy of, and serve the three new socket calls

    • an unhandled warning inside a pseudo-cron request would otherwise leak
into the response body a visitor receives
  1. Tests (tests/Unit/MailSmtpTest.php):
  2. Twenty cases drive the dialogue over a socket pair standing in for the relay, so multi-line replies, an unexpected code, dot-stuffing, CRLF line endings, the read timeout and the closed socket are exercised without a network

  3. Five guards were confirmed to fail their tests when removed: dot-stuffing, continuation handling, the advertised-mechanism read, the socket close and the connection reuse

  4. Plan (docs/MAIL-2026.md):
  5. Record the batch in Progress with its decisions, the defects found and fixed inside it and the blockers left open

Benefits:

  • An installation can point delivery at an authenticated relay, which is what most hosting now requires for mail to arrive at all

  • A hosted sender is reached through the SMTP credentials it publishes, with no code specific to any provider

  • Every failure carries the phase and the code, so a refusal can be attributed to connect, EHLO, AUTH, the sender, the recipient or the body

Technical notes:

  • Nothing writes mail.transport or any SMTP key yet, so no installation behaviour changes

  • No test reaches a relay: the dialogue is covered, the dialects real relays answer with are not, and the stage verification list covers them on a host that can deliver

  • Implicit SSL and the TLS handshake are the two paths no test enters, since a self-signed peer would only prove verification can be turned off

  • No new package: composer.json is untouched and the class uses PHP core only
Feature: Sendmail transport and transport dispatch
Автор: Eduard Laas | Дата: 09:37 28.07.2026

Stage 1 batch 3 of docs/MAIL-2026.md adds the second transport and the dispatch that chooses one. The binary is reached through proc_open() with an argument array, so no shell is involved and mail.sendmail stays a path rather than a command. Nothing selects it yet, since config/mail.php arrives in batch 5, so every installation keeps delivering through PHP mail().

Core changes:

  1. Sendmail transport (core/classes/mail.php):
  2. addSendMail() pipes the message into the configured binary and reads the exit status that popen() would hide

    • the command is an argument array: the path is validated as an existing
executable file and every argument (-t, -i, -f) is supplied by the class,
so panel access cannot become shell execution
  • -t takes the recipient from the To header, so no address is ever passed as
a command argument
  • proc_open() is probed rather than assumed, since shared hosting routinely
lists it in disable_functions
  • a short write is a failure of its own: a binary that died before reading
can still exit zero, which an unchecked fwrite() would report as accepted
  • the write uses the same warning handler as PHP mail(), because a closed
pipe raises one that would otherwise leak into the response body
  1. Transport dispatch (core/classes/mail.php):
  2. setDelivery() became the match on mail.transport that batch 2 promised

    • the default arm is PHP mail(), so an unset or unknown value keeps behaving
exactly as the installation does today
  1. Message composition (core/classes/mail.php):
  2. getHeaders() gained the subject, emitted only when the transport does not supply it, which is the rule the block already applied to To

  3. setError() bounds the recorded text at 255 characters, counted in characters so a multibyte transport response is not cut mid-character

  4. Tests (tests/Unit/MailTransportTest.php, tests/Unit/MailHeaderTest.php):
  5. Five cases over the two sendmail guards, the transport selection and the error bound, none of which start a process

  6. Both guards were confirmed to fail their tests when removed
  7. The eleven batch 1 getHeaders() calls carry the added argument, with no assertion changed

  8. Plan (docs/MAIL-2026.md):
  9. Record the batch in Progress with its decisions, the defects found and fixed inside it and the blockers left open

Benefits:

  • An installation whose host has no usable mail() gains a second way out
  • A failed delivery now carries the binary's own exit status and stderr
  • Message assembly stays in one place for the SMTP transport in batch 4

Technical notes:

  • Nothing writes mail.transport or mail.sendmail yet, so no installation behaviour changes

  • The pipe itself is unexercised here: this box has no sendmail binary, and the stage verification list covers it on a host that can deliver

  • No new package: composer.json is untouched and the class uses PHP core only
Feature: PHP Mail transport and the enqueue contract
Автор: Eduard Laas | Дата: 09:08 28.07.2026

Stage 1 batch 2 of docs/MAIL-2026.md adds the entry point every call site will use and the default transport behind it, so one place validates a message, composes it and hands it over. Nothing calls addQueue() yet and addMail() still delivers, so no installation behaviour changes; the 26 call sites migrate in batch 6.

Core changes:

  1. Enqueue contract (core/classes/mail.php):
  2. addQueue() accepts one message and delivers it, returning the transport result

    • recipient and sender are validated before a transport is entered, so an
address carrying a line break aborts the send instead of being cleaned
  • an unresolvable sender is refused rather than emitted as From: <>
  • client => true appends the IP, browser and agent hash block inside the
request that owns that data, replacing the magic $id of addMail()
  • priority defaults to 3, as addMail() did
  1. PHP Mail transport (core/classes/mail.php):
  2. setDelivery() encodes subject and body and hands them to the transport, which is the path the stage 2 drain will call instead of addQueue()

  3. addPhpMail() delivers through mail() with the envelope sender as -f

    • the envelope sender follows the resolved From, so the receiving side
authenticates the address the message claims
  • a host refusing the fifth parameter is expected: the fallback is attempted
and logged once per run, and the parameter is dropped for the rest of it
  • the warning handler captures the text instead of discarding it, and the
result of mail() is read rather than ignored
  • getMaskedMail() masks the address a failure records and refuses to log a value that does not validate, so an injected tail cannot reach the log

  • Tests (tests/Unit/MailTransportTest.php, tests/bootstrap.php):
  • Five cases over the pre-transport aborts, the mask and the client block, none of which enter mail() itself

  • getAgent() mock beside the getIp() one the bootstrap already carried
  • Plan (docs/MAIL-2026.md):
  • Record the batch in Progress with its decisions, the defects found and fixed inside it and the blockers left open

Benefits:

  • A refused message stops being invisible: it returns false, fills getError() and produces a Logger::addSite() entry with the transport and a masked address

  • Delivery has one entry point, so the stage 2 queue changes only what happens inside the object

  • A broken transport costs one attempt per message rather than two

Technical notes:

  • Headers reach mail() with CRLF where addMail() used bare LF; composition and semantics are unchanged, encoding and line handling deliberately are not

  • title length is validated in stage 2, where the VARCHAR(255) column exists
  • No new package: composer.json is untouched and the class uses PHP core only
Feature: mail service groundwork, message composition
Автор: Eduard Laas | Дата: 08:43 28.07.2026

Stage 1 batch 1 of docs/MAIL-2026.md adds the Mail service that will own every outgoing message. Only the composition half lands here: pure functions over one message with no transport behind them, so the RFC work is reviewable on its own before PHP mail, Sendmail and SMTP arrive. Nothing calls it yet, addMail() is untouched, and delivery behaviour is unchanged.

Core changes:

  1. Mail service (core/classes/mail.php):
  2. Resolve sender identity per the plan's table: mail.frommail and mail.fromname win, the caller's address and the site name are the fallbacks

  3. Assemble the MIME header block without a self-written Return-Path, which the receiving MTA owns

    • To is emitted only when the transport does not write its own, as PHP mail()
does and as Sendmail started with -t cannot
  • Reply-To drops the display name that only repeated the address
  • Encode subject and display name through mb_encode_mimeheader with B encoding and correct folding, replacing a hand-built encoded word that never folded

    • an encoded word is no longer wrapped in quotes, which RFC 2047 forbids
    • a plain ASCII display name becomes a proper quoted string instead
  • Wrap the base64 body at 76 characters, so a 5 KB message stops going out as a single 6720-octet line

  • Validate addresses with FILTER_VALIDATE_EMAIL and refuse control characters before whitespace is trimmed, so a trailing CRLF cannot be trimmed into a valid address

  • Strip control characters from header text bytewise; a UTF-8 aware pattern returns null on a malformed byte and would drop the whole value

  • Bootstrap (core/system.php):
  • Require the class between the config and core/security.php, and create $mailer once the database connection exists

  • Tests (tests/Unit/MailHeaderTest.php):
  • 23 cases over identity resolution, encoded-word folding limits, base64 line length, CRLF endings, encoding round trips and every address injection path

  • Plan (docs/MAIL-2026.md):
  • Record the batch in Progress with its decisions, its deviations and the defect found and fixed inside it

  • Re-measure the core/system.php line references that the new require shifted

Benefits:

  • Header and encoding conformance is reviewable before any transport depends on it
  • One place composes a message, so the three transports cannot each grow their own
  • Header injection is closed at a single sanitiser rather than per transport

Technical notes:

  • filterText() is no longer applied to subjects and addresses: it is an input filter that HTML-escapes a MIME subject, corrupts a local part containing &, and depends on request state the stage 2 drain will not have

  • Subject bytes therefore change for & < > " ' and %xx sequences; the plan states that byte parity is not the criterion for this stage

  • No new package: composer.json is untouched and the class uses PHP core only
  • No behaviour change yet: addMail() still delivers every one of the 26 call sites, which migrate in batch 6

Docs: record stage 0 and re-measure the comment facts
Автор: Eduard Laas | Дата: 08:13 28.07.2026

The comment plan carried numbers measured on 2026-07-27 and line references that the stage 0 fix moved. Both are re-measured against the live installation so a later chat reads facts instead of history, and the baseline coverage claim in the test guide is corrected to what the stand actually produces.

Core changes:

  1. Comment plan (docs/COMMENTS-REDESIGN-2026.md):
  2. Record the stage 0 batch in Progress: what landed, the decisions taken and the one deviation

  3. Re-measure _comment against the live table

    • 7355 rows instead of 7353, distribution and status counts with them
    • body classification 100 / 1709 / 1 / 10 / 5535, summing to the row count
    • br spellings and the legacy tag inventory, both stated as row counts
  4. Update the file:line references the fix shifted, and mark problem 1 closed with a pointer to the code that closes it

  5. Add a stage 1 blocker: the markup baseline covers six of the eight modules on this stand

  6. Test guide (docs/TESTS.md):
  7. Say plainly that a capture produced six modules, not eight, and that the media and shop fixtures must be re-prepared before the next capture

  8. List the new CommentTrustBoundaryTest and add it to the probe-driven contract tests

Benefits:

  • A new chat starting at stage 1 sees measured reality, not a stale snapshot
  • The parity claim of stage 1 cannot be made by accident over two missing modules

Technical notes:

  • Documentation only; no code or schema change
  • The classification methodology is unchanged, only its counts
Fix: comment writes take the moderation mode and module from the server
Автор: Eduard Laas | Дата: 08:13 28.07.2026

The comment write path decided premoderation from a request field and stored the target module straight from the request, so a crafted POST could publish past premoderation, attach a comment to another module and move another target's counter. Stage 0 of docs/COMMENTS-REDESIGN-2026.md closes that boundary in the current procedural code, ahead of the refactor.

Core changes:

  1. Target resolver (core/system.php):
  2. Add getCommentMode($mod, $id): the module name is only a key into a fixed eight-entry map, never an interpolated table name

    • the target row is loaded by id and must be visible under the same predicate
the module's own view() uses: time <= NOW(), status != '0' and catmids()
  • voting keeps its own rule: modul = '' plus the enddate/status pair
  • returns the row's acomm; 0 means not writable - unknown module, missing row,
invisible row or comments disabled
  • updateComment() and updateCommentStatus() read modul, cid and uid from the comment row by its id

    • the permission check and numcom() now use the stored module
    • updateCommentStatus() reads the row once instead of re-selecting it after
the status write
  1. Write handler (core/user.php):
  2. addComment() resolves the mode through getCommentMode() and no longer reads cid from the request

    • a target with comments disabled refuses the write for everyone, moderators
included
  • setComShow() drops cid from the submit URL and names its parameter acomm
  • Regression cover (tests/Unit/CommentTrustBoundaryTest.php, tests/Support/contract_probe.php):
  • Add the comment probe scenario: getCommentMode() is exercised against live rows in a booted core, with hostile cid and mod values in the request

  • Add six cases over the resolver and the three request handlers; all six fail against the unpatched files

Benefits:

  • Premoderation, the stored module and the target counter can no longer be chosen by the client

  • The module-to-table mapping exists in exactly one place, ready to move into the Comment class in stage 1

  • A draft, an expired item and an unreadable category stop accepting comments

Technical notes:

  • No table or column changes; rendered markup is unchanged and the comment markup baseline verifies byte for byte

  • The request still carries mod as a lookup key; the moderator action links keep their now-ignored &mod= until the transport stage

  • Rendering stays at safe = false until stage 2, together with the format column
27.07.2026
Fix: block script URL schemes in the parser and plan the mail and comment rework
Автор: Eduard Laas | Дата: 23:11 27.07.2026

Closes a stored-XSS vector reachable by any comment author, and lands the approved 2026 plans for the outgoing mail subsystem and the comment engine together with the tooling and the execution protocol they depend on.

Core changes:

  1. Parser URL validation (core/classes/parser.php):
  2. refuse data:, javascript: and vbscript: in every mode, not only in safe mode

    • comments render at safe=false, so the previous allowlist never applied to them
    • [url=javascript:...] produced a working href for anonymous authors
    • the scheme is compared against a copy stripped of whitespace and control
characters, so java&#9;script: cannot survive entity decoding
  • keep data: images working, which bypass this validator by design
  • Parser regression tests (tests/Unit/ParserFixturesTest.php):
  • eight byte-exact cases covering unsafe javascript:, vbscript:, mixed case, leading space, embedded tab and entity-encoded tab

  • verified to fail against the unpatched parser before the fix was applied
  • Mail plan (docs/MAIL-2026.md):
  • transport stage first: PHP mail, Sendmail and SMTP in one class, no library
  • queue and drain second, with atomic claim, backoff, retention and a campaign state machine covering preparing, canary, held, running and aborted

  • SMTP outcome taxonomy by phase, suppression only on a permanent RCPT TO verdict
  • audience stored as a criterion and expanded by a resumable producer job
  • Comment plan (docs/COMMENTS-REDESIGN-2026.md):
  • stage 0 closes the request-side trust boundary: acomm, modul and cid resolved server side through a fixed module map

  • stage 1 centralises every _comment statement into one class with byte parity
  • stage 2 moves rendering to safe=true behind an ordered body migration
  • Markup baseline tool (tools/comment-baseline.php):
  • captures and verifies the rendered comment list per module so the stage 1 parity requirement is checkable rather than asserted

  • covers all eight comment-bearing modules
  • Execution protocol (docs/EXECUTION-2026.md):
  • one batch per chat, ready-to-paste prompts, per-batch verification loop
  • Platform requirements (composer.json, setup/index.php, setup/lang/*, README.md, UPGRADING.md, package.json):

  • raise the PHP requirement to 8.4 and enforce it in the installer
  • declare ext-mbstring, ext-pdo and ext-json and check them on install
  • add _EXTSETUP to all six setup locales
  • Supporting documentation (docs/PERFORMANCE.md, docs/PRINCIPLES.md, docs/TESTS.md):

  • record the measured mail, comment and user-base facts where they outlive the plans

  • add the self-contained principle and the planned test coverage

Benefits:

  • removes an exploitable stored-XSS path across comments, forum and every other content surface

  • makes the comment refactor verifiable instead of trusted
  • gives both plans a single execution contract that survives between sessions

Technical notes:

  • BREAKING: the minimum PHP version is now 8.4; the installer refuses 8.1 to 8.3
  • BREAKING: ext-mbstring, ext-pdo and ext-json are now required explicitly
  • BREAKING: config/modules.php ships with every module active
  • storage/baseline is ignored by git: baselines are data- and host-specific
  • no runtime package was added; composer.json still declares only the platform
Fix: sync the editor into its textarea and plan the comment and mail rework
Автор: Eduard Laas | Дата: 15:48 27.07.2026

Posting a comment from the frontend was impossible: the editor only copied its content into the textarea on a native form submit, which htmx never triggers, so an empty text reached the server. Investigating it produced measurements that justify two follow-up plans.

Core changes:

  1. Editor value synchronisation (plugins/editors/toastui/driver.php):
  2. Bind the copy to editor events instead of the form submit event

    • change and blur keep the textarea current at all times
    • the submit listener stays for the plain, non-htmx path
  3. Frontend forms post the written text again; the admin panel is unaffected because it always submitted natively

  4. Comment subsystem plan (docs/COMMENTS-REDESIGN-2026.md):
  5. Record the measured state: a 252-line render function, a 51 KB response for a single add, filesort on the list query, no index behind the flood check, duplicated validation and an unreachable admin branch

  6. Describe the target: one Comments class owning SQL, validation, permissions and state changes, additive columns only, threads, soft delete, idempotent writes and per-fragment responses

  7. Split the work into five independently shippable stages with explicit verification, including migration and HTTP route checks

  8. Mail queue plan (docs/MAIL-QUEUE-2026.md):
  9. Record the measured state: 26.6 s spent inside one comment request, a single send point that discards the result of mail(), a private newsletter queue built on a comma separated column, and a throughput of four messages per hour

  10. Describe the target: one queue table, one MailQueue class behind the existing addMail() signature, an atomic claim, backoff and retry, and a scheduler drain

  11. Keep all 26 existing call sites untouched

Benefits:

  • Comments can be posted again from every frontend module
  • The two reworks start from measured facts instead of assumptions
  • The mail queue removes the blocking send for every feature, not only comments

Technical notes:

  • The editor change is client side only; no PHP behaviour changes
  • Both documents are plans; no schema or runtime change is included here
  • The mail queue is a prerequisite for stage 3 of the comment plan
Fix: input filter defects, captcha regions and honest filter tests
Автор: Eduard Laas | Дата: 14:24 27.07.2026

Rewriting the input filter tests against the shipped functions instead of local replicas exposed a fatal in filterFields() and two silent behaviour drifts. The captcha helper also poisoned every cacheable build unconditionally, even when captcha was switched off and returned an empty string.

Core changes:

  1. Scalar input reaching filterFields() (core/security.php):
  2. Branch on is_array() instead of the truthiness helper isArray()

    • A non-empty string passed the old check and hit implode(), raising a
TypeError that killed the request
  • getVar(..., 'field') feeds exactly that, so account, help, order, forum,
news and pages could fatal on a scalar field value
  • Filter a scalar through the text filter instead of returning an empty string
  • Captcha as a dynamic region (core/system.php, core/user.php, modules/*):
  • Accept register, comment and contact next to login in checkDynamicMark()
  • Read the captcha through getPageCaptcha() on 17 frontend call sites

    • getCaptcha() marks the build as uncacheable before it even asks whether
captcha is active, so a form dropped the page cache in every configuration
  • The admin login keeps the direct call: the admin area is never cached
  1. Comment length guard (core/user.php):
  2. Compare the longest word instead of the last one

    • The loop overwrote its own result, so only the final word was measured
  3. Count characters with mb_strlen() so cyrillic is not charged twice
  4. Filter tests without replicas (tests/Unit/InputFilterTest.php, tests/Support/contract_probe.php):

  5. Drive the real functions through a new filters probe scenario
  6. Correct three assertions that described the replicas, not the code

    • filterVar() returns an empty array, not an empty string, for a bad list
    • filterHtml() loses a lone backslash to stripslashes before encoding
    • filterHtml() returns an empty string, never null
  7. Extend the marker contract test with the widened captcha whitelist
  8. Naming and memory (core/security.php, core/classes/parser.php, admin/index.php):

  9. Rename the global filterUrl() to filterWebUrl()

    • It normalises a submitted address and did not relate to the parser link
policy Parser::filterUrl(), which refuses dangerous schemes
  • Build the getVar() filter table once per request instead of per call
  • Hash the image memo key so an inline data URI is not held twice

Benefits:

  • A scalar field value no longer fatals the request
  • Pages carrying a form stay cacheable
  • The filter tests fail when the filters change, which they did not before

Technical notes:

  • No schema, route or storage changes
  • checkDynamicMark() still rejects adminlogin, empty and unknown parameters
  • InputFilterTest shrank from 31 replica-based cases to 8 contract cases

Всего: 1091 на 110 страницах по 10 на каждой странице

1 2 3 4 5 6 7 8 9 10 11 12 13 110
Хотите опробовать SLAED CMS в действии?
Идеи и предложения
Обратная связь
Подтверждение

Поделиться
QR-код