CreateUser creates a user in Alpine with the given UID.
(username string, uid int)
| 13 | |
| 14 | // CreateUser creates a user in Alpine with the given UID. |
| 15 | func (a *Alpine) CreateUser(username string, uid int) (createdUsername string, err error) { |
| 16 | UIDStr := strconv.Itoa(uid) |
| 17 | u, err := a.lookupID(UIDStr) |
| 18 | _, unknownUID := err.(user.UnknownUserIdError) |
| 19 | if err != nil && !unknownUID { |
| 20 | return "", err |
| 21 | } |
| 22 | |
| 23 | if u != nil { |
| 24 | if u.Username == username { |
| 25 | return "", nil |
| 26 | } |
| 27 | return u.Username, nil |
| 28 | } |
| 29 | |
| 30 | u, err = a.lookup(username) |
| 31 | _, unknownUsername := err.(user.UnknownUserError) |
| 32 | if err != nil && !unknownUsername { |
| 33 | return "", err |
| 34 | } |
| 35 | |
| 36 | if u != nil { |
| 37 | return "", fmt.Errorf("%w: with name %s for ID %s instead of %d", |
| 38 | ErrUserAlreadyExists, username, u.Uid, uid) |
| 39 | } |
| 40 | |
| 41 | const permission = fs.FileMode(0o644) |
| 42 | file, err := os.OpenFile(a.passwdPath, os.O_APPEND|os.O_WRONLY, permission) |
| 43 | if err != nil { |
| 44 | return "", err |
| 45 | } |
| 46 | s := fmt.Sprintf("%s:x:%d:::/dev/null:/sbin/nologin\n", username, uid) |
| 47 | _, err = file.WriteString(s) |
| 48 | if err != nil { |
| 49 | _ = file.Close() |
| 50 | return "", err |
| 51 | } |
| 52 | |
| 53 | return username, file.Close() |
| 54 | } |