RegistrationServlet.java 7.03 KB
/*
 * 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;
        }
    }

}