@@ -10,6 +10,7 @@ import (
10
10
"os"
11
11
"os/user"
12
12
"path/filepath"
13
+ "strconv"
13
14
"strings"
14
15
"syscall"
15
16
@@ -145,14 +146,41 @@ func tokenCacheFile() (string, error) {
145
146
if err != nil {
146
147
return "" , fmt .Errorf ("user lookup error %s %s" , uname , err .Error ())
147
148
}
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 {
151
157
return "" , err
152
158
}
159
+
153
160
return filepath .Join (tokenCacheDir , url .QueryEscape ("google_oauth.json" )), nil
154
161
}
155
162
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
+
156
184
type tokenCache struct {
157
185
OAuthToken * oauth2.Token
158
186
LastIP string
0 commit comments