Blob Blame History Raw
From c55511be71a6181788067fa018b5f0deaca10e61 Mon Sep 17 00:00:00 2001
From: Aravinda VK <avishwan@redhat.com>
Date: Thu, 28 Dec 2017 14:04:50 +0530
Subject: [PATCH 115/128] eventsapi: JWT signing without external dependency

Added support for JWT signing without using python-jwt since it is not
available in all the distributions.

>upstream mainline patch : https://review.gluster.org/19102

BUG: 1466129
Change-Id: I95699055442fbf9da15249f5defe8a8b287010f1
Signed-off-by: Aravinda VK <avishwan@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/126619
Tested-by: RHGS Build Bot <nigelb@redhat.com>
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
---
 events/src/utils.py | 20 +++++++++++++++++---
 glusterfs.spec.in   |  4 ++--
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/events/src/utils.py b/events/src/utils.py
index 5130720..f24d64d 100644
--- a/events/src/utils.py
+++ b/events/src/utils.py
@@ -18,6 +18,10 @@ from threading import Thread
 import multiprocessing
 from Queue import Queue
 from datetime import datetime, timedelta
+import base64
+import hmac
+from hashlib import sha256
+from calendar import timegm
 
 from eventsapiconf import (LOG_FILE,
                            WEBHOOKS_FILE,
@@ -184,15 +188,25 @@ def autoload_webhooks():
             load_webhooks()
 
 
+def base64_urlencode(inp):
+    return base64.urlsafe_b64encode(inp).replace("=", "").strip()
+
+
 def get_jwt_token(secret, event_type, event_ts, jwt_expiry_time_seconds=60):
-    import jwt
+    exp = datetime.utcnow() + timedelta(seconds=jwt_expiry_time_seconds)
     payload = {
-        "exp": datetime.utcnow() + timedelta(seconds=jwt_expiry_time_seconds),
+        "exp": timegm(exp.utctimetuple()),
         "iss": "gluster",
         "sub": event_type,
         "iat": event_ts
     }
-    return jwt.encode(payload, secret, algorithm='HS256')
+    header = '{"alg":"HS256","typ":"JWT"}'
+    payload = json.dumps(payload, separators=(',', ':'), sort_keys=True)
+    msg = base64_urlencode(header) + "." + base64_urlencode(payload)
+    return "%s.%s" % (
+        msg,
+        base64_urlencode(hmac.HMAC(secret, msg, sha256).digest())
+    )
 
 
 def publish_to_webhook(url, token, secret, message_queue):
diff --git a/glusterfs.spec.in b/glusterfs.spec.in
index 29329fa..56a62a9 100644
--- a/glusterfs.spec.in
+++ b/glusterfs.spec.in
@@ -671,9 +671,9 @@ Requires:         %{name}-server%{?_isa} = %{version}-%{release}
 Requires:         python2 python-prettytable
 Requires:         python2-gluster = %{version}-%{release}
 %if ( 0%{?rhel} )
-Requires:         python-requests python-jwt
+Requires:         python-requests
 %else
-Requires:         python2-requests python2-jwt
+Requires:         python2-requests
 %endif
 %if ( 0%{?rhel} && 0%{?rhel} < 7 )
 Requires:         python-argparse
-- 
1.8.3.1