001 /*
002 * Cumulus4j - Securing your data in the cloud - http://cumulus4j.org
003 * Copyright (C) 2011 NightLabs Consulting GmbH
004 *
005 * This program is free software: you can redistribute it and/or modify
006 * it under the terms of the GNU Affero General Public License as
007 * published by the Free Software Foundation, either version 3 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013 * GNU Affero General Public License for more details.
014 *
015 * You should have received a copy of the GNU Affero General Public License
016 * along with this program. If not, see <http://www.gnu.org/licenses/>.
017 */
018 package org.cumulus4j.keymanager.cli;
019
020 import java.util.LinkedList;
021 import java.util.List;
022 import java.util.Set;
023 import java.util.SortedSet;
024
025 import org.cumulus4j.keystore.prop.Property;
026
027 /**
028 * <p>
029 * {@link SubCommand} implementation for showing various infos about a key-store.
030 * </p>
031 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de
032 */
033 public class InfoSubCommand extends SubCommandWithKeyStoreWithAuth
034 {
035 @Override
036 public String getSubCommandName() {
037 return "info";
038 }
039
040 @Override
041 public String getSubCommandDescription() {
042 return "Display infos about the key-store.";
043 }
044
045 @Override
046 public void run() throws Exception
047 {
048 System.out.println("Key store: " + getKeyStoreFile().getCanonicalPath());
049 System.out.println();
050
051 if (getKeyStore().isEmpty()) {
052 System.out.println("This key store is empty!");
053 System.out.println();
054 return;
055 }
056
057 System.out.println("Size of master key: " + getKeyStore().getMasterKeySize(getAuthUserName(), getAuthPasswordAsCharArray()) + " bit");
058 System.out.println();
059
060 Set<String> users = getKeyStore().getUsers(getAuthUserName(), getAuthPasswordAsCharArray());
061 System.out.println("Users: ");
062 if (users.isEmpty())
063 System.out.println(" --- EMPTY ---");
064
065 for (String user : users) {
066 System.out.println(" " + user);
067 }
068 System.out.println();
069
070 SortedSet<Long> keyIDs = getKeyStore().getKeyIDs(getAuthUserName(), getAuthPasswordAsCharArray());
071 List<Long[]> keyIDIntervals = new LinkedList<Long[]>();
072 {
073 Long[] keyIDInterval = null;
074 for (Long keyID : keyIDs) {
075 if (keyIDInterval != null && keyID == keyIDInterval[1] + 1)
076 keyIDInterval[1] = keyID;
077 else {
078 keyIDInterval = new Long[2];
079 keyIDIntervals.add(keyIDInterval);
080 keyIDInterval[0] = keyID;
081 keyIDInterval[1] = keyID;
082 }
083 }
084 }
085
086 System.out.println("Key IDs:");
087 if (keyIDIntervals.isEmpty())
088 System.out.println(" --- EMPTY ---");
089
090 for (Long[] keyIDInterval : keyIDIntervals) {
091 System.out.println(" " + keyIDInterval[0] + "..." + keyIDInterval[1]);
092 }
093 System.out.println();
094
095 System.out.println("Properties:");
096 SortedSet<Property<?>> properties = getKeyStore().getProperties(getAuthUserName(), getAuthPasswordAsCharArray());
097 if (properties.isEmpty())
098 System.out.println(" --- EMPTY ---");
099
100 // We do not output the details here! 'info' should give an overview only. Details can be obtained via other sub-commands.
101 // for (Property<?> property : properties) {
102 // System.out.println(" " + property.getName() + " (" + property.getClass().getName() + ") = " + property.getValue());
103 // }
104 for (Property<?> property : properties) {
105 System.out.println(" " + property.getName() + " (" + property.getClass().getName() + ", " + property.getValueEncoded().length + " Byte)");
106 }
107
108 System.out.println();
109 }
110
111 }