View Javadoc
1   package org.argeo.cms.ui.workbench.rap;
2   
3   import java.security.PrivilegedAction;
4   import java.util.Locale;
5   
6   import javax.security.auth.Subject;
7   import javax.security.auth.x500.X500Principal;
8   import javax.servlet.http.HttpServletRequest;
9   import javax.servlet.http.HttpServletResponse;
10  
11  import org.argeo.cms.CmsMsg;
12  import org.argeo.cms.auth.CurrentUser;
13  import org.argeo.cms.util.CmsUtils;
14  import org.argeo.cms.util.LoginEntryPoint;
15  import org.eclipse.rap.rwt.RWT;
16  import org.eclipse.rap.rwt.client.service.JavaScriptExecutor;
17  import org.eclipse.swt.SWT;
18  import org.eclipse.swt.events.SelectionListener;
19  import org.eclipse.swt.widgets.Button;
20  import org.eclipse.swt.widgets.Composite;
21  import org.eclipse.swt.widgets.Display;
22  import org.eclipse.ui.PlatformUI;
23  
24  public class SpnegoWorkbenchLogin extends LoginEntryPoint {
25  	// private final static Log log =
26  	// LogFactory.getLog(RapWorkbenchLogin.class);
27  
28  	/** Override to provide an application specific workbench advisor */
29  	protected RapWorkbenchAdvisor createRapWorkbenchAdvisor(String username) {
30  		return new RapWorkbenchAdvisor(username);
31  	}
32  
33  	@Override
34  	public int createUI() {
35  		HttpServletRequest request = RWT.getRequest();
36  		String authorization = request.getHeader(HEADER_AUTHORIZATION);
37  		if (authorization == null || !authorization.startsWith("Negotiate")) {
38  			HttpServletResponse response = RWT.getResponse();
39  			response.setStatus(401);
40  			response.setHeader(HEADER_WWW_AUTHENTICATE, "Negotiate");
41  			response.setDateHeader("Date", System.currentTimeMillis());
42  			response.setDateHeader("Expires", System.currentTimeMillis() + (24 * 60 * 60 * 1000));
43  			response.setHeader("Accept-Ranges", "bytes");
44  			response.setHeader("Connection", "Keep-Alive");
45  			response.setHeader("Keep-Alive", "timeout=5, max=97");
46  			// response.setContentType("text/html; charset=UTF-8");
47  		}
48  
49  		int returnCode;
50  		returnCode = super.createUI();
51  		return returnCode;
52  	}
53  
54  	@Override
55  	protected int postLogin() {
56  		Subject subject = getSubject();
57  		final Display display = Display.getCurrent();
58  		if (subject.getPrincipals(X500Principal.class).isEmpty()) {
59  			RWT.getClient().getService(JavaScriptExecutor.class).execute("location.reload()");
60  		}
61  		//
62  		// RUN THE WORKBENCH
63  		//
64  		Integer returnCode = null;
65  		try {
66  			returnCode = Subject.doAs(subject, new PrivilegedAction<Integer>() {
67  				public Integer run() {
68  					int result = createAndRunWorkbench(display, CurrentUser.getUsername(subject));
69  					return new Integer(result);
70  				}
71  			});
72  			// explicit workbench closing
73  			logout();
74  		} finally {
75  			display.dispose();
76  		}
77  		return returnCode;
78  	}
79  
80  	protected int createAndRunWorkbench(Display display, String username) {
81  		RapWorkbenchAdvisor workbenchAdvisor = createRapWorkbenchAdvisor(username);
82  		return PlatformUI.createAndRunWorkbench(display, workbenchAdvisor);
83  	}
84  
85  	@Override
86  	protected void extendsCredentialsBlock(Composite credentialsBlock, Locale selectedLocale,
87  			SelectionListener loginSelectionListener) {
88  //		Button loginButton = new Button(credentialsBlock, SWT.PUSH);
89  //		loginButton.setText(CmsMsg.login.lead(selectedLocale));
90  //		loginButton.setLayoutData(CmsUtils.fillWidth());
91  //		loginButton.addSelectionListener(loginSelectionListener);
92  	}
93  
94  	@Override
95  	protected Display createDisplay() {
96  		return PlatformUI.createDisplay();
97  	}
98  
99  }