RegistrationServlet.java
7.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
* Decompiled with CFR 0_118.
*
* Could not load the following classes:
* javax.servlet.ServletException
* org.apache.felix.scr.annotations.Reference
* org.apache.felix.scr.annotations.sling.SlingServlet
* org.apache.jackrabbit.util.Base64
* org.apache.sling.api.SlingHttpServletRequest
* org.apache.sling.api.SlingHttpServletResponse
* org.apache.sling.api.resource.ResourceResolver
* org.apache.sling.api.servlets.SlingAllMethodsServlet
* org.apache.sling.commons.json.JSONException
* org.apache.sling.commons.json.JSONObject
* org.apache.sling.commons.json.io.JSONWriter
* org.slf4j.Logger
* org.slf4j.LoggerFactory
*/
package com.adobe.cq.screens.device.registration.impl;
import com.adobe.cq.screens.device.Device;
import com.adobe.cq.screens.device.DeviceManager;
import com.adobe.cq.screens.device.registration.PendingDevice;
import com.adobe.cq.screens.device.registration.RegistrationResult;
import com.adobe.cq.screens.device.registration.impl.PendingDeviceImpl;
import com.adobe.cq.screens.device.registration.impl.RegistrationManager;
import com.adobe.cq.screens.device.registration.impl.RegistrationResultImpl;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.Iterator;
import javax.servlet.ServletException;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.jackrabbit.util.Base64;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import org.apache.sling.commons.json.io.JSONWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SlingServlet(resourceTypes={"screens/core/components/service/registration"}, methods={"POST"})
public class RegistrationServlet
extends SlingAllMethodsServlet {
private final Logger log = LoggerFactory.getLogger(RegistrationServlet.class);
private final String METADATA_PARAM = "metadata";
@Reference
RegistrationManager service;
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/json");
try {
PendingDeviceImpl device;
JSONWriter out = new JSONWriter((Writer)response.getWriter());
out.object();
String token = request.getParameter("id");
String cmd = request.getParameter("cmd");
PendingDeviceImpl pendingDeviceImpl = device = token == null ? null : (PendingDeviceImpl)this.service.getDevice(token);
if (device != null && cmd != null) {
PendingDevice.State next = PendingDevice.State.valueOf(cmd);
switch (device.getState()) {
case UNREGISTERED: {
if (next != PendingDevice.State.PREREGISTRATION) {
out.key("message").value((Object)"invalid command, device is un-registred and is waiting to switch to pre-registration...");
break;
}
device.setState(next);
out.key("message").value((Object)"device switched to pre-registration");
break;
}
case PREREGISTRATION: {
out.key("message").value((Object)"wait for device code...");
break;
}
case REGISTRATION: {
if (next != PendingDevice.State.REGISTERED) {
out.key("message").value((Object)"invalid command, device is registered and is waiting to switch to registered...");
break;
}
String code = request.getParameter("code");
if (code == null || !code.equals(device.getRegistrationCode())) {
out.key("message").value((Object)"code validation failed. please provide code sent by the device...");
break;
}
String tenant = request.getParameter("tenant");
if (tenant == null) {
out.key("message").value((Object)"please provide tenant name");
break;
}
ResourceResolver resolver = request.getResourceResolver();
DeviceManager deviceManager = (DeviceManager)resolver.adaptTo(DeviceManager.class);
Device realDevice = deviceManager.createDevice(tenant);
if (realDevice == null) {
out.key("message").value((Object)"device could not be created");
break;
}
String password = deviceManager.updatePassword(realDevice);
JSONObject metadata = device.getMetadata();
this.handleMetadata(request, metadata);
deviceManager.setMetadata(realDevice, metadata);
RegistrationResultImpl result = new RegistrationResultImpl().setDeviceId(realDevice.getId()).setDevicePath(realDevice.getPath()).setPassword(Base64.encode((String)password));
device.setRegistrationResult(result).setState(next);
out.key("message").value((Object)"device has been registration");
out.key("info").value((Object)result);
break;
}
case REGISTERED: {
out.key("message").value((Object)"device has already been registered");
}
}
out.key("status").value((Object)device.getState());
} else {
out.key("message").value((Object)"unknown device id or invalid command");
}
out.endObject();
}
catch (Exception jex) {
this.log.error("Error during device registration", (Throwable)jex);
}
}
private void handleMetadata(SlingHttpServletRequest request, JSONObject metadata) throws JSONException {
String str = request.getParameter("metadata");
if (str != null) {
JSONObject parsed = new JSONObject(str);
Iterator iter = parsed.keys();
while (iter.hasNext()) {
String key = (String)iter.next();
metadata.put(key, (Object)parsed.getString(key));
}
}
}
protected void bindService(RegistrationManager registrationManager) {
this.service = registrationManager;
}
protected void unbindService(RegistrationManager registrationManager) {
if (this.service == registrationManager) {
this.service = null;
}
}
}