Mercurial > go > multipass
comparison file/file.go @ 18:00d30c67b56d
Put all the library stuff into multipass/file.
| author | Paul Fisher <paul@pfish.zone> |
|---|---|
| date | Sun, 01 Nov 2015 12:16:51 -0500 |
| parents | 9b4ec6b5c23e |
| children | ef2ef22ca4b1 |
comparison
equal
deleted
inserted
replaced
| 17:342f63116bfd | 18:00d30c67b56d |
|---|---|
| 1 // Package file handles I/O for single password files. | 1 // Package file handles I/O for single password files. |
| 2 // | 2 // |
| 3 // A password file contains multiple passwords for a single user. | 3 // A password file contains multiple passwords for a single user. |
| 4 // It starts with a banner that indicates the version of the file, | 4 // It starts with a banner that indicates the version of the file, |
| 5 // then has entries in the format specified by auth.Entry. | 5 // then has entries in the format specified by Entry. |
| 6 | 6 |
| 7 package file | 7 package file |
| 8 | 8 |
| 9 import ( | 9 import ( |
| 10 "bufio" | 10 "bufio" |
| 12 "os" | 12 "os" |
| 13 "syscall" | 13 "syscall" |
| 14 "time" | 14 "time" |
| 15 | 15 |
| 16 "golang.org/x/sys/unix" | 16 "golang.org/x/sys/unix" |
| 17 "pfish.zone/go/multipass/auth" | |
| 18 ) | 17 ) |
| 19 | 18 |
| 20 const ( | 19 const ( |
| 21 // the Banner acts as a version indicator | 20 // the Banner acts as a version indicator |
| 22 Banner = "# Multipass v0.1 password file" | 21 Banner = "# Multipass v0.1 password file" |
| 71 return false, err | 70 return false, err |
| 72 } | 71 } |
| 73 defer file.Close() | 72 defer file.Close() |
| 74 | 73 |
| 75 for scanner.Scan() { | 74 for scanner.Scan() { |
| 76 entry, err := auth.EntryFromShadow(scanner.Text()) | 75 entry, err := EntryFromShadow(scanner.Text()) |
| 77 // Skip invalid lines. | 76 // Skip invalid lines. |
| 78 if err != nil { | 77 if err != nil { |
| 79 continue | 78 continue |
| 80 } | 79 } |
| 81 if entry.Authenticate(password) { | 80 if entry.Authenticate(password) { |
| 83 } | 82 } |
| 84 } | 83 } |
| 85 return false, nil | 84 return false, nil |
| 86 } | 85 } |
| 87 | 86 |
| 88 func (f *ShadowFile) Add(entry *auth.Entry) error { | 87 func (f *ShadowFile) Add(entry *Entry) error { |
| 89 handle, err := f.openWrite() | 88 handle, err := f.openWrite() |
| 90 if err != nil { | 89 if err != nil { |
| 91 return err | 90 return err |
| 92 } | 91 } |
| 93 err = handle.write(entry) | 92 err = handle.write(entry) |
| 105 } | 104 } |
| 106 } | 105 } |
| 107 return handle.finalize() | 106 return handle.finalize() |
| 108 } | 107 } |
| 109 | 108 |
| 110 func (f *ShadowFile) AllEntries() ([]*auth.Entry, error) { | 109 func (f *ShadowFile) AllEntries() ([]*Entry, error) { |
| 111 file, scanner, err := f.open() | 110 file, scanner, err := f.open() |
| 112 if err != nil { | 111 if err != nil { |
| 113 return nil, err | 112 return nil, err |
| 114 } | 113 } |
| 115 defer file.Close() | 114 defer file.Close() |
| 116 | 115 |
| 117 var entries []*auth.Entry | 116 var entries []*Entry |
| 118 | 117 |
| 119 for scanner.Scan() { | 118 for scanner.Scan() { |
| 120 entry, err := auth.EntryFromShadow(scanner.Text()) | 119 entry, err := EntryFromShadow(scanner.Text()) |
| 121 // Skip invalid lines. | 120 // Skip invalid lines. |
| 122 if err != nil { | 121 if err != nil { |
| 123 continue | 122 continue |
| 124 } | 123 } |
| 125 entries = append(entries, entry) | 124 entries = append(entries, entry) |
| 240 func (h *writeHandle) next() bool { | 239 func (h *writeHandle) next() bool { |
| 241 // If the scanner is nil, then we have no input file and therefore no next. | 240 // If the scanner is nil, then we have no input file and therefore no next. |
| 242 return h.scanner != nil && h.scanner.Scan() | 241 return h.scanner != nil && h.scanner.Scan() |
| 243 } | 242 } |
| 244 | 243 |
| 245 func (h *writeHandle) entry() (*auth.Entry, error) { | 244 func (h *writeHandle) entry() (*Entry, error) { |
| 246 return auth.EntryFromShadow(h.scanner.Text()) | 245 return EntryFromShadow(h.scanner.Text()) |
| 247 } | 246 } |
| 248 | 247 |
| 249 func (h *writeHandle) write(entry *auth.Entry) error { | 248 func (h *writeHandle) write(entry *Entry) error { |
| 250 if _, err := h.writer.WriteString(entry.Encode()); err != nil { | 249 if _, err := h.writer.WriteString(entry.Encode()); err != nil { |
| 251 return err | 250 return err |
| 252 } | 251 } |
| 253 _, err := h.writer.WriteString("\n") | 252 _, err := h.writer.WriteString("\n") |
| 254 return err | 253 return err |
