Imported Upstream version 0.1
[debian/configureit.git] / user.go
1 // user.go
2 //
3 // User Type
4
5 package configureit
6
7 import (
8         "os"
9         "os/user"
10         "strings"
11         "strconv"
12 )
13
14 // User options represent user specifications in a config file.
15 //
16 // They can be either a literal username, or a number.
17 type UserOption struct {        
18         defaultvalue    string
19         isset           bool
20         // literal value
21         Value           string
22 }
23
24 var EmptyUserSet = os.NewError("No value set")
25
26 func NewUserOption(defaultValue string) ConfigNode {
27         opt := new(UserOption)
28
29         opt.defaultvalue = defaultValue
30         opt.Reset()
31
32         return opt
33 }
34
35 func (opt *UserOption) String() string {
36         return opt.Value
37 }
38
39 func (opt *UserOption) Parse(newValue string) os.Error {
40         nvs := strings.TrimSpace(newValue)
41         if nvs != "" {
42                 // validate the input.
43                 _, err := strconv.Atoi(nvs)
44                 if err != nil {
45                         switch err.(type) {
46                         case *strconv.NumError:
47                                 // not a number.  do a lookup.
48                                 _, err = user.Lookup(nvs)
49                                 if err != nil {
50                                         return err
51                                 }
52                         default:
53                                 return err
54                         }
55                 }                       
56         }
57         opt.Value = newValue
58         opt.isset = true
59
60         return nil
61 }
62
63 func (opt *UserOption) IsDefault() bool {
64         return !opt.isset
65 }
66
67 func (opt *UserOption) Reset() {
68         opt.Value = opt.defaultvalue
69         opt.isset = false
70 }
71
72 func (opt *UserOption) User() (userinfo *user.User, err os.Error) {
73         nvs := strings.TrimSpace(opt.Value)
74         if nvs == "" {
75                 // special case: empty string is the current euid.
76                 return nil, EmptyUserSet
77         }
78         // attempt to map this as a number first, in case a numeric UID 
79         // was provided.
80         val, err := strconv.Atoi(nvs)
81         if err != nil {
82                 switch err.(type) {
83                 case *strconv.NumError:
84                         // not a number.  do a user table lookup.
85                         userinfo, err = user.Lookup(nvs)
86                         if err != nil {
87                                 return nil, err
88                         }
89                         return userinfo, nil
90                 default:
91                         return nil, err
92                 }
93         }
94         userinfo, err = user.LookupId(val)
95         return userinfo, err
96 }