[jboss-cvs] JBossAS SVN: r93688 - in branches/Branch_5_x/testsuite: src/main/org/jboss/test/profileservice/testsecure and 2 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Sep 18 07:57:31 EDT 2009


Author: emuckenhuber
Date: 2009-09-18 07:57:31 -0400 (Fri, 18 Sep 2009)
New Revision: 93688

Added:
   branches/Branch_5_x/testsuite/src/resources/test-configs/jacc/deploy/profileservice-jboss-beans.xml
Modified:
   branches/Branch_5_x/testsuite/build.xml
   branches/Branch_5_x/testsuite/src/main/org/jboss/test/profileservice/testsecure/ProfileServiceUnitTestCase.java
   branches/Branch_5_x/testsuite/src/resources/test-configs/jacc/conf/login-config.xml
Log:
[JBAS-7269] provide secured PS configuration to run the secure tests.

Modified: branches/Branch_5_x/testsuite/build.xml
===================================================================
--- branches/Branch_5_x/testsuite/build.xml	2009-09-18 11:51:46 UTC (rev 93687)
+++ branches/Branch_5_x/testsuite/build.xml	2009-09-18 11:57:31 UTC (rev 93688)
@@ -707,9 +707,11 @@
       <include name="org/jboss/test/cmp2/relationship/*TestCase.class" />
       <include name="org/jboss/test/cmp2/simple/SimpleUnitTestCase.class" />
       <include name="**/test/webservice/jbws309/*TestCase.class"/>
+      <include name="**/test/profileservice/testsecure/*UnitTestCase.class"/>
    </patternset>
    <patternset id="jacc.excludes">
 	<exclude name="**/test/jacc/test/*"/>
+    <exclude name="**/test/profileservice/testsecure/*UnitTestCase.class"/>
    </patternset>
    <patternset id="jacc.allstarrole.includes">
       <include name="org/jboss/test/jacc/test/allstarrole/*TestCase.class"/>
@@ -781,7 +783,6 @@
       <include name="**/test/perf/test/SecurePerfStressTestCase.class"/>
       <include name="**/test/timer/test/SecureTimerUnitTestCase.class"/>
       <include name="**/test/security/test/client/*UnitTestCase.class"/>
-      <include name="**/test/profileservice/testsecure/*UnitTestCase.class"/>
    </patternset>
    <patternset id="security.excludes">
       <exclude name="**/test/naming/test/Security*"/>

Modified: branches/Branch_5_x/testsuite/src/main/org/jboss/test/profileservice/testsecure/ProfileServiceUnitTestCase.java
===================================================================
--- branches/Branch_5_x/testsuite/src/main/org/jboss/test/profileservice/testsecure/ProfileServiceUnitTestCase.java	2009-09-18 11:51:46 UTC (rev 93687)
+++ branches/Branch_5_x/testsuite/src/main/org/jboss/test/profileservice/testsecure/ProfileServiceUnitTestCase.java	2009-09-18 11:57:31 UTC (rev 93688)
@@ -121,7 +121,7 @@
       ProfileService ps = getProfileService();
       Collection<ProfileKey> keys = ps.getProfileKeys();
       log.info("getProfileKeys: "+keys);
-      ProfileKey defaultKey = new ProfileKey("all");
+      ProfileKey defaultKey = new ProfileKey("deployers");
       assertTrue("keys contains default", keys.contains(defaultKey));
       logout();
    }
@@ -144,33 +144,9 @@
    }
 
    /**
-    * Try to access a method with an invalid login
+    * Try to 
     * @throws Exception
     */
-   public void testInvalidUserDefaultDSComponentCount()
-      throws Exception
-   {
-      login("admin", "non-admin".toCharArray());
-      ManagementView mgtView = getManagementView();
-      ComponentType type = new ComponentType("DataSource", "LocalTx");
-      try
-      {
-         Set<ManagedComponent> comps = mgtView.getComponentsForType(type);
-         fail("jduke was able to invoke getComponentsForType");
-      }
-      catch(Exception e)
-      {
-         log.info("jduke calling getComponentsForType failed as expected, "+e.getMessage());
-      }
-      finally
-      {
-         logout();
-      }
-   }
-   /**
-    * Try to access a method with a user that does not have admin rights
-    * @throws Exception
-    */
    public void testNonAdminDefaultDSComponentCount()
       throws Exception
    {
@@ -215,29 +191,6 @@
       assertEquals("There is 1 DefaultDS ManagedComponent", 1, 1);
       logout();
    }
-   /**
-    * Validate that there is only 1 DefaultDS ManagedComponent
-    * @throws Exception
-    */
-   public void testDefaultDSComponentCountUsingAdminAdmin()
-      throws Exception
-   {
-      login("admin", "admin".toCharArray());
-      ManagementView mgtView = getManagementView();
-      ComponentType type = new ComponentType("DataSource", "LocalTx");
-      Set<ManagedComponent> comps = mgtView.getComponentsForType(type);
-      int count = 0;
-      for (ManagedComponent comp : comps)
-      {
-        String cname = comp.getName();
-        if( cname.endsWith("DefaultDS") )
-        {
-           count ++;
-        }
-      }
-      assertEquals("There is 1 DefaultDS ManagedComponent", 1, 1);
-      logout();
-   }
 
    /**
     * Validate that there is only 1 DefaultDS ManagedComponent
@@ -289,9 +242,7 @@
       throws Exception
    {
       InitialContext ctx = super.getInitialContext();
-      Object ref = ctx.lookup("SecureProfileService/remote");
-      log.debug("SecureProfileService/remote: "+ref);
-      ProfileService ps = (ProfileService) ref;
+      ProfileService ps = (ProfileService) ctx.lookup("SecureProfileService/remote");
       return ps;
    }
    

Modified: branches/Branch_5_x/testsuite/src/resources/test-configs/jacc/conf/login-config.xml
===================================================================
--- branches/Branch_5_x/testsuite/src/resources/test-configs/jacc/conf/login-config.xml	2009-09-18 11:51:46 UTC (rev 93687)
+++ branches/Branch_5_x/testsuite/src/resources/test-configs/jacc/conf/login-config.xml	2009-09-18 11:57:31 UTC (rev 93688)
@@ -103,4 +103,15 @@
       </login-module>
     </authentication>
   </application-policy>
+  
+   <application-policy name="jmx-console">
+    <authentication>
+      <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"
+        flag="required">
+        <module-option name="usersProperties">props/jmx-console-users.properties</module-option>
+        <module-option name="rolesProperties">props/jmx-console-roles.properties</module-option>
+      </login-module>
+    </authentication>
+  </application-policy>
+  
 </policy>

Added: branches/Branch_5_x/testsuite/src/resources/test-configs/jacc/deploy/profileservice-jboss-beans.xml
===================================================================
--- branches/Branch_5_x/testsuite/src/resources/test-configs/jacc/deploy/profileservice-jboss-beans.xml	                        (rev 0)
+++ branches/Branch_5_x/testsuite/src/resources/test-configs/jacc/deploy/profileservice-jboss-beans.xml	2009-09-18 11:57:31 UTC (rev 93688)
@@ -0,0 +1,367 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+    The secured profile service beans configuration.
+-->
+<deployment xmlns="urn:jboss:bean-deployer:2.0">
+
+    <!-- profileservice secureview application-policy definition -->
+    <application-policy xmlns="urn:jboss:security-beans:1.0" name="profileservice">
+        <authentication>
+            <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required">
+                <module-option name="unauthenticatedIdentity">nouser</module-option>
+                <module-option name="usersProperties">profileservice-users.properties</module-option>
+                <module-option name="rolesProperties">profileservice-roles.properties</module-option>
+            </login-module>
+        </authentication>
+    </application-policy>
+
+    <bean name="ConnectorMBean">
+        <constructor factoryClass="org.jboss.mx.util.MBeanTyper" factoryMethod="typeMBean">
+            <parameter><inject bean="JMXKernel" property="mbeanServer"/></parameter>
+            <parameter>jboss.remoting:service=Connector,transport=socket</parameter>
+            <parameter>org.jboss.remoting.transport.ConnectorMBean</parameter>
+        </constructor>
+        <depends>jboss.remoting:service=Connector,transport=socket</depends>
+    </bean>
+
+    <!--
+        Add a ProfileService handler to the remoting socket connector
+    -->
+    <bean name="ProfileServiceInvocationHandler"
+        class="org.jboss.profileservice.remoting.ProfileServiceInvocationHandler">
+        <install bean="ConnectorMBean" method="addInvocationHandler">
+            <parameter class="java.lang.String">ProfileService</parameter>
+            <parameter class="org.jboss.remoting.ServerInvocationHandler"><this/></parameter>
+        </install>
+        <uninstall bean="ConnectorMBean" method="removeInvocationHandler">
+            <parameter>ProfileService</parameter>
+        </uninstall>
+        <property name="managementViewProxy"><inject bean="ProfileServiceProxyFactory" property="managementViewProxy"/></property>
+        <property name="deployMgrProxy"><inject bean="ProfileServiceProxyFactory" property="deployMgrProxy"/></property>
+        <property name="securityDomain">jmx-console</property>
+        <property name="securityManagement"><inject bean="JNDIBasedSecurityManagement"/></property>
+    </bean>
+    
+    <!--
+        Add a DeploymentManger handler to the remoting socket connector
+    -->
+    <bean name="DeploymentInvocationHandler"
+        class="org.jboss.profileservice.management.upload.remoting.DeployHandler">
+        <install bean="ConnectorMBean" method="addInvocationHandler">
+            <parameter class="java.lang.String">DeploymentManager</parameter>
+            <parameter class="org.jboss.remoting.ServerInvocationHandler"><this/></parameter>
+        </install>
+        <uninstall bean="ConnectorMBean" method="removeInvocationHandler">
+            <parameter>DeploymentManager</parameter>
+        </uninstall>
+        <property name="deployer"><inject bean="ProfileServiceDeployer"/></property>
+        <property name="profileService"><inject bean="ProfileService"/></property>
+        <property name="profileRepository"><inject bean="ProfileRepositoryFactory" /></property>
+        <property name="securityDomain">jmx-console</property>
+        <property name="securityManagement"><inject bean="JNDIBasedSecurityManagement"/></property>
+        <depends>TransientDeploymentsProfileManager</depends>
+    </bean>
+
+    <bean name="TransientDeploymentsProfileManager"
+        class="org.jboss.profileservice.management.upload.AbstractTransientProfileManager">
+        <property name="profileService"><inject bean="ProfileService"/></property>
+    </bean>
+
+    <bean name="RuntimeComponentDispatcher" class="org.jboss.profileservice.management.KernelBusRuntimeComponentDispatcher">
+       <constructor>
+          <parameter class="org.jboss.kernel.Kernel"><inject bean="jboss.kernel:service=Kernel"/></parameter>
+       </constructor>
+    </bean>
+    
+    <bean name="MBeanRuntimeComponentDispatcher" class="org.jboss.profileservice.management.MBeanRuntimeComponentDispatcher">
+       <constructor>
+           <parameter name="mbeanServer"><inject bean="JMXKernel" property="mbeanServer"/></parameter>
+       </constructor>
+    </bean>
+
+    <bean name="ManagedOperationProxyFactory" class="org.jboss.profileservice.management.ManagedOperationProxyFactory">
+    	<property name="locator"><inject bean="ConnectorMBean" property="invokerLocator"/></property>
+        <property name="dispatcher"><inject bean="RuntimeComponentDispatcher"/></property>
+        <property name="dispatchName">kernel-dispatcher</property>
+    </bean>
+    
+    <bean name="MBeanManagedOperationProxyFactory" class="org.jboss.profileservice.management.ManagedOperationProxyFactory">
+    	<property name="locator"><inject bean="ConnectorMBean" property="invokerLocator"/></property>
+        <property name="dispatcher"><inject bean="MBeanRuntimeComponentDispatcher"/></property>
+        <property name="dispatchName">mbean-dispatcher</property>
+    </bean>
+
+    <!-- The default applications profile key -->
+    <bean name="ApplicationsProfileKey" class="org.jboss.profileservice.spi.ProfileKey">
+		<constructor><parameter><inject bean="BootstrapProfileFactory" property="applicationsName" /></parameter></constructor>
+	</bean>
+	
+    <!--
+        The ManagementView plugin
+    -->
+    <bean name="ManagementView" class="org.jboss.profileservice.management.ManagementViewImpl">
+        <install bean="ProfileService" method="setViewManager">
+            <parameter>
+                <this/>
+            </parameter>
+        </install>
+        <uninstall bean="ProfileService" method="setViewManager">
+            <parameter>
+                <null/>
+            </parameter>
+        </uninstall>
+        <property name="mainDeployer"><inject bean="MainDeployer"/></property>
+        <property name="mbeanServer"><inject bean="JMXKernel" property="mbeanServer"/></property>
+        <property name="profileService"><inject bean="ProfileService"/></property>
+       	<property name="attachmentStore"><inject bean="AttachmentStore" /></property>
+       	<property name="deploymentManager"><inject bean="DeploymentManager"/></property>
+        <property name="defaultProfileKey"><inject bean="ApplicationsProfileKey"/></property>
+        <property name="dispatcher"><inject bean="RuntimeComponentDispatcher"/></property>
+        <property name="proxyFactory"><inject bean="ManagedOperationProxyFactory"/></property>
+        <property name="mbeanProxyFactory"><inject bean="MBeanManagedOperationProxyFactory"/></property>
+        <property name="bootstrapManagedDeployments"><inject bean="ProfileServiceBootstrap" property="bootstrapMDs"/></property>
+        <!-- Accept any implementor of DeploymentTemplate -->
+        <incallback method="addTemplate"/>
+        <uncallback method="removeTemplate"/>
+        <!-- Accept any implementor of ManagedDeployment -->
+        <incallback method="addManagedMBeanDeployments"/>
+        <uncallback method="removeManagedMBeanDeployments"/>
+    </bean>
+
+    <!--
+        The DeploymentManager plugin
+    -->
+    <bean name="DeploymentManager"
+        class="org.jboss.profileservice.management.upload.DeploymentManagerImpl">
+        <install bean="ProfileService" method="setDeploymentManager">
+            <parameter>
+                <this/>
+            </parameter>
+        </install>
+        <uninstall bean="ProfileService" method="setDeploymentManager">
+            <parameter>
+                <null/>
+            </parameter>
+        </uninstall>
+        <property name="defaultProfileKey"><inject bean="ApplicationsProfileKey"/></property>
+        <property name="profileRepository"><inject bean="ProfileRepositoryFactory"/></property>
+        <property name="locator"><inject bean="ConnectorMBean" property="invokerLocator"/></property>
+        <property name="remotingSubsystem">DeploymentManager</property>
+    </bean>
+
+    <!-- To remove the unsecure proxy binding, change the jndiName property to
+        a local binding like java:ProfileService and update the
+        deploy/profileservice-secured.jar ejb-jar.xml profileService
+        resource-ref/mapped-name.
+    -->
+    <bean name="ProfileServiceProxyFactory" class="org.jboss.profileservice.remoting.ProxyFactory">
+        <property name="dispatchName">ProfileService</property>
+        <property name="jndiName">ProfileService</property>
+        <property name="mgtViewJndiName">ManagementView</property>
+        <property name="deployMgrJndiName">DeploymentManager</property>
+        <property name="locator"><inject bean="ConnectorMBean" property="invokerLocator"/></property>
+        <property name="profileService"><inject bean="ProfileService"/></property>
+        <property name="viewManager"><inject bean="ManagementView"/></property>
+        <property name="deploymentManager"><inject bean="DeploymentManager"/></property>
+        <!-- Create links from secured proxies back to old secured ejb3 facades -->
+        <property name="createEjb3Links">true</property>
+        <!-- Server side security interceptor stack -->
+        <property name="serverProxyInterceptors">
+            <list>
+                <bean class="org.jboss.aspects.security.AuthenticationInterceptor">
+                    <constructor>
+                        <parameter>
+                            <value-factory bean="JNDIBasedSecurityManagement" method="getAuthenticationManager"
+                            parameter="jmx-console"/>
+                        </parameter>
+                    </constructor>
+                </bean>
+                <bean class="org.jboss.aspects.security.RoleBasedAuthorizationInterceptor">
+                    <constructor>
+                        <parameter>
+                            <value-factory bean="JNDIBasedSecurityManagement" method="getAuthenticationManager"
+                                parameter="jmx-console"/>
+                        </parameter>
+                        <parameter>
+                            <value-factory bean="JNDIBasedSecurityManagement" method="getAuthenticationManager"
+                                parameter="jmx-console"/>
+                        </parameter>
+                    </constructor>
+                </bean>
+            </list>
+        </property>
+        <depends>ConnectorMBean</depends>
+    </bean>
+    <bean name="PlatformMBeanKernelRegistryPlugin" class="org.jboss.profileservice.management.PlatformMBeanKernelRegistryPlugin">
+        <property name="serviceController"><inject bean="JMXKernel" property="serviceController"/></property>
+    </bean>
+    <!-- Handle OpenType composite conversion to MetaType -->
+    <bean name="CompositeDataMetaValueBuilder"
+        class="org.jboss.managed.plugins.jmx.CompositeDataMetaValueBuilder">
+        <install bean="MetaValueFactory" method="setBuilder">
+            <parameter>
+                <value>javax.management.openmbean.CompositeDataSupport</value>
+            </parameter>
+            <parameter>
+                <this/>
+            </parameter>
+        </install>
+        <uninstall bean="MetaValueFactory" method="setBuilder">
+            <parameter>
+                <value>javax.management.openmbean.CompositeDataSupport</value>
+            </parameter>
+            <parameter>
+                <null/>
+            </parameter>
+        </uninstall>
+        <property name="metaValueFactory"><inject bean="MetaValueFactory"/></property>
+    </bean>
+
+    <!-- A MBeanDeploymentNameBuilder that just uses the name key as the name -->
+    <bean name="NameKeyMBeanDeploymentNameBuilder"
+        class="org.jboss.profileservice.management.mbean.SimpleMBeanDeploymentNameBuilder">
+        <property name="keyName">name</property>
+    </bean>
+    <bean name="JNDINameKeyMBeanDeploymentNameBuilder"
+        class="org.jboss.profileservice.management.mbean.SimpleMBeanDeploymentNameBuilder">
+        <property name="keyName">jndiName</property>
+    </bean>
+    <bean name="HostMBeanDeploymentNameBuilder"
+        class="org.jboss.profileservice.management.mbean.SimpleMBeanDeploymentNameBuilder">
+        <property name="keyName">host</property>
+    </bean>
+    <!-- A MBeanDeploymentNameBuilder that combines the host,path keys as the name -->
+    <bean name="WarManagerMBeanDeploymentNameBuilder"
+        class="org.jboss.profileservice.management.mbean.ComplexMBeanDeploymentNameBuilder">
+        <property name="prefix">//</property>
+        <property name="keyNames">
+            <list elementClass="java.lang.String">
+                <value>host</value>
+                <value>path</value>
+            </list>
+        </property>
+    </bean>
+    <!-- A deployment for the following mbean patterns:
+        jboss.web:host=localhost,path=/jmx-console,type=Manager
+        jboss.web:J2EEApplication=none,J2EEServer=none,j2eeType=WebModule,name=*
+        +- all servlets attribute names
+    -->
+    <bean name="WarManagedDeploymentFactory"
+        class="org.jboss.profileservice.management.ProxyManagedDeploymentFactory">
+        <property name="factoryName">War</property>
+
+        <property name="defaultViewUse">STATISTIC</property>
+        <property name="rootMOPatterns">
+            <set elementClass="org.jboss.profileservice.management.ProxyDeploymentInfo">
+                <!-- Manager -->
+                <bean class="org.jboss.profileservice.management.ProxyDeploymentInfo">
+                    <property name="compType">MBean</property>
+                    <property name="compSubtype">WebApplicationManager</property>
+                    <property name="pattern">jboss.web:host=localhost,type=Manager,*</property>
+                    <property name="nameBuilder">
+                        <inject bean="WarManagerMBeanDeploymentNameBuilder"/>
+                    </property>
+                </bean>
+                <!-- WebModule -->
+                <bean class="org.jboss.profileservice.management.ProxyDeploymentInfo">
+                    <property name="compType">MBean</property>
+                    <property name="compSubtype">WebApplication</property>
+                    <property name="pattern">jboss.web:J2EEApplication=none,J2EEServer=none,j2eeType=WebModule,*</property>
+                    <property name="nameBuilder">
+                        <inject bean="NameKeyMBeanDeploymentNameBuilder"/>
+                    </property>
+                    <property name="componentInfo">
+                        <map keyClass="java.lang.String" valueClass="java.lang.String">
+                            <!-- Process the servlets components -->
+                            <entry>
+                                <key>servlets</key>
+                                <value>MBean:Servlet</value>
+                            </entry>
+                        </map>
+                    </property>
+                </bean>
+            </set>
+        </property>
+    </bean>
+    <!-- jboss.web:host=*,type=Host -->
+    <bean name="WebHostsManagedDeploymentFactory"
+        class="org.jboss.profileservice.management.ProxyManagedDeploymentFactory">
+        <property name="factoryName">WebHost</property>
+        
+        <property name="defaultViewUse">STATISTIC</property>
+        <property name="rootMOPatterns">
+            <set elementClass="org.jboss.profileservice.management.ProxyDeploymentInfo">
+                <!-- Manager -->
+                <bean class="org.jboss.profileservice.management.ProxyDeploymentInfo">
+                    <property name="compType">MBean</property>
+                    <property name="compSubtype">WebHost</property>
+                    <property name="pattern">jboss.web:type=Host,*</property>
+                    <property name="nameBuilder">
+                        <inject bean="HostMBeanDeploymentNameBuilder"/>
+                    </property>
+                </bean>
+            </set>
+        </property>
+    </bean>
+    <!-- jboss.web:name=*,type=GlobalRequestProcessor/ThreadPool -->
+    <bean name="ConnectorManagedDeploymentFactory"
+        class="org.jboss.profileservice.management.ProxyManagedDeploymentFactory">
+        <property name="factoryName">Connector</property>
+        
+        <property name="defaultViewUse">STATISTIC</property>
+        <property name="rootMOPatterns">
+            <set elementClass="org.jboss.profileservice.management.ProxyDeploymentInfo">
+                <!-- Manager -->
+                <bean class="org.jboss.profileservice.management.ProxyDeploymentInfo">
+                    <property name="compType">MBean</property>
+                    <property name="compSubtype">WebRequestProcessor</property>
+                    <property name="pattern">jboss.web:type=GlobalRequestProcessor,*</property>
+                    <property name="nameBuilder">
+                        <inject bean="NameKeyMBeanDeploymentNameBuilder"/>
+                    </property>
+                </bean>
+                <bean class="org.jboss.profileservice.management.ProxyDeploymentInfo">
+                    <property name="compType">MBean</property>
+                    <property name="compSubtype">WebThreadPool</property>
+                    <property name="pattern">jboss.web:type=ThreadPool,*</property>
+                    <property name="nameBuilder">
+                        <inject bean="NameKeyMBeanDeploymentNameBuilder"/>
+                    </property>
+                </bean>
+            </set>
+        </property>
+    </bean>
+    <bean name="EJBMetricsManagedDeploymentFactory"
+        class="org.jboss.profileservice.management.ProxyManagedDeploymentFactory">
+        <property name="factoryName">EJBMetrics</property>
+        <property name="defaultViewUse">STATISTIC</property>
+        <property name="propertyMetaMappings">
+            <map keyClass="java.lang.String" valueClass="java.lang.String">
+                <entry>
+                     <key>DetypedInvocationStatistics</key>
+                     <value>org.jboss.profileservice.management.mbean.EJBInvocationStatsMapper</value>
+                </entry>
+            </map>
+        </property>
+        <property name="rootMOPatterns">
+            <set elementClass="org.jboss.profileservice.management.ProxyDeploymentInfo">
+                <!-- Manager -->
+                <bean class="org.jboss.profileservice.management.ProxyDeploymentInfo">
+                    <property name="compType">EJB</property>
+                    <property name="compSubtype">Unknown</property>
+                    <property name="subtypeAttribute">BeanTypeName</property>
+                    <property name="pattern">jboss.j2ee:service=EJB,*</property>
+                    <property name="excludedKeys">
+                       <set elementClass="java.lang.String">
+                           <value>plugin</value>
+                       </set>
+                    </property>
+                    <property name="nameBuilder">
+                        <inject bean="JNDINameKeyMBeanDeploymentNameBuilder"/>
+                    </property>
+                </bean>
+            </set>
+        </property>
+    </bean>
+</deployment>




More information about the jboss-cvs-commits mailing list