org.eclipse.rap.rwt.osgi,\
org.eclipse.gemini.blueprint.extender
-argeo.osgi.start.4.cms=\
-org.argeo.cms.core
+#argeo.osgi.start.4.cms=\
+#org.argeo.cms.core
-argeo.osgi.start.4.workbench=\
-org.eclipse.equinox.http.registry,\
+#argeo.osgi.start.4.workbench=\
+#org.eclipse.equinox.http.registry,\
-argeo.osgi.start.5.cms=\
-org.argeo.cms.demo
+#argeo.osgi.start.5.cms=\
+#org.argeo.cms.demo
org.osgi.service.http.port=7070
#org.osgi.service.http.port.secure=7073
-log4j.rootLogger=WARN, development
+log4j.rootLogger=WARN, console
log4j.logger.org.argeo=DEBUG
log4j.logger.org.argeo.cms.internal.kernel=TRACE
<artifactId>org.argeo.util</artifactId>
<version>2.1.29-SNAPSHOT</version>
</dependency>
+ <dependency>
+ <groupId>org.argeo.commons</groupId>
+ <artifactId>org.argeo.eclipse.ui.rap</artifactId>
+ <version>2.1.29-SNAPSHOT</version>
+ </dependency>
<!-- Complete target platform -->
<dependency>
public void setRequest(HttpServletRequest request) {
this.request = request;
}
+ // private X509Certificate extractCertificate(HttpServletRequest req) {
+ // X509Certificate[] certs = (X509Certificate[]) req
+ // .getAttribute("javax.servlet.request.X509Certificate");
+ // if (null != certs && certs.length > 0) {
+ // return certs[0];
+ // }
+ // return null;
+ // }
}
import javax.security.auth.login.CredentialNotFoundException;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
-import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
DataHttp(HttpService httpService, NodeRepository node) {
this.httpService = httpService;
sessionProvider = new OpenInViewSessionProvider();
- registerRepositoryServlets(ALIAS_NODE, node);
+ // registerRepositoryServlets(ALIAS_NODE, node);
}
public void destroy() {
- unregisterRepositoryServlets(ALIAS_NODE);
+ // unregisterRepositoryServlets(ALIAS_NODE);
}
void registerRepositoryServlets(String alias, Repository repository) {
Properties ip = new Properties();
ip.setProperty(WebdavServlet.INIT_PARAM_RESOURCE_CONFIG, WEBDAV_CONFIG);
ip.setProperty(WebdavServlet.INIT_PARAM_RESOURCE_PATH_PREFIX, path);
- // httpService.registerFilter(path, anonymous ? new AnonymousFilter()
- // : new DavFilter(), null, null);
- // Cast to servlet because of a weird behaviour in Eclipse
- httpService.registerServlet(path, (Servlet) webdavServlet, ip,
+ httpService.registerServlet(path, webdavServlet, ip,
new DataHttpContext(anonymous));
}
ip.setProperty(RemotingServlet.INIT_PARAM_TMP_DIRECTORY, "remoting");
// in order to avoid annoying warning.
ip.setProperty(RemotingServlet.INIT_PARAM_PROTECTED_HANDLERS_CONFIG, "");
- // Cast to servlet because of a weird behaviour in Eclipse
- // httpService.registerFilter(path, anonymous ? new AnonymousFilter()
- // : new DavFilter(), null, null);
- httpService.registerServlet(path, (Servlet) remotingServlet, ip,
+ httpService.registerServlet(path, remotingServlet, ip,
new DataHttpContext(anonymous));
}
-// private X509Certificate extractCertificate(HttpServletRequest req) {
-// X509Certificate[] certs = (X509Certificate[]) req
-// .getAttribute("javax.servlet.request.X509Certificate");
-// if (null != certs && certs.length > 0) {
-// return certs[0];
-// }
-// return null;
-// }
-
private Subject subjectFromRequest(HttpServletRequest request) {
Authorization authorization = (Authorization) request
.getAttribute(HttpContext.AUTHORIZATION);
return true;
}
- KernelUtils.logRequestHeaders(log, request);
+ if (log.isTraceEnabled())
+ KernelUtils.logRequestHeaders(log, request);
try {
new LoginContext(LOGIN_CONTEXT_USER,
new HttpRequestCallbackHandler(request)).login();
import org.eclipse.equinox.http.jetty.JettyConfigurator;
import org.eclipse.equinox.http.jetty.JettyConstants;
import org.eclipse.equinox.http.servlet.ExtendedHttpService;
+import org.eclipse.rap.rwt.application.ApplicationConfiguration;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.log.LogReaderService;
import org.osgi.service.useradmin.UserAdmin;
+import org.osgi.util.tracker.ServiceTracker;
import bitronix.tm.BitronixTransactionManager;
import bitronix.tm.BitronixTransactionSynchronizationRegistry;
defaultLocale = new Locale(getFrameworkProp(I18N_DEFAULT_LOCALE,
ENGLISH.getLanguage()));
locales = asLocaleList(getFrameworkProp(I18N_LOCALES));
- logger = new NodeLogger();
+
+ ServiceTracker<LogReaderService, LogReaderService> logReaderService = new ServiceTracker<LogReaderService, LogReaderService>(
+ bc, LogReaderService.class, null);
+ logReaderService.open();
+ logger = new NodeLogger(logReaderService.getService());
+ logReaderService.close();
// Initialise services
initTransactionManager();
if (sr != null)
addHttpService(sr);
+ UserUi userUi = new UserUi();
+ Hashtable<String, String> props = new Hashtable<String, String>();
+ props.put("contextName", "user");
+ bc.registerService(ApplicationConfiguration.class, userUi, props);
+
// Kernel thread
kernelThread = new KernelThread(this);
kernelThread.setContextClassLoader(Kernel.class.getClassLoader());
Object headerValue = request.getHeader(headerName);
log.debug(headerName + ": " + headerValue);
}
+ log.debug("");
}
static void logFrameworkProperties(Log log) {
*/
package org.argeo.cms.internal.kernel;
+import java.security.SignatureException;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.argeo.ArgeoLogListener;
import org.argeo.ArgeoLogger;
import org.argeo.cms.auth.CurrentUser;
+import org.osgi.service.log.LogEntry;
+import org.osgi.service.log.LogListener;
+import org.osgi.service.log.LogReaderService;
+import org.osgi.service.log.LogService;
/** Not meant to be used directly in standard log4j config */
-class NodeLogger implements ArgeoLogger {
+class NodeLogger implements ArgeoLogger, LogListener {
private Boolean disabled = false;
}
};
+ @SuppressWarnings("unchecked")
+ public NodeLogger(LogReaderService lrs) {
+ Enumeration<LogEntry> logEntries = lrs.getLog();
+ while (logEntries.hasMoreElements())
+ logged(logEntries.nextElement());
+ lrs.addLogListener(this);
+ }
+
public void init() {
try {
events = new LinkedBlockingQueue<LogEvent>();
// this.layout = layout;
// }
+ //
+ // OSGi LOGGER
+ //
+ @Override
+ public void logged(LogEntry status) {
+ Log pluginLog = LogFactory.getLog(status.getBundle().getSymbolicName());
+ Integer severity = status.getLevel();
+ if (severity == LogService.LOG_ERROR) {
+ // FIXME Fix Argeo TP
+ if (status.getException() instanceof SignatureException)
+ return;
+ pluginLog.error(status.getMessage(), status.getException());
+ } else if (severity == LogService.LOG_WARNING)
+ pluginLog.warn(status.getMessage(), status.getException());
+ else if (severity == LogService.LOG_INFO && pluginLog.isDebugEnabled())
+ pluginLog.debug(status.getMessage(), status.getException());
+ else if (severity == LogService.LOG_DEBUG && pluginLog.isTraceEnabled())
+ pluginLog.trace(status.getMessage(), status.getException());
+ }
+
+ //
+ // ARGEO LOGGER
+ //
+
public synchronized void register(ArgeoLogListener listener,
Integer numberOfPreviousEvents) {
String username = CurrentUser.getUsername();
--- /dev/null
+package org.argeo.cms.internal.kernel;
+
+import org.argeo.cms.util.LoginEntryPoint;
+import org.eclipse.rap.rwt.application.Application;
+import org.eclipse.rap.rwt.application.ApplicationConfiguration;
+import org.eclipse.rap.rwt.application.EntryPoint;
+import org.eclipse.rap.rwt.application.EntryPointFactory;
+import org.eclipse.rap.rwt.application.Application.OperationMode;
+
+public class UserUi implements ApplicationConfiguration {
+
+ @Override
+ public void configure(Application application) {
+ application.setOperationMode(OperationMode.SWT_COMPATIBILITY);
+ application.addEntryPoint("/login", LoginEntryPoint.class, null);
+ }
+
+ private class LoginEpf implements EntryPointFactory {
+
+ @Override
+ public EntryPoint create() {
+ return new LoginEntryPoint();
+ }
+
+ }
+}
--- /dev/null
+package org.argeo.cms.util;
+
+import java.util.Locale;
+
+import javax.security.auth.Subject;
+import javax.security.auth.login.CredentialNotFoundException;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+import javax.servlet.http.HttpServletRequest;
+
+import org.argeo.ArgeoException;
+import org.argeo.cms.CmsException;
+import org.argeo.cms.CmsImageManager;
+import org.argeo.cms.CmsView;
+import org.argeo.cms.auth.AuthConstants;
+import org.argeo.cms.auth.HttpRequestCallbackHandler;
+import org.argeo.cms.widgets.auth.CmsLogin;
+import org.argeo.cms.widgets.auth.CmsLoginShell;
+import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
+import org.argeo.eclipse.ui.specific.UiContext;
+import org.eclipse.rap.rwt.RWT;
+import org.eclipse.rap.rwt.application.EntryPoint;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+
+public class LoginEntryPoint implements EntryPoint, CmsView {
+ // private final static Log log = LogFactory.getLog(WorkbenchLogin.class);
+ private final Subject subject = new Subject();
+ private LoginContext loginContext;
+
+ @Override
+ public int createUI() {
+ final Display display = createDisplay();
+ UiContext.setData(CmsView.KEY, this);
+ try {
+ // try pre-auth
+ loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_USER,
+ subject, new HttpRequestCallbackHandler(getRequest()));
+ loginContext.login();
+ } catch (CredentialNotFoundException e) {
+ CmsLoginShell loginShell = createCmsLoginShell();
+ loginShell.open();
+ while (!loginShell.getShell().isDisposed()) {
+ try {
+ if (!display.readAndDispatch())
+ display.sleep();
+ } catch (Exception e1) {
+ try {
+ Thread.sleep(3000);
+ } catch (InterruptedException e2) {
+ // silent
+ }
+ ErrorFeedback.show("Login failed", e1);
+ return -1;
+ }
+ }
+ } catch (LoginException e) {
+ throw new ArgeoException("Cannot log in", e);
+ }
+ return postLogin();
+ }
+
+ protected Display createDisplay() {
+ return new Display();
+ }
+
+ protected int postLogin() {
+ return 0;
+ }
+
+ protected HttpServletRequest getRequest() {
+ return RWT.getRequest();
+ }
+
+ protected CmsLoginShell createCmsLoginShell() {
+ return new CmsLoginShell(this) {
+
+ @Override
+ public void createContents(Composite parent) {
+ LoginEntryPoint.this.createLoginPage(parent, this);
+ }
+
+ @Override
+ protected void extendsCredentialsBlock(Composite credentialsBlock,
+ Locale selectedLocale,
+ SelectionListener loginSelectionListener) {
+ LoginEntryPoint.this.extendsCredentialsBlock(credentialsBlock,
+ selectedLocale, loginSelectionListener);
+ }
+
+ };
+ }
+
+ /**
+ * To be overridden. CmsLogin#createCredentialsBlock() should be called at
+ * some point in order to create the credentials composite. In order to use
+ * the default layout, call CmsLogin#defaultCreateContents() but <b>not</b>
+ * CmsLogin#createContent(), since it would lead to a stack overflow.
+ */
+ protected void createLoginPage(Composite parent, CmsLogin login) {
+ login.defaultCreateContents(parent);
+ }
+
+ protected void extendsCredentialsBlock(Composite credentialsBlock,
+ Locale selectedLocale, SelectionListener loginSelectionListener) {
+
+ }
+
+ @Override
+ public void navigateTo(String state) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void authChange(LoginContext loginContext) {
+ this.loginContext = loginContext;
+ }
+
+ @Override
+ public void logout() {
+ if (loginContext == null)
+ throw new CmsException("Login context should not bet null");
+ try {
+ loginContext.logout();
+ } catch (LoginException e) {
+ throw new CmsException("Cannot log out", e);
+ }
+ }
+
+ @Override
+ public final Subject getSubject() {
+ return subject;
+ }
+
+ @Override
+ public void exception(Throwable e) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public CmsImageManager getImageManager() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+}
}
public static void setLocale(Locale locale) {
- RWT.getUISession().setLocale(locale);
+ if (Display.getCurrent() != null)
+ RWT.getUISession().setLocale(locale);
}
/** Can always be null */
package org.argeo.security.ui.rap;
+import java.security.PrivilegedAction;
import java.util.Locale;
+import javax.security.auth.Subject;
+
import org.argeo.cms.CmsMsg;
+import org.argeo.cms.auth.CurrentUser;
import org.argeo.cms.util.CmsUtils;
+import org.argeo.cms.util.LoginEntryPoint;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.client.service.JavaScriptExecutor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
-public class RapWorkbenchLogin extends WorkbenchLogin {
+public class RapWorkbenchLogin extends LoginEntryPoint {
// private final static Log log =
// LogFactory.getLog(RapWorkbenchLogin.class);
- @Override
- protected int createAndRunWorkbench(Display display, String username) {
- RapWorkbenchAdvisor workbenchAdvisor = createRapWorkbenchAdvisor(username);
- return PlatformUI.createAndRunWorkbench(display, workbenchAdvisor);
- }
-
/** Override to provide an application specific workbench advisor */
protected RapWorkbenchAdvisor createRapWorkbenchAdvisor(String username) {
return new RapWorkbenchAdvisor(username);
return returnCode;
}
+ @Override
+ protected int postLogin() {
+ final Display display = Display.getCurrent();
+ //
+ // RUN THE WORKBENCH
+ //
+ Integer returnCode = null;
+ try {
+ returnCode = Subject.doAs(getSubject(),
+ new PrivilegedAction<Integer>() {
+ public Integer run() {
+ int result = createAndRunWorkbench(display,
+ CurrentUser.getUsername(getSubject()));
+ return new Integer(result);
+ }
+ });
+ // explicit workbench closing
+ logout();
+ } finally {
+ display.dispose();
+ }
+ return returnCode;
+ }
+
+ protected int createAndRunWorkbench(Display display, String username) {
+ RapWorkbenchAdvisor workbenchAdvisor = createRapWorkbenchAdvisor(username);
+ return PlatformUI.createAndRunWorkbench(display, workbenchAdvisor);
+ }
+
@Override
protected void extendsCredentialsBlock(Composite credentialsBlock,
Locale selectedLocale, SelectionListener loginSelectionListener) {
loginButton.addSelectionListener(loginSelectionListener);
}
+ @Override
+ protected Display createDisplay() {
+ return PlatformUI.createDisplay();
+ }
+
}
+++ /dev/null
-package org.argeo.security.ui.rap;
-
-import java.security.PrivilegedAction;
-import java.util.Locale;
-
-import javax.security.auth.Subject;
-import javax.security.auth.login.CredentialNotFoundException;
-import javax.security.auth.login.LoginContext;
-import javax.security.auth.login.LoginException;
-import javax.servlet.http.HttpServletRequest;
-
-import org.argeo.ArgeoException;
-import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsImageManager;
-import org.argeo.cms.CmsView;
-import org.argeo.cms.auth.AuthConstants;
-import org.argeo.cms.auth.CurrentUser;
-import org.argeo.cms.auth.HttpRequestCallbackHandler;
-import org.argeo.cms.widgets.auth.CmsLogin;
-import org.argeo.cms.widgets.auth.CmsLoginShell;
-import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
-import org.argeo.eclipse.ui.specific.UiContext;
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.rap.rwt.application.EntryPoint;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-
-abstract class WorkbenchLogin implements EntryPoint, CmsView {
- // private final static Log log = LogFactory.getLog(WorkbenchLogin.class);
- private final Subject subject = new Subject();
- private LoginContext loginContext;
-
- @Override
- public int createUI() {
- final Display display = PlatformUI.createDisplay();
- UiContext.setData(CmsView.KEY, this);
- try {
- // try pre-auth
- loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_USER,
- subject, new HttpRequestCallbackHandler(getRequest()));
- loginContext.login();
- } catch (CredentialNotFoundException e) {
- CmsLoginShell loginShell = createCmsLoginShell();
- loginShell.open();
- while (!loginShell.getShell().isDisposed()) {
- try {
- if (!display.readAndDispatch())
- display.sleep();
- } catch (Exception e1) {
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e2) {
- // silent
- }
- ErrorFeedback.show("Login failed", e1);
- return -1;
- }
- }
- } catch (LoginException e) {
- throw new ArgeoException("Cannot log in", e);
- }
- //
- // RUN THE WORKBENCH
- //
- Integer returnCode = null;
- try {
- returnCode = Subject.doAs(subject, new PrivilegedAction<Integer>() {
- public Integer run() {
- int result = createAndRunWorkbench(display,
- CurrentUser.getUsername(subject));
- return new Integer(result);
- }
- });
- // explicit workbench closing
- logout();
- } finally {
- display.dispose();
- }
- return returnCode;
- }
-
- protected abstract int createAndRunWorkbench(Display display,
- String username);
-
- protected HttpServletRequest getRequest() {
- return RWT.getRequest();
- }
-
- protected CmsLoginShell createCmsLoginShell() {
- return new CmsLoginShell(this) {
-
- @Override
- public void createContents(Composite parent) {
- WorkbenchLogin.this.createLoginPage(parent, this);
- }
-
- @Override
- protected void extendsCredentialsBlock(Composite credentialsBlock,
- Locale selectedLocale,
- SelectionListener loginSelectionListener) {
- WorkbenchLogin.this.extendsCredentialsBlock(credentialsBlock,
- selectedLocale, loginSelectionListener);
- }
-
- };
- }
-
- /**
- * To be overridden. CmsLogin#createCredentialsBlock() should be called at
- * some point in order to create the credentials composite. In order to use
- * the default layout, call CmsLogin#defaultCreateContents() but <b>not</b>
- * CmsLogin#createContent(), since it would lead to a stack overflow.
- */
- protected void createLoginPage(Composite parent, CmsLogin login) {
- login.defaultCreateContents(parent);
- }
-
- protected void extendsCredentialsBlock(Composite credentialsBlock,
- Locale selectedLocale, SelectionListener loginSelectionListener) {
-
- }
-
- @Override
- public void navigateTo(String state) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void authChange(LoginContext loginContext) {
- this.loginContext = loginContext;
- }
-
- @Override
- public void logout() {
- if (loginContext == null)
- throw new CmsException("Login context should not bet null");
- try {
- loginContext.logout();
- } catch (LoginException e) {
- throw new CmsException("Cannot log out", e);
- }
- }
-
- @Override
- public final Subject getSubject() {
- return subject;
- }
-
- @Override
- public void exception(Throwable e) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public CmsImageManager getImageManager() {
- // TODO Auto-generated method stub
- return null;
- }
-}