taylor      2002/06/18 22:14:12

  Modified:    build    Tag: security_14 build.xml
               src/java/org/apache/jetspeed/om/security Tag: security_14
                        BaseJetspeedGroup.java BaseJetspeedPermission.java
                        BaseJetspeedRole.java
               src/java/org/apache/jetspeed/services/security Tag:
                        security_14 TestGroupManagement.java
                        TestPermissionManagement.java
                        TestRoleManagement.java
               src/java/org/apache/jetspeed/services/security/turbine Tag:
                        security_14 TurbineGroupManagement.java
                        TurbinePermissionManagement.java
                        TurbineRoleManagement.java
               webapp/WEB-INF/conf Tag: security_14
                        JetspeedSecurity.properties
                        JetspeedSecurity.template
               webapp/WEB-INF/db Tag: security_14 jetspeed.properties
                        jetspeed.script
  Log:
  - Completed Unit Tests for PermissionManagement
  - Fixed bugs in addRole, addGroup
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.142.2.13 +3 -0      jakarta-jetspeed/build/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-jetspeed/build/build.xml,v
  retrieving revision 1.142.2.12
  retrieving revision 1.142.2.13
  diff -u -r1.142.2.12 -r1.142.2.13
  --- build.xml 18 Jun 2002 06:49:33 -0000      1.142.2.12
  +++ build.xml 19 Jun 2002 05:14:11 -0000      1.142.2.13
  @@ -901,10 +901,13 @@
               <formatter type="plain" usefile="false"/>            
   
               <!-- JUnit unit tests -->
  +
               <test name="org.apache.jetspeed.services.security.TestUserManagement"/>
               <test 
name="org.apache.jetspeed.services.security.TestPortalAuthentication"/> 
  +
               <test name="org.apache.jetspeed.services.security.TestRoleManagement"/> 
               <test 
name="org.apache.jetspeed.services.security.TestGroupManagement"/> 
  +
               <test 
name="org.apache.jetspeed.services.security.TestPermissionManagement"/> 
   
           </junit>
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.2   +2 -2      
jakarta-jetspeed/src/java/org/apache/jetspeed/om/security/Attic/BaseJetspeedGroup.java
  
  Index: BaseJetspeedGroup.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/om/security/Attic/BaseJetspeedGroup.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- BaseJetspeedGroup.java    17 Jun 2002 21:27:02 -0000      1.1.2.1
  +++ BaseJetspeedGroup.java    19 Jun 2002 05:14:12 -0000      1.1.2.2
  @@ -115,7 +115,7 @@
        */
       public void setId(String id)
       {      
  -        if (id == null)
  +        if (this.id == null)
           {
               this.id = id;
           }
  
  
  
  1.1.2.3   +2 -2      
jakarta-jetspeed/src/java/org/apache/jetspeed/om/security/Attic/BaseJetspeedPermission.java
  
  Index: BaseJetspeedPermission.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/om/security/Attic/BaseJetspeedPermission.java,v
  retrieving revision 1.1.2.2
  retrieving revision 1.1.2.3
  diff -u -r1.1.2.2 -r1.1.2.3
  --- BaseJetspeedPermission.java       18 Jun 2002 06:49:34 -0000      1.1.2.2
  +++ BaseJetspeedPermission.java       19 Jun 2002 05:14:12 -0000      1.1.2.3
  @@ -114,7 +114,7 @@
        */
       public void setId(String id)
       {      
  -        if (id == null)
  +        if (this.id == null)
           {
               this.id = id;
           }
  
  
  
  1.1.2.3   +2 -2      
jakarta-jetspeed/src/java/org/apache/jetspeed/om/security/Attic/BaseJetspeedRole.java
  
  Index: BaseJetspeedRole.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/om/security/Attic/BaseJetspeedRole.java,v
  retrieving revision 1.1.2.2
  retrieving revision 1.1.2.3
  diff -u -r1.1.2.2 -r1.1.2.3
  --- BaseJetspeedRole.java     17 Jun 2002 21:27:02 -0000      1.1.2.2
  +++ BaseJetspeedRole.java     19 Jun 2002 05:14:12 -0000      1.1.2.3
  @@ -115,7 +115,7 @@
        */
       public void setId(String id)
       {      
  -        if (id == null)
  +        if (this.id == null)
           {
               this.id = id;
           }
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.2   +3 -1      
jakarta-jetspeed/src/java/org/apache/jetspeed/services/security/Attic/TestGroupManagement.java
  
  Index: TestGroupManagement.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/services/security/Attic/TestGroupManagement.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- TestGroupManagement.java  18 Jun 2002 01:53:17 -0000      1.1.2.1
  +++ TestGroupManagement.java  19 Jun 2002 05:14:12 -0000      1.1.2.2
  @@ -210,6 +210,8 @@
               group = JetspeedGroupFactory.getInstance();
               group.setName("bogus");
               service.addGroup(group);
  +            System.out.println("new group id = " + group.getId());
  +            assertTrue(group.getId() != null);
           }
           catch(Exception e)
           {
  
  
  
  1.1.2.2   +32 -30    
jakarta-jetspeed/src/java/org/apache/jetspeed/services/security/Attic/TestPermissionManagement.java
  
  Index: TestPermissionManagement.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/services/security/Attic/TestPermissionManagement.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- TestPermissionManagement.java     18 Jun 2002 06:49:34 -0000      1.1.2.1
  +++ TestPermissionManagement.java     19 Jun 2002 05:14:12 -0000      1.1.2.2
  @@ -138,8 +138,8 @@
               {
                   permission = (Permission)permissions.next();
                   map.put(permission.getName(), permission);
  -                System.out.println("permission = " + permission.getName());
  -                System.out.println("id = " + permission.getId());
  +                //System.out.println("permission = " + permission.getName());
  +                //System.out.println("id = " + permission.getId());
               }
               assertTrue(map.get("view") != null);
               assertTrue(map.get("customize") != null);
  @@ -158,7 +158,7 @@
        * @throws Exception
        */
   
  -    public void xtestGetPermissionsForUser() throws Exception 
  +    public void testGetPermissionsForUser() throws Exception 
       {
           PermissionManagement service = getService();
           Permission permission = null;
  @@ -166,15 +166,15 @@
   
           try
           {
  -            Iterator permissions = service.getPermissions("turbine");
  +            Iterator permissions = service.getPermissions("user");
               while (permissions.hasNext())
               {
                   permission = (Permission)permissions.next();
                   map.put(permission.getName(), permission);
  -                System.out.println("permission = " + permission.getName());
               }
  -            assertTrue(map.get("user") != null);
  -            assertTrue(map.get("admin") == null);
  +            assertTrue(map.get("view") != null);
  +            assertTrue(map.get("customize") != null);
  +            assertTrue(map.get("close") == null);
   
               map.clear();
               permissions = service.getPermissions("admin");            
  @@ -182,10 +182,11 @@
               {
                   permission = (Permission)permissions.next();
                   map.put(permission.getName(), permission);
  -                System.out.println("permission = " + permission.getName());
               }
  -            assertTrue(map.get("user") != null);
  -            assertTrue(map.get("admin") != null);
  +            assertTrue(map.get("view") != null);
  +            assertTrue(map.get("customize") != null);
  +            assertTrue(map.get("close") != null);
  +
           }
           catch (Exception e)
           {
  @@ -201,7 +202,7 @@
        * @throws Exception
        */
   
  -    public void xtestAddPermission() throws Exception 
  +    public void testAddPermission() throws Exception 
       {
           PermissionManagement service = getService();
           Permission permission = null;
  @@ -211,6 +212,8 @@
               permission = JetspeedPermissionFactory.getInstance();
               permission.setName("bogus");
               service.addPermission(permission);
  +            System.out.println("new permission id = " + permission.getId());
  +            assertTrue(permission.getId() != null);
           }
           catch(Exception e)
           {
  @@ -237,7 +240,7 @@
        * @throws Exception
        */
   
  -    public void xtestRemovePermission() throws Exception 
  +    public void testRemovePermission() throws Exception 
       {
           PermissionManagement service = getService();
           Permission permission = null;
  @@ -269,16 +272,15 @@
        * @throws Exception
        */
   
  -    public void xtestGetPermission() throws Exception 
  +    public void testGetPermission() throws Exception 
       {
           PermissionManagement service = getService();
   
           try
           {
  -            Permission permission = service.getPermission("user");
  -            System.out.println("*** permission nm = " + permission.getName());
  +            Permission permission = service.getPermission("view");
               System.out.println("*** permission id = " + permission.getId());
  -            assertTrue(permission.getName().equals("user"));
  +            assertTrue(permission.getName().equals("view"));
           }
           catch (Exception e)
           {
  @@ -294,13 +296,13 @@
        * @throws Exception
        */
   
  -    public void xtestSavePermission() throws Exception 
  +    public void testSavePermission() throws Exception 
       {
           PermissionManagement service = getService();
   
           try
           {
  -            Permission permission = service.getPermission("user");
  +            Permission permission = service.getPermission("customize");
               service.savePermission(permission);
           }
           catch(Exception e)
  @@ -316,14 +318,14 @@
        * Tests grantPermission method 
        * @throws Exception
        */
  -    public void xtestGrantPermission() throws Exception 
  +    public void testGrantPermission() throws Exception 
       {
           PermissionManagement service = getService();
           Permission permission = null;
   
           try
           {
  -            service.grantPermission("turbine", "admin");
  +            service.grantPermission("user", "close");
           }
           catch(Exception e)
           {
  @@ -331,8 +333,8 @@
           }
           try
           {
  -            service.grantPermission("baduser", "admin");
  -            fail("Should've thrown a bad user exception on grant");
  +            service.grantPermission("badrole", "close");
  +            fail("Should've thrown a bad role exception on grant");
           }
           catch(Exception e)
           {
  @@ -340,7 +342,7 @@
           }
           try
           {
  -            service.grantPermission("turbine", "badpermission");
  +            service.grantPermission("user", "badpermission");
               fail("Should've thrown a bad permission exception on grant");
           }
           catch(Exception e)
  @@ -356,14 +358,14 @@
        * Tests revokePermission method 
        * @throws Exception
        */
  -    public void xtestRevokePermission() throws Exception 
  +    public void testRevokePermission() throws Exception 
       {
           PermissionManagement service = getService();
           Permission permission = null;
   
           try
           {
  -            service.revokePermission("turbine", "admin");
  +            service.revokePermission("user", "close");
           }
           catch(Exception e)
           {
  @@ -371,7 +373,7 @@
           }
           try
           {
  -            service.grantPermission("baduser", "admin");
  +            service.revokePermission("badrole", "close");
               fail("Should've thrown a bad user exception on revoke");
           }
           catch(Exception e)
  @@ -387,14 +389,14 @@
        * Tests hasPermission method 
        * @throws Exception
        */
  -    public void xtestHasPermission() throws Exception 
  +    public void testHasPermission() throws Exception 
       {
           PermissionManagement service = getService();
           Permission permission = null;
   
           try
           {
  -            boolean has = service.hasPermission("admin", "admin");
  +            boolean has = service.hasPermission("user", "view");
               assertTrue(true == has);
           }
           catch(Exception e)
  @@ -403,7 +405,7 @@
           }
           try
           {
  -            boolean has = service.hasPermission("turbine", "admin");
  +            boolean has = service.hasPermission("user", "close");
               assertTrue(false == has);
           }
           catch(Exception e)
  
  
  
  1.1.2.3   +4 -2      
jakarta-jetspeed/src/java/org/apache/jetspeed/services/security/Attic/TestRoleManagement.java
  
  Index: TestRoleManagement.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/services/security/Attic/TestRoleManagement.java,v
  retrieving revision 1.1.2.2
  retrieving revision 1.1.2.3
  diff -u -r1.1.2.2 -r1.1.2.3
  --- TestRoleManagement.java   18 Jun 2002 01:53:17 -0000      1.1.2.2
  +++ TestRoleManagement.java   19 Jun 2002 05:14:12 -0000      1.1.2.3
  @@ -209,6 +209,8 @@
               role = JetspeedRoleFactory.getInstance();
               role.setName("bogus");
               service.addRole(role);
  +            System.out.println("new role id = " + role.getId());
  +            assertTrue(role.getId() != null);
           }
           catch(Exception e)
           {
  @@ -369,7 +371,7 @@
           }
           try
           {
  -            service.grantRole("baduser", "admin");
  +            service.revokeRole("baduser", "admin");
               fail("Should've thrown a bad user exception on revoke");
           }
           catch(Exception e)
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.4   +4 -5      
jakarta-jetspeed/src/java/org/apache/jetspeed/services/security/turbine/Attic/TurbineGroupManagement.java
  
  Index: TurbineGroupManagement.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/services/security/turbine/Attic/TurbineGroupManagement.java,v
  retrieving revision 1.1.2.3
  retrieving revision 1.1.2.4
  diff -u -r1.1.2.3 -r1.1.2.4
  --- TurbineGroupManagement.java       18 Jun 2002 06:49:35 -0000      1.1.2.3
  +++ TurbineGroupManagement.java       19 Jun 2002 05:14:12 -0000      1.1.2.4
  @@ -235,10 +235,9 @@
           {
               TurbineGroup tgroup = new TurbineGroup();
               tgroup.setGroupName(group.getName());
  -
  -            TurbineGroupPeer.doInsert(tgroup);
  -            group.setId(tgroup.getId());
  -
  +            Criteria criteria = TurbineGroupPeer.buildCriteria(tgroup);
  +            NumberKey key = (NumberKey)TurbineGroupPeer.doInsert(criteria);
  +            group.setId(key.toString());
           }
           catch(Exception e)
           {
  
  
  
  1.1.2.2   +4 -5      
jakarta-jetspeed/src/java/org/apache/jetspeed/services/security/turbine/Attic/TurbinePermissionManagement.java
  
  Index: TurbinePermissionManagement.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/services/security/turbine/Attic/TurbinePermissionManagement.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- TurbinePermissionManagement.java  18 Jun 2002 06:49:35 -0000      1.1.2.1
  +++ TurbinePermissionManagement.java  19 Jun 2002 05:14:12 -0000      1.1.2.2
  @@ -220,10 +220,9 @@
           {
               TurbinePermission tpermission = new TurbinePermission();
               tpermission.setPermissionName(permission.getName());
  -
  -            TurbinePermissionPeer.doInsert(tpermission);
  -            permission.setId(tpermission.getId());
  -
  +            Criteria criteria = TurbinePermissionPeer.buildCriteria(tpermission);
  +            NumberKey key = (NumberKey)TurbinePermissionPeer.doInsert(criteria);
  +            permission.setId(key.toString());
           }
           catch(Exception e)
           {
  
  
  
  1.1.2.5   +4 -5      
jakarta-jetspeed/src/java/org/apache/jetspeed/services/security/turbine/Attic/TurbineRoleManagement.java
  
  Index: TurbineRoleManagement.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/services/security/turbine/Attic/TurbineRoleManagement.java,v
  retrieving revision 1.1.2.4
  retrieving revision 1.1.2.5
  diff -u -r1.1.2.4 -r1.1.2.5
  --- TurbineRoleManagement.java        18 Jun 2002 06:49:35 -0000      1.1.2.4
  +++ TurbineRoleManagement.java        19 Jun 2002 05:14:12 -0000      1.1.2.5
  @@ -228,10 +228,9 @@
           {
               TurbineRole trole = new TurbineRole();
               trole.setRoleName(role.getName());
  -
  -            TurbineRolePeer.doInsert(trole);
  -            role.setId(trole.getId());
  -
  +            Criteria criteria = TurbineRolePeer.buildCriteria(trole);
  +            NumberKey key = (NumberKey)TurbineRolePeer.doInsert(criteria);
  +            role.setId(key.toString());
           }
           catch(Exception e)
           {
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.16  +2 -2      
jakarta-jetspeed/webapp/WEB-INF/conf/Attic/JetspeedSecurity.properties
  
  Index: JetspeedSecurity.properties
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jetspeed/webapp/WEB-INF/conf/Attic/JetspeedSecurity.properties,v
  retrieving revision 1.1.2.15
  retrieving revision 1.1.2.16
  diff -u -r1.1.2.15 -r1.1.2.16
  --- JetspeedSecurity.properties       18 Jun 2002 06:49:35 -0000      1.1.2.15
  +++ JetspeedSecurity.properties       19 Jun 2002 05:14:12 -0000      1.1.2.16
  @@ -47,7 +47,7 @@
   #########################################
   
   
services.PermissionManagement.classname=org.apache.jetspeed.services.security.turbine.TurbinePermissionManagement
  
-services.JetspeedSecurity.group.class=org.apache.jetspeed.om.security.BaseJetspeedPermission
  
+services.JetspeedSecurity.permission.class=org.apache.jetspeed.om.security.BaseJetspeedPermission
   
   # -------------------------------------------------------------------
   #
  
  
  
  1.1.2.8   +2 -2      
jakarta-jetspeed/webapp/WEB-INF/conf/Attic/JetspeedSecurity.template
  
  Index: JetspeedSecurity.template
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jetspeed/webapp/WEB-INF/conf/Attic/JetspeedSecurity.template,v
  retrieving revision 1.1.2.7
  retrieving revision 1.1.2.8
  diff -u -r1.1.2.7 -r1.1.2.8
  --- JetspeedSecurity.template 18 Jun 2002 06:49:36 -0000      1.1.2.7
  +++ JetspeedSecurity.template 19 Jun 2002 05:14:12 -0000      1.1.2.8
  @@ -47,7 +47,7 @@
   #########################################
   
   
services.PermissionManagement.classname=org.apache.jetspeed.services.security.turbine.TurbinePermissionManagement
  
-services.JetspeedSecurity.group.class=org.apache.jetspeed.om.security.BaseJetspeedPermission
  
+services.JetspeedSecurity.permission.class=org.apache.jetspeed.om.security.BaseJetspeedPermission
   
   # -------------------------------------------------------------------
   #
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.11.2.9  +1 -1      jakarta-jetspeed/webapp/WEB-INF/db/jetspeed.properties
  
  Index: jetspeed.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-jetspeed/webapp/WEB-INF/db/jetspeed.properties,v
  retrieving revision 1.11.2.8
  retrieving revision 1.11.2.9
  diff -u -r1.11.2.8 -r1.11.2.9
  --- jetspeed.properties       18 Jun 2002 06:49:36 -0000      1.11.2.8
  +++ jetspeed.properties       19 Jun 2002 05:14:12 -0000      1.11.2.9
  @@ -1,4 +1,4 @@
   #Hypersonic SQL database
  -#Mon Jun 17 23:43:09 PDT 2002
  +#Tue Jun 18 22:13:22 PDT 2002
   version=1.4
   modified=yes
  
  
  
  1.13.2.9  +21 -4     jakarta-jetspeed/webapp/WEB-INF/db/jetspeed.script
  
  Index: jetspeed.script
  ===================================================================
  RCS file: /home/cvs/jakarta-jetspeed/webapp/WEB-INF/db/jetspeed.script,v
  retrieving revision 1.13.2.8
  retrieving revision 1.13.2.9
  diff -u -r1.13.2.8 -r1.13.2.9
  --- jetspeed.script   18 Jun 2002 06:49:36 -0000      1.13.2.8
  +++ jetspeed.script   19 Jun 2002 05:14:12 -0000      1.13.2.9
  @@ -120,10 +120,12 @@
   INSERT INTO TURBINE_USER_GROUP_ROLE VALUES(1,1,2)
   INSERT INTO TURBINE_USER_GROUP_ROLE VALUES(330,1,1)
   INSERT INTO TURBINE_USER_GROUP_ROLE VALUES(340,1,1)
  -INSERT INTO ID_TABLE VALUES(1,'TURBINE_PERMISSION',100,10)
  -INSERT INTO ID_TABLE VALUES(2,'TURBINE_ROLE',280,10)
  -INSERT INTO ID_TABLE VALUES(3,'TURBINE_GROUP',210,10)
  -INSERT INTO ID_TABLE VALUES(4,'TURBINE_USER',350,10)
  +INSERT INTO TURBINE_USER_GROUP_ROLE VALUES(350,1,1)
  +INSERT INTO TURBINE_USER_GROUP_ROLE VALUES(360,1,1)
  +INSERT INTO ID_TABLE VALUES(1,'TURBINE_PERMISSION',230,10)
  +INSERT INTO ID_TABLE VALUES(2,'TURBINE_ROLE',320,10)
  +INSERT INTO ID_TABLE VALUES(3,'TURBINE_GROUP',250,10)
  +INSERT INTO ID_TABLE VALUES(4,'TURBINE_USER',370,10)
   INSERT INTO ID_TABLE VALUES(5,'TURBINE_SCHEDULED_JOB',100,10)
   INSERT INTO ID_TABLE VALUES(6,'TURBINE_ROLE_PERMISSION',100,10)
   INSERT INTO ID_TABLE VALUES(7,'TURBINE_USER_GROUP_ROLE',100,10)
  @@ -143,3 +145,18 @@
   INSERT INTO COFFEES VALUES('JoeGrade',3,7.99,1,2)
   INSERT INTO COFFEES VALUES('CantThinkOfAnymoreGrade',4,7.99,1,2)
   /*C1*/CONNECT USER sa PASSWORD ""
  +/*C2*/CONNECT USER sa PASSWORD ""
  +SET AUTOCOMMIT FALSE
  +/*C3*/CONNECT USER sa PASSWORD ""
  +/*C2*/DELETE FROM ID_TABLE WHERE ID_TABLE_ID=1
  +INSERT INTO ID_TABLE VALUES(1,'TURBINE_PERMISSION',230,10)
  +DELETE FROM ID_TABLE WHERE ID_TABLE_ID=1
  +INSERT INTO ID_TABLE VALUES(1,'TURBINE_PERMISSION',240,10)
  +COMMIT
  +SET AUTOCOMMIT TRUE
  +/*C1*/INSERT INTO TURBINE_PERMISSION VALUES(230,'bogus',NULL)
  +DELETE FROM TURBINE_PERMISSION WHERE PERMISSION_ID=230
  +DELETE FROM TURBINE_PERMISSION WHERE PERMISSION_ID=2
  +INSERT INTO TURBINE_PERMISSION VALUES(2,'customize',NULL)
  +INSERT INTO TURBINE_ROLE_PERMISSION VALUES(1,7)
  +DELETE FROM TURBINE_ROLE_PERMISSION WHERE ROLE_ID=1 AND PERMISSION_ID=7
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to