From 36499e3a571e83f4e7f03a186df803d44a0c8edd Mon Sep 17 00:00:00 2001 From: It's Networking <87145183+Its-Networking@users.noreply.github.com> Date: Thu, 15 Aug 2024 17:05:47 -0400 Subject: [PATCH 01/13] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9c8ce81..b70c708 100644 --- a/README.md +++ b/README.md @@ -57,10 +57,10 @@ It'll provide you with the code which you should replace with in the `main.py` f ```PY keyauthapp = api( - name = "example", #App name (Manage Applications --> Application name) - ownerid = "JjPMBVlIOd", #Owner ID (Account-Settings --> OwnerID) - secret = "db40d586f4b189e04e5c18c3c94b7e72221be3f6551995adc05236948d1762bc", #App secret(Manage Applications --> App credentials code) - version = "1.0", + name = "", #App name (Manage Applications --> Application name) + ownerid = "", #Owner ID (Account-Settings --> OwnerID) + secret = "", #App secret(Manage Applications --> App credentials code) + version = "", hash_to_check = getchecksum() ) ``` From de203125baafca3052a49560452753ab4295a678 Mon Sep 17 00:00:00 2001 From: William Nelson Date: Sat, 12 Oct 2024 01:04:22 -0400 Subject: [PATCH 02/13] Security update --- keyauth.py | 48 ++++++++++++++++++++++-------------------------- main.py | 7 +++---- requirements.txt | 1 + 3 files changed, 26 insertions(+), 30 deletions(-) diff --git a/keyauth.py b/keyauth.py index 3987731..045bcf1 100644 --- a/keyauth.py +++ b/keyauth.py @@ -2,11 +2,10 @@ import json as jsond # json import time # sleep before exit import binascii # hex encoding -from uuid import uuid4 # gen random guid import platform # check platform import subprocess # needed for mac device -import hmac # signature checksum -import hashlib # signature checksum +from datetime import datetime +from discord_interactions import verify_key # used for signature verification try: if os.name == 'nt': @@ -28,11 +27,11 @@ class api: - name = ownerid = secret = version = hash_to_check = "" + name = ownerid = version = hash_to_check = "" - def __init__(self, name, ownerid, secret, version, hash_to_check): - if len(ownerid) != 10 and len(secret) != 64: - print("Go to Manage Applications on dashboard, copy python code, and replace code in main.py with that") + def __init__(self, name, ownerid, version, hash_to_check): + if len(ownerid) != 10: + print("Visit https://keyauth.cc/app/, copy Pthon code, and replace code in main.py with that") time.sleep(3) os._exit(1) @@ -40,8 +39,6 @@ def __init__(self, name, ownerid, secret, version, hash_to_check): self.ownerid = ownerid - self.secret = secret - self.version = version self.hash_to_check = hash_to_check self.init() @@ -54,16 +51,11 @@ def init(self): print("You've already initialized!") time.sleep(3) os._exit(1) - - sent_key = str(uuid4())[:16] - - self.enckey = sent_key + "-" + self.secret post_data = { "type": "init", "ver": self.version, "hash": self.hash_to_check, - "enckey": sent_key, "name": self.name, "ownerid": self.ownerid } @@ -96,9 +88,6 @@ def init(self): self.sessionid = json["sessionid"] self.initialized = True - - if json["newSession"]: - time.sleep(0.1) def register(self, user, password, license, hwid=None): self.checkinit() @@ -523,15 +512,23 @@ def logout(self): def __do_request(self, post_data): try: response = requests.post( - "https://keyauth.win/api/1.2/", data=post_data, timeout=10 + "https://keyauth.win/api/1.3/", data=post_data, timeout=10 ) - key = self.secret if post_data["type"] == "init" else self.enckey - if post_data["type"] == "log": return response.text - - client_computed = hmac.new(key.encode('utf-8'), response.text.encode('utf-8'), hashlib.sha256).hexdigest() + if post_data["type"] == "log" or post_data["type"] == "file": return response.text - signature = response.headers["signature"] + signature = response.headers["x-signature-ed25519"] + timestamp = response.headers["x-signature-timestamp"] + + unix_timestamp = int(timestamp) + # Get the current time + current_time = datetime.now().timestamp() + + # Check if the timestamp is older than 15 seconds + if current_time - unix_timestamp > 15: + print("Timestamp OLD") + time.sleep(3) + os._exit(1) if not os.path.exists("C:\\ProgramData\\KeyAuth"): os.makedirs("C:\\ProgramData\\KeyAuth") @@ -543,11 +540,10 @@ def __do_request(self, post_data): with open(f"C:\\ProgramData\\KeyAuth\\Debug\\{exe_name}\\log.txt", "a") as log_file: if len(response.text) <= 200: - tampered = not hmac.compare_digest(client_computed, signature) execution_time = time.strftime("%I:%M %p | %m/%d/%Y") - log_file.write(f"\n{execution_time} | {post_data['type']} \nResponse: {response.text}\n Was response tampered with? {tampered}\n") + log_file.write(f"\n{execution_time} | {post_data['type']} \nResponse: {response.text}") - if not hmac.compare_digest(client_computed, signature): + if not verify_key(response.text.encode('utf-8'), signature, timestamp, '5586b4bc69c7a4b487e4563a4cd96afd39140f919bd31cea7d1c6a1e8439422b'): print("Signature checksum failed. Request was tampered with or session ended most likely.") print("Response: " + response.text) time.sleep(3) diff --git a/main.py b/main.py index 06e7fac..8aaded8 100644 --- a/main.py +++ b/main.py @@ -46,10 +46,9 @@ def getchecksum(): keyauthapp = api( - name = "", - ownerid = "", - secret = "", - version = "1.0", + name = "", # Application Name + ownerid = "", # Owner ID + version = "1.0", # Application Version hash_to_check = getchecksum() ) diff --git a/requirements.txt b/requirements.txt index e2c27ec..1778876 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ requests pywin32 +discord-interactions From c975c47c3aba0042da657cd49353e05be24963db Mon Sep 17 00:00:00 2001 From: William Nelson Date: Sat, 12 Oct 2024 16:32:57 -0400 Subject: [PATCH 03/13] Security Update - by VaultCord.com --- keyauth.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyauth.py b/keyauth.py index 045bcf1..78e872d 100644 --- a/keyauth.py +++ b/keyauth.py @@ -524,8 +524,8 @@ def __do_request(self, post_data): # Get the current time current_time = datetime.now().timestamp() - # Check if the timestamp is older than 15 seconds - if current_time - unix_timestamp > 15: + # Check if the timestamp is older than 20 seconds + if current_time - unix_timestamp > 20: print("Timestamp OLD") time.sleep(3) os._exit(1) From f738bfd59aeb60aa7be1ffe9e8b53cf362d61868 Mon Sep 17 00:00:00 2001 From: William Nelson <83034852+wnelson03@users.noreply.github.com> Date: Thu, 17 Oct 2024 12:30:51 -0400 Subject: [PATCH 04/13] Update README.md --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b70c708..721a437 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ # KeyAuth-Python-Example : Please star 🌟 -KeyAuth Python example for the https://keyauth.cc authentication system. + +KeyAuth Python example SDK for https://keyauth.cc license key API auth. ## **Bugs** -If the default example not added to your software isn't functioning how it should, please report a bug here https://keyauth.cc/app/?page=forms +If you are using our example with no significant changes, and you are having problems, please Report Bug here https://keyauth.cc/app/?page=forms However, we do **NOT** provide support for adding KeyAuth to your project. If you can't figure this out you should use Google or YouTube to learn more about the programming language you want to sell a program in. @@ -29,6 +30,9 @@ Thank you for your compliance, we work hard on the development of KeyAuth and do KeyAuth is an Open source authentication system with cloud hosting plans as well. Client SDKs available for [C#](https://github.com/KeyAuth/KeyAuth-CSHARP-Example), [C++](https://github.com/KeyAuth/KeyAuth-CPP-Example), [Python](https://github.com/KeyAuth/KeyAuth-Python-Example), [Java](https://github.com/KeyAuth-Archive/KeyAuth-JAVA-api), [JavaScript](https://github.com/mazkdevf/KeyAuth-JS-Example), [VB.NET](https://github.com/KeyAuth/KeyAuth-VB-Example), [PHP](https://github.com/KeyAuth/KeyAuth-PHP-Example), [Rust](https://github.com/KeyAuth/KeyAuth-Rust-Example), [Go](https://github.com/mazkdevf/KeyAuth-Go-Example), [Lua](https://github.com/mazkdevf/KeyAuth-Lua-Examples), [Ruby](https://github.com/mazkdevf/KeyAuth-Ruby-Example), and [Perl](https://github.com/mazkdevf/KeyAuth-Perl-Example). KeyAuth has several unique features such as memory streaming, webhook function where you can send requests to API without leaking the API, discord webhook notifications, ban the user securely through the application at your discretion. Feel free to join https://t.me/keyauth if you have questions or suggestions. +> [!TIP] +> https://vaultcord.com FREE Discord bot to Backup server, members, channels, messages & more. Custom verify page, block alt accounts, VPNs & more. + ## **Customer connection issues?** This is common amongst all authentication systems. Program obfuscation causes false positives in virus scanners, and with the scale of KeyAuth this is perceived as a malicious domain. So, `keyauth.com` and `keyauth.win` have been blocked by many internet providers. for dashbord, reseller panel, customer panel, use `keyauth.cc` @@ -122,7 +126,7 @@ keyauthapp.register(user, password, license) Used so the user can add extra time to their account by claiming new key. -> **Warning** +> [!Warning] > No password is needed to upgrade account. So, unlike login, register, and license functions - you should **not** log user in after successful upgrade. ```py From 79031786c1ed29277bcbd2ce1944cd787a4bfffb Mon Sep 17 00:00:00 2001 From: William Nelson <83034852+wnelson03@users.noreply.github.com> Date: Thu, 17 Oct 2024 13:00:52 -0400 Subject: [PATCH 05/13] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 721a437..8a3cc9f 100644 --- a/README.md +++ b/README.md @@ -243,7 +243,7 @@ keyauthapp.logout() Tutorial video https://www.youtube.com/watch?v=ENRaNPPYJbc -> **Note** +> [!NOTE] > Read documentation for KeyAuth webhooks here https://keyauth.readme.io/reference/webhooks-1 Send HTTP requests to URLs securely without leaking the URL in your application. You should definitely use if you want to send requests to SellerAPI from your application, otherwise if you don't use you'll be leaking your seller key to everyone. And then someone can mess up your application. @@ -267,7 +267,7 @@ data = keyauthapp.webhook("7kR0UedlVI", "", "{\"content\": \"webhook message her ## **Download file** -> **Note** +> [!NOTE] > Read documentation for KeyAuth files here https://docs.keyauth.cc/website/dashboard/files Keep files secure by providing KeyAuth your file download link on the KeyAuth dashboard. Make sure this is a direct download link (as soon as you go to the link, it starts downloading without you clicking anything). The KeyAuth download function provides the bytes, and then you get to decide what to do with those. This example shows how to write it to a file named `text.txt` in the same folder as the program, though you could execute with RunPE or whatever you want. From 11cc4cf10ef4e6614180328951c174f93e709904 Mon Sep 17 00:00:00 2001 From: William Nelson Date: Tue, 22 Oct 2024 16:27:04 -0400 Subject: [PATCH 06/13] Fix timestamp check --- keyauth.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyauth.py b/keyauth.py index 78e872d..b11b4cd 100644 --- a/keyauth.py +++ b/keyauth.py @@ -522,7 +522,7 @@ def __do_request(self, post_data): unix_timestamp = int(timestamp) # Get the current time - current_time = datetime.now().timestamp() + current_time = int(datetime.utcnow().timestamp()) # Check if the timestamp is older than 20 seconds if current_time - unix_timestamp > 20: From 1b89725436ddef4dd986662739f8c24388f5b8d9 Mon Sep 17 00:00:00 2001 From: It's Networking Date: Fri, 15 Nov 2024 15:05:11 -0500 Subject: [PATCH 07/13] Fix for TIMESTAMP OLD error some users would receive --- keyauth.py | 57 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/keyauth.py b/keyauth.py index b11b4cd..0b66678 100644 --- a/keyauth.py +++ b/keyauth.py @@ -4,7 +4,7 @@ import binascii # hex encoding import platform # check platform import subprocess # needed for mac device -from datetime import datetime +from datetime import datetime, timedelta from discord_interactions import verify_key # used for signature verification try: @@ -512,44 +512,54 @@ def logout(self): def __do_request(self, post_data): try: response = requests.post( - "https://keyauth.win/api/1.3/", data=post_data, timeout=10 + "https://keyauth.win/api/1.3/", data=post_data, timeout=10 ) - - if post_data["type"] == "log" or post_data["type"] == "file": return response.text - - signature = response.headers["x-signature-ed25519"] - timestamp = response.headers["x-signature-timestamp"] - - unix_timestamp = int(timestamp) - # Get the current time - current_time = int(datetime.utcnow().timestamp()) - - # Check if the timestamp is older than 20 seconds - if current_time - unix_timestamp > 20: - print("Timestamp OLD") + + if post_data["type"] == "log" or post_data["type"] == "file": + return response.text + + # Get the signature and timestamp from the headers + signature = response.headers.get("x-signature-ed25519") + timestamp = response.headers.get("x-signature-timestamp") + + if not signature or not timestamp: + print("Missing headers for signature verification.") + time.sleep(3) + os._exit(1) + + server_time = datetime.utcfromtimestamp(int(timestamp)) + current_time = datetime.utcnow() + + buffer_seconds = 5 + time_difference = current_time - server_time + + if time_difference > timedelta(seconds=20 + buffer_seconds): + print("Timestamp is too old (exceeded 20 seconds + buffer).") time.sleep(3) os._exit(1) + # Proceed with creating debug folders and logging if not os.path.exists("C:\\ProgramData\\KeyAuth"): - os.makedirs("C:\\ProgramData\\KeyAuth") os.makedirs("C:\\ProgramData\\KeyAuth\\Debug") exe_name = os.path.basename(__file__) - if not os.path.exists(f"C:\\ProgramData\\KeyAuth\\Debug\\{exe_name}"): - os.makedirs(f"C:\\ProgramData\\KeyAuth\\Debug\\{exe_name}") + log_dir = f"C:\\ProgramData\\KeyAuth\\Debug\\{exe_name}" + if not os.path.exists(log_dir): + os.makedirs(log_dir) - with open(f"C:\\ProgramData\\KeyAuth\\Debug\\{exe_name}\\log.txt", "a") as log_file: + with open(f"{log_dir}\\log.txt", "a") as log_file: if len(response.text) <= 200: execution_time = time.strftime("%I:%M %p | %m/%d/%Y") log_file.write(f"\n{execution_time} | {post_data['type']} \nResponse: {response.text}") - + if not verify_key(response.text.encode('utf-8'), signature, timestamp, '5586b4bc69c7a4b487e4563a4cd96afd39140f919bd31cea7d1c6a1e8439422b'): print("Signature checksum failed. Request was tampered with or session ended most likely.") print("Response: " + response.text) time.sleep(3) - os._exit(1) - + os._exit(1) + return response.text + except requests.exceptions.Timeout: print("Request timed out. Server is probably down/slow at the moment") @@ -611,5 +621,4 @@ def get_hwid(): output = subprocess.Popen("ioreg -l | grep IOPlatformSerialNumber", stdout=subprocess.PIPE, shell=True).communicate()[0] serial = output.decode().split('=', 1)[1].replace(' ', '') hwid = serial[1:-2] - return hwid - + return hwid \ No newline at end of file From 40a896a6beb4da2f8c7c655d7faef71064a8be12 Mon Sep 17 00:00:00 2001 From: CodeGraph <87975966+Coolbossco@users.noreply.github.com> Date: Mon, 18 Nov 2024 10:18:05 -0500 Subject: [PATCH 08/13] Fixed .utcfromtimestamp() deprecation error --- main.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/main.py b/main.py index 8aaded8..02d918c 100644 --- a/main.py +++ b/main.py @@ -17,7 +17,7 @@ import os import hashlib from time import sleep -from datetime import datetime +from datetime import datetime, UTC # import json as jsond # ^^ only for auto login/json writing/reading @@ -173,15 +173,15 @@ def answer(): subs = keyauthapp.user_data.subscriptions # Get all Subscription names, expiry, and timeleft for i in range(len(subs)): sub = subs[i]["subscription"] # Subscription from every Sub - expiry = datetime.utcfromtimestamp(int(subs[i]["expiry"])).strftime( + expiry = datetime.fromtimestamp(int(subs[i]["expiry"]), UTC).strftime( '%Y-%m-%d %H:%M:%S') # Expiry date from every Sub timeleft = subs[i]["timeleft"] # Timeleft from every Sub print(f"[{i + 1} / {len(subs)}] | Subscription: {sub} - Expiry: {expiry} - Timeleft: {timeleft}") -print("Created at: " + datetime.utcfromtimestamp(int(keyauthapp.user_data.createdate)).strftime('%Y-%m-%d %H:%M:%S')) -print("Last login at: " + datetime.utcfromtimestamp(int(keyauthapp.user_data.lastlogin)).strftime('%Y-%m-%d %H:%M:%S')) -print("Expires at: " + datetime.utcfromtimestamp(int(keyauthapp.user_data.expires)).strftime('%Y-%m-%d %H:%M:%S')) +print("Created at: " + datetime.fromtimestamp(int(keyauthapp.user_data.createdate), UTC).strftime('%Y-%m-%d %H:%M:%S')) +print("Last login at: " + datetime.fromtimestamp(int(keyauthapp.user_data.lastlogin), UTC).strftime('%Y-%m-%d %H:%M:%S')) +print("Expires at: " + datetime.fromtimestamp(int(keyauthapp.user_data.expires), UTC).strftime('%Y-%m-%d %H:%M:%S')) print("\nExiting in five seconds..") sleep(5) os._exit(1) From ec1d376907baf4692ce9c7c78a70aebeb76a56b2 Mon Sep 17 00:00:00 2001 From: CodeGraph <87975966+Coolbossco@users.noreply.github.com> Date: Mon, 18 Nov 2024 11:05:08 -0500 Subject: [PATCH 09/13] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8a3cc9f..68dce63 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ For API, `keyauth.cc` will not work because I purposefully blocked it on there s You can either use Pyinstaller or Nuitka. Links: -- Nutika: https://nuitka.net/ +- Nuitka: https://nuitka.net/ - Pyinstaller: https://pyinstaller.org/ Pyinstaller: From a39741cc811bf0a1a1b14c547c4a9a14be0c9013 Mon Sep 17 00:00:00 2001 From: It's Networking Date: Thu, 19 Dec 2024 11:08:23 -0500 Subject: [PATCH 10/13] Two Factor Authentication Added --- keyauth.py | 123 ++++++++++++++++++++++++++++++++++++++++++----------- main.py | 44 +++++++++++++++---- 2 files changed, 132 insertions(+), 35 deletions(-) diff --git a/keyauth.py b/keyauth.py index 0b66678..4eb9558 100644 --- a/keyauth.py +++ b/keyauth.py @@ -4,8 +4,11 @@ import binascii # hex encoding import platform # check platform import subprocess # needed for mac device -from datetime import datetime, timedelta +import qrcode +from datetime import datetime, timezone, timedelta from discord_interactions import verify_key # used for signature verification +from PIL import Image + try: if os.name == 'nt': @@ -143,7 +146,7 @@ def upgrade(self, user, license): time.sleep(3) os._exit(1) - def login(self, user, password, hwid=None): + def login(self, user, password, code=None, hwid=None): self.checkinit() if hwid is None: hwid = others.get_hwid() @@ -155,8 +158,11 @@ def login(self, user, password, hwid=None): "hwid": hwid, "sessionid": self.sessionid, "name": self.name, - "ownerid": self.ownerid + "ownerid": self.ownerid, } + + if code is not None: + post_data["code"] = code response = self.__do_request(post_data) @@ -170,7 +176,7 @@ def login(self, user, password, hwid=None): time.sleep(3) os._exit(1) - def license(self, key, hwid=None): + def license(self, key, code=None, hwid=None): self.checkinit() if hwid is None: hwid = others.get_hwid() @@ -183,6 +189,9 @@ def license(self, key, hwid=None): "name": self.name, "ownerid": self.ownerid } + + if code is not None: + post_data["code"] = code response = self.__do_request(post_data) @@ -507,15 +516,87 @@ def logout(self): else: print(json["message"]) time.sleep(3) - os._exit(1) + os._exit(1) + + def enable2fa(self, code=None): + self.checkinit() + + post_data = { + "type": "2faenable", + "sessionid": self.sessionid, + "name": self.name, + "ownerid": self.ownerid, + "code": code + } + + response = self.__do_request(post_data) + + json = jsond.loads(response) + + if json["success"]: + if code is None: + # First request: Display the 2FA secret code + print(f"Your 2FA secret code is: {json['2fa']['secret_code']}") + qr_code = json['2fa']['QRCode'] + self.display_qr_code(qr_code) + code_input = input("Enter the 6 digit 2fa code to enable 2fa: ") + self.enable2fa(code_input); + else: + # Second request: Confirm successful 2FA activation + print("2FA has been successfully enabled!") + time.sleep(3) + else: + print(f"Error: {json['message']}") + time.sleep(3) + os._exit(1) + + def disable2fa(self, code=None): + self.checkinit() + + code = input("Enter the 6 digit 2fa code to disable 2fa: ") + + post_data = { + "type": "2fadisable", + "sessionid": self.sessionid, + "name": self.name, + "ownerid": self.ownerid, + "code": code + } + + response = self.__do_request(post_data) + + json = jsond.loads(response) + + print(json['message']) + time.sleep(3) + + + def display_qr_code(self, qr_code_url): + # Generate QR code image + qr = qrcode.QRCode( + version=1, + error_correction=qrcode.constants.ERROR_CORRECT_L, + box_size=10, + border=4, + ) + + # Add the QR code URL data + qr.add_data(qr_code_url) + qr.make(fit=True) + + # Create an image from the QR code + img = qr.make_image(fill='black', back_color='white') + + # Display the QR code image + img.show() def __do_request(self, post_data): try: response = requests.post( - "https://keyauth.win/api/1.3/", data=post_data, timeout=10 + "https://keyauth.win/api/1.3/", data=post_data, timeout=10 ) - if post_data["type"] == "log" or post_data["type"] == "file": + if post_data["type"] == "log" or post_data["type"] == "file" or post_data["type"] == "2faenable" or post_data["type"] == "2fadisable": return response.text # Get the signature and timestamp from the headers @@ -527,8 +608,12 @@ def __do_request(self, post_data): time.sleep(3) os._exit(1) - server_time = datetime.utcfromtimestamp(int(timestamp)) - current_time = datetime.utcnow() + server_time = datetime.fromtimestamp(int(timestamp), timezone.utc) + current_time = datetime.now(timezone.utc) + + #print(f"Server Timestamp (UTC seconds): {timestamp}") + #print(f"Server Time (UTC seconds): {server_time.timestamp()}") + #print(f"Current Time (UTC seconds): {current_time.timestamp()}") buffer_seconds = 5 time_difference = current_time - server_time @@ -538,31 +623,17 @@ def __do_request(self, post_data): time.sleep(3) os._exit(1) - # Proceed with creating debug folders and logging - if not os.path.exists("C:\\ProgramData\\KeyAuth"): - os.makedirs("C:\\ProgramData\\KeyAuth\\Debug") - - exe_name = os.path.basename(__file__) - log_dir = f"C:\\ProgramData\\KeyAuth\\Debug\\{exe_name}" - if not os.path.exists(log_dir): - os.makedirs(log_dir) - - with open(f"{log_dir}\\log.txt", "a") as log_file: - if len(response.text) <= 200: - execution_time = time.strftime("%I:%M %p | %m/%d/%Y") - log_file.write(f"\n{execution_time} | {post_data['type']} \nResponse: {response.text}") - if not verify_key(response.text.encode('utf-8'), signature, timestamp, '5586b4bc69c7a4b487e4563a4cd96afd39140f919bd31cea7d1c6a1e8439422b'): print("Signature checksum failed. Request was tampered with or session ended most likely.") - print("Response: " + response.text) time.sleep(3) os._exit(1) return response.text - except requests.exceptions.Timeout: + except requests.exceptions.Timeout: print("Request timed out. Server is probably down/slow at the moment") - + + class application_data_class: numUsers = numKeys = app_ver = customer_panel = onlineUsers = "" diff --git a/main.py b/main.py index 02d918c..6fc86d7 100644 --- a/main.py +++ b/main.py @@ -28,11 +28,12 @@ def clear(): if platform.system() == 'Windows': os.system('cls & title Python Example') # clear console, change title elif platform.system() == 'Linux': - os.system('clear') # clear console - sys.stdout.write("\x1b]0;Python Example\x07") # change title + os.system('clear') # Clear the terminal + sys.stdout.write("\033]0;Python Example\007") # Set terminal title + sys.stdout.flush() elif platform.system() == 'Darwin': - os.system("clear && printf '\e[3J'") # clear console - os.system('''echo - n - e "\033]0;Python Example\007"''') # change title + os.system("clear && printf '\033[3J'") # Clear terminal and scrollback + os.system('echo -n -e "\033]0;Python Example\007"') # Set terminal title print("Initializing") @@ -46,9 +47,9 @@ def getchecksum(): keyauthapp = api( - name = "", # Application Name - ownerid = "", # Owner ID - version = "1.0", # Application Version + name = "", # App name + ownerid = "", # Account ID + version = "", # Application version. Used for automatic downloads see video here https://www.youtube.com/watch?v=kW195PLCBKs hash_to_check = getchecksum() ) @@ -63,7 +64,8 @@ def answer(): if ans == "1": user = input('Provide username: ') password = input('Provide password: ') - keyauthapp.login(user, password) + code = input('Enter 2fa code: (not using 2fa? Just press enter)') + keyauthapp.login(user, password, code) elif ans == "2": user = input('Provide username: ') password = input('Provide password: ') @@ -75,7 +77,8 @@ def answer(): keyauthapp.upgrade(user, license) elif ans == "4": key = input('Enter your license: ') - keyauthapp.license(key) + code = input('Enter 2fa code: (not using 2fa? Just press enter)') + keyauthapp.license(key, code) else: print("\nInvalid option") sleep(1) @@ -164,7 +167,16 @@ def answer(): print(e) os._exit(1)''' +keyauthapp.fetchStats() +# Display Application Data +print("\nApplication data: ") +print("App Version: " + keyauthapp.app_data.app_ver) +print("Customer Panel Link: " + keyauthapp.app_data.customer_panel) +print("Number of Keys: " + keyauthapp.app_data.numKeys) +print("Number of Users: " + keyauthapp.app_data.numUsers) +print("Online Users: " + keyauthapp.app_data.onlineUsers) +# Display User Data print("\nUser data: ") print("Username: " + keyauthapp.user_data.username) print("IP address: " + keyauthapp.user_data.ip) @@ -182,6 +194,20 @@ def answer(): print("Created at: " + datetime.fromtimestamp(int(keyauthapp.user_data.createdate), UTC).strftime('%Y-%m-%d %H:%M:%S')) print("Last login at: " + datetime.fromtimestamp(int(keyauthapp.user_data.lastlogin), UTC).strftime('%Y-%m-%d %H:%M:%S')) print("Expires at: " + datetime.fromtimestamp(int(keyauthapp.user_data.expires), UTC).strftime('%Y-%m-%d %H:%M:%S')) + +# Two Factor Authentication +print("\nTwo Factor Authentication:") +print("1. Enable 2FA") +print("2. Disable 2FA") + +tfaans = input("Select Option: ") +if tfaans == "1": + keyauthapp.enable2fa() # You only need to call this once as it's called in the API file. +elif tfaans == "2": + keyauthapp.disable2fa() # You only need to call this once as it's called in the API file, and should ideally only need to be called once anyways. +else: + print("\nInvalid Option") + print("\nExiting in five seconds..") sleep(5) os._exit(1) From 0383ac005370aeee0fa86e85981b85df7f81ad50 Mon Sep 17 00:00:00 2001 From: It's Networking <87145183+Its-Networking@users.noreply.github.com> Date: Fri, 20 Dec 2024 17:20:55 -0500 Subject: [PATCH 11/13] Update README.md --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 68dce63..1ee9dc3 100644 --- a/README.md +++ b/README.md @@ -230,6 +230,22 @@ Function only works after login. keyauthapp.ban() ``` +## **Enable Two Factor Authentication (2fa)** + +Enable two factor authentication (2fa) on a client account. + +```py +keyauthapp.enable2fa() +``` + +## **Disable Two Factor Authentication (2fa)** + +Disable two factor authentication (2fa) on a client account. + +```py +keyauthapp.disable2fa() +``` + ## **Logout session** Logout the users session and close the application. From 12a6657b304dd5177e02aeff66a984adbf4e012a Mon Sep 17 00:00:00 2001 From: u8ej1337 Date: Sun, 12 Jan 2025 09:06:46 -0500 Subject: [PATCH 12/13] you forgot to add requirements for the qrcode stuff. --- requirements.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/requirements.txt b/requirements.txt index 1778876..b57953d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,5 @@ requests pywin32 discord-interactions +qrcode +pillow From fd663900d7c7aa637ecc4df6652d927c1d300a86 Mon Sep 17 00:00:00 2001 From: It's Networking <87145183+Its-Networking@users.noreply.github.com> Date: Sat, 13 Dec 2025 17:03:22 -0500 Subject: [PATCH 13/13] Revise KeyAuth description for clarity and impact --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1ee9dc3..82cdd14 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Thank you for your compliance, we work hard on the development of KeyAuth and do ## **What is KeyAuth?** -KeyAuth is an Open source authentication system with cloud hosting plans as well. Client SDKs available for [C#](https://github.com/KeyAuth/KeyAuth-CSHARP-Example), [C++](https://github.com/KeyAuth/KeyAuth-CPP-Example), [Python](https://github.com/KeyAuth/KeyAuth-Python-Example), [Java](https://github.com/KeyAuth-Archive/KeyAuth-JAVA-api), [JavaScript](https://github.com/mazkdevf/KeyAuth-JS-Example), [VB.NET](https://github.com/KeyAuth/KeyAuth-VB-Example), [PHP](https://github.com/KeyAuth/KeyAuth-PHP-Example), [Rust](https://github.com/KeyAuth/KeyAuth-Rust-Example), [Go](https://github.com/mazkdevf/KeyAuth-Go-Example), [Lua](https://github.com/mazkdevf/KeyAuth-Lua-Examples), [Ruby](https://github.com/mazkdevf/KeyAuth-Ruby-Example), and [Perl](https://github.com/mazkdevf/KeyAuth-Perl-Example). KeyAuth has several unique features such as memory streaming, webhook function where you can send requests to API without leaking the API, discord webhook notifications, ban the user securely through the application at your discretion. Feel free to join https://t.me/keyauth if you have questions or suggestions. +KeyAuth is a powerful cloud-based authentication system designed to protect your software from piracy and unauthorized access. With KeyAuth, you can implement secure licensing, user management, and subscription systems in minutes. Client SDKs available for [C#](https://github.com/KeyAuth/KeyAuth-CSHARP-Example), [C++](https://github.com/KeyAuth/KeyAuth-CPP-Example), [Python](https://github.com/KeyAuth/KeyAuth-Python-Example), [Java](https://github.com/KeyAuth-Archive/KeyAuth-JAVA-api), [JavaScript](https://github.com/mazkdevf/KeyAuth-JS-Example), [VB.NET](https://github.com/KeyAuth/KeyAuth-VB-Example), [PHP](https://github.com/KeyAuth/KeyAuth-PHP-Example), [Rust](https://github.com/KeyAuth/KeyAuth-Rust-Example), [Go](https://github.com/mazkdevf/KeyAuth-Go-Example), [Lua](https://github.com/mazkdevf/KeyAuth-Lua-Examples), [Ruby](https://github.com/mazkdevf/KeyAuth-Ruby-Example), and [Perl](https://github.com/mazkdevf/KeyAuth-Perl-Example). KeyAuth has several unique features such as memory streaming, webhook function where you can send requests to API without leaking the API, discord webhook notifications, ban the user securely through the application at your discretion. Feel free to join https://t.me/keyauth if you have questions or suggestions. > [!TIP] > https://vaultcord.com FREE Discord bot to Backup server, members, channels, messages & more. Custom verify page, block alt accounts, VPNs & more.