import cyrus-sasl-2.1.23
[cyrus-sasl.git] / java / CyrusSasl / ServerFactory.java
1 package CyrusSasl;
2
3 import java.util.Hashtable;
4 import javax.security.auth.callback.*;
5
6 class ServerFactory implements SaslServerFactory
7 {
8     private int localptr = 0;
9
10     /* JNI functions  */
11     private native int jni_sasl_server_init(String appname);
12     private native int jni_sasl_server_new(String service,
13                                            String local_domain,
14                                            int secflags);
15
16
17     public ServerFactory()
18     {
19         /* these parameters aren't needed for getting mech list */
20         localptr = jni_sasl_server_new("foo", "bar", 0);
21     }
22
23     private boolean init(String appname)
24     {
25         /* load library */
26         try {
27             System.loadLibrary("javasasl");
28         } catch (UnsatisfiedLinkError e) {
29             /* xxx */
30             System.out.println("Unable to load javasasl library");
31         }
32
33         jni_sasl_server_init(appname);
34
35         return true;
36     }
37
38     {
39         init("javasasl application");
40     }
41
42     public SaslServer createSaslServer(String mechanism,
43                                        String protocol,
44                                        String serverName,
45                                        Hashtable props,
46                                        javax.security.auth.callback.CallbackHandler cbh)
47         throws SaslException
48     {
49         int cptr;
50
51         cptr = jni_sasl_server_new(protocol,
52                                    serverName,
53                                    0);
54
55         if (cptr == 0) {
56             throw new SaslException("Unable to create new Client connection object", 
57                                     new Throwable());
58         }
59
60         return new GenericServer(cptr,mechanism,props,cbh);
61     }
62
63     private native String jni_sasl_server_getlist(int ptr, String prefix,
64                                                   String sep, String suffix);
65
66     public String[] getMechanismNames()
67     {
68         if (localptr == 0)
69             localptr = jni_sasl_server_new("foo", 
70                                            "bar",
71                                            0);
72
73         String list = jni_sasl_server_getlist(localptr, "",
74                                               "\n","\n");
75
76         /* count newlines */
77         int newlines = 0;
78         int pos =0;
79
80         while (pos < list.length()) {
81             if (list.charAt(pos)=='\n') 
82                 newlines++;
83             pos++;
84         }
85
86         String[]ret = new String[newlines];
87
88         int num =0;
89         pos =0;
90         String temp="";
91
92         while (pos < list.length()) {       
93             if (list.charAt(pos)=='\n') {
94                 ret[num++]=temp;
95                 temp=new String("");
96             } else {
97                 temp+=list.charAt(pos);
98             }
99             pos++;
100         }
101         
102         return ret;
103     }
104
105 }