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    }