Skip to content

Add blindReviewGuard 1.0.0.0 for OJS 3.5 - #524

Open
edersotto wants to merge 1 commit into
pkp:mainfrom
OJSBR:blindReviewGuard-1.0.0.0
Open

Add blindReviewGuard 1.0.0.0 for OJS 3.5#524
edersotto wants to merge 1 commit into
pkp:mainfrom
OJSBR:blindReviewGuard-1.0.0.0

Conversation

@edersotto

@edersotto edersotto commented Aug 29, 2026

Copy link
Copy Markdown

Adds Blind Review Guard 1.0.0.0, a generic plugin for OJS 3.5 that checks the files a reviewer is about to receive for anything that identifies the authors, and can remove the identifying metadata.

Why this one

Anonymous review in OJS rests on a checklist item asking the author to follow the "Ensuring a Blind Review" instructions. Nothing verifies it — and the leak is rarely in the part anyone reads:

  • the document properties carry the account name of whoever created and last saved the file;
  • every tracked change and comment carries the name of whoever made it, in w:author attributes spread across document.xml, comments.xml and people.xml (accepting all changes does not remove the comments, and deleting the comments does not remove people.xml);
  • the cover page carries the corresponding author's e-mail address;
  • the file name carries whatever the author typed.

The editor usually finds out when a reviewer mentions it: too late, with the anonymity already broken. The topic comes back to the forum periodically — file names under blind review, author confidentiality in supplementary files — and pkp/pkp-lib#2202 fixed the file-name half years ago, but nothing looks inside the file.

There is nothing in this gallery for it: searching the current plugins.xml for "anonym" or "blind" returns no match across the 100 plugins listed. The only prior art we could find anywhere is an abandoned 2017 plugin for OJS 3.0 that shells out to exiftool/qpdf, strips metadata without asking, does not look at the content and does not tell the editor anything.

What makes the report trustworthy

It reads the submission's own contributor list. It does not look for "a name": it looks for those names, e-mail addresses, ORCID iDs and affiliations. That is the difference between a report editors act on and one they learn to ignore.

Where it acts, and why there

OJS keeps a submission's files in stages, and a reviewer never sees the author's upload: sending a submission to review copies the selected files into the review stage (PKP\decision\steps\PromoteFiles"allows the editor to copy files from one or more file stages to a new stage"). The plugin works on the copy, at the moment the copy is created, through SubmissionFile::add filtered to file stages 4, 19, 15 and 20. A second hook, ReviewAssignment::add, reports anything still identifying at the last moment before someone outside the editorial team can open the file.

Consequences that matter to journals: the identified version in SUBMISSION_FILE_SUBMISSION — title page, full author list, the version many journals require — is never touched. No core file is patched, no table is added, and whether the review is anonymous is read from the journal's defaultReviewMode and from each assignment's reviewMethod.

What it deliberately does not do

  • It never edits the text of a manuscript. A name in the body is reported, never silently deleted: rewriting a submission is the author's job and the editor's call.
  • It never rewrites a PDF. A PDF is a fragile container and a corrupted manuscript is worse than a metadata leak the editor was told about.
  • It stays inactive in open review, where the author's name is the arrangement rather than a leak.
  • It is not a plagiarism or similarity checker, and it does not guarantee anonymity: self-citation and writing style still give an author away. It removes the mechanical leak, which is the part that can be removed.

Packaging

  • Pure PHP: OOXML through ZipArchive, and for PDF the /Info dictionary, the XMP packet and a best-effort read of the FlateDecode content streams. No external binary — no exiftool, no qpdf, no pdftotext. When the PDF body cannot be read, the report says so instead of reporting the file as clean.
  • 45 tests. Written for PHPUnit and collected by the ApplicationPlugins suite; they also run standalone (php tests/run.php), since the OJS release tarball ships no development dependencies. Fixtures are generated rather than committed, so a reviewer can read exactly what makes each file dirty.
  • 38 locales, matching the set carried by the generic plugins PKP maintains. Everything not yet reviewed by a native speaker is marked fuzzy, so Weblate shows it as needing review instead of freezing it as final.
  • GPL-3.0, PHP 8.2+, tested on OJS 3.5.0-3.

Checks run before opening this

  • xmllint --schema ./plugins.xsd ./plugins.xml --noout — validates.
  • Package URL resolves and the md5 in the entry matches the published tarball (848e4ac0c5045f78de2e3a93263c7929).
  • The tarball unpacks as a single blindReviewGuard/ directory, and the test suite passes when run from the downloaded package.

Notes

Submitted as reviewed, following what other third-party plugins declare here. Happy to adjust anything in the entry — wording, compatibility range or metadata — if you would like it different.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant