1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package waffle.windows.auth.impl;
25
26 import com.sun.jna.platform.win32.Secur32;
27 import com.sun.jna.platform.win32.Sspi;
28 import com.sun.jna.platform.win32.Sspi.CredHandle;
29 import com.sun.jna.platform.win32.Sspi.TimeStamp;
30 import com.sun.jna.platform.win32.Win32Exception;
31 import com.sun.jna.platform.win32.WinError;
32
33 import waffle.windows.auth.IWindowsCredentialsHandle;
34
35
36
37
38
39 public class WindowsCredentialsHandleImpl implements IWindowsCredentialsHandle {
40
41
42 private final String principalName;
43
44
45 private final int credentialsType;
46
47
48 private final String securityPackage;
49
50
51 private CredHandle handle;
52
53
54
55
56
57
58
59
60
61
62
63 public WindowsCredentialsHandleImpl(final String newPrincipalName, final int newCredentialsType,
64 final String newSecurityPackage) {
65 this.principalName = newPrincipalName;
66 this.credentialsType = newCredentialsType;
67 this.securityPackage = newSecurityPackage;
68 }
69
70
71
72
73
74
75
76
77
78 public static IWindowsCredentialsHandle getCurrent(final String securityPackage) {
79 final IWindowsCredentialsHandle handle = new WindowsCredentialsHandleImpl(null, Sspi.SECPKG_CRED_OUTBOUND,
80 securityPackage);
81 handle.initialize();
82 return handle;
83 }
84
85
86
87
88 @Override
89 public void initialize() {
90 this.handle = new CredHandle();
91 final TimeStamp clientLifetime = new TimeStamp();
92 final int rc = Secur32.INSTANCE.AcquireCredentialsHandle(this.principalName, this.securityPackage,
93 this.credentialsType, null, null, null, null, this.handle, clientLifetime);
94 if (WinError.SEC_E_OK != rc) {
95 throw new Win32Exception(rc);
96 }
97 }
98
99
100
101
102 @Override
103 public void dispose() {
104 if (this.handle != null && !this.handle.isNull()) {
105 final int rc = Secur32.INSTANCE.FreeCredentialsHandle(this.handle);
106 if (WinError.SEC_E_OK != rc) {
107 throw new Win32Exception(rc);
108 }
109 }
110 }
111
112
113
114
115
116
117 @Override
118 public CredHandle getHandle() {
119 return this.handle;
120 }
121 }