Changeset 568 in code


Ignore:
Timestamp:
Jun 25, 2021, 6:33:13 PM (4 years ago)
Author:
contact
Message:

Add per-user realname setting

This allows users to set a default realname used if the per-network
realname isn't set.

A new "user update" command is introduced and can be extended to edit
other user properties and other users in the future.

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/db.go

    r542 r568  
    3131        Username string
    3232        Password string // hashed
     33        Realname string
    3334        Admin    bool
    3435}
     
    9394}
    9495
    95 func (net *Network) GetRealname() string {
     96func GetRealname(user *User, net *Network) string {
    9697        if net.Realname != "" {
    9798                return net.Realname
     99        }
     100        if user.Realname != "" {
     101                return user.Realname
    98102        }
    99103        return net.Nick
  • trunk/db_sqlite.go

    r542 r568  
    1717        username VARCHAR(255) NOT NULL UNIQUE,
    1818        password VARCHAR(255),
    19         admin INTEGER NOT NULL DEFAULT 0
     19        admin INTEGER NOT NULL DEFAULT 0,
     20        realname VARCHAR(255)
    2021);
    2122
     
    134135        "ALTER TABLE Channel ADD COLUMN detached_internal_msgid VARCHAR(255)",
    135136        "ALTER TABLE Network ADD COLUMN enabled INTEGER NOT NULL DEFAULT 1",
     137        "ALTER TABLE User ADD COLUMN realname VARCHAR(255)",
    136138}
    137139
     
    243245        user := &User{Username: username}
    244246
    245         var password sql.NullString
    246         row := db.db.QueryRow("SELECT id, password, admin FROM User WHERE username = ?", username)
    247         if err := row.Scan(&user.ID, &password, &user.Admin); err != nil {
     247        var password, realname sql.NullString
     248        row := db.db.QueryRow("SELECT id, password, admin, realname FROM User WHERE username = ?", username)
     249        if err := row.Scan(&user.ID, &password, &user.Admin, &realname); err != nil {
    248250                return nil, err
    249251        }
    250252        user.Password = password.String
     253        user.Realname = realname.String
    251254        return user, nil
    252255}
     
    257260
    258261        password := toNullString(user.Password)
     262        realname := toNullString(user.Realname)
    259263
    260264        var err error
    261265        if user.ID != 0 {
    262                 _, err = db.db.Exec("UPDATE User SET password = ?, admin = ? WHERE username = ?",
    263                         password, user.Admin, user.Username)
     266                _, err = db.db.Exec("UPDATE User SET password = ?, admin = ?, realname = ? WHERE username = ?",
     267                        password, user.Admin, realname, user.Username)
    264268        } else {
    265269                var res sql.Result
    266                 res, err = db.db.Exec("INSERT INTO User(username, password, admin) VALUES (?, ?, ?)",
    267                         user.Username, password, user.Admin)
     270                res, err = db.db.Exec("INSERT INTO User(username, password, admin, realname) VALUES (?, ?, ?, ?)",
     271                        user.Username, password, user.Admin, realname)
    268272                if err != nil {
    269273                        return err
  • trunk/doc/soju.1.scd

    r564 r568  
    161161
    162162        *-realname* <realname>
    163                 Connect with the specified real name. By default, the nickname is used.
     163                Connect with the specified real name. By default, the account's realname
     164                is used if set, otherwise the network's nickname is used.
    164165
    165166        *-nick* <nickname>
     
    297298        Disable SASL authentication and remove stored credentials.
    298299
    299 *user create* -username <username> -password <password> [-admin]
     300*user create* -username <username> -password <password> [options...]
    300301        Create a new soju user. Only admin users can create new accounts.
     302
     303        Options:
     304
     305        *-admin*
     306                Make the new user an administrator.
     307
     308        *-realname* <realname>
     309                Set the user's realname. This is used as a fallback if there is no
     310                realname set for a network.
     311
     312*user update* [-realname <realname>]
     313        Update the current user.
    301314
    302315*user delete* <username>
  • trunk/downstream.go

    r565 r568  
    8484                attrs["username"] = irc.TagValue(network.Username)
    8585        }
    86         if network.Realname != "" {
    87                 attrs["realname"] = irc.TagValue(network.Realname)
     86        if realname := GetRealname(&network.user.User, &network.Network); realname != "" {
     87                attrs["realname"] = irc.TagValue(realname)
    8888        }
    8989
     
    13881388                }
    13891389
     1390                // If the client just resets to the default, just wipe the per-network
     1391                // preference
     1392                storeRealname := realname
     1393                if realname == dc.user.Realname {
     1394                        storeRealname = ""
     1395                }
     1396
    13901397                var storeErr error
    13911398                var needUpdate []Network
     
    13991406                                })
    14001407
    1401                                 n.Realname = realname
     1408                                n.Realname = storeRealname
    14021409                                if err := dc.srv.db.StoreNetwork(dc.user.ID, &n.Network); err != nil {
    14031410                                        dc.logger.Printf("failed to store network realname: %v", err)
     
    14081415
    14091416                        record := n.Network // copy network record because we'll mutate it
    1410                         record.Realname = realname
     1417                        record.Realname = storeRealname
    14111418                        needUpdate = append(needUpdate, record)
    14121419                })
     
    22242231                        pass, _ := attrs.GetTag("pass")
    22252232
     2233                        if realname == dc.user.Realname {
     2234                                realname = ""
     2235                        }
     2236
    22262237                        // TODO: reject unknown attributes
    22272238
  • trunk/service.go

    r566 r568  
    255255                        children: serviceCommandSet{
    256256                                "create": {
    257                                         usage:  "-username <username> -password <password> [-admin]",
     257                                        usage:  "-username <username> -password <password> [-realname <realname>] [-admin]",
    258258                                        desc:   "create a new soju user",
    259259                                        handle: handleUserCreate,
    260260                                        admin:  true,
     261                                },
     262                                "update": {
     263                                        usage:  "[-realname <realname>]",
     264                                        desc:   "update the current user",
     265                                        handle: handleUserUpdate,
    261266                                },
    262267                                "delete": {
     
    267272                                },
    268273                        },
    269                         admin: true,
    270274                },
    271275                "change-password": {
     
    752756        username := fs.String("username", "", "")
    753757        password := fs.String("password", "", "")
     758        realname := fs.String("realname", "", "")
    754759        admin := fs.Bool("admin", false, "")
    755760
     
    772777                Username: *username,
    773778                Password: string(hashed),
     779                Realname: *realname,
    774780                Admin:    *admin,
    775781        }
     
    779785
    780786        sendServicePRIVMSG(dc, fmt.Sprintf("created user %q", *username))
     787        return nil
     788}
     789
     790func handleUserUpdate(dc *downstreamConn, params []string) error {
     791        fs := newFlagSet()
     792        realname := fs.String("realname", "", "")
     793
     794        if err := fs.Parse(params); err != nil {
     795                return err
     796        }
     797
     798        if err := dc.user.updateRealname(*realname); err != nil {
     799                return err
     800        }
     801
     802        sendServicePRIVMSG(dc, fmt.Sprintf("updated user %q", dc.user.Username))
    781803        return nil
    782804}
  • trunk/upstream.go

    r563 r568  
    16721672        uc.nickCM = uc.network.casemap(uc.nick)
    16731673        uc.username = uc.network.GetUsername()
    1674         uc.realname = uc.network.GetRealname()
     1674        uc.realname = GetRealname(&uc.user.User, &uc.network.Network)
    16751675
    16761676        uc.SendMessage(&irc.Message{
  • trunk/user.go

    r563 r568  
    764764        }
    765765
     766        // If the realname is reset to the default, just wipe the per-network
     767        // setting
     768        if record.Realname == u.Realname {
     769                record.Realname = ""
     770        }
     771
    766772        if err := u.checkNetwork(record); err != nil {
    767773                return nil, err
     
    856862}
    857863
     864func (u *user) updateRealname(realname string) error {
     865        u.User.Realname = realname
     866        if err := u.srv.db.StoreUser(&u.User); err != nil {
     867                return fmt.Errorf("failed to update user %q: %v", u.Username, err)
     868        }
     869
     870        // Re-connect to networks which use the default realname
     871        var needUpdate []Network
     872        u.forEachNetwork(func(net *network) {
     873                if net.Realname == "" {
     874                        needUpdate = append(needUpdate, net.Network)
     875                }
     876        })
     877
     878        var netErr error
     879        for _, net := range needUpdate {
     880                if _, err := u.updateNetwork(&net); err != nil {
     881                        netErr = err
     882                }
     883        }
     884
     885        return netErr
     886}
     887
    858888func (u *user) stop() {
    859889        u.events <- eventStop{}
Note: See TracChangeset for help on using the changeset viewer.