/**
 * Copyright 2016 Telefonica Investigación y Desarrollo, S.A.U
 *
 * This file is part of fiware-cosmos (FI-WARE project).
 *
 * fiware-cosmos is free software: you can redistribute it and/or modify it under the terms of the GNU Affero
 * General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your
 * option) any later version.
 * fiware-cosmos is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
 * for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with fiware-cosmos. If not, see
 * http://www.gnu.org/licenses/.
 *
 * For those usages not covered by the GNU Affero General Public License please contact with iot_support at tid dot es
 */
package com.telefonica.iot.cosmos.hive.authprovider;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.security.sasl.AuthenticationException;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hive.service.auth.PasswdAuthenticationProvider;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.log4j.Logger;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

/**
 * Custom implementation of the org.apache.hive.service.auth.PasswdAuthenticationProvider interface.
 * 
 * @author frb
 */
public class OAuth2AuthenticationProviderImpl implements PasswdAuthenticationProvider {
    
    private static final Logger LOGGER = Logger.getLogger(HttpClientFactory.class);
    private final HttpClientFactory httpClientFactory;
    private final String idmEndpoint;
    
    /**
     * Constructor.
     */
    public OAuth2AuthenticationProviderImpl() {
        // get the cnfigured Identity Manager endpoint
        HiveConf conf = null;
        
        try {
            conf = new HiveConf();
        } catch (Exception e) {
            LOGGER.info("Unable to read the Hive configuration, using default values");
        } finally {
            if (conf == null) {
                idmEndpoint = "https://account.lab.fiware.org";
            } else {
                idmEndpoint = conf.get("com.telefonica.iot.idm.endpoint", "https://account.lab.fiware.org");
            } // if else
            
            LOGGER.info("Identity Manager endpoint: " + idmEndpoint);
        } // try catch finally
        
        // create a factory of Http clients
        if (idmEndpoint.startsWith("https")) {
            httpClientFactory = new HttpClientFactory(true);
        } else {
            httpClientFactory = new HttpClientFactory(false);
        } // if else
    } // OAuth2AuthenticationProviderImpl

    @Override
    public void Authenticate(String user, String token) throws AuthenticationException {
        // create the Http client
        HttpClient httpClient = httpClientFactory.getHttpClient(true);
        
        // create the request
        String url = idmEndpoint + "/user?access_token=" + token;
        HttpRequestBase request = new HttpGet(url);
        
        // do the request
        HttpResponse httpRes = null;
        
        try {
            httpRes = httpClient.execute(request);
            LOGGER.debug("Doing request: " + request.toString());
        } catch (IOException e) {
            throw new AuthenticationException(e.getMessage());
        } // try catch
        
        // get the input streamResponse
        String streamResponse = "";
        
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(httpRes.getEntity().getContent()));
            streamResponse = reader.readLine();
            LOGGER.debug("Response received: " + streamResponse);
        } catch (IOException e) {
            throw new AuthenticationException(e.getMessage());
        } // try catch
        
        // parse the input streamResponse as a Json
        JSONObject jsonResponse = null;
        
        try {
            JSONParser jsonParser = new JSONParser();
            jsonResponse = (JSONObject) jsonParser.parse(streamResponse);
        } catch (ParseException e) {
            throw new AuthenticationException(e.getMessage());
        } // try catch
        
        // check if the given token does not exist
        if (jsonResponse.containsKey("error")) {
            throw new AuthenticationException("The given token does not exist");
        } // if
        
        // check if the obtained user id matches the given user
        if (jsonResponse.containsKey("id") && !jsonResponse.get("id").equals(user)) {
            throw new AuthenticationException("The given token does not match the given user");
        } // if
        
        // release the connection
        request.releaseConnection();
        
        LOGGER.debug("User " + user + " authenticated");
    } // Authenticate
    
} // OAuth2AuthenticationProviderImpl

@@ -2055,17 +2055,17 @@
  // 
-g
+G
 et the c
 nfig
@@ -2060,16 +2060,17 @@
 et the c
+o
 nfigured
@@ -2180,24 +2180,76 @@
 HiveConf();%0A
+            LOGGER.info(%22Hive configuration read%22);%0A
         %7D ca
@@ -2472,16 +2472,122 @@
 e.org%22;%0A
+                LOGGER.info(%22Using hardcoded Identity Manager endpoint: https://account.lab.fiware.org%22);%0A
         
@@ -2724,42 +2724,8 @@
     
-%7D // if else%0A            %0A        
     
@@ -2737,16 +2737,33 @@
 R.info(%22
+Using configured 
 Identity
@@ -2795,24 +2795,62 @@
 mEndpoint);%0A
+            %7D // if else%0A            %0A
         %7D //
@@ -2884,25 +2884,25 @@
 %0A        // 
-c
+C
 reate a fact

Add improved logs