oscerd commented on code in PR #27716:
URL: https://github.com/apache/camel/pull/27716#discussion_r4251331636


##########
components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramEndpoint.java:
##########
@@ -122,16 +130,54 @@ public Consumer createConsumer(Processor processor) 
throws Exception {
 
     @Override
     public Processor createWebhookHandler(Processor next) {
-        return new TelegramWebhookProcessor(next);
+        if (!configuration.isWebhookSecretTokenEnabled()) {
+            LOG.warn("The webhook secret token is disabled 
(webhookSecretTokenEnabled=false): webhook requests to {} are not"
+                     + " verified",
+                    this);
+            return new TelegramWebhookProcessor(next, null);
+        }
+        return new TelegramWebhookProcessor(next, resolveWebhookSecretToken());
     }
 
     @Override
     public void registerWebhook() throws Exception {
-        if 
(!telegramService.setWebhook(webhookConfiguration.computeFullExternalUrl())) {
+        String url = webhookConfiguration.computeFullExternalUrl();
+        boolean registered = configuration.isWebhookSecretTokenEnabled()
+                ? telegramService.setWebhook(url, resolveWebhookSecretToken())
+                : telegramService.setWebhook(url);
+        if (!registered) {
             throw new RuntimeCamelException("The Telegram API refused to 
register a webhook");
         }
     }
 
+    /**
+     * Returns the secret token of the webhook: the configured one, or else 
one derived from the authorization token,
+     * which stays the same across restarts and replicas.
+     */
+    String resolveWebhookSecretToken() {
+        String token = configuration.getWebhookSecretToken();
+        if (token == null) {
+            return 
deriveWebhookSecretToken(configuration.getAuthorizationToken());
+        }
+        if (!WEBHOOK_SECRET_TOKEN_PATTERN.matcher(token).matches()) {
+            throw new IllegalArgumentException(
+                    "The webhookSecretToken must be 1 to 256 characters long, 
using only A-Z, a-z, 0-9, _ and -");
+        }
+        return token;
+    }
+
+    static String deriveWebhookSecretToken(String authorizationToken) {

Review Comment:
   Added in a3ba1ad2bb14, based on your suggestion: the authorization token 
(the secret) is the key and the fixed label is the message, so the derived 
token cannot be computed without the authorization token, and changes only when 
it does.
   
   _Claude Code on behalf of oscerd_
   
   



##########
components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramEndpoint.java:
##########
@@ -122,16 +130,54 @@ public Consumer createConsumer(Processor processor) 
throws Exception {
 
     @Override
     public Processor createWebhookHandler(Processor next) {
-        return new TelegramWebhookProcessor(next);
+        if (!configuration.isWebhookSecretTokenEnabled()) {
+            LOG.warn("The webhook secret token is disabled 
(webhookSecretTokenEnabled=false): webhook requests to {} are not"
+                     + " verified",
+                    this);
+            return new TelegramWebhookProcessor(next, null);
+        }
+        return new TelegramWebhookProcessor(next, resolveWebhookSecretToken());
     }
 
     @Override
     public void registerWebhook() throws Exception {
-        if 
(!telegramService.setWebhook(webhookConfiguration.computeFullExternalUrl())) {
+        String url = webhookConfiguration.computeFullExternalUrl();
+        boolean registered = configuration.isWebhookSecretTokenEnabled()
+                ? telegramService.setWebhook(url, resolveWebhookSecretToken())
+                : telegramService.setWebhook(url);
+        if (!registered) {
             throw new RuntimeCamelException("The Telegram API refused to 
register a webhook");
         }
     }
 
+    /**
+     * Returns the secret token of the webhook: the configured one, or else 
one derived from the authorization token,
+     * which stays the same across restarts and replicas.
+     */
+    String resolveWebhookSecretToken() {
+        String token = configuration.getWebhookSecretToken();
+        if (token == null) {
+            return 
deriveWebhookSecretToken(configuration.getAuthorizationToken());
+        }
+        if (!WEBHOOK_SECRET_TOKEN_PATTERN.matcher(token).matches()) {
+            throw new IllegalArgumentException(
+                    "The webhookSecretToken must be 1 to 256 characters long, 
using only A-Z, a-z, 0-9, _ and -");
+        }
+        return token;
+    }
+
+    static String deriveWebhookSecretToken(String authorizationToken) {
+        try {
+            Mac mac = Mac.getInstance("HmacSHA256");
+            mac.init(new 
SecretKeySpec(authorizationToken.getBytes(StandardCharsets.UTF_8), 
"HmacSHA256"));
+            byte[] digest = 
mac.doFinal("camel-telegram-webhook-secret-token".getBytes(StandardCharsets.UTF_8));

Review Comment:
   Added in a3ba1ad2bb14, based on your suggestion: the authorization token 
(the secret) is the key and the fixed label is the message, so the derived 
token cannot be computed without the authorization token, and changes only when 
it does.
   
   _Claude Code on behalf of oscerd_
   
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to