Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.downloader / org.gvsig.downloader.swing / org.gvsig.downloader.swing.scribejava / src / main / java / org / gvsig / downloader / swing / scribejava / keycloak / DownloaderAuthenticationKeycloakConfig.java @ 47845

History | View | Annotate | Download (10.2 KB)

1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package org.gvsig.downloader.swing.scribejava.keycloak;
7

    
8
import java.awt.event.ActionEvent;
9
import javax.json.JsonObject;
10
import org.apache.commons.lang3.StringUtils;
11
import org.gvsig.downloader.DownloaderAuthenticationConfig;
12
import org.gvsig.downloader.DownloaderCredentials;
13
import org.gvsig.downloader.DownloaderManager;
14
import org.gvsig.downloader.spi.AbstractDownloaderAuthenticationConfig;
15
import static org.gvsig.downloader.swing.scribejava.keycloak.DownloaderAuthenticationKeycloakFactory.AUTH_MODE_KEYCLOAK;
16
import org.gvsig.json.Json;
17
import org.gvsig.json.JsonObjectBuilder;
18
import org.gvsig.tools.ToolsLocator;
19
import org.gvsig.tools.dynobject.DynStruct;
20
import org.gvsig.tools.persistence.PersistenceManager;
21
import org.gvsig.tools.persistence.Persistent;
22
import org.gvsig.tools.persistence.PersistentState;
23
import org.gvsig.tools.persistence.exception.PersistenceException;
24
import org.gvsig.tools.swing.api.ToolsSwingLocator;
25
import org.gvsig.tools.swing.api.windowmanager.Dialog;
26
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
27
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
28
import org.gvsig.tools.util.LabeledValue;
29

    
30
/**
31
 *
32
 * @author jjdelcerro
33
 */
34
public class DownloaderAuthenticationKeycloakConfig 
35
        extends AbstractDownloaderAuthenticationConfig
36
        implements DownloaderAuthenticationConfig, LabeledValue<DownloaderAuthenticationConfig>
37
    {
38
    
39
    private static final String DEFAULT_CLIENTID = "gvsigdesktop";
40
    private static final String DEFAULT_SCOPE = "openid";
41
    private static final int DEFAULT_LOCALPORT = 8888;
42

    
43
    private static final String PERSISTENT_DEFINITION_NAME = "UserIdentificationKeycloakConfig";
44
    
45
    private String clientid;
46
    private String realm;
47
    private String keycloakBaseurl;
48
    private int localPort;
49
    private String scope;
50

    
51
    public DownloaderAuthenticationKeycloakConfig(DownloaderAuthenticationKeycloakFactory factory, String serviceUrl) {
52
        super(AUTH_MODE_KEYCLOAK, factory,serviceUrl);
53
        this.clientid = DEFAULT_CLIENTID;
54
        this.scope = DEFAULT_SCOPE;
55
        this.localPort = DEFAULT_LOCALPORT;
56
        this.realm = null;
57
        this.keycloakBaseurl = null;
58
    }
59
    
60
    public DownloaderAuthenticationKeycloakConfig() {
61
        this((DownloaderAuthenticationKeycloakFactory)null, null);
62
    }
63
    
64
    @Override
65
    public DownloaderAuthenticationKeycloakFactory getFactory() {
66
        return (DownloaderAuthenticationKeycloakFactory) super.getFactory();
67
    }
68
    
69
    @Override
70
    public String getKey() {
71
        StringBuilder builder = new StringBuilder();
72
        builder.append("ServiceUrl=").append(this.getServiceUrl()).append(";");
73
        builder.append("localport=").append(this.localPort).append(";");
74
        builder.append("clientid=").append(this.clientid).append(";");
75
        builder.append("scope=").append(this.scope).append(";");
76
        builder.append("realm=").append(this.realm).append(";");
77
        builder.append("baseurl=").append(this.keycloakBaseurl).append(";");
78
        return builder.toString();        
79
    }
80

    
81
    public int getLocalPort() {
82
        return localPort;
83
    }
84

    
85
    public String getKeycloakBaseurl() {
86
        return keycloakBaseurl;
87
    }
88

    
89
    public String getRealm() {
90
        return realm;
91
    }
92

    
93
    public String getClientid() {
94
        return clientid;
95
    }
96

    
97
    public String getScope() {
98
        return scope;
99
    }
100

    
101
    public void setKeycloakBaseurl(String keycloakBaseurl) {
102
        this.keycloakBaseurl = keycloakBaseurl;
103
    }
104

    
105
    public void setLocalPort(int localPort) {
106
        this.localPort = localPort;
107
    }
108

    
109
    public void setRealm(String realm) {
110
        this.realm = realm;
111
    }
112

    
113
    public void setClientid(String clientid) {
114
        this.clientid = clientid;
115
    }
116

    
117
    public void setScope(String scope) {
118
        this.scope = scope;
119
    }
120

    
121
    @Override
122
    public DownloaderAuthenticationKeycloakRequester create() {
123
        if( StringUtils.isBlank(clientid) ) {
124
            return null;
125
        }
126
        if( StringUtils.isBlank(realm) ) {
127
            return null;
128
        }
129
        if( StringUtils.isBlank(keycloakBaseurl) ) {
130
            return null;
131
        }
132
        if( localPort<1024  ) {
133
            return null;
134
        }
135
        return new DownloaderAuthenticationKeycloakRequester(this);
136
    }
137

    
138
    @Override
139
    public boolean isConfigurable() {
140
        return true;
141
    }
142

    
143
    @Override
144
    public boolean isFilled() {
145
        return StringUtils.isNotBlank(this.clientid) &&
146
        StringUtils.isNotBlank(this.scope) &&
147
        this.localPort >= 1024 &&
148
        StringUtils.isNotBlank(this.realm) &&
149
        StringUtils.isNotBlank(this.keycloakBaseurl);
150
    }
151

    
152
    @Override
153
    public boolean requestAuthenticationConfig() {    
154
        WindowManager_v2 winmgr = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
155
        DownloaderAuthenticationKeycloakConfigPanel panel = new DownloaderAuthenticationKeycloakConfigPanel();
156
        panel.put(this);
157
        Dialog dialog = winmgr.createDialog(
158
                panel,
159
                "Configuracion de Keycloak",
160
                null, 
161
                WindowManager_v2.BUTTONS_OK_CANCEL
162
        );
163
        dialog.addActionListener((ActionEvent e) -> {
164
            if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
165
                panel.fetch(this);
166
            }
167
        });
168
        dialog.show(WindowManager.MODE.DIALOG);
169
        return dialog.getAction()==WindowManager_v2.BUTTON_OK;
170
    }
171

    
172
    @Override
173
    public void fromJson(JsonObject json) {
174
//        DownloaderManager manager = DownloaderLocator.getDownloaderManager();
175
        String type = json.getString("type", null);
176
        if( type!=null ) {
177
            if( !StringUtils.equalsIgnoreCase(type, "OAuth") ) {
178
                throw new IllegalArgumentException("Invalid value of type '"+type+"' for '"+AUTH_MODE_KEYCLOAK+"'.");
179
            }
180
//            this.factory = manager.getDownloaderAuthenticationFactory(AUTH_MODE_KEYCLOAK);
181
            this.realm = json.getString("realm", null);
182
            this.keycloakBaseurl = json.getString("url", null);
183
            if( StringUtils.isNotBlank(this.keycloakBaseurl) ) {
184
                if( this.keycloakBaseurl.endsWith("/") ) {
185
                    this.keycloakBaseurl = this.keycloakBaseurl+"realms";
186
                } else {
187
                    this.keycloakBaseurl = this.keycloakBaseurl+"/realms";
188
                }
189
            }
190
        } else {
191
            super.fromJson(json);
192
            this.clientid = json.getString("clientid", null);
193
            this.scope = json.getString("scope", null);
194
            this.realm = json.getString("realm", null);
195
            this.keycloakBaseurl = json.getString("baseurl", null);
196
            this.localPort = json.getInt("localPort", 0);                
197
        }
198
    }
199

    
200
    @Override
201
    public JsonObjectBuilder toJsonBuilder() {
202
        JsonObjectBuilder builder = super.toJsonBuilder();
203
        builder.add_class(this);
204
        builder.add("clientid", this.clientid);
205
        builder.add("scope", this.scope);
206
        builder.add("realm", this.realm);
207
        builder.add("baseurl", this.keycloakBaseurl);
208
        builder.add("localPort", this.localPort);
209
        return builder;
210
    }
211

    
212
    @Override
213
    public void saveToState(PersistentState state) throws PersistenceException {
214
        super.saveToState(state);
215
        state.set("clientid",this.clientid);
216
        state.set("scope",this.scope);
217
        state.set("baseurl",this.keycloakBaseurl);
218
        state.set("realm",this.realm);
219
        state.set("localPort",this.localPort);
220
    }
221

    
222
    @Override
223
    public void loadFromState(PersistentState state) throws PersistenceException {
224
        super.loadFromState(state);
225
        this.clientid = state.getString("clientid");
226
        this.scope = state.getString("scope");
227
        this.keycloakBaseurl = state.getString("baseurl");
228
        this.realm = state.getString("realm");
229
        this.localPort = state.getInt("localPort");
230
    }
231
    
232
    public static void selfRegister() {
233
        PersistenceManager manager = ToolsLocator.getPersistenceManager();
234
        if (manager.getDefinition(PERSISTENT_DEFINITION_NAME) == null) {
235
            DynStruct definition = manager.addDefinition(DownloaderAuthenticationKeycloakConfig.class,
236
                    PERSISTENT_DEFINITION_NAME, 
237
                    "DownloaderAuthenticationKeycloakConfig persistence definition", null, null
238
            );     
239
            definition.extend(
240
                PersistenceManager.PERSISTENCE_NAMESPACE, 
241
                DownloaderAuthenticationConfig.PERSISTENT_DEFINITION_NAME
242
            );
243
            definition.addDynFieldString("clientid");
244
            definition.addDynFieldString("scope");
245
            definition.addDynFieldString("baseurl");
246
            definition.addDynFieldString("realm");
247
            definition.addDynFieldInt("localPort");
248
        }
249
        Json.registerSerializer(DownloaderAuthenticationKeycloakConfig.class);
250
    }
251

    
252
    @Override
253
    public String getLabel() {
254
        return String.format("%s - %s", this.keycloakBaseurl, this.realm);
255
    }
256

    
257
    @Override
258
    public DownloaderAuthenticationKeycloakConfig getValue() {
259
        return this;
260
    }
261

    
262
    @Override
263
    public String toString() {
264
        return String.format(//           "Factory: %s\ngvSIG online URL: %s\nKeycloak URL:%s\nRealm: %s\nLocal port:%d", 
265
           "Factory: %s\nKeycloak URL:%s\nRealm: %s\nLocal port:%d", 
266
           this.getFactory().getProviderName(),
267
//           this.getUrlOnline(),
268
this.getKeycloakBaseurl(),
269
           this.getRealm(),
270
           this.getLocalPort()
271
        );
272
    }
273

    
274
    @Override
275
    public DownloaderAuthenticationConfig createAuthenticationConfig(String serviceUrl) {
276
        if (StringUtils.isBlank(serviceUrl)) {
277
            return null;
278
        }
279
        
280
        DownloaderAuthenticationKeycloakConfig other = new DownloaderAuthenticationKeycloakConfig(null, serviceUrl);
281
        other.clientid = this.clientid;
282
        other.keycloakBaseurl = this.keycloakBaseurl;
283
        other.localPort = this.localPort;
284
        other.realm = this.realm;
285
        other.scope = this.scope;
286
        return other;
287
    }
288
        
289
    
290
}