/*
* JBoss, Home of Professional Open Source.
* Copyright 2015, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.cli.handlers;
import java.io.IOException;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.Map;
import org.jboss.as.cli.CommandContext;
import org.jboss.as.cli.CommandFormatException;
import org.jboss.as.cli.CommandLineException;
import org.jboss.as.cli.ConnectionInfo;
import org.jboss.as.cli.Util;
import org.jboss.as.cli.util.FingerprintGenerator;
import org.jboss.as.cli.util.SimpleTable;
import org.jboss.as.controller.client.ModelControllerClient;
import org.jboss.dmr.ModelNode;
/**
*
* @author Claudio Miranda
*/
public class ConnectionInfoHandler extends CommandHandlerWithHelp {
public ConnectionInfoHandler() {
this("connection-info");
}
public ConnectionInfoHandler(String command) {
super(command);
}
/* (non-Javadoc)
* @see org.jboss.as.cli.CommandHandler#doHandle(org.jboss.as.cli.CommandContext)
*/
@Override
protected void doHandle(CommandContext ctx) throws CommandLineException {
final ModelControllerClient client = ctx.getModelControllerClient();
if(client == null) {
ctx.printLine("<connect to the controller and re-run the connection-info command to see the connection information>\n");
} else {
ConnectionInfo connInfo = ctx.getConnectionInfo();
String username = null;
final ModelNode req = new ModelNode();
req.get(Util.OPERATION).set("whoami");
req.get(Util.ADDRESS).setEmptyList();
req.get("verbose").set(true);
try {
final ModelNode response = client.execute(req);
if(Util.isSuccess(response)) {
if (response.hasDefined(Util.RESULT)) {
final ModelNode result = response.get(Util.RESULT);
if(result.hasDefined("identity")) {
username = result.get("identity").get("username").asString();
}
if (result.hasDefined("mapped-roles")) {
String strRoles = result.get("mapped-roles").asString();
String grantedStr = "granted role";
// a comma is contained in the string if there is more than one role
if (strRoles.indexOf(',') > 0)
grantedStr = "granted roles";
username = username + ", "+ grantedStr + " " + strRoles;
} else {
username = username + " has no role associated.";
}
} else {
username = "result was not available.";
}
} else {
ctx.printLine(Util.getFailureDescription(response));
}
} catch (IOException e) {
throw new CommandFormatException("Failed to get the AS release info: " + e.getLocalizedMessage());
}
SimpleTable st = new SimpleTable(2);
st.addLine(new String[]{"Username", username});
st.addLine(new String[]{"Logged since", connInfo.getLoggedSince().toString()});
X509Certificate[] lastChain = connInfo.getServerCertificates();
boolean sslConn = lastChain != null;
if (sslConn) {
try {
for (Certificate current : lastChain) {
if (current instanceof X509Certificate) {
X509Certificate x509Current = (X509Certificate) current;
Map<String, String> fingerprints = FingerprintGenerator.generateFingerprints(x509Current);
st.addLine(new String[] {"Subject", x509Current.getSubjectX500Principal().getName()});
st.addLine(new String[] {"Issuer", x509Current.getIssuerDN().getName()});
st.addLine(new String[] {"Valid from", x509Current.getNotBefore().toString()});
st.addLine(new String[] {"Valid to", x509Current.getNotAfter().toString()});
for (String alg : fingerprints.keySet()) {
st.addLine(new String[] {alg, fingerprints.get(alg)});
}
}
}
} catch (CommandLineException cle) {
throw new CommandFormatException("Error trying to generate server certificate fingerprint.", cle);
}
} else {
st.addLine(new String[] {"Not an SSL connection.", ""});
}
ctx.printLine(st.toString());
}
}
}