ProfileServlet.java 3.86 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  javax.jcr.Session
 *  javax.servlet.RequestDispatcher
 *  javax.servlet.Servlet
 *  javax.servlet.ServletException
 *  javax.servlet.ServletRequest
 *  javax.servlet.ServletResponse
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Properties
 *  org.apache.felix.scr.annotations.Property
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.jackrabbit.api.security.user.User
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.SlingHttpServletResponse
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.servlets.SlingSafeMethodsServlet
 *  org.apache.sling.jcr.api.SlingRepository
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.granite.oauth.server.scopes.servlets.impl;

import com.adobe.granite.oauth.server.impl.helper.OAuth2Helper;
import java.io.IOException;
import javax.jcr.Session;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.jackrabbit.api.security.user.User;
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.SlingSafeMethodsServlet;
import org.apache.sling.jcr.api.SlingRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
@Service(value={Servlet.class})
@Properties(value={@Property(name="service.description", value={"Profile API"}), @Property(name="sling.servlet.paths", value={"/libs/oauth/profile"})})
public class ProfileServlet
extends SlingSafeMethodsServlet {
    private final Logger log;
    private static final long serialVersionUID = 3755700490495366399L;
    @Reference
    private SlingRepository repository;

    public ProfileServlet() {
        this.log = LoggerFactory.getLogger(this.getClass());
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        Session oauthServiceSession = null;
        try {
            User user = (User)request.getResourceResolver().adaptTo(User.class);
            String accessToken = OAuth2Helper.getJwtFromUserId(user.getID());
            String subject = OAuth2Helper.getSubject(accessToken);
            oauthServiceSession = this.repository.loginService(null, null);
            User resourceOwner = OAuth2Helper.getUser(oauthServiceSession, subject);
            String path = resourceOwner.getPath();
            request.getRequestDispatcher(path + "/profile.userproperties.json").forward((ServletRequest)request, (ServletResponse)response);
        }
        catch (Exception e) {
            this.log.error("exception while accessing the repository ", (Throwable)e);
            response.setStatus(401);
            response.setHeader("WWW-Authenticate", "Bearer realm=\"Sling\"");
            response.flushBuffer();
        }
        finally {
            if (oauthServiceSession != null) {
                oauthServiceSession.logout();
            }
        }
    }

    protected void bindRepository(SlingRepository slingRepository) {
        this.repository = slingRepository;
    }

    protected void unbindRepository(SlingRepository slingRepository) {
        if (this.repository == slingRepository) {
            this.repository = null;
        }
    }
}