(20241128) Serving HTML on redirect.

This commit is contained in:
2024-11-28 19:27:56 +05:30
parent de78d58e2c
commit 7241bd977f
5 changed files with 187 additions and 53 deletions
+16 -9
View File
@@ -40,7 +40,7 @@ sys.path.append(".")
sys.path.append("..") sys.path.append("..")
# For using Quart: # For using Quart:
from quart import Blueprint, current_app, request from quart import Blueprint, current_app, request, render_template
# My utils: # My utils:
from utils_v2.string import json from utils_v2.string import json
@@ -133,6 +133,7 @@ async def mail_callback(
""" """
Use this when authorizing access to someone's GMail account. This can be used to capture the authentication token. Use this when authorizing access to someone's GMail account. This can be used to capture the authentication token.
:param mail_client: The mail company/brand that you want the authorization from.
:param inbound_headers: auto-extracted by the decorators. :param inbound_headers: auto-extracted by the decorators.
:param inbound_data: auto-extracted by the decorators. :param inbound_data: auto-extracted by the decorators.
:param inbound_files: auto-extracted by the decorators. :param inbound_files: auto-extracted by the decorators.
@@ -173,14 +174,20 @@ async def mail_callback(
# ┛┗┗ ┛┣┛┗┛┛┗┛┗ # ┛┗┗ ┛┣┛┗┛┛┗┛┗
# ┛ # ┛
# Return a success response: # # Return a response:
return ResponseModel( # return ResponseModel(
status_code = StatusCodes.OK if tokens_saved else StatusCodes.FAILED, # status_code = StatusCodes.OK if tokens_saved else StatusCodes.FAILED,
http_code = HttpCodes.SUCCESS if tokens_saved else HttpCodes.INTERNAL_SERVER_ERROR, # http_code = HttpCodes.SUCCESS if tokens_saved else HttpCodes.INTERNAL_SERVER_ERROR,
data = { # data = {
"mailClient": mail_client, # "mailClient": mail_client,
"authorized": True # "authorized": True
} # }
# )
# Return a page that shows you the status of your authorization:
return await render_template(
"/mail/oauth/oauth_success.html" if tokens_saved else "/mail/oauth/oauth_failure.html",
mail_client = mail_client.title()
) )
+16 -43
View File
@@ -40,7 +40,7 @@ sys.path.append(".")
sys.path.append("..") sys.path.append("..")
# For using Quart: # For using Quart:
from quart import Blueprint, current_app, request from quart import Blueprint, current_app, request, render_template
# My utils: # My utils:
from utils_v2.string import json from utils_v2.string import json
@@ -65,6 +65,9 @@ from shared import constants
# For asynchronous activities: # For asynchronous activities:
import asyncio import asyncio
# For random choices:
import random
# ***************************************************************************************************************** # *****************************************************************************************************************
# ***** **** # ***** ****
@@ -127,48 +130,18 @@ async def callback_test(
**kwargs **kwargs
): ):
""" # Return a random page:
This URL does nothing, just captures data on webhooks and logs it for documentation. return await render_template(
:param inbound_headers: auto-extracted by the decorators. random.choice([
:param inbound_data: auto-extracted by the decorators. r"/mail/oauth/oauth_success.html",
:param inbound_files: auto-extracted by the decorators. r"/mail/oauth/oauth_failure.html"
:param kwargs: Any number of extra inputs supplied by the decorators. ]),
:return: A standard response structure. mail_client = random.choice([
""" "GMail",
"Outlook",
# Construct a message: "WhatsApp",
message = "🪝 *WEBHOOK/CALLBACK ALERT!* 🪝\n\n" "Telegram"
message += f"Method: *{request.method}*\nLog Id.: `{kwargs.get('log_id')}`\n\n" ])
message += "*Headers:*\n```json\n"
message += json.to_string({k: v for k, v in request.headers.items()})
message += "\n```\n"
message += "*Query Args:*\n```json\n"
message += json.to_string(request.args.to_dict())
message += "\n```\n"
message += "*JSON:*\n```json\n"
message += json.to_string(await request.get_json())
message += "\n```\n"
message += "*Form-Data:*\n```json\n"
message += json.to_string((await request.form).to_dict())
message += "\n```\n"
message += "*Form-Files:*\n```json\n"
message += json.to_string(inbound_files, default = str)
message += "\n```\n"
# Send a message on Telegram:
api_response = await current_app.http_client.post(
url = current_app.script_data["alerts"]["url"],
json = {
"message": message,
"type": "info",
"chatId": "1275560043" # ... KPS
}
)
# Return a success response:
return ResponseModel(
status_code = StatusCodes.OK,
data = {"accepted": True}
) )
+1 -1
View File
@@ -104,7 +104,7 @@ APP_VERSION = constants.APP_VERSION
# The Quart app: # The Quart app:
app = Quart(__name__) app = Quart(__name__, template_folder = r"../views")
app = cors(app) app = cors(app)
app.register_blueprint(mail_oauth_bp, url_prefix = f"/{MODULE_BASE}/mail") app.register_blueprint(mail_oauth_bp, url_prefix = f"/{MODULE_BASE}/mail")
app.register_blueprint(mail_callback_bp, url_prefix = f"/{MODULE_BASE}/mail") app.register_blueprint(mail_callback_bp, url_prefix = f"/{MODULE_BASE}/mail")
+77
View File
@@ -0,0 +1,77 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Authorization Failed</title>
<style>
/* General reset and basic styles */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Arial', sans-serif;
background-color: #f4f7fc; /* Light grayish-blue */
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
padding: 20px;
}
.message-container {
background-color: #fff; /* White background */
border-radius: 16px;
padding: 35px;
max-width: 400px;
text-align: center;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
color: #333; /* Dark text color */
}
h1 {
font-size: 24px;
color: #F44336; /* Red color for failure */
margin-bottom: 10px;
}
p {
font-size: 16px;
color: #666; /* Light gray text */
margin-bottom: 20px;
}
.icon {
font-size: 48px;
color: #F44336; /* Red for the error icon */
margin-bottom: 20px;
}
/* Responsive styles */
@media (max-width: 600px) {
.message-container {
padding: 20px;
}
h1 {
font-size: 20px;
}
p {
font-size: 14px;
}
}
</style>
</head>
<body>
<div class="message-container">
<div class="icon"></div> <!-- Cross icon for failure -->
<h1>Authorization Failed</h1>
<p>Something went wrong in getting authorization from your {{ mail_client }} account. Please feel free to try the same steps again. You can close this tab at any time.</p>
</div>
</body>
</html>
+77
View File
@@ -0,0 +1,77 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Authorization Successful</title>
<style>
/* General reset and basic styles */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Arial', sans-serif;
background-color: #f4f7fc; /* Light grayish-blue */
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
padding: 20px;
}
.message-container {
background-color: #fff; /* White background */
border-radius: 16px;
padding: 35px;
max-width: 400px;
text-align: center;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
color: #333; /* Dark text color */
}
h1 {
font-size: 24px;
color: #4CAF50; /* Green color for success */
margin-bottom: 10px;
}
p {
font-size: 16px;
color: #666; /* Light gray text */
margin-bottom: 20px;
}
.icon {
font-size: 48px;
color: #4CAF50; /* Same green as the heading */
margin-bottom: 20px;
}
/* Responsive styles */
@media (max-width: 600px) {
.message-container {
padding: 20px;
}
h1 {
font-size: 20px;
}
p {
font-size: 14px;
}
}
</style>
</head>
<body>
<div class="message-container">
<div class="icon"></div> <!-- Checkmark icon -->
<h1>Authorization Successful</h1>
<p>We have received authorization from your {{ mail_client }} account. You can close this tab at any time.</p>
</div>
</body>
</html>