1 /*
2  * @(#) $Id: ListPCommand.java,v 1.3 2003/07/08 08:13:53 pankaj Exp $
3  *
4  * Copyright (c) 2002-03 by Pankaj Kumar (http://www.pankaj-k.net). 
5  * All rights reserved.
6  *
7  * The license governing the use of this file can be found in the 
8  * root directory of the containing software.
9  */
10package org.jstk.crypt;
11
12import java.util.*;
13import java.security.Security;
14import java.security.Provider;
15
16import org.jstk.*;
17
18public class ListPCommand extends JSTKCommandAdapter{
19    public String briefDescription(){
20        return "lists cryptographic providers and services offered";
21    }
22    public String optionsDescription(){
23        return
24            "  -provider <provider>: limit to this provider name.\n" +
25            "  -info               : print provider info.\n" +
26            "  -props              : print provider properties.\n" +
27            "  -csinfo             : print cryptographic services.\n";
28    }
29
30    public String[] useForms(){
31        String[] useForms = { "[-provider <provider>] [-info] [-props] [-csinfo]" };
32        return useForms;
33    }
34    public String[] sampleUses(){
35        String[] uses = {
36            "",
37            "-info",
38            "-csinfo",
39            "-props",
40            "-info -props -csinfo",
41            "-provider SunJCE -props",
42            "-provider SunJCE -csinfo"
43        };
44        return uses;
45    }
46
47    private String formText(String left, String right, int maxLeftLen){
48        StringBuffer sb = new StringBuffer();
49        sb.append(left);
50        int blanksNeeded = maxLeftLen - left.length();
51        while (blanksNeeded-- > 0)
52            sb.append(" ");
53        if (left.length() > 0)
54            sb.append(" : " + right);
55        else
56            sb.append("   " + right);
57        return sb.toString();
58    }
59
60    private void appendProvider(SecurityInfo.ProviderInfo provider,
61        boolean info, boolean props, boolean csinfo){
62
63        if (info)   // Append provider info.
64            result.appendText("Provider Info:: \n" + provider.info + "\n");
65
66        if (props){ // Append properties
67            result.appendText("Provider Properties::\n");
68            /* Make the output less verbose.
69            result.appendText(formText("property name", "property value", 32) + "\n");
70            result.appendText("---------------------------------------------------------------\n");
71            */
72            Enumeration propNames = provider.props.propertyNames();
73            int idx = 0;
74            while (propNames.hasMoreElements()){
75                String key = (String)propNames.nextElement();
76                String value = provider.props.getProperty(key);
77                String left = "[" + idx + "] " + key;
78                result.appendText(formText(left, value, 32) + "\n");
79                ++idx;
80            }
81            result.appendText("---------------------------------------------------------------\n");
82        }
83
84        if (csinfo){    // Append service and algo/type info.
85            result.appendText("Cryptographic Services::\n");
86            /* Make the output less verbose.
87            result.appendText(formText("cryptographic service", "<algorith>|<type>", 20) + "\n");
88            result.appendText("---------------------------------------------------------------\n");
89            */
90
91            Iterator itr = provider.svcmap.entrySet().iterator();
92            int idx = 0;
93            while (itr.hasNext()){
94                Map.Entry ent = (Map.Entry)itr.next();
95                String key = (String)ent.getKey();
96                Vector algs = (Vector)ent.getValue();
97
98                for (int i = 0; i < algs.size(); i++){
99                    SecurityInfo.AlgInfo ai = (SecurityInfo.AlgInfo)algs.elementAt(i);
00                    String left = "";
01                    if (i == 0)
02                        left = "[" + idx + "] " + key;
03                    result.appendText(formText(left, ai.toString(), 20) + "\n");
04                    if (ai.props != null){
05                        Enumeration propNames = ai.props.propertyNames();
06                        while (propNames.hasMoreElements()){
07                            String key1 = (String)propNames.nextElement();
08                            String value1 = ai.props.getProperty(key1);
09                            result.appendText(formText("", key1 + " = " + value1, 24) + "\n");
10                        }
11                    }
12                }
13                ++idx;
14            }
15            result.appendText("---------------------------------------------------------------\n");
16        }
17    }
18
19    public Object execute(JSTKArgs args) throws JSTKException{
20        String providerName = (String)args.get("provider");
21        boolean info = Boolean.valueOf((String)args.get("info")).booleanValue();
22        boolean props = Boolean.valueOf((String)args.get("props")).booleanValue();
23        boolean csinfo = Boolean.valueOf((String)args.get("csinfo")).booleanValue();
24
25        try {
26            SecurityInfo si = new SecurityInfo();
27            result = new JSTKResult(si, true, "");
28            for (int i = 0; i < si.providers.length; i++){
29                if ((providerName == null)||(si.providers[i].name.matches(providerName))){
30                    result.appendText("Provider[" + i + "]:: " +
31                        si.providers[i].name + " " + si.providers[i].version + "\n");
32                    appendProvider(si.providers[i], info, props, csinfo);
33                }
34            }
35            return result;
36        } catch (Exception exc){
37            throw new JSTKException("ListPCommand execution failed", exc);
38        }
39    }
40
41    public static void main(String[] args) throws Exception {
42        JSTKOptions opts = new JSTKOptions();
43        opts.parse(args, 0);
44        ListPCommand listPCmd = new ListPCommand();
45        JSTKResult result = (JSTKResult)listPCmd.execute(opts);
46        System.out.println(result.getText());
47    }
48}