d1681e
From c55511be71a6181788067fa018b5f0deaca10e61 Mon Sep 17 00:00:00 2001
d1681e
From: Aravinda VK <avishwan@redhat.com>
d1681e
Date: Thu, 28 Dec 2017 14:04:50 +0530
d1681e
Subject: [PATCH 115/128] eventsapi: JWT signing without external dependency
d1681e
d1681e
Added support for JWT signing without using python-jwt since it is not
d1681e
available in all the distributions.
d1681e
d1681e
>upstream mainline patch : https://review.gluster.org/19102
d1681e
d1681e
BUG: 1466129
d1681e
Change-Id: I95699055442fbf9da15249f5defe8a8b287010f1
d1681e
Signed-off-by: Aravinda VK <avishwan@redhat.com>
d1681e
Reviewed-on: https://code.engineering.redhat.com/gerrit/126619
d1681e
Tested-by: RHGS Build Bot <nigelb@redhat.com>
d1681e
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
d1681e
---
d1681e
 events/src/utils.py | 20 +++++++++++++++++---
d1681e
 glusterfs.spec.in   |  4 ++--
d1681e
 2 files changed, 19 insertions(+), 5 deletions(-)
d1681e
d1681e
diff --git a/events/src/utils.py b/events/src/utils.py
d1681e
index 5130720..f24d64d 100644
d1681e
--- a/events/src/utils.py
d1681e
+++ b/events/src/utils.py
d1681e
@@ -18,6 +18,10 @@ from threading import Thread
d1681e
 import multiprocessing
d1681e
 from Queue import Queue
d1681e
 from datetime import datetime, timedelta
d1681e
+import base64
d1681e
+import hmac
d1681e
+from hashlib import sha256
d1681e
+from calendar import timegm
d1681e
 
d1681e
 from eventsapiconf import (LOG_FILE,
d1681e
                            WEBHOOKS_FILE,
d1681e
@@ -184,15 +188,25 @@ def autoload_webhooks():
d1681e
             load_webhooks()
d1681e
 
d1681e
 
d1681e
+def base64_urlencode(inp):
d1681e
+    return base64.urlsafe_b64encode(inp).replace("=", "").strip()
d1681e
+
d1681e
+
d1681e
 def get_jwt_token(secret, event_type, event_ts, jwt_expiry_time_seconds=60):
d1681e
-    import jwt
d1681e
+    exp = datetime.utcnow() + timedelta(seconds=jwt_expiry_time_seconds)
d1681e
     payload = {
d1681e
-        "exp": datetime.utcnow() + timedelta(seconds=jwt_expiry_time_seconds),
d1681e
+        "exp": timegm(exp.utctimetuple()),
d1681e
         "iss": "gluster",
d1681e
         "sub": event_type,
d1681e
         "iat": event_ts
d1681e
     }
d1681e
-    return jwt.encode(payload, secret, algorithm='HS256')
d1681e
+    header = '{"alg":"HS256","typ":"JWT"}'
d1681e
+    payload = json.dumps(payload, separators=(',', ':'), sort_keys=True)
d1681e
+    msg = base64_urlencode(header) + "." + base64_urlencode(payload)
d1681e
+    return "%s.%s" % (
d1681e
+        msg,
d1681e
+        base64_urlencode(hmac.HMAC(secret, msg, sha256).digest())
d1681e
+    )
d1681e
 
d1681e
 
d1681e
 def publish_to_webhook(url, token, secret, message_queue):
d1681e
diff --git a/glusterfs.spec.in b/glusterfs.spec.in
d1681e
index 29329fa..56a62a9 100644
d1681e
--- a/glusterfs.spec.in
d1681e
+++ b/glusterfs.spec.in
d1681e
@@ -671,9 +671,9 @@ Requires:         %{name}-server%{?_isa} = %{version}-%{release}
d1681e
 Requires:         python2 python-prettytable
d1681e
 Requires:         python2-gluster = %{version}-%{release}
d1681e
 %if ( 0%{?rhel} )
d1681e
-Requires:         python-requests python-jwt
d1681e
+Requires:         python-requests
d1681e
 %else
d1681e
-Requires:         python2-requests python2-jwt
d1681e
+Requires:         python2-requests
d1681e
 %endif
d1681e
 %if ( 0%{?rhel} && 0%{?rhel} < 7 )
d1681e
 Requires:         python-argparse
d1681e
-- 
d1681e
1.8.3.1
d1681e