Theme File Editor Omeka S module

Releases

1.0.5

Oct 26, 2026

  • Admin > Modules now shows Configure next to ThemeFileEditor, as the documentation says. The settings had no link anywhere in the admin.

1.0.4

Oct 20, 2026

  • Editors and other roles below Supervisor who open a Theme File Editor page now get Omeka's Forbidden page with HTTP status 403, and its API calls a JSON 403. They used to get Omeka's error page Omeka S encountered an error with status 500, from the API too. Who may use the editor is unchanged: Supervisors and Global Administrators.
  • If another module grants more roles access: the rule is now on the ACL resource ThemeFileEditor\Permission\Editor (EditorController::ACL_RESOURCE) instead of the two controller classes, as the documentation showed until now. A rule on the controller classes no longer grants anything, so those users are refused until the rule is moved (see Permissions on the Configuration page).
  • The Edit Theme Files button on a site's Theme page (/admin/site/s/<slug>/theme) now appears. It looked for the theme in the site's settings, where Omeka does not keep it, so the button was never added. It opens the editor with the site's theme selected, for the roles that may use the editor.
  • Copy Theme is all or nothing. A copy that failed part-way, on a file the web server could not read or a full disk, left a half-copied theme in themes/ under the new name, which sites could select and which blocked a second try ("already exists"). The copy is now written to a temporary hidden folder and renamed to the new name only once every file is in it; on a failure that folder is removed, the message ends "Nothing was copied.", and an existing folder is never written to or removed.

1.0.3

Oct 20, 2026

  • Search finds templates that are symbolic links. Themes whose templates link to a copy shared with other themes (such as several themes developed against one engine) returned no results for them. Links are followed when they point inside the theme's own directory or the Omeka installation, and a link loop is searched only once.
  • Such linked templates are also listed in the file tree and open in the editor, read-only, with a banner naming the file they link to: saving one would change every theme that shares it, so saves and rollbacks through a link are refused. They used to be missing from the tree, leaving empty folders, and could not be opened.
  • After opening a module or application file, Browse source now shows that module or Application views, and the tree lists its files. It used to reset to Theme files.
  • The editor shows far more code: the file details sit on one line under the file name, and the editor fills the window. At 1280×800 it showed about eight lines, the rest hidden under the save row.
  • On the search page, content snippets stay inside the Match column (up to three lines) instead of running into Size.
  • When the syntax check blocks a save, Saving… disappears as soon as the error banner shows, instead of lingering for five seconds.
  • Copy Theme makes a standalone theme. It skipped every symbolic link, so copying a theme whose templates and engine link to a shared copy (such as Vitrine, Confetti, Plinth or Overprint in a development setup) gave a theme with no layout, most of its templates missing and no engine. A link is now copied as the file or folder it points to when that lies inside the theme or the Omeka installation, so every template in the copy is its own file and can be edited. Links pointing elsewhere, broken links and links that loop back are left out and listed in a message after the copy; a copy is limited to 20,000 files and 256 MB, checked before anything is written.
  • After a copy, the editor now says what was copied (Theme "vitrine" copied to "vitrine-winter" (267 files).). Messages such as Settings saved. on the Settings page were also never shown: the module's pages discarded them.
  • For an application or module file, the file details show Theme override (Can be created, Exists, writable, Linked, read-only or Not writable, with the target path on hover) instead of Writable. These files are never edited in place, so whether the original file was writable did not matter; what matters is whether Copy to Theme can write the theme's copy.
  • Copy to Theme no longer writes through a link. When the theme's file at that path was a link to an engine's shared template, the copy replaced the shared template, changing every theme that uses it. Such a file, or a folder on the way that links out of the theme, is now refused with a message, and the shared copy is left alone. Theme names containing anything but letters, numbers, _ and - are refused for saves and copies, as they already were for opening files.

1.0.2

Oct 11, 2026

  • The Theme Files link in each site's admin menu and the Theme File Editor entry in the Modules menu showed their text in a serif fallback font. The links carried Font Awesome's fa class, which sets the whole link in the icon font; they now carry only the icon class, like the other menu entries, so the text matches the rest of the menu.

1.0.1

Sep 22, 2026

Security hardening.

  • The JSON API's POST endpoints (save, rollback, copy to theme, copy theme, settings) now require a CSRF token, sent by the editor as a csrf form field and an X-CSRF-Token header. Requests without a valid token are rejected with HTTP 403.
  • The editor page no longer shows the content of a non-.phtml file that lives inside a view/ directory. The extension is checked before the file is read, and FileEditor::readFile() now enforces it as well.
  • Path validation in FileBrowser now rejects absolute paths before trimming slashes (previously /etc/passwd became etc/passwd and the check never fired), and resolves both sides of the under-root check with realpath() so symlinked roots such as macOS /private/var compare correctly.
  • The Create disk backup before overwriting setting is now honoured: it sets the default state of the save dialog's checkbox instead of being stored and ignored.
  • The per-user save rate limit is persisted in user settings, so it is enforced across requests and PHP-FPM workers rather than within a single process.
  • Removed the stale activeTheme view variable and attribute left over from the old active-theme concept.
  • Fixed the integration test suite: settings mocks now return the real defaults, and macOS temp paths are resolved before comparison.
Log in for Support