Skip to content

Commit a32003c

Browse files
henrylove0claude
andcommitted
feat(erp): route login through GoTrue + finish Exe Foundry Bold branding
GoTrue: login form posts to /api/auth/gotrue-login when GOTRUE_URL configured (falls back to stock login otherwise); auto-provisioned users are System Users; response normalized to Frappe 'Logged In' flow; GOTRUE_ADMIN_TOKEN wired through entrypoint.sh + docker-compose.yml. Branding: replaced remaining stock ERPNext logo/favicon/splash/email/manifest/ desktop-icon refs with Exe assets (#0F0E1A/#F5D76E, Epilogue/Manrope/Space Grotesk); login.bundle.scss confirmed bundled. Follow-up: full JWT/JWKS SSO middleware. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent cbb6dfd commit a32003c

8 files changed

Lines changed: 40 additions & 10 deletions

File tree

apps/erpnext/erpnext/desktop_icon/erpnext.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"label": "ERPNext",
1010
"link": "/app/home",
1111
"link_type": "External",
12-
"logo_url": "/assets/erpnext/images/erpnext-logo.svg",
12+
"logo_url": "/assets/frappe/images/exe-erp-logo.svg",
1313
"modified": "2025-11-17 16:33:37.520201",
1414
"modified_by": "Administrator",
1515
"name": "ERPNext",

apps/erpnext/erpnext/exe_auth/api.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,16 @@
1111
Configuration (site_config.json):
1212
{
1313
"gotrue_url": "http://gotrue:9999",
14-
"exe_admin_token": "your-secret-token"
14+
"exe_admin_token": "your-secret-token",
15+
"gotrue_admin_token": "your-service-role-key"
1516
}
1617
"""
1718

1819
import hmac
1920
import os
2021
import frappe
2122
import requests
23+
from frappe.website.utils import get_home_page
2224
from frappe.rate_limiter import rate_limit
2325

2426

@@ -77,7 +79,7 @@ def gotrue_login(email=None, password=None, workspace_name=None):
7779
"email": email,
7880
"first_name": first_name,
7981
"enabled": 1,
80-
"user_type": "Website User",
82+
"user_type": "System User",
8183
}
8284
)
8385
user_doc.flags.ignore_permissions = True
@@ -107,8 +109,10 @@ def gotrue_login(email=None, password=None, workspace_name=None):
107109

108110
return {
109111
"success": True,
112+
"message": "Logged In",
110113
"user": email,
111114
"sid": frappe.session.sid,
115+
"home_page": get_home_page() or "/desk",
112116
}
113117

114118

@@ -134,7 +138,9 @@ def admin_token(token=None):
134138

135139
return {
136140
"success": True,
141+
"message": "Logged In",
137142
"user": "Administrator",
138143
"sid": frappe.session.sid,
144+
"home_page": get_home_page() or "/desk",
139145
"isAdminToken": True,
140146
}

apps/erpnext/erpnext/hooks.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
app_email = "support@askexe.com"
88
app_license = "GNU General Public License (v3)"
99
source_link = "https://github.com/AskExe/exe-erp"
10-
app_logo_url = "/assets/erpnext/images/erpnext-logo.svg" # TODO: replace with Exe logo
10+
app_logo_url = "/assets/frappe/images/exe-erp-logo.svg"
1111
app_home = "/desk"
1212

1313
add_to_apps_screen = [
1414
{
1515
"name": app_name,
16-
"logo": "/assets/erpnext/images/erpnext-logo.svg",
16+
"logo": "/assets/frappe/images/exe-erp-logo.svg",
1717
"title": app_title,
1818
"route": app_home,
1919
"has_permission": "erpnext.check_app_permission",
@@ -115,8 +115,8 @@
115115
website_generators = ["BOM", "Sales Partner"]
116116

117117
website_context = {
118-
"favicon": "/assets/erpnext/images/erpnext-favicon.svg",
119-
"splash_image": "/assets/erpnext/images/erpnext-logo.svg",
118+
"favicon": "/assets/frappe/images/exe-erp-favicon.svg",
119+
"splash_image": "/assets/frappe/images/exe-erp-splash.svg",
120120
}
121121

122122
# Exe ERP — GoTrue SSO endpoints
@@ -534,7 +534,7 @@
534534
],
535535
}
536536

537-
email_brand_image = "assets/erpnext/images/erpnext-logo.jpg"
537+
email_brand_image = "assets/frappe/images/exe-erp-logo.svg"
538538

539539
default_mail_footer = """
540540
<span>

apps/erpnext/erpnext/public/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
"background_color": "#0F0E1A",
77
"theme_color": "#F5D76E",
88
"icons": [
9-
{"src": "/assets/erpnext/images/erpnext-logo.svg", "sizes": "any", "type": "image/svg+xml"}
9+
{"src": "/assets/frappe/images/exe-erp-logo.svg", "sizes": "any", "type": "image/svg+xml"}
1010
]
1111
}

docker-compose.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ services:
2424
EXE_ERP_ADMIN_TOKEN: ${EXE_ERP_ADMIN_TOKEN:-}
2525
EXE_ADMIN_TOKEN: ${EXE_ADMIN_TOKEN:-}
2626
GOTRUE_URL: ${GOTRUE_URL:-}
27+
GOTRUE_ADMIN_TOKEN: ${GOTRUE_ADMIN_TOKEN:-}
2728
volumes:
2829
- erp-sites:/home/frappe/frappe-bench/sites
2930
networks:
@@ -56,6 +57,7 @@ services:
5657
EXE_ERP_ADMIN_TOKEN: ${EXE_ERP_ADMIN_TOKEN:-}
5758
EXE_ADMIN_TOKEN: ${EXE_ADMIN_TOKEN:-}
5859
GOTRUE_URL: ${GOTRUE_URL:-}
60+
GOTRUE_ADMIN_TOKEN: ${GOTRUE_ADMIN_TOKEN:-}
5961
ports:
6062
- "127.0.0.1:8069:8000"
6163
volumes:

entrypoint.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,9 @@ try:
160160
_admin_token = '${EXE_ERP_ADMIN_TOKEN:-}' or '${EXE_ADMIN_TOKEN:-}'
161161
if _admin_token:
162162
config['exe_admin_token'] = _admin_token
163+
_gotrue_admin_token = '${GOTRUE_ADMIN_TOKEN:-}'
164+
if _gotrue_admin_token:
165+
config['gotrue_admin_token'] = _gotrue_admin_token
163166
with open('${site_config}', 'w') as f:
164167
json.dump(config, f, indent=2)
165168
print('GoTrue SSO configured in site_config.json')

frappe/templates/includes/login/login.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
window.disable_signup = {{ disable_signup and "true" or "false" }};
55
window.show_footer_on_login = {{ show_footer_on_login and "true" or "false" }};
6+
window.gotrue_login_enabled = {{ gotrue_login_enabled and "true" or "false" }};
67

78
window.login = {};
89

@@ -23,7 +24,18 @@ login.bind_events = function () {
2324
frappe.msgprint("{{ _('Both login and password required') | striptags | e }}");
2425
return false;
2526
}
26-
login.call(args, null, "/api/method/login");
27+
if (window.gotrue_login_enabled) {
28+
login.call(
29+
{
30+
email: args.usr,
31+
password: args.pwd,
32+
},
33+
null,
34+
"/api/auth/gotrue-login"
35+
);
36+
} else {
37+
login.call(args, null, "/api/method/login");
38+
}
2739
return false;
2840
});
2941

@@ -222,6 +234,12 @@ login.login_handlers = (function () {
222234

223235
var login_handlers = {
224236
200: function (data) {
237+
var gotrue_response = data.message && typeof data.message === "object" ? data.message : data;
238+
if (gotrue_response && gotrue_response.success) {
239+
data.message = "Logged In";
240+
data.home_page = gotrue_response.home_page || data.home_page || "/desk";
241+
}
242+
225243
if (data.message == 'Logged In') {
226244
login.set_status({{ _("Success") | tojson }}, 'green');
227245
document.body.innerHTML = `{% include "templates/includes/splash_screen.html" %}`;

frappe/www/login.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ def get_context(context):
4545
context["disable_signup"] = cint(frappe.get_website_settings("disable_signup"))
4646
context["show_footer_on_login"] = cint(frappe.get_website_settings("show_footer_on_login"))
4747
context["disable_user_pass_login"] = cint(frappe.get_system_settings("disable_user_pass_login"))
48+
context["gotrue_login_enabled"] = bool(frappe.conf.get("gotrue_url"))
4849
context["logo"] = get_app_logo()
4950
context["app_name"] = (
5051
frappe.get_website_settings("app_name") or frappe.get_system_settings("app_name") or _("Exe ERP")

0 commit comments

Comments
 (0)