All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.search.experiences.internal.web.cache.IpstackWebCacheItem Maven / Gradle / Ivy

/**
 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
 */

package com.liferay.search.experiences.internal.web.cache;

import com.liferay.petra.string.StringBundler;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.json.JSONUtil;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.HttpUtil;
import com.liferay.portal.kernel.webcache.WebCacheItem;
import com.liferay.portal.kernel.webcache.WebCachePoolUtil;
import com.liferay.search.experiences.blueprint.exception.InvalidWebCacheItemException;
import com.liferay.search.experiences.blueprint.exception.PrivateIPAddressException;
import com.liferay.search.experiences.internal.configuration.IpstackConfiguration;

import java.beans.ExceptionListener;

import java.net.Inet4Address;
import java.net.InetAddress;

/**
 * @author Brian Wing Shun Chan
 */
public class IpstackWebCacheItem implements WebCacheItem {

	public static JSONObject get(
		ExceptionListener exceptionListener, String ipAddress,
		IpstackConfiguration ipstackConfiguration) {

		try {
			if (!ipstackConfiguration.enabled() ||
				_isPrivateIPAddress(ipAddress)) {

				return JSONFactoryUtil.createJSONObject();
			}

			return (JSONObject)WebCachePoolUtil.get(
				StringBundler.concat(
					IpstackWebCacheItem.class.getName(), StringPool.POUND,
					ipstackConfiguration.apiKey(), StringPool.POUND,
					ipstackConfiguration.apiURL(), StringPool.POUND, ipAddress),
				new IpstackWebCacheItem(ipAddress, ipstackConfiguration));
		}
		catch (Exception exception) {
			if (_log.isDebugEnabled()) {
				_log.debug(exception);
			}

			exceptionListener.exceptionThrown(exception);

			return JSONFactoryUtil.createJSONObject();
		}
	}

	public IpstackWebCacheItem(
		String ipAddress, IpstackConfiguration ipstackConfiguration) {

		_ipAddress = ipAddress;
		_ipstackConfiguration = ipstackConfiguration;
	}

	@Override
	public JSONObject convert(String key) {
		try {
			String apiURL = _ipstackConfiguration.apiURL();

			if (!apiURL.endsWith("/")) {
				apiURL += "/";
			}

			String url = StringBundler.concat(
				apiURL, _ipAddress, "?access_key=",
				_ipstackConfiguration.apiKey());

			if (_log.isDebugEnabled()) {
				_log.debug("Reading " + url);
			}

			JSONObject jsonObject = JSONFactoryUtil.createJSONObject(
				HttpUtil.URLtoString(url));

			_validateResponse(jsonObject);

			return jsonObject;
		}
		catch (Exception exception) {
			throw new InvalidWebCacheItemException(exception);
		}
	}

	@Override
	public long getRefreshTime() {
		if (_ipstackConfiguration.enabled()) {
			return _ipstackConfiguration.cacheTimeout();
		}

		return 0;
	}

	private static boolean _isPrivateIPAddress(String ipAddress)
		throws Exception {

		Inet4Address inet4Address = (Inet4Address)InetAddress.getByName(
			ipAddress);

		if (inet4Address.isAnyLocalAddress() ||
			inet4Address.isLinkLocalAddress() ||
			inet4Address.isLoopbackAddress() ||
			inet4Address.isMulticastAddress() ||
			inet4Address.isSiteLocalAddress()) {

			throw new PrivateIPAddressException(
				"Unable to resolve private IP address " + ipAddress);
		}

		return false;
	}

	private void _validateResponse(JSONObject jsonObject) {
		boolean success = jsonObject.getBoolean("success", true);

		if (success) {
			return;
		}

		throw new InvalidWebCacheItemException(
			StringBundler.concat(
				"IPStack: ",
				JSONUtil.getValueAsString(
					jsonObject, "JSONObject/error", "Object/info"),
				" (",
				JSONUtil.getValueAsString(
					jsonObject, "JSONObject/error", "Object/code"),
				")"));
	}

	private static final Log _log = LogFactoryUtil.getLog(
		IpstackWebCacheItem.class);

	private final String _ipAddress;
	private final IpstackConfiguration _ipstackConfiguration;

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy