package org.openntf.domino.xsp.junit.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import javax.servlet.ServletException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openntf.domino.Database;
import org.openntf.domino.Session;
import org.openntf.domino.design.IconNote;
import org.openntf.domino.exceptions.UserAccessException;
import org.openntf.domino.junit.DominoJUnitRunner;
import org.openntf.domino.junit.TestEnv;
import org.openntf.domino.utils.Factory;
import org.openntf.domino.utils.Factory.SessionType;
import org.openntf.domino.xsp.xots.FakeHttpRequest;
import org.openntf.domino.xsp.xots.ModuleLoader;
import com.ibm.domino.xsp.module.nsf.NSFComponentModule;
import com.ibm.domino.xsp.module.nsf.NotesContext;
@RunWith(DominoJUnitRunner.class)
public class SessionFactory {
/**
* This test tests if we have a correct (untrusted) session.
*/
@Test
public void TestNativeSession() {
Session sess = Factory.getSession(SessionType.CURRENT);
assertFalse(sess.isTrustedSession());
assertFalse(sess.isAnonymous());
assertFalse(sess.isRestricted());
assertEquals(TestEnv.SESSION_USER, sess.getUserName());
assertEquals(TestEnv.SESSION_USER, sess.getEffectiveUserName());
// now check if we can access a database on a trusted server (this should work)
Database nab = sess.getDatabase(TestEnv.REMOTE_TRUSTED_SERVER, "names.nsf");
assertNotNull(nab);
IconNote icn = nab.getDesign().getIconNote();
assertNotNull(icn);
// now check if we can access a database on an untrusted server (this should not work)
// RPr TODO: Behavior inconsistent, see #testNamedSession
nab = sess.getDatabase(TestEnv.REMOTE_UNTRUSTED_SERVER, "names.nsf"); // Returns null
assertNull(nab);
}
/**
* This test test if we have a correct trusted session by accessing a remote untrusted server.
*
* Attention: Creating trusted session does not work in Domino-server environment (due AgentSecurityManager)
*/
@Test
public void TestTrustedSession() {
Session sess = Factory.getSession(SessionType.TRUSTED);
assertTrue(sess.isTrustedSession());
assertFalse(sess.isAnonymous());
assertFalse(sess.isRestricted());
System.out.println("Native Session User name " + sess.getUserName());
System.out.println("Native Session Effective name " + sess.getEffectiveUserName());
assertEquals(TestEnv.SESSION_USER, sess.getUserName());
assertEquals(TestEnv.SESSION_USER, sess.getEffectiveUserName());
// now check if we can access a database on a trusted server (this should work)
Database nab = sess.getDatabase(TestEnv.REMOTE_TRUSTED_SERVER, "names.nsf");
assertNotNull(nab);
IconNote icn = nab.getDesign().getIconNote();
assertNotNull(icn);
// now check if we can access a database on an untrusted server (this should work, because we have a trusted session)
nab = sess.getDatabase(TestEnv.REMOTE_UNTRUSTED_SERVER, "names.nsf");
assertNotNull(nab);
}
@Test
public void TestTrustedSessionWNotesContext() throws ServletException {
NSFComponentModule module = ModuleLoader.loadModule("names.nsf", false);
NotesContext ctx = new NotesContext(module);
NotesContext.initThread(ctx);
try {
ctx.initRequest(new FakeHttpRequest("CN=Roland Praml/OU=01/OU=int/O=FOCONIS"));
Session sess = Factory.getSession(SessionType.TRUSTED);
assertTrue(sess.isTrustedSession());
assertFalse(sess.isAnonymous());
assertFalse(sess.isRestricted());
System.out.println("Native Session User name " + sess.getUserName());
System.out.println("Native Session Effective name " + sess.getEffectiveUserName());
assertEquals(TestEnv.SESSION_USER, sess.getUserName());
assertEquals(TestEnv.SESSION_USER, sess.getEffectiveUserName());
// now check if we can access a database on a trusted server (this should work)
Database nab = sess.getDatabase(TestEnv.REMOTE_TRUSTED_SERVER, "names.nsf");
assertNotNull(nab);
IconNote icn = nab.getDesign().getIconNote();
assertNotNull(icn);
// now check if we can access a database on an untrusted server (this should work, because we have a trusted session)
nab = sess.getDatabase(TestEnv.REMOTE_UNTRUSTED_SERVER, "names.nsf");
assertNotNull(nab);
} finally {
NotesContext.termThread();
}
}
/**
* This test checks if we can create named sessions
*/
@Test(expected = UserAccessException.class)
public void TestNamedSession() {
Session sess = Factory.getNamedSession("CN=Tony Stark/O=Avengers", false);
assertFalse(sess.isTrustedSession());
assertFalse(sess.isAnonymous());
assertTrue(sess.isRestricted()); //- the XPage sessions is not restricted, the native named sessions are
System.out.println("Named Session User name " + sess.getUserName());
System.out.println("Named Session Effective name " + sess.getEffectiveUserName());
assertEquals("CN=Tony Stark/O=Avengers", sess.getEffectiveUserName());
// RPr TODO: Behavior inconsistent, see #testNativeSession
Database db = sess.getDatabase(TestEnv.SESSION_USER, "names.nsf"); // Throws UAC
assertNotNull(db);
}
/**
* Checks full access session (cannot really test if it will work)
*/
@Test
public void TestFullAccessSession() {
//Session master = Factory.fromLotus(masterSession, Session.SCHEMA, null);
Session normal = Factory.getSession(SessionType.CURRENT);
Session sess = Factory.getNamedSession(TestEnv.SESSION_USER, false);
assertNotSame(normal, sess);
assertFalse(sess.isTrustedSession());
assertFalse(sess.isAnonymous());
assertEquals(TestEnv.SESSION_USER, sess.getUserName());
Database db = sess.getDatabase(TestEnv.SESSION_USER, "names.nsf");
assertNotNull(db);
db = sess.getDatabase(TestEnv.REMOTE_UNTRUSTED_SERVER, "names.nsf");
// RPr TODO: Behavior inconsistent, see #testNativeSession
assertNull(db);
}
@Test
public void TestSignerSession() {
//Session master = Factory.fromLotus(masterSession, Session.SCHEMA, null);
Session normal = Factory.getSession(SessionType.SIGNER);
Session sess = Factory.getNamedSession(TestEnv.SESSION_USER, false);
assertNotSame(normal, sess);
assertFalse(sess.isTrustedSession());
assertFalse(sess.isAnonymous());
assertEquals(TestEnv.SESSION_USER, sess.getUserName());
Database db = sess.getDatabase(TestEnv.SESSION_USER, "names.nsf");
assertNotNull(db);
db = sess.getDatabase(TestEnv.REMOTE_UNTRUSTED_SERVER, "names.nsf");
// RPr TODO: Behavior inconsistent, see #testNativeSession
assertNull(db);
}
@Test
public void TestSignerFullAccessSession() {
//Session master = Factory.fromLotus(masterSession, Session.SCHEMA, null);
Session normal = Factory.getSession(SessionType.SIGNER_FULL_ACCESS);
Session sess = Factory.getNamedSession(TestEnv.SESSION_USER, false);
assertNotSame(normal, sess);
assertFalse(sess.isTrustedSession());
assertFalse(sess.isAnonymous());
assertEquals(TestEnv.SESSION_USER, sess.getUserName());
Database db = sess.getDatabase(TestEnv.SESSION_USER, "names.nsf");
assertNotNull(db);
db = sess.getDatabase(TestEnv.REMOTE_UNTRUSTED_SERVER, "names.nsf");
// RPr TODO: Behavior inconsistent, see #testNativeSession
assertNull(db);
}
@Test
public void TestCurrentFullAccessSession() {
//Session master = Factory.fromLotus(masterSession, Session.SCHEMA, null);
Session normal = Factory.getSession(SessionType.CURRENT_FULL_ACCESS);
Session sess = Factory.getNamedSession(TestEnv.SESSION_USER, false);
assertNotSame(normal, sess);
assertFalse(sess.isTrustedSession());
assertFalse(sess.isAnonymous());
assertEquals(TestEnv.SESSION_USER, sess.getUserName());
Database db = sess.getDatabase(TestEnv.SESSION_USER, "names.nsf");
assertNotNull(db);
db = sess.getDatabase(TestEnv.REMOTE_UNTRUSTED_SERVER, "names.nsf");
// RPr TODO: Behavior inconsistent, see #testNativeSession
assertNull(db);
}
}