From 3ed49fae0dc3197d3c50c1a443e77cddff83a314 Mon Sep 17 00:00:00 2001
From: Face <69168154+face-hh@users.noreply.github.com>
Date: Sat, 16 Aug 2025 19:26:52 +0300
Subject: [PATCH] domain dashboard, hidden css prop, fix bugs
---
dns/frontend/dashboard.html | 112 +++++-
dns/frontend/dashboard.lua | 364 ++++++++++++++++++
dns/frontend/script.lua | 10 +-
flumi/Scripts/B9/CSSParser.gd | 4 +
flumi/Scripts/B9/HTMLParser.gd | 6 +-
flumi/Scripts/StyleManager.gd | 6 +
flumi/Scripts/Utils/Lua/Network.gd | 24 ++
flumi/Scripts/Utils/URLUtils.gd | 9 +-
flumi/Scripts/main.gd | 2 +
.../gurt-protocol/bin/windows/gurt_godot.dll | Bin 4692480 -> 4692992 bytes
protocol/library/src/client.rs | 37 +-
tests/dom-utils.html | 6 +-
12 files changed, 561 insertions(+), 19 deletions(-)
create mode 100644 dns/frontend/dashboard.lua
diff --git a/dns/frontend/dashboard.html b/dns/frontend/dashboard.html
index 2e75510..044b754 100644
--- a/dns/frontend/dashboard.html
+++ b/dns/frontend/dashboard.html
@@ -1,10 +1,114 @@
- Login
+ Domain Dashboard
-
-
+
+
+
+
+
+
- todo
+ 🌐 Domain Management Dashboard
+
+
+
+
+
+
Register New Domain
+
+
+
+
+
+
+
+ Loading TLDs...
+
+
+
+
+
+
+
+
+
+
+
+
Invite System
+
Create invite codes to share with friends, or redeem codes to get more domain registrations.
+
+
+
+
Create Invite
+
+
+
+
Redeem Invite
+
+
+
+
+
+
+
+
+
+
+
My Domains
+
+ Loading domains...
+
+
+
+
+
+
+
+
+
Invite Code Generated
+
Share this code with friends to give them 3 additional domain registrations:
+
+ Loading...
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dns/frontend/dashboard.lua b/dns/frontend/dashboard.lua
new file mode 100644
index 0000000..197ff38
--- /dev/null
+++ b/dns/frontend/dashboard.lua
@@ -0,0 +1,364 @@
+local user = nil
+local domains = {}
+local tlds = {}
+local authToken = nil
+
+local userInfo = gurt.select('#user-info')
+local domainsList = gurt.select('#domains-list')
+local logArea = gurt.select('#log-area')
+local inviteModal = gurt.select('#invite-modal')
+local tldSelector = gurt.select('#tld-selector')
+
+local logMessages = {}
+
+local function addLog(message)
+ table.insert(logMessages, Time.format(Time.now(), '%H:%M:%S') .. ' - ' .. message)
+ if #logMessages > 50 then
+ table.remove(logMessages, 1)
+ end
+ logArea.text = table.concat(logMessages, '\n')
+end
+
+local function showError(elementId, message)
+ local element = gurt.select('#' .. elementId)
+
+ element.text = message
+ element.classList:remove('hidden')
+end
+
+local function hideError(elementId)
+ local element = gurt.select('#' .. elementId)
+
+ element.classList:add('hidden')
+end
+
+local function showModal(modalId)
+ local modal = gurt.select('#' .. modalId)
+
+ modal.classList:remove('hidden')
+end
+
+local function hideModal(modalId)
+ local modal = gurt.select('#' .. modalId)
+
+ modal.classList:add('hidden')
+end
+
+local function makeRequest(url, options)
+ options = options or {}
+ if authToken then
+ options.headers = options.headers or {}
+ options.headers.Authorization = 'Bearer ' .. authToken
+ end
+ return fetch(url, options)
+end
+
+local function checkAuth()
+ authToken = gurt.crumbs.get("auth_token")
+
+ if authToken then
+ addLog('Found auth token, checking validity...')
+ local response = makeRequest('gurt://localhost:4878/auth/me')
+ print(table.tostring(response))
+ if response:ok() then
+ user = response:json()
+ addLog('Authentication successful for user: ' .. user.username)
+ updateUserInfo()
+ loadDomains()
+ loadTLDs()
+ else
+ addLog('Token invalid, redirecting to login...')
+ --gurt.crumbs.delete('auth_token')
+ --gurt.location.goto('../')
+ end
+ else
+ addLog('No auth token found, redirecting to login...')
+ gurt.location.goto('../')
+ end
+end
+
+local function logout()
+ gurt.crumbs.delete('auth_token')
+ addLog('Logged out successfully')
+ gurt.location.goto("../")
+end
+
+local function loadDomains()
+ addLog('Loading domains...')
+ local response = makeRequest('gurt://localhost:4878/domains?page=1&size=100')
+
+ if response:ok() then
+ local data = response:json()
+ domains = data.domains or {}
+ addLog('Loaded ' .. #domains .. ' domains')
+ renderDomains()
+ else
+ addLog('Failed to load domains: ' .. response:text())
+ end
+end
+
+local function loadTLDs()
+ addLog('Loading available TLDs...')
+ local response = fetch('gurt://localhost:4878/tlds')
+
+ if response:ok() then
+ tlds = response:json()
+ addLog('Loaded ' .. #tlds .. ' TLDs')
+ renderTLDSelector()
+ else
+ addLog('Failed to load TLDs: ' .. response:text())
+ end
+end
+
+local function submitDomain(name, tld, ip)
+ hideError('domain-error')
+ addLog('Submitting domain: ' .. name .. '.' .. tld)
+
+ local response = makeRequest('gurt://localhost:4878/domain', {
+ method = 'POST',
+ headers = { ['Content-Type'] = 'application/json' },
+ body = JSON.stringify({ name = name, tld = tld, ip = ip })
+ })
+
+ if response:ok() then
+ local data = response:json()
+ addLog('Domain submitted successfully: ' .. data.domain)
+
+ -- Update user registrations remaining
+ user.registrations_remaining = user.registrations_remaining - 1
+ updateUserInfo()
+
+ -- Clear form
+ gurt.select('#domain-name').text = ''
+ gurt.select('#domain-ip').text = ''
+
+ -- Refresh domains list
+ loadDomains()
+ else
+ local error = response:text()
+ showError('domain-error', 'Domain submission failed: ' .. error)
+ addLog('Domain submission failed: ' .. error)
+ end
+end
+
+local function createInvite()
+ addLog('Creating invite code...')
+ local response = makeRequest('gurt://localhost:4878/auth/invite', { method = 'POST' })
+
+ if response:ok() then
+ local data = response:json()
+ local inviteCode = data.invite_code
+ gurt.select('#invite-code-display').text = inviteCode
+ addLog('Invite code created: ' .. inviteCode)
+ showModal('invite-modal')
+ else
+ addLog('Failed to create invite: ' .. response:text())
+ end
+end
+
+local function redeemInvite(code)
+ hideError('redeem-error')
+ addLog('Redeeming invite code: ' .. code)
+
+ local response = makeRequest('gurt://localhost:4878/auth/redeem-invite', {
+ method = 'POST',
+ headers = { ['Content-Type'] = 'application/json' },
+ body = JSON.stringify({ invite_code = code })
+ })
+
+ if response:ok() then
+ local data = response:json()
+ addLog('Invite redeemed: +' .. data.registrations_added .. ' registrations')
+
+ -- Update user info
+ user.registrations_remaining = user.registrations_remaining + data.registrations_added
+ updateUserInfo()
+
+ -- Clear form
+ gurt.select('#invite-code-input').text = ''
+ else
+ local error = response:text()
+ showError('redeem-error', 'Failed to redeem invite: ' .. error)
+ addLog('Failed to redeem invite: ' .. error)
+ end
+end
+
+-- UI rendering functions
+local function updateUserInfo()
+ if user then
+ userInfo.text = 'Welcome, ' .. user.username .. ' | Registrations remaining: ' .. user.registrations_remaining
+ end
+end
+
+local function renderTLDSelector()
+ tldSelector.text = ''
+ for i, tld in ipairs(tlds) do
+ local option = gurt.create('div', {
+ text = '.' .. tld,
+ style = 'tld-option',
+ ['data-tld'] = tld
+ })
+
+ option:on('click', function()
+ -- Clear previous selection
+ local options = gurt.selectAll('.tld-option')
+ for j = 1, #options do
+ options[j].classList:remove('tld-selected')
+ end
+
+ -- Select this option
+ option.classList:add('tld-selected')
+ end)
+
+ tldSelector:append(option)
+ end
+end
+
+local function renderDomains()
+ domainsList.text = ''
+
+ if #domains == 0 then
+ local emptyMessage = gurt.create('div', {
+ text = 'No domains registered yet. Submit your first domain below!',
+ style = 'text-center text-[#6b7280] py-8'
+ })
+ domainsList:append(emptyMessage)
+ return
+ end
+
+ for i, domain in ipairs(domains) do
+ local domainItem = gurt.create('div', {
+ style = 'domain-item'
+ })
+
+ local domainInfo = gurt.create('div', {})
+
+ local domainName = gurt.create('div', {
+ text = domain.name .. '.' .. domain.tld,
+ style = 'font-bold text-lg'
+ })
+
+ local domainIP = gurt.create('div', {
+ text = 'IP: ' .. domain.ip,
+ style = 'text-[#6b7280]'
+ })
+
+ domainInfo:append(domainName)
+ domainInfo:append(domainIP)
+
+ local actions = gurt.create('div', {
+ style = 'flex gap-2'
+ })
+
+ -- Update IP button
+ local updateBtn = gurt.create('button', {
+ text = 'Update IP',
+ style = 'secondary-btn'
+ })
+
+ updateBtn:on('click', function()
+ local newIP = prompt('Enter new IP address for ' .. domain.name .. '.' .. domain.tld .. ':')
+ if newIP and newIP ~= '' then
+ updateDomainIP(domain.name, domain.tld, newIP)
+ end
+ end)
+
+ -- Delete button
+ local deleteBtn = gurt.create('button', { text = 'Delete', style = 'danger-btn' })
+
+ deleteBtn:on('click', function()
+ if confirm('Are you sure you want to delete ' .. domain.name .. '.' .. domain.tld .. '?') then
+ deleteDomain(domain.name, domain.tld)
+ end
+ end)
+
+ actions:append(updateBtn)
+ actions:append(deleteBtn)
+
+ domainItem:append(domainInfo)
+ domainItem:append(actions)
+ domainsList:append(domainItem)
+ end
+end
+
+local function updateDomainIP(name, tld, ip)
+ addLog('Updating IP for ' .. name .. '.' .. tld .. ' to ' .. ip)
+
+ local response = makeRequest('gurt://localhost:4878/domain/' .. name .. '/' .. tld, {
+ method = 'PUT',
+ headers = { ['Content-Type'] = 'application/json' },
+ body = JSON.stringify({ ip = ip })
+ })
+
+ if response:ok() then
+ addLog('Domain IP updated successfully')
+ loadDomains()
+ else
+ addLog('Failed to update domain IP: ' .. response:text())
+ end
+end
+
+local function deleteDomain(name, tld)
+ addLog('Deleting domain: ' .. name .. '.' .. tld)
+
+ local response = makeRequest('gurt://localhost:4878/domain/' .. name .. '/' .. tld, {
+ method = 'DELETE'
+ })
+
+ if response:ok() then
+ addLog('Domain deleted successfully')
+ loadDomains()
+ else
+ addLog('Failed to delete domain: ' .. response:text())
+ end
+end
+
+-- Event handlers
+gurt.select('#logout-btn'):on('click', logout)
+
+gurt.select('#submit-domain-btn'):on('click', function()
+ local name = gurt.select('#domain-name').text
+ local ip = gurt.select('#domain-ip').text
+ local selectedTLD = gurt.select('.tld-selected')
+
+ if not name or name == '' then
+ showError('domain-error', 'Domain name is required')
+ return
+ end
+
+ if not ip or ip == '' then
+ showError('domain-error', 'IP address is required')
+ return
+ end
+
+ if not selectedTLD then
+ showError('domain-error', 'Please select a TLD')
+ return
+ end
+
+ local tld = selectedTLD:getAttribute('data-tld')
+ submitDomain(name, tld, ip)
+end)
+
+gurt.select('#create-invite-btn'):on('click', createInvite)
+
+gurt.select('#redeem-invite-btn'):on('click', function()
+ local code = gurt.select('#invite-code-input').text
+ if code and code ~= '' then
+ redeemInvite(code)
+ end
+end)
+
+gurt.select('#close-invite-modal'):on('click', function()
+ hideModal('invite-modal')
+end)
+
+gurt.select('#copy-invite-code'):on('click', function()
+ local inviteCode = gurt.select('#invite-code-display').text
+ Clipboard.write(inviteCode)
+ addLog('Invite code copied to clipboard')
+end)
+
+-- Initialize
+addLog('Dashboard initialized')
+checkAuth()
\ No newline at end of file
diff --git a/dns/frontend/script.lua b/dns/frontend/script.lua
index b9f4bdd..e799fd9 100644
--- a/dns/frontend/script.lua
+++ b/dns/frontend/script.lua
@@ -18,7 +18,7 @@ submitBtn:on('submit', function(event)
password = password
})
print(request_body)
- local url = 'http://localhost:8080/auth/login'
+ local url = 'gurt://localhost:8080/auth/login'
local headers = {
['Content-Type'] = 'application/json'
}
@@ -39,9 +39,13 @@ submitBtn:on('submit', function(event)
local jsonData = response:json()
if jsonData then
addLog('Logged in as user: ' .. jsonData.user.username)
- addLog('Token: ' .. jsonData.token:sub(1, 20) .. '...')
- -- TODO: store as cookie
+ gurt.crumbs.set({
+ name = "auth_token",
+ value = jsonData.token,
+ lifespan = 604800
+ })
+
gurt.location.goto("/dashboard.html")
end
else
diff --git a/flumi/Scripts/B9/CSSParser.gd b/flumi/Scripts/B9/CSSParser.gd
index dfb529f..35b5c91 100644
--- a/flumi/Scripts/B9/CSSParser.gd
+++ b/flumi/Scripts/B9/CSSParser.gd
@@ -913,6 +913,10 @@ static func parse_utility_class_internal(rule: CSSRule, utility_name: String) ->
rule.properties[utility_name] = "200ms"
return
+ if utility_name == "hidden":
+ rule.properties["display"] = "none"
+ return
+
# Handle more utility classes as needed
# Add more cases here for other utilities
diff --git a/flumi/Scripts/B9/HTMLParser.gd b/flumi/Scripts/B9/HTMLParser.gd
index 71bdb06..d4772cc 100644
--- a/flumi/Scripts/B9/HTMLParser.gd
+++ b/flumi/Scripts/B9/HTMLParser.gd
@@ -112,15 +112,15 @@ func handle_style_element(style_element: HTMLElement) -> void:
parse_result.external_css.append(src)
return
- # Handle inline CSS - we'll get the text content when parsing is complete
- # For now, create a parser that will be populated later
+ # Handle inline CSS
if not parse_result.css_parser:
parse_result.css_parser = CSSParser.new()
parse_result.css_parser.init()
func process_styles() -> void:
if not parse_result.css_parser:
- return
+ parse_result.css_parser = CSSParser.new()
+ parse_result.css_parser.init()
var css_content = Constants.DEFAULT_CSS
var style_elements = find_all("style")
diff --git a/flumi/Scripts/StyleManager.gd b/flumi/Scripts/StyleManager.gd
index ba8a069..877dc3f 100644
--- a/flumi/Scripts/StyleManager.gd
+++ b/flumi/Scripts/StyleManager.gd
@@ -109,6 +109,12 @@ static func apply_element_styles(node: Control, element: HTMLParser.HTMLElement,
if styles.has("opacity"):
node.modulate.a = styles["opacity"]
+ if styles.has("display"):
+ if styles["display"] == "none":
+ node.visible = false
+ else:
+ node.visible = true
+
# Apply cursor
if styles.has("cursor"):
var cursor_shape = get_cursor_shape_from_type(styles["cursor"])
diff --git a/flumi/Scripts/Utils/Lua/Network.gd b/flumi/Scripts/Utils/Lua/Network.gd
index 8da9dcb..f687e29 100644
--- a/flumi/Scripts/Utils/Lua/Network.gd
+++ b/flumi/Scripts/Utils/Lua/Network.gd
@@ -5,6 +5,27 @@ static func setup_network_api(vm: LuauVM):
vm.lua_pushcallable(_lua_fetch_handler, "fetch")
vm.lua_setglobal("fetch")
+static func resolve_fetch_url(url: String) -> String:
+ # If URL is already absolute, return as-is
+ if url.begins_with("http://") or url.begins_with("https://") or url.begins_with("gurt://"):
+ return url
+
+ # Get current domain from main scene
+ var main_node = Engine.get_main_loop().current_scene
+ var current_domain = ""
+ if main_node and main_node.has_method("get_current_url"):
+ current_domain = main_node.get_current_url()
+
+ # If no current domain, default to gurt:// protocol for relative URLs
+ if current_domain.is_empty():
+ if url.begins_with("/"):
+ return "gurt://" + url.substr(1)
+ else:
+ return "gurt://" + url
+
+ # Use URLUtils to resolve relative URL against current domain
+ return URLUtils.resolve_url(current_domain, url)
+
static func _lua_fetch_handler(vm: LuauVM) -> int:
var url: String = vm.luaL_checkstring(1)
var options: Dictionary = {}
@@ -12,6 +33,9 @@ static func _lua_fetch_handler(vm: LuauVM) -> int:
if vm.lua_gettop() >= 2 and vm.lua_istable(2):
options = vm.lua_todictionary(2)
+ # Resolve relative URLs and default to gurt:// protocol
+ url = resolve_fetch_url(url)
+
# Default options
var method = options.get("method", "GET").to_upper()
var headers = options.get("headers", {})
diff --git a/flumi/Scripts/Utils/URLUtils.gd b/flumi/Scripts/Utils/URLUtils.gd
index 31527a1..9a15dcc 100644
--- a/flumi/Scripts/Utils/URLUtils.gd
+++ b/flumi/Scripts/Utils/URLUtils.gd
@@ -45,11 +45,16 @@ static func resolve_url(base_url: String, relative_url: String) -> String:
# Relative path
final_path_parts = current_path_parts.duplicate()
+ if final_path_parts.size() > 0:
+ var last_part = final_path_parts[-1]
+ if "." in last_part and not last_part.ends_with("/"):
+ final_path_parts.resize(final_path_parts.size() - 1)
+
var href_parts = relative_url.split("/")
for part in href_parts:
if part == "..":
if final_path_parts.size() > 0:
- final_path_parts.pop_back()
+ final_path_parts.resize(final_path_parts.size() - 1)
elif part == "." or part == "":
continue
else:
@@ -59,4 +64,4 @@ static func resolve_url(base_url: String, relative_url: String) -> String:
if final_path_parts.size() > 0:
result += "/" + "/".join(final_path_parts)
- return result
\ No newline at end of file
+ return result
diff --git a/flumi/Scripts/main.gd b/flumi/Scripts/main.gd
index be1dc4c..b537e63 100644
--- a/flumi/Scripts/main.gd
+++ b/flumi/Scripts/main.gd
@@ -86,6 +86,8 @@ func handle_link_click(meta: Variant) -> void:
func _on_search_submitted(url: String) -> void:
print("Search submitted: ", url)
+ search_bar.release_focus()
+
if GurtProtocol.is_gurt_domain(url):
print("Processing as GURT domain")
diff --git a/flumi/addons/gurt-protocol/bin/windows/gurt_godot.dll b/flumi/addons/gurt-protocol/bin/windows/gurt_godot.dll
index e7cedfa63b33fb46b2e999159b61ec132461c537..6593e22424ea663a3f84b064752cdb2a16f81b1e 100644
GIT binary patch
delta 781620
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