diff --git a/duniter4j-es-core/src/license/THIRD-PARTY.properties b/duniter4j-es-core/src/license/THIRD-PARTY.properties new file mode 100644 index 0000000000000000000000000000000000000000..10a89e2bcaf4082c40f141057fa9e10147c47390 --- /dev/null +++ b/duniter4j-es-core/src/license/THIRD-PARTY.properties @@ -0,0 +1,35 @@ +# Generated by org.codehaus.mojo.license.AddThirdPartyMojo +#------------------------------------------------------------------------------- +# Already used licenses in project : +# - ASL, version 2 +# - Apache 2.0 +# - Apache License 2.0 +# - Apache License Version 2.0 +# - BSD License +# - BSD licence +# - CC0 1.0 Universal +# - CDDL +# - CDDL+GPL +# - COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 +# - Common Development and Distribution License (CDDL) v1.0 +# - Dual license consisting of the CDDL v1.1 and GPL v2 +# - Eclipse Public License 1.0 +# - GPLv2+CE +# - General Public License (GPL) v3 +# - Indiana University Extreme! Lab Software License, vesion 1.1.1 +# - LGPL, version 2.1 +# - Lesser General Public License (LGPL) v 3.0 +# - Lesser General Public License (LPGL) +# - Lesser General Public License (LPGL) v 2.1 +# - Lesser General Public License (LPGL) version 3.0 +# - MIT License +# - New BSD License +# - Public Domain, per Creative Commons CC0 +# - The Apache Software License, Version 2.0 +#------------------------------------------------------------------------------- +# Please fill the missing licenses for dependencies : +# +# +#Fri May 18 18:26:32 CEST 2018 +commons-primitives--commons-primitives--1.0=The Apache Software License, Version 2.0 +org.antlr--antlr-runtime--3.3=BSD License diff --git a/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/PluginSettings.java b/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/PluginSettings.java index a0f394a8d60a34a59338e623d34d450dfec462da..1ba958a01aa2cb149ad08837ee8801e63e0ef893 100644 --- a/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/PluginSettings.java +++ b/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/PluginSettings.java @@ -261,6 +261,10 @@ public class PluginSettings extends AbstractLifecycleComponent<PluginSettings> { return settings.getAsInt("duniter.retry.waitDuration", 5000); } + public String getShareBaseUrl() { + return settings.get("duniter.share.base.url"); + } + public Peer checkAndGetPeer() { if (StringUtils.isBlank(getNodeBmaHost())) { logger.error("ERROR: node host is required"); diff --git a/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/rest/share/AbstractRestShareLinkAction.java b/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/rest/share/AbstractRestShareLinkAction.java index ff97fada10df8a93d416f847e86196295e3c881b..6dd3dd5a8d41c80a6aa9b6733b45de31e1c575e9 100644 --- a/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/rest/share/AbstractRestShareLinkAction.java +++ b/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/rest/share/AbstractRestShareLinkAction.java @@ -14,7 +14,8 @@ import org.elasticsearch.common.logging.Loggers; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.rest.*; import org.nuiton.i18n.I18n; -import org.stringtemplate.v4.*; +import org.stringtemplate.v4.ST; +import org.stringtemplate.v4.STGroup; import java.util.Locale; @@ -31,23 +32,27 @@ public abstract class AbstractRestShareLinkAction extends BaseRestHandler { private OGDataResolver resolver; private STGroup templates; + private String urlPattern; public AbstractRestShareLinkAction(Settings settings, RestController controller, Client client, String indexName, String typeName, + String shareBaseUrl, OGDataResolver resolver ) { super(settings, controller, client); log = Loggers.getLogger("duniter.rest." + indexName, settings, String.format("[%s]", indexName)); + + String pathPattern = String.format("/%s/%s/%s/_share", indexName, typeName, "%s"); controller.registerHandler(GET, - String.format("/%s/%s/{id}/_share", indexName, typeName), + String.format(pathPattern, "{id}"), this); + this.urlPattern = (shareBaseUrl != null ? shareBaseUrl : "") + pathPattern; this.resolver = resolver; // Configure springtemplate engine this.templates = STUtils.newSTGroup("org/duniter/elasticsearch/templates"); Preconditions.checkNotNull(this.templates.getInstanceOf("html_share"), "Unable to load ST template for share page"); - } @Override @@ -68,8 +73,11 @@ public abstract class AbstractRestShareLinkAction extends BaseRestHandler { template.add("description", data.description); template.add("siteName", data.siteName); template.add("image", data.image); - template.add("url", data.url); + template.add("url", String.format(urlPattern, id)); + template.add("redirectUrl", data.url); template.add("locale", data.locale); + template.add("imageHeight", data.imageHeight); + template.add("imageWidth", data.imageWidth); if (StringUtils.isNotBlank(data.url)) { Locale locale = data.locale != null ? new Locale(data.locale) : I18n.getDefaultLocale(); template.add("redirectMessage", I18n.l(locale, "duniter4j.share.redirection.help")); diff --git a/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/util/opengraph/OGData.java b/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/util/opengraph/OGData.java index 0530ead6288cd913cacb01fc7fc11883688e864b..655e14603d4fc75452a72fbbe9cde1cb10b5a4a5 100644 --- a/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/util/opengraph/OGData.java +++ b/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/util/opengraph/OGData.java @@ -10,4 +10,7 @@ public class OGData { public String imageType; public String siteName; + public Integer imageHeight; + public Integer imageWidth; + } diff --git a/duniter4j-es-core/src/main/resources/org/duniter/elasticsearch/templates/html_share.st b/duniter4j-es-core/src/main/resources/org/duniter/elasticsearch/templates/html_share.st index 664245e3511d95a8b6d5d74c8825c691e38b178d..1b03f96d40bad593c53154292ffc852d5e0c0658 100644 --- a/duniter4j-es-core/src/main/resources/org/duniter/elasticsearch/templates/html_share.st +++ b/duniter4j-es-core/src/main/resources/org/duniter/elasticsearch/templates/html_share.st @@ -1,4 +1,5 @@ -html_share(type, title, summary, description, image, siteName, locale, url, redirectMessage) ::= << +html_share(type, title, summary, description, image, imageHeight, imageWidth, siteName, locale, url, redirectUrl, redirectMessage) ::= << +<!DOCTYPE html> <html prefix="og: http://ogp.me/ns#"> <head> <meta charset="UTF-8"> @@ -30,17 +31,28 @@ html_share(type, title, summary, description, image, siteName, locale, url, redi $if(image)$ <meta property="og:image" content="$image$" /> $endif$ + $if(imageHeight)$ + <meta property="og:image:height" content="$imageHeight$" /> + $endif$ + $if(imageWidth)$ + <meta property="og:image:width" content="$imageWidth$" /> + $endif$ $if(locale)$ <meta property="og:locale" content="$locale$" /> $endif$ $if(url)$ - <meta property="og:url" content="$url$" /> + <meta property="og:url" content="$url$"/> + $endif$ + + $if(redirectUrl)$ + <script type="text/javascript"> - window.location.href = "$url$" + window.location.href = "$redirectUrl$" </script> - <META HTTP-EQUIV="Refresh" CONTENT="0; URL=$url$"> + <!--<META HTTP-EQUIV="Refresh" CONTENT="0; URL=$redirectUrl$"> + --> $endif$ </head> <body> @@ -54,9 +66,9 @@ html_share(type, title, summary, description, image, siteName, locale, url, redi <p>$description$</p> - $if(url)$ + $if(redirectUrl)$ <p> - $redirectMessage$ <a href='$url$'>$title$</a>. + $redirectMessage$ <a href='$redirectUrl$'>$title$</a>. </p> $endif$ </body> diff --git a/duniter4j-es-user/src/main/java/org/duniter/elasticsearch/user/PluginSettings.java b/duniter4j-es-user/src/main/java/org/duniter/elasticsearch/user/PluginSettings.java index e640a389057facdda36a00115d2cbe8fbc794f7a..152034a27f4b0a98fd702e965ca11eca076f152a 100644 --- a/duniter4j-es-user/src/main/java/org/duniter/elasticsearch/user/PluginSettings.java +++ b/duniter4j-es-user/src/main/java/org/duniter/elasticsearch/user/PluginSettings.java @@ -220,7 +220,7 @@ public class PluginSettings extends AbstractLifecycleComponent<PluginSettings> { return this.settings.get("duniter.user.share.site.name", "Cesium"); } - public String getBaseUrl() { + public String getShareBaseUrl() { return settings.get("duniter.share.base.url"); } diff --git a/duniter4j-es-user/src/main/java/org/duniter/elasticsearch/user/rest/page/RestPageShareLinkAction.java b/duniter4j-es-user/src/main/java/org/duniter/elasticsearch/user/rest/page/RestPageShareLinkAction.java index ecd1c817499ab22f60f370ff4ba7e231ba7da755..49385cf924df5d1aed059bcf799de15f958b0d7c 100644 --- a/duniter4j-es-user/src/main/java/org/duniter/elasticsearch/user/rest/page/RestPageShareLinkAction.java +++ b/duniter4j-es-user/src/main/java/org/duniter/elasticsearch/user/rest/page/RestPageShareLinkAction.java @@ -10,10 +10,8 @@ import org.duniter.elasticsearch.rest.share.AbstractRestShareLinkAction; import org.duniter.elasticsearch.user.PluginSettings; import org.duniter.elasticsearch.user.dao.page.PageIndexDao; import org.duniter.elasticsearch.user.dao.page.PageRecordDao; -import org.duniter.elasticsearch.user.model.UserProfile; import org.duniter.elasticsearch.user.model.page.RegistryRecord; import org.duniter.elasticsearch.user.service.PageService; -import org.duniter.elasticsearch.user.service.UserService; import org.duniter.elasticsearch.util.opengraph.OGData; import org.elasticsearch.client.Client; import org.elasticsearch.common.inject.Inject; @@ -23,7 +21,6 @@ import org.nuiton.i18n.I18n; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; -import java.util.Locale; public class RestPageShareLinkAction extends AbstractRestShareLinkAction { @@ -32,6 +29,7 @@ public class RestPageShareLinkAction extends AbstractRestShareLinkAction { final PluginSettings pluginSettings, final PageService service) { super(settings, controller, client, PageIndexDao.INDEX, PageRecordDao.TYPE, + pluginSettings.getShareBaseUrl(), createResolver(pluginSettings, service)); } @@ -60,9 +58,13 @@ public class RestPageShareLinkAction extends AbstractRestShareLinkAction { // og:image if (record.getThumbnail() != null && StringUtils.isNotBlank(record.getThumbnail().get("_content_type"))) { - String baseUrl = pluginSettings.getBaseUrl(); + String baseUrl = pluginSettings.getShareBaseUrl(); data.image = StringUtils.isBlank(baseUrl) ? "" : baseUrl; data.image += RestImageAttachmentAction.computeImageUrl(PageIndexDao.INDEX, PageRecordDao.TYPE, id, RegistryRecord.PROPERTY_THUMBNAIL, record.getThumbnail().get("_content_type")); + + // FIXME : use a greater image ? at least 200px x 200px for FaceBook + data.imageHeight = 100; + data.imageWidth = 100; } // og:url @@ -94,8 +96,10 @@ public class RestPageShareLinkAction extends AbstractRestShareLinkAction { // default og:image if (StringUtils.isBlank(data.image)) { - data.image = pluginSettings.getCesiumUrl() + "/img/logo_128px.png"; + data.image = pluginSettings.getCesiumUrl() + "/img/logo_200px.png"; data.imageType = "image/png"; + data.imageHeight = 200; + data.imageWidth = 200; } return data; diff --git a/duniter4j-es-user/src/main/java/org/duniter/elasticsearch/user/rest/user/RestUserShareLinkAction.java b/duniter4j-es-user/src/main/java/org/duniter/elasticsearch/user/rest/user/RestUserShareLinkAction.java index 540e6e4e0fcdf07c324b0b6a248d078763e7b2c2..7a4775207e80be76f665ed97b3e743c2419a9072 100644 --- a/duniter4j-es-user/src/main/java/org/duniter/elasticsearch/user/rest/user/RestUserShareLinkAction.java +++ b/duniter4j-es-user/src/main/java/org/duniter/elasticsearch/user/rest/user/RestUserShareLinkAction.java @@ -1,6 +1,5 @@ package org.duniter.elasticsearch.user.rest.user; -import com.google.common.collect.Maps; import com.google.common.html.HtmlEscapers; import org.duniter.core.exception.BusinessException; import org.duniter.core.exception.TechnicalException; @@ -29,9 +28,10 @@ public class RestUserShareLinkAction extends AbstractRestShareLinkAction { final PluginSettings pluginSettings, final UserService userService) { super(settings, controller, client, UserService.INDEX, UserService.PROFILE_TYPE, + pluginSettings.getShareBaseUrl(), createResolver(pluginSettings, userService)); - if (StringUtils.isBlank(pluginSettings.getBaseUrl())) { + if (StringUtils.isBlank(pluginSettings.getShareBaseUrl())) { log.warn(I18n.t("duniter4j.es.share.error.noBaseUrl", "duniter.share.base.url")); } } @@ -57,6 +57,7 @@ public class RestUserShareLinkAction extends AbstractRestShareLinkAction { else { locale = I18n.getDefaultLocale(); } + data.locale = locale.toString(); String pubkey = I18n.l(locale, "duniter.user.share.pubkey", id); @@ -81,9 +82,11 @@ public class RestUserShareLinkAction extends AbstractRestShareLinkAction { // og:image if (profile.getAvatar() != null && StringUtils.isNotBlank(profile.getAvatar().getContentType())) { - String baseUrl = pluginSettings.getBaseUrl(); + String baseUrl = pluginSettings.getShareBaseUrl(); data.image = StringUtils.isBlank(baseUrl) ? "" : baseUrl; data.image += RestImageAttachmentAction.computeImageUrl(UserService.INDEX, UserService.PROFILE_TYPE, id, UserProfile.PROPERTY_AVATAR, profile.getAvatar().getContentType()); + data.imageHeight = 100; + data.imageWidth = 100; } // og:url @@ -116,8 +119,10 @@ public class RestUserShareLinkAction extends AbstractRestShareLinkAction { // default og:image if (StringUtils.isBlank(data.image)) { - data.image = pluginSettings.getCesiumUrl() + "/img/logo_128px.png"; + data.image = pluginSettings.getCesiumUrl() + "/img/logo_200px.png"; data.imageType = "image/png"; + data.imageHeight = 200; + data.imageWidth = 200; } return data;