owncloud / owncloud/core

integrity:check-core reports FILE_MISSING for the mimetypelist.js test fixture in QA builds

Open Beginner friendly
#41,769 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
PHP
Stars
8.8k
Forks
2.1k
Avg merge
20h 7m
Merged PRs (30d)
41

Description

Summary

occ integrity:check-core reports FILE_MISSING on the QA variants only
(owncloud-11.0.0-qa, owncloud-complete-20260730-qa) for:

tests/data/integritycheck/app/core/js/mimetypelist.js
  expected: 27c74670adb750...830763fd
  current:

Non-QA variants are INTACT — they ship no tests/ directory, so the path
never exists.

Root cause: signer/verifier exclusion asymmetry

ExcludeFileByNameFilterIterator excludes by a path-suffix regex
(lib/private/IntegrityCheck/Iterator/ExcludeFileByNameFilterIterator.php:66):

private $excludedFilePathPatterns = [
    '|/core/js/mimetypelist.js$|', // regenerable via occ maintenance:mimetype:update-js
];

That regex is meant to exempt the one regenerable file at the server root, but
$ -anchored suffix matching also hits the integritycheck test fixture:

/srv/owncloud/tests/data/integritycheck/app/core/js/mimetypelist.js   match=1
/srv/owncloud/core/js/mimetypelist.js                                 match=1

The signer (ocsign) excludes the exact path core/js/mimetypelist.js, so it
signs the fixture and omits the real one. Verified in the published
v11.0.0 complete-qa manifest:

  • core/js/mimetypelist.js in manifest: false
  • tests/data/integritycheck/app/core/js/mimetypelist.js in manifest: true

So the verifier skips on disk exactly the file the signer put in the manifest →
FILE_MISSING.

Impact

Cosmetic-but-loud for QA builds: hasPassedCheck() treats FILE_MISSING as a
failure, so QA installs show a code-integrity warning. No cryptographic issue —
the envelope itself verifies: all 57 scopes in the published v11.0.0
complete-qa tarball pass ECDSA-P384/SHA-384 over the verbatim hashes bytes,
leaf CN == scope id, chain to root-g2, and 0 manifest-vs-disk diffs on a
pristine extraction.

Not a 11.0.0 regressionv11.0.0-rc3's complete-qa tarball reproduces it
identically, and the exclusion has been in place since 0f29535218.

Suggested fix

Align the two sides. Either anchor the verifier pattern to the server root so it
matches only the real file, e.g.

'|^' . preg_quote($root, '|') . '/core/js/mimetypelist\.js$|'

(the iterator already receives $root), or have the signer apply the same
suffix rule. Anchoring the verifier is the narrower change and keeps the fixture
signed and checked.

Reproduce

gh release download v11.0.0 --repo owncloud/core -p 'owncloud-complete-20260730-qa.tar.bz2'
tar xjf owncloud-complete-20260730-qa.tar.bz2
# install, then:
occ integrity:check-core

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in lib/private/IntegrityCheck/Iterator/ExcludeFileByNameFilterIterator.php at the exclusion pattern around line 66, then reproduce with occ integrity:check-core on the published complete-qa build. Compare the verifier's excluded paths with the signer behavior described in the issue. Done means the server-root mimetypelist.js remains excluded while the tests/data integritycheck fixture is signed, checked, and no longer reported as FILE_MISSING.

Written by the indexing model from the issue text.

Assessment

Tech stack
php
Domain
security
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
78/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.