001 package org.tynamo.security.federatedaccounts.services;
002
003 import org.apache.shiro.realm.AuthenticatingRealm;
004 import org.apache.shiro.realm.Realm;
005 import org.apache.tapestry5.ioc.Configuration;
006 import org.apache.tapestry5.ioc.MappedConfiguration;
007 import org.apache.tapestry5.ioc.OrderedConfiguration;
008 import org.apache.tapestry5.ioc.ServiceBinder;
009 import org.apache.tapestry5.ioc.annotations.InjectService;
010 import org.apache.tapestry5.ioc.services.Coercion;
011 import org.apache.tapestry5.ioc.services.CoercionTuple;
012 import org.apache.tapestry5.services.LibraryMapping;
013 import org.tynamo.common.ModuleProperties;
014 import org.tynamo.security.FilterChainDefinition;
015 import org.tynamo.security.federatedaccounts.FederatedAccountSymbols;
016 import org.tynamo.security.federatedaccounts.facebook.FacebookRealm;
017 import org.tynamo.security.federatedaccounts.pages.CommitFacebookOauth;
018 import org.tynamo.security.federatedaccounts.pages.FacebookOauth;
019 import org.tynamo.security.federatedaccounts.util.WindowMode;
020
021 public class FederatedAccountsModule {
022 private static final String PATH_PREFIX = "federated";
023 private static String version = ModuleProperties.getVersion(FederatedAccountsModule.class);
024
025 public static void bind(ServiceBinder binder) {
026 binder.bind(AuthenticatingRealm.class, FacebookRealm.class).withId(FacebookRealm.class.getSimpleName());
027 }
028
029 public static void contributeFactoryDefaults(MappedConfiguration<String, String> configuration) {
030 configuration.add(FederatedAccountSymbols.COMMITAFTER_OAUTH, "true");
031 configuration.add(FederatedAccountSymbols.HTTPCLIENT_ON_GAE, "false");
032 configuration.add(FederatedAccountSymbols.SUCCESSURL, "");
033 configuration.add(FacebookRealm.FACEBOOK_PRINCIPAL, FacebookRealm.PrincipalProperty.id.name());
034 configuration.add(FacebookRealm.FACEBOOK_PERMISSIONS, "");
035 configuration.add(FacebookRealm.FACEBOOK_CLIENTID, "");
036 configuration.add(FacebookRealm.FACEBOOK_CLIENTSECRET, "");
037 }
038
039 public static void contributeComponentClassResolver(Configuration<LibraryMapping> configuration) {
040 configuration.add(new LibraryMapping(PATH_PREFIX, "org.tynamo.security.federatedaccounts"));
041 }
042
043 public static void contributeClasspathAssetAliasManager(MappedConfiguration<String, String> configuration) {
044 configuration.add(PATH_PREFIX + "-" + version, "org/tynamo/security/federatedaccounts");
045 }
046
047 public static void contributeWebSecurityManager(Configuration<Realm> configuration,
048 @InjectService("FacebookRealm") AuthenticatingRealm facebookRealm) {
049 configuration.add(facebookRealm);
050 }
051
052 public static void contributeSecurityRequestFilter(OrderedConfiguration<FilterChainDefinition> configuration) {
053 // TODO can there possibly be security implications for this, document properly
054 // We can't use linksource here because we are not in request lifecycle
055 configuration.add("facebookoauth", new FilterChainDefinition("/" + PATH_PREFIX + "/"
056 + FacebookOauth.class.getSimpleName().toLowerCase(), "anon"), "before:*");
057 configuration.add("commitfacebookoauth", new FilterChainDefinition("/" + PATH_PREFIX + "/"
058 + CommitFacebookOauth.class.getSimpleName().toLowerCase(), "anon"), "before:*");
059 }
060
061 public void contributeTypeCoercer(Configuration<CoercionTuple<String, WindowMode>> configuration) {
062 configuration.add(new CoercionTuple<String, WindowMode>(String.class, WindowMode.class, new Coercion<String, WindowMode>() {
063 public WindowMode coerce(String input) {
064 return WindowMode.valueOf(input);
065 }
066 }));
067 }
068
069 }