func (ts *strutilSuite) TestMakeRandomString(c *check.C) { // for our tests rand.Seed(1) s1 := strutil.MakeRandomString(10) c.Assert(s1, check.Equals, "pw7MpXh0JB") s2 := strutil.MakeRandomString(5) c.Assert(s2, check.Equals, "4PQyl") }
func AtomicWriteFileChown(filename string, data []byte, perm os.FileMode, flags AtomicWriteFlags, uid, gid int) (err error) { if flags&AtomicWriteFollow != 0 { if fn, err := os.Readlink(filename); err == nil || (fn != "" && os.IsNotExist(err)) { if filepath.IsAbs(fn) { filename = fn } else { filename = filepath.Join(filepath.Dir(filename), fn) } } } tmp := filename + "." + strutil.MakeRandomString(12) // XXX: if go switches to use aio_fsync, we need to open the dir for writing dir, err := os.Open(filepath.Dir(filename)) if err != nil { return err } defer dir.Close() fd, err := os.OpenFile(tmp, os.O_WRONLY|os.O_CREATE|os.O_TRUNC|os.O_EXCL, perm) if err != nil { return err } defer func() { e := fd.Close() if err == nil { err = e } if err != nil { os.Remove(tmp) } }() // according to the docs, Write returns a non-nil error when n != // len(b), so don't worry about short writes. if _, err := fd.Write(data); err != nil { return err } if uid > -1 && gid > -1 { if err := fd.Chown(uid, gid); err != nil { return err } } else if uid > -1 || gid > -1 { return errors.New("internal error: AtomicWriteFileChown needs none or both of uid and gid set") } if err := fd.Sync(); err != nil { return err } if err := os.Rename(tmp, filename); err != nil { return err } return dir.Sync() }
func (ts *AtomicWriteTestSuite) TestAtomicWriteFileNoOverwriteTmpExisting(c *C) { tmpdir := c.MkDir() // ensure we always get the same result rand.Seed(1) expectedRandomness := strutil.MakeRandomString(12) // ensure we always get the same result rand.Seed(1) p := filepath.Join(tmpdir, "foo") err := ioutil.WriteFile(p+"."+expectedRandomness, []byte(""), 0644) c.Assert(err, IsNil) err = AtomicWriteFile(p, []byte(""), 0600, 0) c.Assert(err, ErrorMatches, "open .*: file exists") }
// NewAccount creates an account assertion for username, it fills in values for other missing headers as needed. It panics on error. func NewAccount(db SignerDB, username string, otherHeaders map[string]interface{}, keyID string) *asserts.Account { if otherHeaders == nil { otherHeaders = make(map[string]interface{}) } otherHeaders["username"] = username if otherHeaders["account-id"] == nil { otherHeaders["account-id"] = strutil.MakeRandomString(32) } if otherHeaders["display-name"] == nil { otherHeaders["display-name"] = strings.ToTitle(username[:1]) + username[1:] } if otherHeaders["validation"] == nil { otherHeaders["validation"] = "unproven" } if otherHeaders["timestamp"] == nil { otherHeaders["timestamp"] = time.Now().Format(time.RFC3339) } a, err := db.Sign(asserts.AccountType, otherHeaders, nil, keyID) if err != nil { panic(err) } return a.(*asserts.Account) }