@@ -10,6 +10,7 @@ import (
1010 "os"
1111 "os/user"
1212 "path/filepath"
13+ "strconv"
1314 "strings"
1415 "syscall"
1516
@@ -145,14 +146,41 @@ func tokenCacheFile() (string, error) {
145146 if err != nil {
146147 return "", fmt.Errorf("user lookup error %s %s", uname, err.Error())
147148 }
148- tokenCacheDir := filepath.Join(userInfo.HomeDir, ".credentials")
149- err = os.MkdirAll(tokenCacheDir, 0700)
150- if err != nil {
149+
150+ // create home dir
151+ if err := createDir(userInfo.HomeDir, userInfo.Uid, userInfo.Gid, 0755); err != nil {
152+ return "", err
153+ }
154+ // create token dir
155+ tokenCacheDir := filepath.Join("/opt/google-web-oauth", uname, ".credentials")
156+ if err := createDir(tokenCacheDir, "0", "0", 0700); err != nil {
151157 return "", err
152158 }
159+
153160 return filepath.Join(tokenCacheDir, url.QueryEscape("google_oauth.json")), nil
154161}
155162
163+ func createDir(path, uid, gid string, mode os.FileMode) error {
164+ if _, err := os.Stat(path); os.IsNotExist(err) {
165+ if err = os.MkdirAll(path, mode); err != nil {
166+ return err
167+ }
168+ iuid, err := strconv.Atoi(uid)
169+ if err != nil {
170+ return err
171+ }
172+ igid, err := strconv.Atoi(gid)
173+ if err != nil {
174+ return err
175+ }
176+ if err = os.Chown(path, iuid, igid); err != nil {
177+ return err
178+ }
179+ }
180+ return nil
181+
182+ }
183+
156184type tokenCache struct {
157185 OAuthToken *oauth2.Token
158186 LastIP string
0 commit comments