Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: r/demo/users #3166

Open
wants to merge 196 commits into
base: master
Choose a base branch
from
Open

refactor: r/demo/users #3166

wants to merge 196 commits into from

Conversation

leohhhn
Copy link
Contributor

@leohhhn leohhhn commented Nov 20, 2024

Description

Addresses: #2827

This PR refactors the current r/demo/users & r/sys/users system in accordance to the issue mentioned above. Below is the high-level overview of the new system.

It also makes a small change to the p/demo/releases lib.

r/gnoland/users/v1

  • Fully replaces r/demo/users
  • Is the main entry point for users looking to register a name, create an alias (rename themselves), or delete their username
  • Implements allowed username pattern checks as per the issue r/sys/users Mainnet v1 (mvp) & v2 #2827
  • Is pausable by GovDAO, contains no other administration functionality
  • Contains a nice UI/render for users (please suggest improvements) - see bottom
  • Uses r/demo/profile for displaying extra information about a user (to be moved to r/nt/profiles or r/gnoland/profiles)

r/sys/users

  • Namespace check moved to r/sys/names
  • Contains the address/name <> user stores, to which only whitelisted realms can write
  • Contains resolver functions & other useful getters
  • Is callable only by whitelisted realms, such as r/gnoland/users/v1, etc.
  • Whitelist is fully managed by GovDAO (after chore: remove govdao dependency in r/gov/dao/bridge #3523 was resolved)

r/sys/names

  • Namespace checking functionality moved here (from r/sys/users), added tests, as discussed with @moul
  • Verify function now only upgradeable with a GovDAO prop instead of previously being ownable
  • Verify functionality is now not pausable and on by default, as per discussions with @moul. This means Portal Loop will need to be patched upon merging this PR, as many txs will fail due to not having proper namespace permissions. The namespace verify functionality is off by default, but should be enabled in genesis via r/sys/names.Enable(). The Portal Loop will indeed need to be patched if we enable this functionality.

Keeper & genesis params

  • Updated the VM keeper to call r/sys/names for the namespace check instead of r/sys/users
  • Updated params to load r/sys/names, which the keeper will call

r/gnoland/users/v1

Screenshot 2025-01-17 at 01 10 56

r/gnoland/users

Currently this is the "releases" page for the user registration systems (example data):

Screenshot 2025-02-03 at 12 19 28
Contributors' checklist...
  • Added new tests, or not needed, or not feasible
  • Provided an example (e.g. screenshot) to aid review or the PR is self-explanatory
  • Updated the official documentation or not needed
  • No breaking changes were made, or a BREAKING CHANGE: xxx message was included in the description
  • Added references to related issues and PRs
  • Provided any useful hints for running manual tests

@github-actions github-actions bot added the 🧾 package/realm Tag used for new Realms or Packages. label Nov 20, 2024
Copy link

codecov bot commented Nov 21, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

📢 Thoughts on this report? Let us know!

@zivkovicmilos zivkovicmilos self-requested a review November 21, 2024 06:03
@leohhhn leohhhn changed the title refactor: r/demo/users refactor: r/demo/users Nov 21, 2024
@github-actions github-actions bot added 📦 🤖 gnovm Issues or PRs gnovm related 📦 🌐 tendermint v2 Issues or PRs tm2 related 📦 ⛰️ gno.land Issues or PRs gno.land package related labels Nov 25, 2024
# Conflicts:
#	examples/gno.land/r/demo/users/users.gno
#	examples/gno.land/r/demo/users/z_10_filetest.gno
#	examples/gno.land/r/demo/users/z_11_filetest.gno
#	examples/gno.land/r/demo/users/z_11b_filetest.gno
#	examples/gno.land/r/demo/users/z_2_filetest.gno
#	examples/gno.land/r/demo/users/z_3_filetest.gno
#	examples/gno.land/r/demo/users/z_4_filetest.gno
#	examples/gno.land/r/demo/users/z_5_filetest.gno
#	examples/gno.land/r/demo/users/z_6_filetest.gno
#	examples/gno.land/r/demo/users/z_7_filetest.gno
#	examples/gno.land/r/demo/users/z_7b_filetest.gno
#	examples/gno.land/r/demo/users/z_8_filetest.gno
#	examples/gno.land/r/demo/users/z_9_filetest.gno
#	examples/gno.land/r/sys/users/verify.gno
@leohhhn leohhhn requested review from moul and n0izn0iz and removed request for n0izn0iz February 10, 2025 15:28
@leohhhn
Copy link
Contributor Author

leohhhn commented Feb 10, 2025

Considerations:

  • We should probably limit the # of times users can update their name - related comment
  • Should we allow users to go back to a previous name of theirs? Users still keep the permission to deploy their previous namespaces.

Comment on lines +6 to +7
ErrInvalidUsername = errors.New("r/gnoland/users: invalid username")
ErrPaused = errors.New("r/gnoland/users: paused")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keep it like this for now 👍 , but the need to prefix with "package realm" shows that we are not using gno errors as much as we should, yet.


// DeleteUser makes all names associated with the `PrevRealm()` address unresolvable.
// WARN: After deletion, the same address WILL NOT be able to register a new name.
func DeleteUser() error {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same for now; make it a GovDAO feature until we determine the appropriate requirements.

authorDisplayText := prop.Author().String()
if user != nil {
authorDisplayText = ufmt.Sprintf("[%s](/r/demo/users:%s)", user.Name, user.Name)
authorDisplayText = ufmt.Sprintf("[%s](/r/sys/users:%s)", user.Name(), user.Name())
}

out += ufmt.Sprintf("**Author: %s**\n\n", authorDisplayText)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this whole thing should be done like this:

			user := users.GetUserByAddress(prop.Author())
			out += ufmt.Sprintf("**Author: %s**\n\n", user.RenderLink())

authorDisplayText := prop.Author().String()
if user != nil {
authorDisplayText = ufmt.Sprintf("[%s](/r/demo/users:%s)", user.Name, user.Name)
authorDisplayText = ufmt.Sprintf("[%s](/r/sys/users:%s)", user.Name(), user.Name())
}

out += ufmt.Sprintf("**Author: %s**\n\n", authorDisplayText)
Copy link
Member

@moul moul Feb 12, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this whole thing should be done like this, because a very common workflow:

			user := users.GetUserByAddress(prop.Author())
			out += ufmt.Sprintf("**Author: %s**\n\n", user.String())

}

if authorUsername != "" {
out += ufmt.Sprintf("**Author: [%s](/r/demo/users:%s)**\n\n", authorUsername, authorUsername)
out += ufmt.Sprintf("**Author: [%s](/r/gnoland/users/v1:%s)**\n\n", authorUsername, authorUsername)
} else {
out += ufmt.Sprintf("**Author: %s**\n\n", p.Author().String())
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

type verifierFunc func(address std.Address, name string) bool

var (
Ownable = ownable.NewWithAddress("g1manfred47kzduec920z88wfr64ylksmdcedlf5") // @moul > dropped in genesis via Enable
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

govdao or #3700

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ohhhhh, no sorry, it's for the enable fuse, that's ok.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

would be better to be a random address, not mine. ideally one without a private key if this is a genesis msg without signature.

enabled = false // set to true in genesis
)

const VerifyFuncUpdatedEvent = "VerifyFuncUpdated"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove this

}

// NewVerifyCallExecutor allows updating the verifier function via a GovDAO proposal
func NewVerifyCallExecutor(newVerifyCall func(enabled bool, address std.Address, name string) bool) dao.Executor {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should remove this and deploy a r/sys/names/v2 if we want to change the logic. It's very easy to modify using the params keeper, which simply points to an arbitrary realm address.

}

func makeUserDataSafe(data interface{}) interface{} {
u := data.(*UserData)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
u := data.(*UserData)
u := *(data.(*UserData))


const gusersv1 = "gno.land/r/gnoland/users/v1" // preregistered with store write perms

var callerWhitelist = addrset.Set{}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
var callerWhitelist = addrset.Set{}
var controllers = addrset.Set{} // caller whitelist

Comment on lines +20 to +24
// IsOnWhitelist checks if the given address has
// permission to write to the user store
func IsOnWhitelist(addr std.Address) bool {
return callerWhitelist.Has(addr)
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove this.

}

// NewAddWhitelistedAddrExecutor allows GovDAO to add a whitelisted caller
func NewAddWhitelistedAddrExecutor(addr std.Address) dao.Executor {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
func NewAddWhitelistedAddrExecutor(addr std.Address) dao.Executor {
func ProposeNewController(addr std.Address) dao.Executor {


// Validate validates username and address passed in
func validateName(username string) error {
if strings.TrimSpace(username) == "" {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Space trimming shouldn't be for validation but for sanitization. Make validateName a helper function that also sanitizes, and use it for every function that could set a new name in the store.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
📦 🌐 tendermint v2 Issues or PRs tm2 related 📦 ⛰️ gno.land Issues or PRs gno.land package related 📦 🤖 gnovm Issues or PRs gnovm related 🧾 package/realm Tag used for new Realms or Packages.
Projects
Status: 📥 Inbox
Status: In Review
Development

Successfully merging this pull request may close these issues.

r/sys/users Mainnet v1 (mvp) & v2
8 participants