Changeset 173 in code for trunk


Ignore:
Timestamp:
Mar 27, 2020, 9:38:38 PM (5 years ago)
Author:
contact
Message:

Stop accessing user data in downstreamConn.authenticate

This becomes racy once user.Password is updated on-the-fly.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/db.go

    r149 r173  
    105105
    106106        return users, nil
     107}
     108
     109func (db *DB) GetUser(username string) (*User, error) {
     110        db.lock.RLock()
     111        defer db.lock.RUnlock()
     112
     113        user := &User{Username: username}
     114
     115        var password *string
     116        row := db.db.QueryRow("SELECT password FROM User WHERE username = ?", username)
     117        if err := row.Scan(&password); err != nil {
     118                return nil, err
     119        }
     120        user.Password = fromStringPtr(password)
     121        return user, nil
    107122}
    108123
  • trunk/downstream.go

    r168 r173  
    587587        username, networkName := unmarshalUsername(username)
    588588
    589         u := dc.srv.getUser(username)
    590         if u == nil {
    591                 dc.logger.Printf("failed authentication for %q: unknown username", username)
    592                 return errAuthFailed
    593         }
    594 
    595         err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))
     589        u, err := dc.srv.db.GetUser(username)
    596590        if err != nil {
    597591                dc.logger.Printf("failed authentication for %q: %v", username, err)
     
    599593        }
    600594
    601         dc.user = u
     595        err = bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))
     596        if err != nil {
     597                dc.logger.Printf("failed authentication for %q: %v", username, err)
     598                return errAuthFailed
     599        }
     600
     601        dc.user = dc.srv.getUser(username)
     602        if dc.user == nil {
     603                dc.logger.Printf("failed authentication for %q: user not active", username)
     604                return errAuthFailed
     605        }
    602606        dc.networkName = networkName
    603607        return nil
Note: See TracChangeset for help on using the changeset viewer.