Merge branch 'pr/909'

* pr/909:
  Add Vilbrekin
  Correctly check whether parent directory is writable for current user. "&04" was checking if file is readable by others, while "&0200" checks if it's writable for current user.
This commit is contained in:
Jakob Borg committed 2014-10-26 13:59:09 +01:00
commit d3ddfa31f7
7 files changed
+34 -6

No files matched your search

+1
View File
@@ -22,3 +22,4 @@ Phill Luby <phill.luby@newredo.com>
Ryan Sullivan <kayoticsully@gmail.com>
Tully Robinson <tully@tojr.org>
Veeti Paananen <veeti.paananen@rojekti.fi>
Vil Brekin <vilbrekin@gmail.com>
+2 -1
View File
@@ -789,11 +789,11 @@
<li>Daniel Martí</li>
<li>Felix Ableitner</li>
<li>Felix Unterpaintner</li>
<li>Gilli Sigurdsson</li>
</ul>
</div>
<div class="col-md-6">
<ul>
<li>Gilli Sigurdsson</li>
<li>James Patterson</li>
<li>Jens Diemer</li>
<li>Jochen Voss</li>
@@ -805,6 +805,7 @@
<li>Ryan Sullivan</li>
<li>Tully Robinson</li>
<li>Veeti Paananen</li>
<li>Vil Brekin</li>
</ul>
</div>
</div>
+1 -1
View File
@@ -92,7 +92,7 @@ func Assets() map[string][]byte {
bs, _ = ioutil.ReadAll(gr)
assets["img/logo-text-64.png"] = bs
bs, _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/+x97XLjtrLg/zwFhvckY29Zkp1JZu9ObN/yx0ziZD68ln2y2VT2FCRCEmOK5BCgPYrj+0b7FPti290Av0GRsmWPz81JVTwiCTTQjUZ3o9Fo7D47/nB0/svpazZTc3//i91nvd4XgwE7CqNF7E1nim0cbbKvt3e+YT/yy3DEDsN4ynjgQolAxd4oUWEs2YYUgqmZYEcf3p+fnRxenH84G7KJ54vNPoBDiOczT7IoDqcxnzP4OYmhigwn6prH4hVbhAkb84DFwvWkBiyYp7CpQRizeeh6kwW8QFBJ4IqYmlMinksWTujh+/cX7HsRiJj77DQZ+d6YvfXGIpCCcWga38iZcNloQcXfQAcQ2tD0gb0JATBXXhhsMeFBkZhdiVjCM3uRtmEAbjHo0wZX2O2YhRFW2kRgPFgwn6u8ahP6OZYu8wKCPQsjJCJABbyvPd9nI8ESKSaJv8WgJPv55PyHDxfnCO7g/S/s54Ozs4P35798B4XVLIQC4kpoUN488j2ADHjFPFAL7P6712dHP0D5g8OTtyfnvwAGCOjNyfn718Mhe/PhjB2w04Oz85Oji7cHZ+z04uz0w/B1nw3N0C4h70TDmodARVco7vkyxfsXGFcJnfNdNuNXAsZ3LLwr6BpnY+CxLmPnh8EUQSGWUDinY5+dTFgQqi2G7Lc7Uyp6NRhcX1/3p0HSB0Yd+BqGHOz3v+j1gL2Ry2GAgumeIwKHBdMej6I9Ry6CMUAOpvRqjKwd+r6I95xh+uVIxb7Dxj6Xcs/BQn7ILx0EKbi7/wVju3PAnI1nPJZC7TmJmvT+3ck/YO964mPiXe05/6t3cdA7CucRcNvIFwAWWhQB1Dp5vSfcqSjUC/hc7DlXnriOwlgVil57rprtueIKcOzRwxZwkqc87vfkmPtib6e/XQPkCjmOPWLYAqxaMZ4AR8W1Er4XXMIQ+kAx+KzGwHPeGCHNYjHZc7z5dDDhV/iqHwEx97/ASspTvtjPCMn+ZDc3OIzH1PX30N7G5u3t7kCXy5rRIEdhqGCm8GgwlnKQPfXnXtCHN47pjVr4Aia3UE4VwAQwGABbiWu+6FYjhKkbe0CopuK7Az3mX+yOQndB1V3vqso5r2EyKuKa/d0BfNfEAPnKzsOIjXjMkCPxXcCvMsbiV/hF/9NTUND8dMWEJz6MP4AXVM6bkqyi7pseGCDYC+7BZDLf4KuMQLaW2uiNQDK40DcYtPSLH05Dh8l4rIcSH3tKfFK9l9/QeLKZQJ2w57z42mGa/5ydnf/uDABDbCFrLqq0hUDYzHNdEfQ+SWffzgBRVj/xCwBSEhR+kmrKsKPhQ/J7MHpJBKLBFSfBJGRffcUKj/1AXBdoQvVArCqQ72oRAVH1QzbJRypI28Of8H8vir05jxf0W85TttdCA2TNZdb8xmapncoITP1FNMNZwrJfvfFMXMXwbxI5KTW/EnMZfWcBAzMgkKhm8l+9K+4n8FdrnT3n5qaIOZaQ6vbW2b/Qb4EH2c2XpvSXt+Xho4YGmhoFGoM0LVPcYOPGYeSG10GZstwQ59+cajlg6+kUpR4oW24eilDaSRVOMxrtDnip2ZxzsubmIkiqowGoZD0sDh9YH2oolAI5JXEMV+qLHq/KEO2n4AodLpNyaYc8V8+STp35GI9DV7T1ZxZes5Pjtu5kZPSuQBbGziqdlrNEIek7dTqcTFp7rMHdjYIxcD6PVae+QGUoPmvpz5mG+JAU5COw5zp1GVRRrHpiHqlFS7cPEOaSTu8OEt8+3fMvRpPhDxCNWn01aB5dHvXdGy+WChTXNZjNgb9Ae/A6YB7YbmAMSgkC9TtmaIoWa4BGgtGNuWpF2f4M4E+86UmAxkQmVwBwruhKnfF7c7e383VRURS+Ax2Ez+hvzzRbFmHVskhrl0rtzl4UhHCpDFkxTsoj7L0QrnDBYnixn9GuuQG0J6qiKioM4TmYypoGSUzaH4xqCcsEMPslR6salwlgETM+Vt4V1HDBfs8Mr3mCw2A6psKsEFngoBzLoPsFhVwa+ubuT8A8q2jYDjpWK1P6x1g5sFjzfaPkH3UmV3VejaV8mG0T75NjGczyi9Jj4SE3BcuTQ0wTHww/4OUK65eYPIVHFUMfl8GwqIVFOlqKvpiozby2dTK8XDYXetM4BPODeS6azQhdLp8QZvLc3OjSR/hpQ//unxyDTUejF4tIcJWCxNWu/vUWel63kxonXdlcAHx8HsnUiohgAY/LlH9L+51aH/oZuvg3L3DFJ+wS2fIAIYllGL9iUegFda6FnsAct83sSrEOpt3MdSt8mFIMqHR7uxxgPhUKBjSSVcJ6eDxLyTpUXCVF4ls6WjcfMzC965kAqzEJLgOywS70j7pd2BWSBI6MBOA91D/uAWnMAy2bh+ZXG6waBJCAVeHe2D4tVJc2wtjGzQ3CPBXxGLiOT0WJ6b/ctPVsxT57rpXXbB0+gaKP1Fv7e9Ju5VlclY5mYueSpTQjS9Msndksn+KkAqjIjRe8Yroi29vbY9u39XnbRatSQcVHfqa99QP9xWW8i34j1zyjq46Y2UYqlToBbN9i+wf8NGtXYjBYLQrMKIGCOQ9wG5t0M2RxUW8W0SVZBPXdBlwGTcjcF0vDEGEkgm7YnnI1WwO+CObOGKcm6RwWXP6vGQV/63sBrMQ9O690JokxR3vSm7bR5HUch/F9qNGEwedhhqkfjtpWsN9DGe4zVHlirZhPCfAbzxeS/cm4f80X8n0yH4n49rYmdj0FnTPNb7H/bAR3uFAEbuQFsNK5vT38HGSdhfM2qr4Nxw9CVB/hro2mBO1JkHTsh4nbQ7+EH/KqgVdF7AOsyz5MaC12d+I2lCZnW5M4CmD9qYm/z7bLPprwGhenRZMxdUTYhjEHtIZRRGCWQeRLUEytpBYs0SZw9rdb+rTNDpdZTMQ2j85QwNqX3RTgOy5hxfIQjFS3xb1JarL1z2Al9iHwwZb6Rcjl9GsE9awG63349IYiCcYzMb4UbdP6ZBrgnieY1nNPoitdPvqg6C5gD+Q6xqUE7ikOTWfHDkYTnODKHqyZNViLGmIKcAhiT34O9OWMx6LHfdXqM4dyLvvZu5+pTM1JLXaMpti8i2EI7+3LJPiAS6z6krK2gOzscKSixunY4GbkwRSqNYg33DbsrkfT3WKrHm0XNFEX48E0wY5m2HG51F1J2NsdSPb163JKpdvOhS0KtBwa3U6ogJ+j8+J5xXMLk6fERtpHtdbp3kqXu2Bb2BgsT4MOnYcV7djz2xZwALl9RJscMt2c0w1TaiUndrmxSRjPjb/YtqF+F/c+d11D4U609RPZtuHlusZLvoS+nShYfZzFaZUrT3rkIpo7g4q7v+is15u4BWc9YV/21lNoCIY36Zie+3jyjWM+4+eCF14DP5pM0RH/ax6GsbH5W8fdryZHvPG4m4gkhNzR197R074LIjBQxAbUA4p4KCDU14icHOPwZWUzj7ubR5tkVTYr3veqJ9O+54VezBKWy/2XQOjWTQ6ri3IdDspm92SjJbL+1e+xKcbOujgXGo0RaDcQY9yblL8+V6Hi/nP0Vo0iXEbOBdBgfHuLTxsNZU8CWnSe42Nx5bnZZNA0mjNroF0n1X8RPRTdwkR1J9yHRD0JyqlWQ+DgHbtQnu/9QXvYd6eZXMASe96Hf7r4mR4GW5fL2SjkcRuTHJ1erBXpcZSYzaKKrwceA7D3Yu6/2rm9/fIO1EhNbtMStH4QBCEst8WHn9izPQrtnnhBw15LR7qNwLyYhXGb59y4kY89OUYjfsGGsLTr4FZZbf1e6i3qLUaVZDLG2BdnGUFSK6iwEgh8IE7Ww6Vrc3u7laXPs47tTiYdG35kedC6QfZ3HeJ49zlhYiSbF712zBoWvNblbkczPH9GS/FMzGHta2xFWTQWbfZFIbLD1OgY2WFMJYrsKJpNzTZliCcntCkm1x7ekXa+Ymw+aHjHw5ud1Exr0MfS4AGczEXVXe/eb+jXGIfzyBdYxFai/w9S+LiG39ne7hh+cBFhLNlxbqGwDah81yCIteKxuwIa5bAPbQl1aQNUIunGV9t3jPyou2Jb8Hf2SWVRmebAmnWEalhmV0uoxtMOxujIYPfbu3/AlVFHG9/GrR2WSbZqK6+YWnzfjzgCa19f3YP6XRZbtnqrr7sedIPSC9o2KA9cNwaz9j601HRAQCWF+aQZLpzPQe+3bcmAhpnFYdB1mbaU37qppuriLddUnyViAnqN3NG6rXoBKuXIFO5OqZoizUlTAObYKEr7pk0EaYD+rDt43Ed9fHKrGQy3rB8oq21i45lFNxl3jihYQugc1kPQuQX6ncn8KEJifWvVeyiiI98DQfX3tjVtR3q1W6r3IZhYiC5BoW+5VHgA/M5i4plUXNnJhbCHAPqYox/wT9ax5P4ee/HyWzuPCnIxLZ8DqU+oW2u7jY3d3LSDALUAy1rxylnAf71373quy3744dV87vxT7PM37XTv8rvt8ZrNsNzyeJBtXt7oQ/svtqG7wuHVjhu6GuJaN3Rrx7O0h21QPoyFryjYWtoPJwr8ps809X0RTNVMh4p83lOKNhdXlazvQ1Uk6X2OKhacgkAPdAcWyIItz7nvg1yCt/1zby4y6YMS55WUIHReQUeoFLu5mcSgrlx/kboTsRqNQTlfgJ3113A8seCHaxIjObsTs2kO6XbwuW0x9eGnz3IwsTQHshO9WbYKfH0YQnfm3ZJYpDLCPEInhQvcQwCqzs2WLBZNaSHKmSAKst8UoYWrEfgmS4yLLrQklqKf5X7pB0IN6rNjmESYeYUN2JswTuaNB6g7tSyh6akHlvmoD6uhQdZ24VcsYCwlOujrlg5mcWBnusD9OrKEBGNoZhrGi4EbjhNc15o8I3XfVeHzg5PFkzKxEeUwWZJaYU2NW5gCCDfGRarbNA7Lz8zjJHov1HUYX2oJiRGHsGRPZ5N+Qh9soLine truncated
bs, _ = base64.StdEncoding.DecodeString("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 truncated
gr, _ = gzip.NewReader(bytes.NewBuffer(bs))
bs, _ = ioutil.ReadAll(gr)
assets["index.html"] = bs
+4 -2
View File
@@ -20,6 +20,7 @@ import (
"path/filepath"
"sync"
"github.com/syncthing/syncthing/internal/osutil"
"github.com/syncthing/syncthing/internal/protocol"
)
@@ -68,7 +69,7 @@ func (s *sharedPullerState) tempFile() (*os.File, error) {
if info, err := os.Stat(dir); err != nil {
s.earlyCloseLocked("dst stat dir", err)
return nil, err
} else if info.Mode()&04 == 0 {
} else if info.Mode()&0200 == 0 {
err := os.Chmod(dir, 0755)
if err == nil {
defer func() {
@@ -136,7 +137,8 @@ func (s *sharedPullerState) earlyCloseLocked(context string, err error) {
s.err = err
if s.fd != nil {
s.fd.Close()
os.Remove(s.tempName)
// Delete temporary file, even if parent dir is read-only
osutil.InWritableDir(func(string) error { os.Remove(s.tempName); return nil }, s.tempName)
}
s.closed = true
}
+25 -1
View File
@@ -15,7 +15,11 @@
package model
import "testing"
import (
"os"
"path/filepath"
"testing"
)
func TestSourceFileOK(t *testing.T) {
s := sharedPullerState{
@@ -61,3 +65,23 @@ func TestSourceFileBad(t *testing.T) {
t.Fatal("Unexpected nil failed()")
}
}
// Test creating temporary file inside read-only directory
func TestReadOnlyDir(t *testing.T) {
s := sharedPullerState{
tempName: "testdata/read_only_dir/.temp_name",
}
// Ensure dir is read-only (git doesn't store full permissions)
os.Chmod(filepath.Dir(s.tempName), 0555)
fd, err := s.tempFile()
if err != nil {
t.Fatal(err)
}
if fd == nil {
t.Fatal("Unexpected nil fd")
}
s.earlyClose("Test done", nil)
}
View File
Whitespace-only changes.
+1 -1
View File
@@ -66,7 +66,7 @@ func Rename(from, to string) error {
// containing `path` is writable for the duration of the call.
func InWritableDir(fn func(string) error, path string) error {
dir := filepath.Dir(path)
if info, err := os.Stat(dir); err == nil && info.IsDir() && info.Mode()&04 == 0 {
if info, err := os.Stat(dir); err == nil && info.IsDir() && info.Mode()&0200 == 0 {
// A non-writeable directory (for this user; we assume that's the
// relevant part). Temporarily change the mode so we can delete the
// file or directory inside it.