[
https://issues.apache.org/jira/browse/TOMEE-4654?focusedWorklogId=1032357&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-1032357
]
ASF GitHub Bot logged work on TOMEE-4654:
-----------------------------------------
Author: ASF GitHub Bot
Created on: 27/Jul/26 08:13
Start Date: 27/Jul/26 08:13
Worklog Time Spent: 10m
Work Description: rzo1 commented on PR #2846:
URL: https://github.com/apache/tomee/pull/2846#issuecomment-5088905273
The underlying bug is real and worth fixing — the read-only machinery has
been there since
d5b3b93d4f (2017) and nothing ever enabled it, so every ENC has been
writable in violation
of EE.5.3.4 / Enterprise Beans 10.4.4. I applied the patch and confirmed
`JavaCompReadOnlyTest`
fails on unpatched main with `bind should have been refused` and passes with
the fix, and that
the read-only cascade doesn't leak into the container root context or the
per-app global/module
contexts.
I can't approve as-is though — the marking happens at the wrong point in the
lifecycle, and it
cuts both ways:
**Container-internal binds can now fail.** `Assembler.isSkip` (:1634-1645)
skips every webapp
`EjbJarInfo` when the app is not `webAppAlone`. So for an EAR containing a
WAR, that WAR's
EJB/managed-bean module is deployed later, by
`TomcatWebAppBuilder.startInternal` via
`assembler.initEjbs` (:1453) and `startEjbs` (:1468) — i.e. after
`createApplication` has already
marked `appContext.getAppJndiContext()` read-only. `initEjbs` ->
`jndiBuilder.build` ->
`JndiBuilder.bindJava` does `appContext.bind("app/" + moduleName + beanName,
ref)`
(`JndiBuilder:694`, `:722`), outside the `NameAlreadyBoundException` catch,
and the caller wraps
`NamingException` into `OpenEJBRuntimeException` (:443).
I probed this directly in openejb-core: with the patch applied, after
`createApplication` returns,
`app1.getAppJndiContext().bind("app/mod3/SomeBean", ref)` fails with
`javax.naming.OperationNotSupportedException`. I couldn't run a full EAR
deployment here, so the
end-to-end failure is inferred from the call chain — but the refusal itself
is proven and the
call chain is unconditional. Reload of such a WAR re-enters the same path
(`TomcatWebAppBuilder:2087` only destroys the app when
`isUnDeployable`/`webAppAlone`).
**And the same modules never get marked.** The flip side:
`setAppNamingContextReadOnly` only
iterates `allDeployments`, the BeanContexts built during
`createApplication`. The webapp modules
excluded by `isSkip` get their BeanContexts created afterwards, so their
`java:comp` stays fully
writable — the spec violation you're targeting survives for exactly the EJBs
that live in an EAR's
web modules.
Both problems have one shape of fix: record the read-only intent on the
`AppContext` and apply it
where the BeanContexts are actually created (end of `initEjbs`/`startEjbs`),
so late modules inherit
it and the container's own binds all run before the flag takes effect.
Other things:
- The new `WebContext` loop is dead code. Neither `TomcatWebAppBuilder` nor
`LightweightWebAppBuilder` stores an `IvmContext` or `ContextHandler` in
`WebContext.jndiEnc`, so
`markReadOnly(webContext.getJndiEnc())` never matches either branch. That
means the PR body's
claim that this is what fixed the web vehicles isn't supported by the
code, and web components
still get a writable ENC.
- `arquillian-tomee-embedded`'s
`EmbeddedTomEEContainerTest.testEjbCanCreateSubContextByDefault`
(:72-88) still asserts the pre-PR semantic. It needs to be inverted in
this PR, and honestly a
container-wide default flip with this blast radius shouldn't land with
only openejb-core unit
coverage — an Arquillian test against a real TomEE would be worth it.
- The opt-out is read from `SystemInstance` only, never from
`appInfo.properties`. Most other
Assembler switches support both (e.g. `OPENEJB_TIMERS_ON` at :1501/:1560
reads
`appInfo.properties.getProperty(..., globalDefault)`). As written, one
legacy app that writes into
its ENC forces the whole container off the spec-required behaviour.
Reading `appInfo.properties`
first with the system property as fallback keeps it per-application.
- `assertWriteRefused` hard-requires `OperationNotSupportedException`, which
couples the new test to
`openejb.jndiExceptionOnFailedWrite` — the `createSubcontext` case right
below it correctly
tolerates both outcomes. Make them consistent.
- Minor test things: the `rename`/`destroySubcontext` assertions are
tautological as written;
`deploy()` runs outside the try/finally so a failure there skips
`SystemInstance.reset()` and
pollutes the next test.
-
`"true".equals(SystemInstance.get().getProperty(FORCE_READ_ONLY_APP_NAMING,
"true"))` is
case-sensitive, so `-Dopenejb.forceReadOnlyAppNamingContext=FALSE`
silently keeps read-only on.
Now that this is the opt-out for a spec-behaviour change, that matters
more than it did.
- `if(`/`for(` without the space doesn't match the file's convention.
Pre-existing in the lines you
moved, but the new `markReadOnly` helper is new code.
Issue Time Tracking
-------------------
Worklog Id: (was: 1032357)
Time Spent: 20m (was: 10m)
> java:comp naming context accepts writes the Enterprise Beans spec requires it
> to refuse
> ---------------------------------------------------------------------------------------
>
> Key: TOMEE-4654
> URL: https://issues.apache.org/jira/browse/TOMEE-4654
> Project: TomEE
> Issue Type: Bug
> Reporter: Markus Jung
> Assignee: Markus Jung
> Priority: Major
> Time Spent: 20m
> Remaining Estimate: 0h
>
> The Enterprise Beans spec requires the java:comp context to be read-only
> inside a bean, and to throw {{OperationNotSupportedException}} on any write
> attempt against it. TomEE's naming context skips that check and lets bind,
> rebind, and rename calls through instead of refusing them.
> h2. Steps to reproduce / TCK reference
> Excluded in {{runner-webprofile/exclusions/enterprise-beans-30.txt}} in the
> apache/tomee-tck harness repo:
> * {{**/naming/context/*Test.java}}
> Once fixed, remove the matching lines and confirm the tests pass — each write
> attempt against java:comp must throw {{OperationNotSupportedException}}.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)