/* * The contents of this file are subject to the terms of the Common Development and * Distribution License (the License). You may not use this file except in compliance with the * License. * * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the * specific language governing permission and limitations under the License. * * When distributing Covered Software, include this CDDL Header Notice in each file and include * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL * Header, with the fields enclosed by brackets [] replaced by your own identifying * information: "Portions copyright [year] [name of copyright owner]". * * Copyright (c) 2005 Sun Microsystems Inc. All Rights Reserved */ /* * Portions Copyrighted 2013-2015 ForgeRock AS. */ package org.forgerock.openam.utils; import com.sun.identity.shared.Constants; import com.sun.identity.shared.configuration.SystemPropertiesManager; import com.sun.identity.shared.debug.Debug; import org.forgerock.http.protocol.Request; import org.forgerock.json.resource.http.HttpContext; import org.forgerock.services.context.ClientContext; import org.forgerock.services.context.Context; import javax.servlet.http.HttpServletRequest; import java.util.List; /** * Shared utility class for HTTP Clients. */ public final class ClientUtils { private ClientUtils() { // Static utility methods so private constructor. } private static Debug utilDebug = Debug.getInstance("amComm"); /** * Returns client IP address. The method checks the special HTTP header * first (handles Load Balancer case), then checks the remote address contained in the request. * Refactored from AuthClientUtils.getClientIPAddress() to enable classes outside of the core * (Federation for example) to access this utility method. * * @param request HttpServletRequest request to be used to obtain client's IP address * @return String representing the client's IP address */ public static String getClientIPAddress(HttpServletRequest request) { String result = null; if (request != null) { String ipAddrHeader = SystemPropertiesManager.get(Constants.CLIENT_IP_ADDR_HEADER); if ((ipAddrHeader != null) && (ipAddrHeader.length() != 0)) { result = request.getHeader(ipAddrHeader); if (result != null) { String[] ips = result.split(","); result = ips[0].trim(); } } if ((result == null) || (result.length() == 0)) { result = request.getRemoteAddr(); if (utilDebug.messageEnabled()) { utilDebug.message("ClientUtils.getClientIPAddress : remoteAddr=[" + result + "]"); } } else { if (utilDebug.messageEnabled()) { utilDebug.message("ClientUtils.getClientIPAddress : header=[" + ipAddrHeader + "], result=[" + result + "]"); } } } return result; } /** * Gets the client IP address from the provided {@code Context} and {@code Request}. * * @param context the Commons Http-Framework context which will be examined to obtain the client's ip address. * @param request the Commons Http-Framework request which will be examined to obtain the client's ip address * @return the client ip address, specified in either a custom header value, or pulled from the request, via * the ClientContext class. */ public static String getClientIPAddress(Context context, Request request) { String result = null; if (request != null) { String ipAddrHeader = SystemPropertiesManager.get(Constants.CLIENT_IP_ADDR_HEADER); if (!StringUtils.isBlank(ipAddrHeader)) { result = request.getHeaders().getFirst(ipAddrHeader); if (result != null) { String[] ips = result.split(","); result = ips[0].trim(); } } if (StringUtils.isBlank(result)) { result = context.asContext(ClientContext.class).getRemoteAddress(); if (utilDebug.messageEnabled()) { utilDebug.message("ClientUtils.getClientIPAddress : remoteAddr=[" + result + "]"); } } else { if (utilDebug.messageEnabled()) { utilDebug.message("ClientUtils.getClientIPAddress : header=[" + ipAddrHeader + "], result=[" + result + "]"); } } } return result; } /** * Gets the client IP address from the provided {@code Context}. * * @param context the Commons Http-Framework context which will be examined to obtain the client's ip address. * @return the client ip address, specified in either a custom header value, or pulled from the request, via the * ClientContext class. Differs from the method above as this method relies upon the presence of crest context * objects, which are not present in the CHF context. */ public static String getClientIPAddress(Context context) { String result = null; String ipAddrHeader = SystemPropertiesManager.get(Constants.CLIENT_IP_ADDR_HEADER); if (!StringUtils.isBlank(ipAddrHeader)) { List clientIPHeaderContent = context.asContext(HttpContext.class).getHeaders().get(ipAddrHeader); if (!CollectionUtils.isEmpty(clientIPHeaderContent)) { result = clientIPHeaderContent.get(0); if (result != null) { String[] ips = result.split(","); result = ips[0].trim(); } } } if (StringUtils.isBlank(result)) { result = context.asContext(ClientContext.class).getRemoteAddress(); if (utilDebug.messageEnabled()) { utilDebug.message("ClientUtils.getClientIPAddress : remoteAddr=[" + result + "]"); } } else { if (utilDebug.messageEnabled()) { utilDebug.message("ClientUtils.getClientIPAddress : header=[" + ipAddrHeader + "], result=[" + result + "]"); } } return result; } }