]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.security.ui/src/org/argeo/security/ui/PrivilegedJob.java
Un-comment default user menu. Client application might define a "org.argeo.ui.openHom...
[lgpl/argeo-commons.git] / org.argeo.security.ui / src / org / argeo / security / ui / PrivilegedJob.java
1 package org.argeo.security.ui;
2
3 import java.security.AccessController;
4 import java.security.PrivilegedAction;
5
6 import javax.security.auth.Subject;
7
8 import org.eclipse.core.runtime.IProgressMonitor;
9 import org.eclipse.core.runtime.IStatus;
10 import org.eclipse.core.runtime.jobs.Job;
11 import org.springframework.security.core.Authentication;
12 import org.springframework.security.core.context.SecurityContextHolder;
13
14 /**
15 * Propagate authentication to an eclipse job. Typically to execute a privileged
16 * action outside the UI thread
17 */
18 public abstract class PrivilegedJob extends Job {
19
20 private final Authentication authentication;
21 private Subject subject;
22
23 public PrivilegedJob(String jobName) {
24 super(jobName);
25 authentication = SecurityContextHolder.getContext().getAuthentication();
26 subject = Subject.getSubject(AccessController.getContext());
27
28 // Must be called *before* the job is scheduled,
29 // it is required for the progress window to appear
30 setUser(true);
31 }
32
33 @Override
34 protected IStatus run(final IProgressMonitor progressMonitor) {
35 PrivilegedAction<IStatus> privilegedAction = new PrivilegedAction<IStatus>() {
36 public IStatus run() {
37 SecurityContextHolder.getContext().setAuthentication(
38 authentication);
39 return doRun(progressMonitor);
40 }
41 };
42 return Subject.doAs(subject, privilegedAction);
43 }
44
45 /**
46 * Implement here what should be executed with default context
47 * authentication
48 */
49 protected abstract IStatus doRun(IProgressMonitor progressMonitor);
50 }