I'm not a security expert too but your solution looks reasonable for me :)
SY, Alexey 2006/9/30, Paulex Yang <[EMAIL PROTECTED]>:
Paulex Yang wrote: > Hi, all > > I'm not a security expert, so please correct me if I miss something. I > found some different behavior of Harmony and RI on > javax.security.auth.login.LoginContext, the testcase[1] shows the > difference. > > Actually I tried to create the event sequence like below: > 1. create LoginContext with some Subject > 2. LoginContext.login() and return successfully > 3. Modify Subject's content to make it invalid(one Principal's name > here, maybe passwd/username/servername in more general case) > 4. LoginContext.login() again > > In RI, the second login() invocation really tried to invoke the > relative LoginModule.login() and then failed to login with the > modified Subject, but in Harmony, both invocations succeed. I consider > RI's behavior is more reasonable. > > After a rough look of LoginContext implementation, I found the cause > may be the Ln. 275 > > private void loginImpl() throws LoginException { > if (loggedIn) { > return; > } > .... > } > > Seems Harmony won't invoke the LoginModule.login() again only if the > login ever succeeds. If I comment out these lines, the test below > passes happily. Any ideas on this issue? I've removed these lines at revision r451557 with regression test, please shout if anyone thinks the update harmful for some reason. > > > [1] > public class LoginContextTest extends TestCase { > private static final String VALID_NAME = "name1"; > private static final String INVALID_NAME = "name2"; > > public void testLogin() throws Exception{ > MyPrincipal pri = new MyPrincipal(); > HashSet set = new HashSet(); > set.add(pri); > Subject sub = new Subject(false, set, new HashSet(), new > HashSet()); > Configuration.setConfiguration(new MyConfig()); > LoginContext context = new LoginContext("moduleName", sub); > context.login(); > pri.name = INVALID_NAME; > try{ > context.login(); > fail("Should throw LoginException"); > }catch(LoginException e){ > } > } static class MyConfig extends Configuration{ > AppConfigurationEntry[] entries = new > AppConfigurationEntry[]{new > AppConfigurationEntry(MyModule.class.getName(), > LoginModuleControlFlag.REQUIRED, new HashMap())}; > public AppConfigurationEntry[] getAppConfigurationEntry(String > name) { > return entries; > } > public void refresh() { > } > } > public static class MyModule implements LoginModule{ > Subject sub; > public void MyModule(){ > } > public boolean abort() throws LoginException { > return false; > } > public boolean commit() throws LoginException { > return true; > } > public void initialize(Subject arg0, CallbackHandler arg1, > Map<String, ?> arg2, Map<String, ?> arg3) { > sub = arg0; > } > public boolean login() throws LoginException { > Principal[] pris = sub.getPrincipals().toArray(new > Principal[0]); > return VALID_NAME.equals(pris[0].getName()); > } > public boolean logout() throws LoginException { > return false; > } > } > public static class MyPrincipal implements Principal{ > public String name = VALID_NAME; > public String getName() { > return name; > } > public String toString(){ > return name; > } > }; > } > > > -- Paulex Yang China Software Development Lab IBM --------------------------------------------------------------------- Terms of use : http://incubator.apache.org/harmony/mailing.html To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
-- Alexey A. Petrenko Intel Middleware Products Division --------------------------------------------------------------------- Terms of use : http://incubator.apache.org/harmony/mailing.html To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]