Mercurial > hg > AnnotationManager
view src/de/mpiwg/itgroup/annotationManager/restlet/RestServer.java @ 7:97f68ab3430f
support both read and search api of Annotator.
some cleanup of imports.
author | casties |
---|---|
date | Mon, 19 Mar 2012 12:01:39 +0100 |
parents | 0be9d53a6967 |
children | 11baadcdd2c8 |
line wrap: on
line source
package de.mpiwg.itgroup.annotationManager.restlet; import java.net.URI; import java.net.URISyntaxException; import java.util.Hashtable; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import javax.security.auth.Subject; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.NameCallback; import javax.security.auth.callback.PasswordCallback; import javax.security.auth.login.AppConfigurationEntry; import javax.security.auth.login.Configuration; import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.restlet.Application; import org.restlet.Context; import org.restlet.Request; import org.restlet.Response; import org.restlet.Restlet; import org.restlet.data.ChallengeScheme; import org.restlet.data.ClientInfo; import org.restlet.engine.component.ChildContext; import org.restlet.ext.jaas.JaasVerifier; import org.restlet.routing.Redirector; import org.restlet.routing.Router; import org.restlet.routing.Template; import org.restlet.routing.TemplateRoute; import org.restlet.security.ChallengeAuthenticator; import org.restlet.security.MapVerifier; import org.restlet.security.User; import org.restlet.security.Verifier; import com.sun.org.apache.xalan.internal.xsltc.runtime.Attributes; import com.sun.security.auth.login.ConfigFile; public class RestServer extends Application { private ChallengeAuthenticator authenticator; private CallbackHandler callbackHandler; /** Erzeuge einen Authenticator * @return */ private ChallengeAuthenticator createAuthenticator() { Context context = getContext(); boolean optional = true; ChallengeScheme challengeScheme = ChallengeScheme.HTTP_BASIC; String realm = "Annotation Service"; JaasVerifier verifier = new JaasVerifier("BasicJaasAuthenticationApplication"); //JaasVerifier verifier = new JaasVerifier("DummyAuthentication"); Configuration jaasConfig; jaasConfig = createConfiguration(); verifier.setConfiguration(jaasConfig); verifier.setUserPrincipalClassName("com.sun.security.auth.UserPrincipal"); ChallengeAuthenticator auth = new ChallengeAuthenticator(context, optional, challengeScheme, realm, verifier) { @Override protected boolean authenticate(Request request, Response response) { if (request.getChallengeResponse() == null) { return false; } else { return super.authenticate(request, response); } } }; return auth; } /** * Konfiguration f�r den Authentificator in Jaas. Pfad zum JAAS-Konfigurationsfile liegt im Context-Parameter * "de.mpiwg.itgroup.annotationManager.jaas.configFilePath". * @return */ protected Configuration createConfiguration() { Configuration jaasConfig; URI confUri; Context context = getContext(); String configFilePath = context.getParameters().getFirstValue("de.mpiwg.itgroup.annotationManager.jaas.configFilePath"); try { confUri = new URI(configFilePath); } catch (URISyntaxException e) { e.printStackTrace(); confUri = null; } jaasConfig= new ConfigFile(confUri); return jaasConfig; } public RestServer(Context parentContext){ super(parentContext); Logger rl = Logger.getRootLogger(); BasicConfigurator.configure(); rl.setLevel(Level.DEBUG); } public synchronized Restlet createInboundRoot(){ this.authenticator = createAuthenticator(); //String target = "{rh}/{rf}/XX"; //Redirector redirector = new Redirector(getContext().createChildContext(), target, // Redirector.MODE_CLIENT_SEE_OTHER); Router router = new Router(getContext()); router.attach("/annotations",AddAndReadAnnotations.class); router.attach("/search",SearchAnnotations.class); // annotator api askes for different uris for search and adding router.attach("/dummy",Dummy.class); //router.attach("",redirector); router.attach("/annotator",ExtendedAnnotationInput.class); router.attach("/",AnnotatorInfo.class); authenticator.setNext(router); return authenticator; } /** * Authentifiziere den Benutzer aus dem Request (BasicAuthenfication) * @param request * @param response * @return */ public boolean authenticate(Request request, Response response) { if (!request.getClientInfo().isAuthenticated()) { authenticator.challenge(response, false); return false; } if(request.getClientInfo().getUser()==null) //FIXME sometimes ist authenticated true, but no user { authenticator.challenge(response, false); return false; } return true; } /** * Authentifiziere den Benutzer * * @param username * @param password * @param request * @return */ public boolean authenticate(String username, String password,Request request) { LoginContext lc; try { Configuration conf = createConfiguration(); lc = new LoginContext("BasicJaasAuthenticationApplication", null, new MyCallBackHandler(username,password),conf); //lc = new LoginContext("DummyAuthentication", null, new MyCallBackHandler(username,password),conf); lc.login(); } catch (LoginException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } Subject subject = lc.getSubject(); ClientInfo clientInfo = new ClientInfo(); User user = new User(username); clientInfo.setAuthenticated(true); clientInfo.setUser(user); request.setClientInfo(clientInfo); return true; } /** * Hole den vollen Benutzernamen aus dem LDAP * @param creator * @return */ public String getUserNameFromLdap(String creator) { String retString=creator; // falls nichts gefunden wird einfach den creator zurueckgeben Hashtable<String,String> env = new Hashtable<String,String>(); String sp = "com.sun.jndi.ldap.LdapCtxFactory"; env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, sp); String ldapUrl = "ldap://ldapreplik.mpiwg-berlin.mpg.de/dc=mpiwg-berlin,dc=mpg,dc=de";//TODO should go into config file env.put(javax.naming.Context.PROVIDER_URL, ldapUrl); DirContext dctx; try { dctx = new InitialDirContext(env); } catch (NamingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); return retString; } String base = "ou=People"; SearchControls sc = new SearchControls(); String[] attributeFilter = { "cn", "mail" }; sc.setReturningAttributes(attributeFilter); sc.setSearchScope(SearchControls.SUBTREE_SCOPE); String filter = "(uid="+creator+")"; try { NamingEnumeration<SearchResult> results = dctx.search(base, filter, sc); while (results.hasMore()) { SearchResult sr = (SearchResult) results.next(); javax.naming.directory.Attributes attrs = sr.getAttributes(); Attribute attr = attrs.get("cn"); retString=(String) attr.get(); } } catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { dctx.close(); } catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return retString; } }