source: branches/2.2.0.1/security/ExpressoCert/src/br/gov/serpro/cert/TokenCollection.java @ 4198

Revision 4198, 4.5 KB checked in by rafaelraymundo, 13 years ago (diff)

Ticket #1813 - Problema com mais de um driver de token configurado.

Line 
1/*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
5
6package br.gov.serpro.cert;
7
8import br.gov.serpro.setup.Setup;
9import java.io.IOException;
10import java.util.HashMap;
11import java.util.logging.Level;
12import java.util.logging.Logger;
13import sun.security.pkcs11.wrapper.CK_C_INITIALIZE_ARGS;
14import sun.security.pkcs11.wrapper.CK_TOKEN_INFO;
15import sun.security.pkcs11.wrapper.PKCS11;
16import sun.security.pkcs11.wrapper.PKCS11Exception;
17import static sun.security.pkcs11.wrapper.PKCS11Constants.*;
18
19/**
20 *
21 * @author esa
22 */
23class TokenCollection extends HashMap<String, Token>{
24   
25    private String preferedTokenKey;
26    private final Setup setup;
27
28    public TokenCollection(Setup setup){
29       
30        this.setup = setup;
31        this.addTokens(setup.getParameter("token"));
32
33    }
34
35    public void setPreferedToken(java.lang.String preferedTokenKey){
36       
37    }
38
39    public String getPreferedToken(){
40        return preferedTokenKey;
41    }
42
43    private void addTokens(String tokens){
44       
45        String[] tokensArray = tokens.split(",");
46        for (int i = 0; i < tokensArray.length; i++){
47            if (tokensArray[i] != null && tokensArray[i].length() > 0){
48                String[] tokenArray = tokensArray[i].split(";");
49                Token token = new Token(tokenArray[0], tokenArray[1], this.setup);
50
51                // Aqui testar se existe token inserido em algum slot para determinado driver.
52                // Pega sempre o primeiro slot registrado com a lib tokenArray[1]
53                // TODO: Deixar o usuário escolher o token que vai usar;
54                if (setup.getParameter("debug").equalsIgnoreCase("true")) {
55                    System.out.println("Getting slots from " + tokenArray[1]);
56                }
57                try {
58                    long[] slots = getSlotsWithTokens(tokenArray[1]);
59                    if (slots.length > 0){
60                        token.registerToken(slots[0]);
61                        if (token.isRegistered()){
62                            this.put(token.getName(), token);
63                        }
64                    }
65                } catch (IOException iex){
66                    continue;
67                }
68            }
69        }
70    }
71
72    public long[] getSlotsWithTokens(String libraryPath) throws IOException{
73        CK_C_INITIALIZE_ARGS initArgs = new CK_C_INITIALIZE_ARGS();
74        String functionList = "C_GetFunctionList";
75
76        initArgs.flags = CKF_OS_LOCKING_OK;
77        PKCS11 tmpPKCS11 = null;
78        long[] slotList = null;
79        try {
80            try {
81                tmpPKCS11 = PKCS11.getInstance(libraryPath, functionList, initArgs, false);
82            } catch (IOException ex) {
83                if (setup.getParameter("debug").equalsIgnoreCase("true")) {
84                    Logger.getLogger(TokenCollection.class.getName()).log(Level.SEVERE, null, ex);
85                }
86                throw ex;
87            }
88        } catch (PKCS11Exception e) {
89            try {
90                initArgs = null;
91                tmpPKCS11 = PKCS11.getInstance(libraryPath, functionList, initArgs, true);
92            } catch (IOException ex) {
93                if (setup.getParameter("debug").equalsIgnoreCase("true")) {
94                    Logger.getLogger(TokenCollection.class.getName()).log(Level.SEVERE, null, ex);
95                }
96            } catch (PKCS11Exception ex) {
97                if (setup.getParameter("debug").equalsIgnoreCase("true")) {
98                    Logger.getLogger(TokenCollection.class.getName()).log(Level.SEVERE, null, ex);
99                }
100            }
101        }
102
103        try {
104            slotList = tmpPKCS11.C_GetSlotList(true);
105
106            for (long slot : slotList){
107                CK_TOKEN_INFO tokenInfo = tmpPKCS11.C_GetTokenInfo(slot);
108                if (setup.getParameter("debug").equalsIgnoreCase("true")) {
109                    System.out.println("slot: "+slot+"\nmanufacturerID: "
110                            + String.valueOf(tokenInfo.manufacturerID) + "\nmodel: "
111                            + String.valueOf(tokenInfo.model));
112                }
113            }
114        } catch (PKCS11Exception ex) {
115            if (setup.getParameter("debug").equalsIgnoreCase("true")) {
116                Logger.getLogger(TokenCollection.class.getName()).log(Level.SEVERE, null, ex);
117            }
118        } catch (Throwable t) {
119            if (setup.getParameter("debug").equalsIgnoreCase("true")) {
120                Logger.getLogger(TokenCollection.class.getName()).log(Level.SEVERE, null, t);
121            }
122        }
123
124        return slotList;
125
126    }
127}
Note: See TracBrowser for help on using the repository browser.