~fwereade/pyjuju/go-log-type

« back to all changes in this revision

Viewing changes to charm/bundle.go

  • Committer: Gustavo Niemeyer
  • Date: 2012-02-10 16:33:57 UTC
  • mfrom: (51.2.11 go-charm-symlinks)
  • Revision ID: gustavo@niemeyer.net-20120210163357-lb2jk8ani7if2h5h
charm: fix symlink and file mode when bundling/expanding

R=fwereade, rog
CC=
https://codereview.appspot.com/5647047

Show diffs side-by-side

added added

removed removed

Lines of Context:
5
5
        "errors"
6
6
        "fmt"
7
7
        "io"
 
8
        "io/ioutil"
8
9
        "os"
9
10
        "path/filepath"
10
11
        "strconv"
194
195
        }
195
196
        defer r.Close()
196
197
 
 
198
        mode := zfile.Mode()
197
199
        path := filepath.Join(dir, cleanName)
198
 
        if strings.HasSuffix(zfile.Name, "/") {
199
 
                err = os.MkdirAll(path, 0755)
 
200
        if strings.HasSuffix(zfile.Name, "/") || mode&os.ModeDir != 0 {
 
201
                err = os.MkdirAll(path, mode&0777)
200
202
                if err != nil {
201
203
                        return err
202
204
                }
208
210
        if err != nil {
209
211
                return err
210
212
        }
211
 
        f, err := os.Create(path)
 
213
 
 
214
        if mode&os.ModeSymlink != 0 {
 
215
                data, err := ioutil.ReadAll(r)
 
216
                if err != nil {
 
217
                        return err
 
218
                }
 
219
                target := string(data)
 
220
                if err := checkSymlinkTarget(dir, cleanName, target); err != nil {
 
221
                        return err
 
222
                }
 
223
                return os.Symlink(target, path)
 
224
        }
 
225
 
 
226
        if err := checkFileType(cleanName, mode); err != nil {
 
227
                return err
 
228
        }
 
229
 
 
230
        f, err := os.OpenFile(path, os.O_CREATE|os.O_EXCL|os.O_WRONLY, mode&0777)
212
231
        if err != nil {
213
232
                return err
214
233
        }
217
236
        return err
218
237
}
219
238
 
 
239
func checkSymlinkTarget(basedir, symlink, target string) error {
 
240
        if filepath.IsAbs(target) {
 
241
                return fmt.Errorf("symlink %q is absolute: %q", symlink, target)
 
242
        }
 
243
        p := filepath.Join(filepath.Dir(symlink), target)
 
244
        if p == ".." || strings.HasPrefix(p, "../") {
 
245
                return fmt.Errorf("symlink %q links out of charm: %q", symlink, target)
 
246
        }
 
247
        return nil
 
248
}
 
249
 
220
250
// FWIW, being able to do this is awesome.
221
251
type readAtBytes []byte
222
252