1 /*
2  * Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 import java.security.Principal;
25 
26 import javax.management.Attribute;
27 import javax.management.MBeanServer;
28 import javax.management.ObjectName;
29 import javax.management.remote.JMXAuthenticator;
30 import javax.management.remote.JMXPrincipal;
31 import javax.security.auth.Subject;
32 
33 public final class TestJMXAuthenticator implements JMXAuthenticator {
34 
35     private String protocol = "";
36     private MBeanServer mbs = null;
37 
TestJMXAuthenticator()38     public TestJMXAuthenticator() {
39     }
40 
TestJMXAuthenticator(String protocol)41     public TestJMXAuthenticator(String protocol) {
42         this.protocol = protocol;
43     }
44 
TestJMXAuthenticator(String protocol, MBeanServer mbs)45     public TestJMXAuthenticator(String protocol, MBeanServer mbs) {
46         this.protocol = protocol;
47         this.mbs = mbs;
48     }
49 
authenticate(Object credentials)50     public Subject authenticate(Object credentials) {
51 
52         String credentials_username = "";
53         String credentials_password = "";
54         Principal aPrincipal = null;
55 
56         credentials_username = ((String[]) credentials)[0];
57         credentials_password = ((String[]) credentials)[1];
58 
59         String authenticated_username = System.getProperty("susername");
60         String authenticated_password = System.getProperty("spassword");
61         String principal = System.getProperty("principal");
62 
63         System.out.println("TestJMXAuthenticator::authenticate: Start");
64         System.out.println("TestJMXAuthenticator::authenticate: credentials username = " +
65                 credentials_username);
66         System.out.println("TestJMXAuthenticator::authenticate: credentials password = " +
67                 credentials_password);
68         System.out.println("TestJMXAuthenticator::authenticate: authenticated username = " +
69                 authenticated_username);
70         System.out.println("TestJMXAuthenticator::authenticate: authenticated password = " +
71                 authenticated_password);
72         System.out.println("TestJMXAuthenticator::authenticate: principal used for " +
73                 "authorization = " + principal);
74 
75         if (credentials_username.equals(authenticated_username) &&
76                 credentials_password.equals(authenticated_password)) {
77             System.out.println("TestJMXAuthenticator::authenticate: " +
78                     "Authenticator should succeed");
79         } else {
80             System.out.println("TestJMXAuthenticator::authenticate: " +
81                     "Authenticator should reject");
82             throw new SecurityException("TestJMXAuthenticator throws EXCEPTION");
83         }
84 
85         // At this point, authentication has succeeded
86         // (no SecurityException thrown).
87         //
88         // If no authorization is required, the returned subject (empty or not)
89         // is useless.
90         // Otherwise, the returned subject must define a principal
91         // and authorization will be performed against this principal.
92         //
93         // Note that this custom JMXAuthenticator is used for test purpose and
94         // the username used to perform authentication may be different from the
95         // username used to perform authorization.
96         //
97         Subject subject = new Subject();
98 
99         if (principal != null) {
100             System.out.println("TestJMXAuthenticator::authenticate: " +
101                     "Add " + principal + " principal to the returned subject");
102             subject.getPrincipals().add(new JMXPrincipal(principal));
103         }
104 
105         return subject;
106     }
107 }
108