| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- // Copyright (C) 2014 The Syncthing Authors.
- //
- // This Source Code Form is subject to the terms of the Mozilla Public
- // License, v. 2.0. If a copy of the MPL was not distributed with this file,
- // You can obtain one at https://mozilla.org/MPL/2.0/.
- //go:build windows
- // +build windows
- package protocol
- // Windows uses backslashes as file separator
- import (
- "fmt"
- "path/filepath"
- "strings"
- )
- func makeNative(m rawModel) rawModel { return nativeModel{m} }
- type nativeModel struct {
- rawModel
- }
- func (m nativeModel) Index(idx *Index) error {
- idx.Files = fixupFiles(idx.Files)
- return m.rawModel.Index(idx)
- }
- func (m nativeModel) IndexUpdate(idxUp *IndexUpdate) error {
- idxUp.Files = fixupFiles(idxUp.Files)
- return m.rawModel.IndexUpdate(idxUp)
- }
- func (m nativeModel) Request(req *Request) (RequestResponse, error) {
- if strings.Contains(req.Name, `\`) {
- l.Warnf("Dropping request for %s, contains invalid path separator", req.Name)
- return nil, ErrNoSuchFile
- }
- req.Name = filepath.FromSlash(req.Name)
- return m.rawModel.Request(req)
- }
- func fixupFiles(files []FileInfo) []FileInfo {
- var out []FileInfo
- for i := range files {
- if strings.Contains(files[i].Name, `\`) {
- msg := fmt.Sprintf("Dropping index entry for %s, contains invalid path separator", files[i].Name)
- if files[i].Deleted {
- // Dropping a deleted item doesn't have any consequences.
- l.Debugln(msg)
- } else {
- l.Warnln(msg)
- }
- if out == nil {
- // Most incoming updates won't contain anything invalid, so
- // we delay the allocation and copy to output slice until we
- // really need to do it, then copy all the so-far valid
- // files to it.
- out = make([]FileInfo, i, len(files)-1)
- copy(out, files)
- }
- continue
- }
- // Fixup the path separators
- files[i].Name = filepath.FromSlash(files[i].Name)
- if out != nil {
- out = append(out, files[i])
- }
- }
- if out != nil {
- // We did some filtering
- return out
- }
- // Unchanged
- return files
- }
|