38 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // SPDX-License-Identifier: BSD-3-Clause
 | |
| 
 | |
| // Copyright (C) 2017-2024 SUSE LLC. All rights reserved.
 | |
| // Use of this source code is governed by a BSD-style
 | |
| // license that can be found in the LICENSE file.
 | |
| 
 | |
| package securejoin
 | |
| 
 | |
| import "os"
 | |
| 
 | |
| // In future this should be moved into a separate package, because now there
 | |
| // are several projects (umoci and go-mtree) that are using this sort of
 | |
| // interface.
 | |
| 
 | |
| // VFS is the minimal interface necessary to use [SecureJoinVFS]. A nil VFS is
 | |
| // equivalent to using the standard [os].* family of functions. This is mainly
 | |
| // used for the purposes of mock testing, but also can be used to otherwise use
 | |
| // [SecureJoinVFS] with VFS-like system.
 | |
| type VFS interface {
 | |
| 	// Lstat returns an [os.FileInfo] describing the named file. If the
 | |
| 	// file is a symbolic link, the returned [os.FileInfo] describes the
 | |
| 	// symbolic link. Lstat makes no attempt to follow the link.
 | |
| 	// The semantics are identical to [os.Lstat].
 | |
| 	Lstat(name string) (os.FileInfo, error)
 | |
| 
 | |
| 	// Readlink returns the destination of the named symbolic link.
 | |
| 	// The semantics are identical to [os.Readlink].
 | |
| 	Readlink(name string) (string, error)
 | |
| }
 | |
| 
 | |
| // osVFS is the "nil" VFS, in that it just passes everything through to the os
 | |
| // module.
 | |
| type osVFS struct{}
 | |
| 
 | |
| func (o osVFS) Lstat(name string) (os.FileInfo, error) { return os.Lstat(name) }
 | |
| 
 | |
| func (o osVFS) Readlink(name string) (string, error) { return os.Readlink(name) }
 |