diff --git a/docs/add-ons/file.md b/docs/add-ons/file.md index a7bef039b..485ef45c7 100755 --- a/docs/add-ons/file.md +++ b/docs/add-ons/file.md @@ -128,6 +128,21 @@ You can hard code the file entries tag to show specific files. You may also spec If you want to display only the files that are in certain folder within an Upload Directory, specify the folder ID using this parameter. +### `mime_type=` + + mime_type="image/jpeg|image/png" + +Filter returned files by MIME type. You may specify one or more MIME types; separate multiple values with the pipe character. + +Or use "not" to exclude types: + + mime_type="not video/mp4|video/quicktime" + +Common examples: + +- Images only: `mime_type="image/jpeg|image/png|image/gif"` +- PDFs only: `mime_type="application/pdf"` + ### `limit=` limit="30" diff --git a/docs/development/extension-hooks/cp/login.md b/docs/development/extension-hooks/cp/login.md index a5a275ebb..ee63b213f 100755 --- a/docs/development/extension-hooks/cp/login.md +++ b/docs/development/extension-hooks/cp/login.md @@ -54,7 +54,7 @@ How it's called: $this->extensions->call('cp_member_logout'); if ($this->extensions->end_script === TRUE) return; - + ## `cp_member_reset_password()` | Parameter | Type | @@ -67,3 +67,22 @@ How it's called: $this->extensions->call('cp_member_process_reset_password'); if ($this->extensions->end_script === TRUE) return; + +## `cp_member_send_reset_token_start($address)` + +| Parameter | Type | Description +| --------- | -------- | --------------------------------------------------------------- +| $address | `String` | Email address posted from the control panel reset password form +| Returns | `String` | Email address after extension processes it + +Additional processing of email address sent via control panel reset password form. + +How it's called: + + if (ee()->extensions->active_hook('member_auth_send_reset_token_start')) { + $address = ee()->extensions->call('member_auth_send_reset_token_start', $address); + if (ee()->extensions->end_script === true) { + return; + } + } + diff --git a/docs/development/extension-hooks/global/email.md b/docs/development/extension-hooks/global/email.md index 6efd70ff6..25f8ff351 100755 --- a/docs/development/extension-hooks/global/email.md +++ b/docs/development/extension-hooks/global/email.md @@ -13,8 +13,50 @@ lang: php # Email Library Extension Hooks +## `email_from_address($from, $name)` + +| Parameter | Type | Description +| --------- | -------- | -------------------------------------- +| $from | `String` | Email `from` address +| $name | `String` | Email `name` for `from` address +| Returns | `Array` | Associative array + +Overwrite an email `from` address. + +How it's called: + + if (ee()->extensions->active_hook('email_from_address')) { + $processed_address = ee()->extensions->call('email_from_address', $from, $name); + $from = $processed_address['from'] ?? $from; + $name = $processed_address['name'] ?? $name; + + if (ee()->extensions->end_script === true) { + return; + } + } + +## `email_to_address($to)` + +| Parameter | Type | Description +| --------- | -------- | -------------------------------------- +| $to | `String` | Email `from` address +| Returns | `String` | Manipulated Email `to` address + +Overwrite an email `to` address. + +How it's called: + + if (ee()->extensions->active_hook('email_to_address')) { + $to = ee()->extensions->call('email_to_address', $to); + + if (ee()->extensions->end_script === true) { + return; + } + } + ## `email_send(&$data)` + | Parameter | Type | Description | | --------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | &\$data | `Array` | Array of data about email to be sent (see above) passed [by reference](https://php.net/manual/en/language.references.pass.php) so data may be altered without needing to return the altered data | diff --git a/docs/development/extension-hooks/module/member-auth.md b/docs/development/extension-hooks/module/member-auth.md index 08fca9d76..ae42895e9 100755 --- a/docs/development/extension-hooks/module/member-auth.md +++ b/docs/development/extension-hooks/module/member-auth.md @@ -69,6 +69,24 @@ How it's called: $edata = ee()->extensions->call('member_member_logout'); if (ee()->extensions->end_script === TRUE) return; +## `member_auth_send_reset_token_start($address)` + +| Parameter | Type | Description +| --------- | -------- | --------------------------------------------- +| $address | `String` | Email address posted from reset password form +| Returns | `String` | Email address after extension processes it + +Additional processing of email address sent via reset password form. Happens after basic security checks, but before email address check occurs. + +How it's called: + + if (ee()->extensions->active_hook('member_auth_send_reset_token_start')) { + $address = ee()->extensions->call('member_auth_send_reset_token_start', $address); + if (ee()->extensions->end_script === true) { + return; + } + } + ## `member_process_reset_password()` | Parameter | Type | Description | diff --git a/docs/installation/changelog.md b/docs/installation/changelog.md index 7374a723c..80f4c3c83 100755 --- a/docs/installation/changelog.md +++ b/docs/installation/changelog.md @@ -8,6 +8,42 @@ --> # ExpressionEngine v7 Change Log +# Version 7.5.15 +(Release: August 20th, 2025) +
+
+ +
+
+ + +**Bug Fixes** 🐛 + +- Fixed [#4923](https://github.com/ExpressionEngine/ExpressionEngine/issues/4923) where RTE ckeditor unordered list style issue [#4944](https://github.com/ExpressionEngine/ExpressionEngine/pull/4944) +- Resolved an issue where base_path and theme_path could be incorrectly set when installed with system folder above web root [#4940](https://github.com/ExpressionEngine/ExpressionEngine/pull/4940) +- Resolved [#4933](https://github.com/ExpressionEngine/ExpressionEngine/issues/4933) changed row getter to account for model object as well [#4939](https://github.com/ExpressionEngine/ExpressionEngine/pull/4939) +- Fixed [#4891](https://github.com/ExpressionEngine/ExpressionEngine/issues/4891): Removed the "\*" displayed on individual input boxes of a required Grid field [#4912](https://github.com/ExpressionEngine/ExpressionEngine/pull/4912) + +**Enhancements** ✨ + +- Add mime_type parameter to {exp:file:entries} tag [#4942](https://github.com/ExpressionEngine/ExpressionEngine/pull/4942) +- Add Strict-Transport-Security header to HTTP Header addon [#4934](https://github.com/ExpressionEngine/ExpressionEngine/pull/4934) +- Bypass on-the-fly manipulations if the image is not editable (e.g. SVG); [#4868](https://github.com/ExpressionEngine/ExpressionEngine/issues/4868) [#4909](https://github.com/ExpressionEngine/ExpressionEngine/pull/4909) +- Make no_results work in rss parser add-on [#4869](https://github.com/ExpressionEngine/ExpressionEngine/pull/4869) + +**Developers** 💻 + +- 4 new hooks for email and forgotten passwords [#4833](https://github.com/ExpressionEngine/ExpressionEngine/pull/4833) +- Additional developer improvements [#4805](https://github.com/ExpressionEngine/ExpressionEngine/pull/4805) + ## Version 7.5.14 (Release: August 6th, 2025)
diff --git a/scripts/utility.js b/scripts/utility.js index 6e80e76d1..d31ff532b 100644 --- a/scripts/utility.js +++ b/scripts/utility.js @@ -22,7 +22,7 @@ const bsToFs = (p) => p.replace(/\\/g, '/') // Gets the folder depth of the specified path const dirDepth = (myDir) => myDir.split(Path.sep).length -const returnEmbedContents = (match, p1, p2, p3, offset, string) => { +const returnEmbedContents = (match, p1, p2, p3, offset, string) => { console.log("Found Embed: " + p1); try { embedContents = Fs.readFileSync('./docs/'+p1, { encoding: 'utf8' }); @@ -40,18 +40,18 @@ const renderTemplate = (template, vars, currentPageInfo) => {; template = template.replace(new RegExp('{{\\s*' + key + '\\s*}}', 'gi'), value) } - + template = template.replace(new RegExp('(?){{embed\:([^"\']*?)}}', 'gi'),returnEmbedContents); return template } -// Gets the relative path to the source dir from a docs page +// Gets the relative path to the source dir from a docs page, returning a web-safe path const getRelativeRootFromPage = (pagePath) => { let depth = dirDepth(pagePath) - dirDepth(Path.resolve(CONFIG.sourceDir)) - let relPath = ('..' + Path.sep).repeat(depth - 1) - - return relPath + if (depth <= 1) return './'; + let relPath = '../'.repeat(depth - 1); + return relPath.replace(/\/+$/, '') + '/'; } // Returns a function that will slugify a heading and also handle future duplicate slugs when called again diff --git a/theme/doc-page-template.html b/theme/doc-page-template.html index be4032ae7..9373ef4f7 100755 --- a/theme/doc-page-template.html +++ b/theme/doc-page-template.html @@ -54,7 +54,6 @@ -