Skip to content
Snippets Groups Projects
Unverified Commit 27f7ce44 authored by Matthias Schiffer's avatar Matthias Schiffer
Browse files

gluon-status-page: when visiting via a next-node address, redirect to a unique address

A downside of this behaviour is that the page does not work for IPv4-only
clients, as the redirect will always point at an IPv6 address.

Still, it seems like a good idea to enforce the redirect even from the IPv4
next-node address, as switching nodes while being connected to the status
page would lead to unexpected behaviour.
parent fdf823a3
No related branches found
No related tags found
No related merge requests found
<%- <%-
local fs = require 'nixio.fs' local fs = require 'nixio.fs'
local json = require 'jsonc'
local ubus = require 'ubus' local ubus = require 'ubus'
local util = require 'gluon.util' local util = require 'gluon.util'
...@@ -44,8 +43,6 @@ ...@@ -44,8 +43,6 @@
local interfaces = get_interfaces() local interfaces = get_interfaces()
local nodeinfo = json.parse(util.exec('exec gluon-neighbour-info -d ::1 -p 1001 -t 1 -c 1 -r nodeinfo'))
local function sorted(t) local function sorted(t)
t = {unpack(t)} t = {unpack(t)}
table.sort(t) table.sort(t)
......
local json = require 'jsonc'
local site = require 'gluon.site'
local util = require 'gluon.util'
local function parse_ip(addr)
if not addr then return end
local ip4 = {addr:match('(%d+)%.(%d+)%.(%d+)%.(%d+)')}
if ip4[1] then
local ret = {}
for i, part in ipairs(ip4) do
ret[i] = tonumber(part)
end
return ret
end
if not addr:match('^[:%x]+$') then
return
end
if addr:sub(0, 2) == '::' then
addr = '0' .. addr
end
if addr:sub(-2) == '::' then
addr = addr .. '0'
end
addr = addr .. ':'
local groups, groups1 = {}, {}
for part in addr:gmatch('([^:]*):') do
if part == '' then
groups1 = groups
groups = {}
else
groups[#groups+1] = tonumber(part, 16)
end
end
while #groups + #groups1 < 8 do
groups1[#groups1+1] = 0
end
for _, group in ipairs(groups) do
groups1[#groups1+1] = group
end
return groups1
end
local function match(a, b, n)
if not a or not b then return false end
for i = 1, n do
if a[i] ~= b[i] then
return false
end
end
return true
end
entry({}, call(function(http, renderer) entry({}, call(function(http, renderer)
renderer.render('status-page', nil, 'gluon-status-page') local nodeinfo = json.parse(util.exec('exec gluon-neighbour-info -d ::1 -p 1001 -t 1 -c 1 -r nodeinfo'))
local node_ip = parse_ip(http:getenv('SERVER_ADDR'))
if node_ip and (
match(node_ip, parse_ip(site.next_node.ip4()), 8) or
match(node_ip, parse_ip(site.next_node.ip6()), 8)
) then
-- The user has visited the status page via a next-node address
-- Redirect the user the a unique address to avoid switching
-- nodes
local prefix = parse_ip(site.prefix6():match('^[^/]+'))
for _, addr in ipairs(nodeinfo.network.addresses) do
if match(prefix, parse_ip(addr), 4) then
http:header('Cache-Control', 'no-cache, no-store, must-revalidate')
http:redirect('http://[' .. addr .. ']' .. http:getenv('REQUEST_URI'))
http:close()
return
end
end
end
renderer.render('status-page', { nodeinfo = nodeinfo }, 'gluon-status-page')
end)) end))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment