PathrockNetwork Gno Explorer
HomeBlocksTransactionsTokensRealmsPackagesValidatorsAnalytics

PathrockNetwork Gno Explorer — an independent explorer for Gno.land Mainnet (gnoland-1), operated by PathrockNetwork. Not an official Gno.land service.

gnowebarchive RPC

gno.land/r/akkadia/beta/user

Realm
Open in gnoweb ↗

Overview

Kind
Realm (renderable)
Name
user
Namespace
akkadia / beta
Files
7 (gnomod.toml)
Exported functions
14
Module
gno.land/r/akkadia/beta/user
gno
0.9

Files (7)

  • gnomod.tomltoml
  • config.gnogno
  • render.gnogno
  • user.gnogno
  • validation.gnogno
  • render_test.gnogno
  • user_test.gnogno
render_test.gnogno
1package user23import (4	"net/url"5	"strings"6	"testing"78

Functions

  • AdminCreateUser(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, addr string)

  • AdminDeleteUser(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, addr string)

  • AdminUpdateUser(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, addr string, propKeys string, propValues string)

  • CreateUser(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string})

  • DeleteAll(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string})

  • DeleteUser(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string})

  • GetListLimit() int

  • GetTotalUserSize() int

  • HasUser(addr string) bool

  • ListUsers(page int, count int) []string

  • ListUsersByAddresses(addrs ....uverse.address) []map[string]string

  • Render(iUrl string) string

  • SetFrozen(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, frozen bool)

  • SetListLimit(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, limit int)

Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.

Rendered

RenderedRawgnoweb ↗

vm/qrender output, sanitized (docs/render-security.md) and displayed in an empty-sandbox iframe — scripts, forms and popups cannot run. Links stay inert in-preview; right-click to open.

"gno.land/p/nt/uassert/v0"
9)
10
11func TestRenderEscapesMarkdownSensitiveUserValues(cur realm, t *testing.T) {
12 setupUserTests(cross(cur), t)
13
14 nickname := "N [x](y) **b**"
15 intro := "**bold** [link](https://example.invalid)\n# heading"
16
17 createUserForTest(cross(cur), regularUser)
18 testing.SetOriginCaller(testAdmin)
19 testing.SetRealm(testing.NewUserRealm(testAdmin))
20 AdminUpdateUser(cross(cur), regularUser, "nickname,introduction", url.PathEscape(nickname)+","+url.PathEscape(intro))
21
22 detail := Render("user?address=" + regularUser.String())
23 uassert.True(t, strings.Contains(detail, `N \[x\]\(y\) \*\*b\*\*`), "nickname should be escaped")
24 uassert.True(t, strings.Contains(detail, `\*\*bold\*\* \[link\]\(https://example\.invalid\)\n\# heading`), "property value should be escaped")
25 uassert.False(t, strings.Contains(detail, "[link](https://example.invalid)"), "property link syntax should not remain raw")
26 uassert.False(t, strings.Contains(detail, "\n# heading"), "property newline heading should not remain raw")
27
28 list := Render("users")
29 uassert.True(t, strings.Contains(list, `N \[x\]\(y\) \*\*b\*\*`), "list nickname should be escaped")
30 uassert.False(t, strings.Contains(list, "[profile](profile-page)"), "list nickname link syntax should not remain raw")
31}
32
33func TestRenderErrors(cur realm, t *testing.T) {
34 setupUserTests(cross(cur), t)
35
36 invalid := Render("user?address=invalid-address")
37 uassert.True(t, strings.Contains(invalid, "Invalid address"), "render output should contain expected error")
38
39 missing := Render("user?address=" + regularUser.String())
40 uassert.True(t, strings.Contains(missing, "User not found"), "missing user should render not found")
41
42 unknown := Render("nickname?nickname=alice")
43 uassert.True(t, strings.Contains(unknown, "Not found"), "removed nickname route should 404")
44}
45
46func TestRenderUserSanitizesPageLink(cur realm, t *testing.T) {
47 setupUserTests(cross(cur), t)
48 createUserForTest(cross(cur), regularUser)
49
50 valid := Render("user?address=" + regularUser.String() + "&page=02")
51 uassert.True(t, strings.Contains(valid, "[← Back to List](./user:users?page=2)"), "valid page should be normalized")
52
53 injected := Render("user?address=" + regularUser.String() + "&page=1%29%5D%28https%3A%2F%2Fexample.invalid%29")
54 uassert.False(t, strings.Contains(injected, "example.invalid"), "invalid page should not be reflected")
55 uassert.False(t, strings.Contains(injected, "users?page="), "invalid page should not render a page back link")
56 uassert.True(t, strings.Contains(injected, "[← Home](./user:)"), "invalid page should fall back to home link")
57}
58
59func TestRenderRejectsOversizedURL(cur realm, t *testing.T) {
60 uassert.PanicsWithMessage(t, cur, "url exceeds max runes", func() {
61 Render(strings.Repeat("a", renderURLMaxRunes+1))
62 })
63 Render(strings.Repeat("a", renderURLMaxRunes))
64}
65
66func TestRenderHomeUsesRelativeBrowseUsersLink(cur realm, t *testing.T) {
67 setupUserTests(cross(cur), t)
68
69 output := Render("")
70
71 uassert.True(t, strings.Contains(output, "* [Browse Users](./user:users)"), "should use package-relative users link")
72 uassert.False(t, strings.Contains(output, "* [Browse Users](users)"), "should not use path-relative users link")
73 uassert.False(t, strings.Contains(output, "* [Browse Users](/r/akkadia/user:users)"), "should not use absolute users link")
74}
75